ref: 57f49b5ea9632be13d0b695a2932fc7e6ed7ac0b
parent: 6668244f2c4cdd0ad841f40d41057817a44799df
author: Sigrid Haflínudóttir <[email protected]>
date: Fri Aug 7 13:20:59 EDT 2020
nanosec: cycles/nsec depending on what we have
--- a/util.c
+++ b/util.c
@@ -1,5 +1,6 @@
#include <u.h>
#include <libc.h>
+#include <tos.h>
int usensec = 0;
@@ -58,11 +59,6 @@
* 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
- *
- * perhaps using RDTSCP is even better
*/
uvlong
nanosec(void)
@@ -69,38 +65,26 @@
{
static uvlong fasthz, xstart;
uvlong x, div;
- int f, n, i;
- char tmp[128], *e;
- if (fasthz == ~0ULL)
+ if(fasthz == ~0ULL)
return nsec() - xstart;
- if (fasthz == 0) {
- fasthz = ~0ULL;
- xstart = nsec();
- if (usensec)
- return 0;
- 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");
+ if(fasthz == 0){
+ if((fasthz = _tos->cyclefreq) == 0){
+ fasthz = ~0ULL;
+ xstart = nsec();
+ fprint(2, "cyclefreq not available, falling back to nsec()\n");
fprint(2, "you might want to disable aux/timesync\n");
return 0;
+ }else{
+ cycles(&xstart);
}
}
cycles(&x);
x -= xstart;
- for (div = 1000000000ULL; x < 0x1999999999999999ULL && div > 1 ; div /= 10ULL, x *= 10ULL);
+ /* this is ugly */
+ for(div = 1000000000ULL; x < 0x1999999999999999ULL && div > 1 ; div /= 10ULL, x *= 10ULL);
return x / (fasthz / div);
}