shithub: riscv

Download patch

ref: 9965e575f8783cbaf29b6b1c8857706b164e427c
parent: 853f0e33fe744d816d66276491c34f9bccd4e6e3
author: Sigrid <ftrvxmtrx@gmail.com>
date: Fri Jul 31 11:51:32 EDT 2020

vmx(1): add missing file

--- /dev/null
+++ b/sys/src/cmd/vmx/nanosec.c
@@ -1,0 +1,50 @@
+#include <u.h>
+#include <libc.h>
+
+/*
+ * nsec() is wallclock and can be adjusted by timesync
+ * so need to use cycles() instead, but fall back to
+ * nsec() in case we can't
+ *
+ * "fasthz" is how many ticks there are in a second
+ * can be read from /dev/time
+ */
+uvlong
+nanosec(void)
+{
+	static uvlong fasthz, xstart;
+	uvlong x, div;
+	int f, n, i;
+	char tmp[128], *e;
+
+	if(fasthz == ~0ULL)
+		return nsec() - xstart;
+
+	if(fasthz == 0){
+		fasthz = ~0ULL;
+		xstart = nsec();
+		if((f = open("/dev/time", OREAD)) >= 0 && (n = read(f, tmp, sizeof(tmp)-1)) > 2){
+			tmp[n] = 0;
+			e = tmp;
+			for(i = 0; i < 3; i++)
+				strtoll(e, &e, 10);
+			if((fasthz = strtoll(e, nil, 10)) < 1)
+				fasthz = ~0ULL;
+			else
+				cycles(&xstart);
+		}
+		close(f);
+		if(fasthz == ~0ULL){
+			fprint(2, "couldn't get fasthz, falling back to nsec()\n");
+			fprint(2, "you might want to disable aux/timesync\n");
+			return 0;
+		}
+	}
+	cycles(&x);
+	x -= xstart;
+
+	/* this is ugly */
+	for(div = 1000000000ULL; x < 0x1999999999999999ULL && div > 1 ; div /= 10ULL, x *= 10ULL);
+
+	return x / (fasthz / div);
+}