reluctantly add _nsec Reference: /n/atom/patch/applied/sys_nsecnix Date: Thu Jun 12 15:47:12 CES 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/omap/arch.c Thu Jun 12 15:46:47 2014 +++ /sys/src/nix/omap/arch.c Thu Jun 12 15:46:48 2014 @@ -31,7 +31,7 @@ * called in sysfile.c */ void -evenaddr(uintptr addr) +validalign(uintptr addr, uint) { if(addr & 3){ postnote(up, 1, "sys: odd address", NDebug); @@ -171,27 +171,6 @@ * atomic ops * make sure that we don't drag in the C library versions */ - -long -_xdec(long *p) -{ - int s, v; - - s = splhi(); - v = --*p; - splx(s); - return v; -} - -void -_xinc(long *p) -{ - int s; - - s = splhi(); - ++*p; - splx(s); -} int ainc(int *p) --- /sys/src/nix/bcm/fns.h Thu Jun 12 15:46:48 2014 +++ /sys/src/nix/bcm/fns.h Thu Jun 12 15:46:49 2014 @@ -81,12 +81,12 @@ extern void delay(int); /* only scheddump() */ extern int islo(void); extern void microdelay(int); /* only edf.c */ -extern void evenaddr(uintptr); extern void idlehands(void); #define hardhalt() idlehands() extern void setkernur(Ureg*, Proc*); /* only devproc.c */ extern void* sysexecregs(uintptr, uint, uint); extern void sysprocsetup(Proc*); +extern void validalign(uintptr, uint); extern void kexit(Ureg*); --- /sys/src/nix/port/sysfile.c Thu Jun 12 15:46:51 2014 +++ /sys/src/nix/port/sysfile.c Thu Jun 12 15:46:52 2014 @@ -207,7 +207,7 @@ */ a = va_arg(list, int*); a = validaddr(a, sizeof(fd), 1); - evenaddr(PTR2UINT(a)); + validalign(PTR2UINT(a), sizeof(int)); c[0] = namec("#|", Atodir, 0, 0); c[1] = nil; --- /sys/src/nix/port/syscallfmt.c Thu Jun 12 15:46:53 2014 +++ /sys/src/nix/port/syscallfmt.c Thu Jun 12 15:46:53 2014 @@ -127,11 +127,12 @@ a = va_arg(list, char*); fmtuserstring(&fmt, a, ""); argv = va_arg(list, char**); - evenaddr(PTR2UINT(argv)); + validalign(PTR2UINT(argv), char**); for(;;){ a = *(char**)validaddr(argv, sizeof(char**), 0); if(a == nil) break; + validalign(PTR2UINT(argv), sizeof(char*)); fmtprint(&fmt, " "); fmtuserstring(&fmt, a, ""); argv++; @@ -218,19 +219,6 @@ l = va_arg(list, ulong); fmtprint(&fmt, "%#p %ld", v, l); break; -/* - case SEMSLEEP: - case SEMWAKEUP: - v = va_arg(list, int*); - fmtprint(&fmt, "%#p", v); - break; - case SEMALT: - ip = va_arg(list, int**); - i[0] = va_arg(list, int); - validaddr(ip, sizeof(int*)*i[0], 0); - fmtprint(&fmt, "%#p %d", ip, i[0]); - break; -*/ case SEEK: v = va_arg(list, vlong*); i[0] = va_arg(list, int); @@ -287,6 +275,10 @@ fmtprint(&fmt, "%ld", l); vl = va_arg(list, vlong); fmtprint(&fmt, " %lld", vl); + break; + case _NSEC: + vl = va_arg(list, vlong); + fmtprint(&fmt, "%llud", vl); break; } poperror(); --- /sys/src/nix/port/portdat.h Thu Jun 12 15:46:55 2014 +++ /sys/src/nix/port/portdat.h Thu Jun 12 15:46:56 2014 @@ -692,6 +692,7 @@ uintptr p; usize u; void* v; + vlong vl; }; struct Proc --- /sys/src/nix/port/systab.c Thu Jun 12 15:46:57 2014 +++ /sys/src/nix/port/systab.c Thu Jun 12 15:46:57 2014 @@ -46,6 +46,7 @@ extern void syspread(Ar0*, va_list); extern void syspwrite(Ar0*, va_list); extern void systsemacquire(Ar0*, va_list); +extern void sys_nsec(Ar0*, va_list); struct { char* n; void (*f)(Ar0*, va_list); @@ -91,6 +92,7 @@ [PREAD] { "Pread", syspread, { .l = -1 } }, [PWRITE] { "Pwrite", syspwrite, { .l = -1 } }, [TSEMACQUIRE] { "Tsemacquire", systsemacquire, { .i = -1 } }, + [_NSEC] { "_Nsec", sys_nsec, { .vl = -1 } }, }; int nsyscall = nelem(systab); --- /sys/src/nix/port/sysproc.c Thu Jun 12 15:46:59 2014 +++ /sys/src/nix/port/sysproc.c Thu Jun 12 15:47:00 2014 @@ -248,7 +248,7 @@ ufile = va_arg(list, char*); ufile = validaddr(ufile, 1, 0); argv = va_arg(list, char**); - evenaddr(PTR2UINT(argv)); + validalign(PTR2UINT(argv), sizeof(char**)); file = nil; elem = nil; @@ -959,7 +959,7 @@ for(p = s->sema.next; p != &s->sema && n > 0; p = p->next){ if(p->addr == addr && p->waiting){ p->waiting = 0; - coherence(); + sfence(); wakeup(p); n--; } @@ -999,7 +999,7 @@ static int semawoke(void* p) { - coherence(); + lfence(); return !((Sema*)p)->waiting; } @@ -1019,7 +1019,7 @@ semqueue(s, addr, &phore); for(;;){ phore.waiting = 1; - coherence(); + sfence(); if(canacquire(addr)){ acquired = 1; break; @@ -1030,7 +1030,7 @@ poperror(); } semdequeue(s, &phore); - coherence(); /* not strictly necessary due to lock in semdequeue */ + lfence(); /* not strictly necessary (and arguablly wrong!) due to lock in semdequeue */ if(!phore.waiting) semwakeup(s, addr, 1); if(!acquired) @@ -1056,7 +1056,7 @@ semqueue(s, addr, &phore); for(;;){ phore.waiting = 1; - coherence(); + sfence(); if(canacquire(addr)){ acquired = 1; break; @@ -1071,7 +1071,7 @@ break; } semdequeue(s, &phore); - coherence(); /* not strictly necessary due to lock in semdequeue */ + lfence(); /* not strictly necessary due to lock in semdequeue */ if(!phore.waiting) semwakeup(s, addr, 1); if(ms <= 0) @@ -1093,7 +1093,7 @@ * int semacquire(int* addr, int block); */ addr = va_arg(list, int*); - evenaddr(PTR2UINT(addr)); + validalign(PTR2UINT(addr), sizeof(long)); block = va_arg(list, int); if((s = seg(up, PTR2UINT(addr), 0)) == nil) @@ -1117,7 +1117,7 @@ */ addr = va_arg(list, int*); addr = validaddr(addr, sizeof(int), 1); - evenaddr(PTR2UINT(addr)); + validalign(PTR2UINT(addr), sizeof(long)); ms = va_arg(list, ulong); if((s = seg(up, PTR2UINT(addr), 0)) == nil) @@ -1140,8 +1140,8 @@ * int semrelease(int* addr, int count); */ addr = va_arg(list, int*); - addr = validaddr(addr, sizeof(int), 1); - evenaddr(PTR2UINT(addr)); + addr = validaddr(addr, sizeof(int*), 1); + validalign(PTR2UINT(addr), sizeof(int*)); delta = va_arg(list, int); if((s = seg(up, PTR2UINT(addr), 0)) == nil) @@ -1150,4 +1150,10 @@ error(Ebadarg); ar0->i = semrelease(s, addr, delta); +} + +void +sys_nsec(Ar0* ar0, va_list) +{ + ar0->vl = todget(nil); } --- /sys/src/nix/k10/fns.h Thu Jun 12 15:47:01 2014 +++ /sys/src/nix/k10/fns.h Thu Jun 12 15:47:01 2014 @@ -23,7 +23,6 @@ void dumpmmu(Proc*); void dumpmmuwalk(uintmem); void dumpptepg(int, uintmem); -#define evenaddr(x) /* x86 doesn't care */ int fpudevprocio(Proc*, void*, long, vlong, int); void fpuinit(void); void fpunoted(void); @@ -115,6 +114,7 @@ void tssrsp0(u64int); void umeminit(void); int userureg(Ureg*); +#define validalign(adr, sz) /* x86 doesn't care */ void vctlinit(Vctl*); void* vintrenable(Vctl*, char*); void* vmapoverlap(uintmem, usize); --- /sys/src/nix/k10/wifi.c Thu Jun 12 15:47:03 2014 +++ /sys/src/nix/k10/wifi.c Thu Jun 12 15:47:04 2014 @@ -1364,7 +1364,7 @@ u16int tk[8], p1k[5]; RC4state rs; MICstate ms; - ulong crc; + u32int crc; if(BLEN(b) < 8+4) return -1;