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);
+}