commit baf076425c31c927dd5ab5bb0368fdbcd3cf22a8 Author: Russ Cox Date: Tue Mar 11 11:33:52 2025 -0400 sys/src/9: add monotonic time field to /dev/time and /dev/bintime Modern programs expect the OS to provide monotonic time. The Plan 9 port of Go has been using Unix time as if it were monotonic time, but then monotonic time moves backward when aux/timesync moves the time-of-day backward. This change adds an extra field to /dev/time and /dev/bintime giving a monotonic time in nanoseconds since system boot. Programs that do long enough reads will get this extra field. Programs that don't do long enough reads will not. No programs should be confused. Speaking of being confused, also rename vlong2le etc to vlong2be since they are converting to big-endian not little-endian. diff --git a/sys/man/3/cons b/sys/man/3/cons index e4d2857d..8f2143b0 100755 --- a/sys/man/3/cons +++ b/sys/man/3/cons @@ -229,8 +229,9 @@ the offset. Therefore, there is no need for a seek back to zero between subsequent accesses. A read of .B bintime -returns 24 bytes, three 8 byte numbers, representing nanoseconds -since start of epoch, clock ticks, and clock frequency. +returns at most 32 bytes, four 8 byte numbers, representing nanoseconds +since start of epoch, clock ticks, clock frequency, +and nanoseconds since system boot. .PP A write to .B bintime @@ -280,8 +281,9 @@ in user mode, system calls, and real elapsed time. The .B time file holds one 32-bit number representing the seconds since start of epoch -and three 64-bit numbers, representing nanoseconds since -start of epoch, clock ticks, and clock frequency. +and four 64-bit numbers, representing nanoseconds since +start of epoch, clock ticks, clock frequency, +and nanoseconds since system boot. .PP A write of a decimal number to .B time diff --git a/sys/src/9/kw/syscall.c b/sys/src/9/kw/syscall.c index cb1d2f56..25024352 100755 --- a/sys/src/9/kw/syscall.c +++ b/sys/src/9/kw/syscall.c @@ -229,7 +229,7 @@ syscall(Ureg* ureg) up->nerrlab = 0; ret = -1; - startns = todget(nil); + startns = todget(nil, nil); if(!waserror()){ if(scallnr >= nsyscall){ pprint("bad sys call number %d pc %#lux\n", @@ -271,7 +271,7 @@ syscall(Ureg* ureg) ureg->r0 = ret; if(up->procctl == Proc_tracesyscall){ - stopns = todget(nil); + stopns = todget(nil, nil); up->procctl = Proc_stopme; sysretfmt(scallnr, (va_list)(sp+BY2WD), ret, startns, stopns); s = splhi(); diff --git a/sys/src/9/loongson/trap.c b/sys/src/9/loongson/trap.c index b491130a..f1caed75 100755 --- a/sys/src/9/loongson/trap.c +++ b/sys/src/9/loongson/trap.c @@ -864,7 +864,7 @@ sctracesetup(ulong scallnr, ulong sp, uintptr pc, vlong *startnsp) if(up->syscalltrace) free(up->syscalltrace); up->syscalltrace = nil; - *startnsp = todget(nil); + *startnsp = todget(nil, nil); } } @@ -876,7 +876,7 @@ sctracefinish(ulong scallnr, ulong sp, int ret, vlong startns) if(up->procctl == Proc_tracesyscall){ up->procctl = Proc_stopme; sysretfmt(scallnr, (va_list)sp, ret, - startns, todget(nil)); + startns, todget(nil, nil)); s = splhi(); procctl(up); splx(s); diff --git a/sys/src/9/loongson64/trap.c b/sys/src/9/loongson64/trap.c index cbd857b6..bb2302bf 100755 --- a/sys/src/9/loongson64/trap.c +++ b/sys/src/9/loongson64/trap.c @@ -870,7 +870,7 @@ sctracesetup(ulong scallnr, uintptr sp, uintptr pc, vlong *startnsp) if(up->syscalltrace) free(up->syscalltrace); up->syscalltrace = nil; - *startnsp = todget(nil); + *startnsp = todget(nil, nil); } } @@ -882,7 +882,7 @@ sctracefinish(ulong scallnr, uintptr sp, uintptr ret, vlong startns) if(up->procctl == Proc_tracesyscall){ up->procctl = Proc_stopme; sysretfmt(scallnr, (va_list)sp, ret, - startns, todget(nil)); + startns, todget(nil, nil)); s = splhi(); procctl(up); splx(s); diff --git a/sys/src/9/omap/devcons.c b/sys/src/9/omap/devcons.c index 9e8fee6c..ceff02af 100755 --- a/sys/src/9/omap/devcons.c +++ b/sys/src/9/omap/devcons.c @@ -1180,7 +1180,7 @@ rand(void) static uvlong uvorder = 0x0001020304050607ULL; static uchar* -le2vlong(vlong *to, uchar *f) +be2vlong(vlong *to, uchar *f) { uchar *t, *o; int i; @@ -1193,7 +1193,7 @@ le2vlong(vlong *to, uchar *f) } static uchar* -vlong2le(uchar *t, vlong from) +vlong2be(uchar *t, vlong from) { uchar *f, *o; int i; @@ -1208,7 +1208,7 @@ vlong2le(uchar *t, vlong from) static long order = 0x00010203; static uchar* -le2long(long *to, uchar *f) +be2long(long *to, uchar *f) { uchar *t, *o; int i; @@ -1220,19 +1220,6 @@ le2long(long *to, uchar *f) return f+sizeof(long); } -static uchar* -long2le(uchar *t, long from) -{ - uchar *f, *o; - int i; - - f = (uchar*)&from; - o = (uchar*)ℴ - for(i = 0; i < sizeof(long); i++) - t[i] = f[o[i]]; - return t+sizeof(long); -} - char *Ebadtimectl = "bad time control"; /* @@ -1243,19 +1230,20 @@ char *Ebadtimectl = "bad time control"; static int readtime(ulong off, char *buf, int n) { - vlong nsec, ticks; + vlong nsec, ticks, mono; long sec; - char str[7*NUMSIZE]; + char str[9*NUMSIZE]; - nsec = todget(&ticks); + nsec = todget(&ticks, &mono); if(fasthz == 0LL) fastticks((uvlong*)&fasthz); sec = nsec/1000000000ULL; - snprint(str, sizeof(str), "%*lud %*llud %*llud %*llud ", + snprint(str, sizeof(str), "%*lud %*llud %*llud %*llud %*llud ", NUMSIZE-1, sec, VLNUMSIZE-1, nsec, VLNUMSIZE-1, ticks, - VLNUMSIZE-1, fasthz); + VLNUMSIZE-1, fasthz, + VLNUMSIZE-1, mono); return readstr(off, buf, n, str); } @@ -1289,23 +1277,27 @@ static int readbintime(char *buf, int n) { int i; - vlong nsec, ticks; + vlong nsec, ticks, mono; uchar *b = (uchar*)buf; i = 0; if(fasthz == 0LL) fastticks((uvlong*)&fasthz); - nsec = todget(&ticks); + nsec = todget(&ticks, &mono); + if(n >= 4*sizeof(uvlong)){ + vlong2be(b+3*sizeof(uvlong), mono); + i += sizeof(uvlong); + } if(n >= 3*sizeof(uvlong)){ - vlong2le(b+2*sizeof(uvlong), fasthz); + vlong2be(b+2*sizeof(uvlong), fasthz); i += sizeof(uvlong); } if(n >= 2*sizeof(uvlong)){ - vlong2le(b+sizeof(uvlong), ticks); + vlong2be(b+sizeof(uvlong), ticks); i += sizeof(uvlong); } if(n >= 8){ - vlong2le(b, nsec); + vlong2be(b, nsec); i += sizeof(vlong); } return i; @@ -1330,20 +1322,20 @@ writebintime(char *buf, int n) case 'n': if(n < sizeof(vlong)) error(Ebadtimectl); - le2vlong(&delta, p); + be2vlong(&delta, p); todset(delta, 0, 0); break; case 'd': if(n < sizeof(vlong)+sizeof(long)) error(Ebadtimectl); - p = le2vlong(&delta, p); - le2long(&period, p); + p = be2vlong(&delta, p); + be2long(&period, p); todset(-1, delta, period); break; case 'f': if(n < sizeof(uvlong)) error(Ebadtimectl); - le2vlong(&fasthz, p); + be2vlong(&fasthz, p); if(fasthz <= 0) error(Ebadtimectl); todsetfreq(fasthz); diff --git a/sys/src/9/pc/devlml.c b/sys/src/9/pc/devlml.c index df96bbda..5f541c4a 100755 --- a/sys/src/9/pc/devlml.c +++ b/sys/src/9/pc/devlml.c @@ -395,7 +395,7 @@ lmlintr(Ureg *, void *x) statcom = lml->codedata->statCom[fno]; jpgheader = (FrameHeader *)(lml->codedata->frag[fno].hdr + 2); jpgheader->frameNo = lml->jpgframeno; - jpgheader->ftime = todget(nil); + jpgheader->ftime = todget(nil, nil); jpgheader->frameSize = (statcom & 0x00ffffff) >> 1; jpgheader->frameSeqNo = statcom >> 24; wakeup(&lml->sleepjpg); diff --git a/sys/src/9/pc/trap.c b/sys/src/9/pc/trap.c index 77e834c8..19ea42c6 100755 --- a/sys/src/9/pc/trap.c +++ b/sys/src/9/pc/trap.c @@ -696,7 +696,7 @@ syscall(Ureg* ureg) if(up->syscalltrace) free(up->syscalltrace); up->syscalltrace = nil; - startns = todget(nil); + startns = todget(nil, nil); } if(scallnr == RFORK){ @@ -753,7 +753,7 @@ syscall(Ureg* ureg) ureg->ax = ret; if(up->procctl == Proc_tracesyscall){ - stopns = todget(nil); + stopns = todget(nil, nil); up->procctl = Proc_stopme; sysretfmt(scallnr, (va_list)(sp+BY2WD), ret, startns, stopns); s = splhi(); diff --git a/sys/src/9/port/devaudio.c b/sys/src/9/port/devaudio.c index c3ddffee..456ea66f 100755 --- a/sys/src/9/port/devaudio.c +++ b/sys/src/9/port/devaudio.c @@ -349,7 +349,7 @@ contindma(void) b = audio.current; if(b){ audio.totcount += Bufsize; - audio.tottime = todget(nil); + audio.tottime = todget(nil, nil); } if(audio.amode == Aread) { if(b){ diff --git a/sys/src/9/port/devcons.c b/sys/src/9/port/devcons.c index 4880b84d..b050994b 100755 --- a/sys/src/9/port/devcons.c +++ b/sys/src/9/port/devcons.c @@ -1180,7 +1180,7 @@ rand(void) static uvlong uvorder = 0x0001020304050607ULL; static uchar* -le2vlong(vlong *to, uchar *f) +be2vlong(vlong *to, uchar *f) { uchar *t, *o; int i; @@ -1193,7 +1193,7 @@ le2vlong(vlong *to, uchar *f) } static uchar* -vlong2le(uchar *t, vlong from) +vlong2be(uchar *t, vlong from) { uchar *f, *o; int i; @@ -1208,7 +1208,7 @@ vlong2le(uchar *t, vlong from) static long order = 0x00010203; static uchar* -le2long(long *to, uchar *f) +be2long(long *to, uchar *f) { uchar *t, *o; int i; @@ -1220,19 +1220,6 @@ le2long(long *to, uchar *f) return f+sizeof(long); } -static uchar* -long2le(uchar *t, long from) -{ - uchar *f, *o; - int i; - - f = (uchar*)&from; - o = (uchar*)ℴ - for(i = 0; i < sizeof(long); i++) - t[i] = f[o[i]]; - return t+sizeof(long); -} - char *Ebadtimectl = "bad time control"; /* @@ -1243,19 +1230,20 @@ char *Ebadtimectl = "bad time control"; static int readtime(ulong off, char *buf, int n) { - vlong nsec, ticks; + vlong nsec, ticks, mono; long sec; - char str[7*NUMSIZE]; + char str[9*NUMSIZE]; - nsec = todget(&ticks); + nsec = todget(&ticks, &mono); if(fasthz == 0LL) fastticks((uvlong*)&fasthz); sec = nsec/1000000000ULL; - snprint(str, sizeof(str), "%*lud %*llud %*llud %*llud ", + snprint(str, sizeof(str), "%*lud %*llud %*llud %*llud %*llud ", NUMSIZE-1, sec, VLNUMSIZE-1, nsec, VLNUMSIZE-1, ticks, - VLNUMSIZE-1, fasthz); + VLNUMSIZE-1, fasthz, + VLNUMSIZE-1, mono); return readstr(off, buf, n, str); } @@ -1289,23 +1277,27 @@ static int readbintime(char *buf, int n) { int i; - vlong nsec, ticks; + vlong nsec, ticks, mono; uchar *b = (uchar*)buf; i = 0; if(fasthz == 0LL) fastticks((uvlong*)&fasthz); - nsec = todget(&ticks); + nsec = todget(&ticks, &mono); + if(n >= 4*sizeof(uvlong)){ + vlong2be(b+3*sizeof(uvlong), mono); + i += sizeof(uvlong); + } if(n >= 3*sizeof(uvlong)){ - vlong2le(b+2*sizeof(uvlong), fasthz); + vlong2be(b+2*sizeof(uvlong), fasthz); i += sizeof(uvlong); } if(n >= 2*sizeof(uvlong)){ - vlong2le(b+sizeof(uvlong), ticks); + vlong2be(b+sizeof(uvlong), ticks); i += sizeof(uvlong); } if(n >= 8){ - vlong2le(b, nsec); + vlong2be(b, nsec); i += sizeof(vlong); } return i; @@ -1330,20 +1322,20 @@ writebintime(char *buf, int n) case 'n': if(n < sizeof(vlong)) error(Ebadtimectl); - le2vlong(&delta, p); + be2vlong(&delta, p); todset(delta, 0, 0); break; case 'd': if(n < sizeof(vlong)+sizeof(long)) error(Ebadtimectl); - p = le2vlong(&delta, p); - le2long(&period, p); + p = be2vlong(&delta, p); + be2long(&period, p); todset(-1, delta, period); break; case 'f': if(n < sizeof(uvlong)) error(Ebadtimectl); - le2vlong(&fasthz, p); + be2vlong(&fasthz, p); if(fasthz <= 0) error(Ebadtimectl); todsetfreq(fasthz); diff --git a/sys/src/9/port/devloopback.c b/sys/src/9/port/devloopback.c index 55fc1872..7b9cb1db 100755 --- a/sys/src/9/port/devloopback.c +++ b/sys/src/9/port/devloopback.c @@ -560,7 +560,7 @@ loopoput(Loop *lb, Link *link, Block *volatile bp) if(BLEN(bp) < lb->minmtu) bp = adjustblock(bp, lb->minmtu); poperror(); - ptime(bp->rp, todget(nil)); + ptime(bp->rp, todget(nil, nil)); link->packets++; link->bytes += n; @@ -577,7 +577,7 @@ looper(Loop *lb) vlong t; int chan; - t = todget(nil); + t = todget(nil, nil); for(chan = 0; chan < 2; chan++) pushlink(&lb->link[chan], t); } diff --git a/sys/src/9/port/devproc.c b/sys/src/9/port/devproc.c index 42ff7dd0..8ffd01f1 100755 --- a/sys/src/9/port/devproc.c +++ b/sys/src/9/port/devproc.c @@ -279,7 +279,7 @@ _proctrace(Proc* p, Tevent etype, vlong ts) te->pid = p->pid; te->etype = etype; if (ts == 0) - te->time = todget(nil); + te->time = todget(nil, nil); else te->time = ts; tproduced++; diff --git a/sys/src/9/port/edf.c b/sys/src/9/port/edf.c index bbbfabd8..c0bf1000 100755 --- a/sys/src/9/port/edf.c +++ b/sys/src/9/port/edf.c @@ -197,7 +197,7 @@ release(Proc *p) DPRINT("%lud release %lud[%s], r=%lud, d=%lud, t=%lud, S=%lud\n", now, p->pid, statename[p->state], e->r, e->d, e->t, e->S); if(pt = proctrace){ - nowns = todget(nil); + nowns = todget(nil, nil); pt(p, SRelease, nowns); pt(p, SDeadline, nowns + 1000LL*e->D); } @@ -326,7 +326,7 @@ edfrun(Proc *p, int edfpri) DPRINT("v"); } if(p->trace && (pt = proctrace)) - pt(p, SInte, todget(nil) + e->tns); + pt(p, SInte, todget(nil, nil) + e->tns); e->tmode = Trelative; e->tf = deadlineintr; e->ta = p; diff --git a/sys/src/9/port/portfns.h b/sys/src/9/port/portfns.h index e03337e0..eea73fef 100755 --- a/sys/src/9/port/portfns.h +++ b/sys/src/9/port/portfns.h @@ -349,7 +349,7 @@ void timerset(Tval); ulong tk2ms(ulong); #define TK2MS(x) ((x)*(1000/HZ)) uvlong tod2fastticks(vlong); -vlong todget(vlong*); +vlong todget(vlong*, vlong*); void todsetfreq(vlong); void todinit(void); void todset(vlong, vlong, int); diff --git a/sys/src/9/port/sysproc.c b/sys/src/9/port/sysproc.c index 30bf28ba..286257d4 100755 --- a/sys/src/9/port/sysproc.c +++ b/sys/src/9/port/sysproc.c @@ -1142,7 +1142,7 @@ sysnsec(ulong *arg) validaddr(arg[0], sizeof(vlong), 1); validalign(arg[0], sizeof(vlong)); - *(vlong*)arg[0] = todget(nil); + *(vlong*)arg[0] = todget(nil, nil); return 0; } diff --git a/sys/src/9/port/taslock.c b/sys/src/9/port/taslock.c index 421b249f..2066d29b 100755 --- a/sys/src/9/port/taslock.c +++ b/sys/src/9/port/taslock.c @@ -101,7 +101,7 @@ lock(Lock *l) */ print("inversion %#p pc %#lux proc %lud held by pc %#lux proc %lud\n", l, pc, up ? up->pid : 0, l->pc, l->p ? l->p->pid : 0); - up->edf->d = todget(nil); /* yield to process with lock */ + up->edf->d = todget(nil, nil); /* yield to process with lock */ } if(i++ > 100000000){ i = 0; diff --git a/sys/src/9/port/tod.c b/sys/src/9/port/tod.c index 424e0f29..54ee2fd6 100755 --- a/sys/src/9/port/tod.c +++ b/sys/src/9/port/tod.c @@ -44,7 +44,9 @@ struct { uvlong udivider; /* ticks = (µdivider*µs)>>31 */ vlong hz; /* frequency of fast clock */ vlong last; /* last reading of fast clock */ - vlong off; /* offset from epoch to last */ + vlong off; /* offset from epoch to last (ns) */ + vlong monolast; /* last reading of fast clocks for monotonic time */ + vlong monooff; /* offset from 0 to monolast (ns) */ vlong lasttime; /* last return value from todget */ vlong delta; /* add 'delta' each slow clock tick from sstart to send */ ulong sstart; /* ... */ @@ -61,20 +63,43 @@ todinit(void) ilock(&tod); tod.init = 1; /* prevent reentry via fastticks */ tod.last = fastticks((uvlong *)&tod.hz); + tod.monolast = tod.last; iunlock(&tod); todsetfreq(tod.hz); addclock0link(todfix, 100); } +/* + * return monotonic ns; tod must be locked + */ +static vlong +todmono(vlong ticks) +{ + uvlong x; + vlong diff; + + if(tod.hz == 0) /* called from first todsetfreq */ + return 0; + diff = ticks - tod.monolast; + mul64fract(&x, diff, tod.multiplier); + x += tod.monooff; + return x; +} + /* * calculate multiplier */ void todsetfreq(vlong f) { + vlong ticks; + if (f <= 0) panic("todsetfreq: freq %lld <= 0", f); ilock(&tod); + ticks = fastticks(nil); + tod.monooff = todmono(ticks); + tod.monolast = ticks; tod.hz = f; /* calculate multiplier for time conversion */ @@ -125,10 +150,10 @@ todset(vlong t, vlong delta, int n) * get time of day */ vlong -todget(vlong *ticksp) +todget(vlong *ticksp, vlong *monop) { uvlong x; - vlong ticks, diff; + vlong ticks, diff, mono; ulong t; if(!tod.init) @@ -159,16 +184,21 @@ todget(vlong *ticksp) mul64fract(&x, diff, tod.multiplier); x += tod.off; - /* time can't go backwards */ + /* time can't go backwards (except when /dev/[bin]time is written) */ if(x < tod.lasttime) x = tod.lasttime; else tod.lasttime = x; + mono = 0; + if(monop != nil) + mono = todmono(ticks); iunlock(&tod); if(ticksp != nil) *ticksp = ticks; + if(monop != nil) + *monop = mono; return x; } @@ -219,7 +249,7 @@ if(x > 30000000000ULL) iprint("todfix %llud\n", x); long seconds(void) { - return (vlong)todget(nil) / TODFREQ; + return (vlong)todget(nil, nil) / TODFREQ; } uvlong diff --git a/sys/src/9/rb/trap.c b/sys/src/9/rb/trap.c index cf972769..299188b5 100755 --- a/sys/src/9/rb/trap.c +++ b/sys/src/9/rb/trap.c @@ -845,7 +845,7 @@ sctracesetup(ulong scallnr, ulong sp, uintptr pc, vlong *startnsp) if(up->syscalltrace) free(up->syscalltrace); up->syscalltrace = nil; - *startnsp = todget(nil); + *startnsp = todget(nil, nil); } } @@ -857,7 +857,7 @@ sctracefinish(ulong scallnr, ulong sp, int ret, vlong startns) if(up->procctl == Proc_tracesyscall){ up->procctl = Proc_stopme; sysretfmt(scallnr, (va_list)(sp+BY2WD), ret, - startns, todget(nil)); + startns, todget(nil, nil)); s = splhi(); procctl(up); splx(s); diff --git a/sys/src/9/teg2/devcons.c b/sys/src/9/teg2/devcons.c index 782bc907..e417fcb9 100755 --- a/sys/src/9/teg2/devcons.c +++ b/sys/src/9/teg2/devcons.c @@ -1193,7 +1193,7 @@ rand(void) static uvlong uvorder = 0x0001020304050607ULL; static uchar* -le2vlong(vlong *to, uchar *f) +be2vlong(vlong *to, uchar *f) { uchar *t, *o; int i; @@ -1206,7 +1206,7 @@ le2vlong(vlong *to, uchar *f) } static uchar* -vlong2le(uchar *t, vlong from) +vlong2be(uchar *t, vlong from) { uchar *f, *o; int i; @@ -1221,7 +1221,7 @@ vlong2le(uchar *t, vlong from) static long order = 0x00010203; static uchar* -le2long(long *to, uchar *f) +be2long(long *to, uchar *f) { uchar *t, *o; int i; @@ -1233,19 +1233,6 @@ le2long(long *to, uchar *f) return f+sizeof(long); } -static uchar* -long2le(uchar *t, long from) -{ - uchar *f, *o; - int i; - - f = (uchar*)&from; - o = (uchar*)ℴ - for(i = 0; i < sizeof(long); i++) - t[i] = f[o[i]]; - return t+sizeof(long); -} - char *Ebadtimectl = "bad time control"; /* @@ -1256,19 +1243,20 @@ char *Ebadtimectl = "bad time control"; static int readtime(ulong off, char *buf, int n) { - vlong nsec, ticks; + vlong nsec, ticks, mono; long sec; - char str[7*NUMSIZE]; + char str[9*NUMSIZE]; - nsec = todget(&ticks); + nsec = todget(&ticks, &mono); if(fasthz == 0LL) fastticks((uvlong*)&fasthz); sec = nsec/1000000000ULL; - snprint(str, sizeof(str), "%*lud %*llud %*llud %*llud ", + snprint(str, sizeof(str), "%*lud %*llud %*llud %*llud %*llud ", NUMSIZE-1, sec, VLNUMSIZE-1, nsec, VLNUMSIZE-1, ticks, - VLNUMSIZE-1, fasthz); + VLNUMSIZE-1, fasthz, + VLNUMSIZE-1, mono); return readstr(off, buf, n, str); } @@ -1302,23 +1290,27 @@ static int readbintime(char *buf, int n) { int i; - vlong nsec, ticks; + vlong nsec, ticks, mono; uchar *b = (uchar*)buf; i = 0; if(fasthz == 0LL) fastticks((uvlong*)&fasthz); - nsec = todget(&ticks); + nsec = todget(&ticks, &mono); + if(n >= 4*sizeof(uvlong)){ + vlong2be(b+3*sizeof(uvlong), mono); + i += sizeof(uvlong); + } if(n >= 3*sizeof(uvlong)){ - vlong2le(b+2*sizeof(uvlong), fasthz); + vlong2be(b+2*sizeof(uvlong), fasthz); i += sizeof(uvlong); } if(n >= 2*sizeof(uvlong)){ - vlong2le(b+sizeof(uvlong), ticks); + vlong2be(b+sizeof(uvlong), ticks); i += sizeof(uvlong); } if(n >= 8){ - vlong2le(b, nsec); + vlong2be(b, nsec); i += sizeof(vlong); } return i; @@ -1343,20 +1335,20 @@ writebintime(char *buf, int n) case 'n': if(n < sizeof(vlong)) error(Ebadtimectl); - le2vlong(&delta, p); + be2vlong(&delta, p); todset(delta, 0, 0); break; case 'd': if(n < sizeof(vlong)+sizeof(long)) error(Ebadtimectl); - p = le2vlong(&delta, p); - le2long(&period, p); + p = be2vlong(&delta, p); + be2long(&period, p); todset(-1, delta, period); break; case 'f': if(n < sizeof(uvlong)) error(Ebadtimectl); - le2vlong(&fasthz, p); + be2vlong(&fasthz, p); if(fasthz <= 0) error(Ebadtimectl); todsetfreq(fasthz); diff --git a/sys/src/9/teg2/syscall.c b/sys/src/9/teg2/syscall.c index 4e27e1d0..1eb650f7 100755 --- a/sys/src/9/teg2/syscall.c +++ b/sys/src/9/teg2/syscall.c @@ -237,7 +237,7 @@ syscall(Ureg* ureg) up->nerrlab = 0; ret = -1; - startns = todget(nil); + startns = todget(nil, nil); l1cache->wb(); /* system is more stable with this */ if(!waserror()){ @@ -281,7 +281,7 @@ syscall(Ureg* ureg) ureg->r0 = ret; if(up->procctl == Proc_tracesyscall){ - stopns = todget(nil); + stopns = todget(nil, nil); up->procctl = Proc_stopme; sysretfmt(scallnr, (va_list)(sp+BY2WD), ret, startns, stopns); s = splhi();