reluctantly introduce _nsec system call and fix ainc not defined Reference: /n/atom/patch/applied/sys_nsec9 Date: Thu Jun 12 15:54:39 CES 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/9/alphapc/faultalpha.c Thu Jun 12 15:53:30 2014 +++ /sys/src/9/alphapc/faultalpha.c Thu Jun 12 15:53:33 2014 @@ -50,10 +50,10 @@ } /* - * called in sysfile.c + * called in syscallfmt.c, sysfile.c, sysproc.c */ void -evenaddr(ulong addr) +validalign(uintptr addr, uint) { if(addr & 3){ postnote(up, 1, "sys: odd address", NDebug); --- /sys/src/9/alphapc/fns.h Thu Jun 12 15:53:38 2014 +++ /sys/src/9/alphapc/fns.h Thu Jun 12 15:53:40 2014 @@ -1,14 +1,16 @@ #include "../port/portfns.h" Dirtab* addarchfile(char*, int, long(*)(Chan*,void*,long,vlong), long(*)(Chan*,void*,long,vlong)); +int adec(int*); +int ainc(int*); void archinit(void); void arginit(void); void arith(void); ulong cankaddr(ulong); int cas(void*, int, int); -void clock(Ureg*); void clockinit(void); void clockintrsched(void); +void clock(Ureg*); #define coherence mb int cistrcmp(char*, char*); int cistrncmp(char*, char*, int); @@ -24,7 +26,6 @@ int dmainit(int, int); long dmasetup(int, void*, long, int); void _dumpstack(Ureg *); -void evenaddr(ulong); void fataltrap(Ureg *, char *); void fault0(void); void faultalpha(Ureg*); @@ -110,6 +111,7 @@ void* vmappat(ulong, int, int); void wrent(int, void*); void wrvptptr(uvlong); +void validalign(uintptr, uint); void vunmap(void*, int); #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) --- /sys/src/9/bcm/fns.h Thu Jun 12 15:53:41 2014 +++ /sys/src/9/bcm/fns.h Thu Jun 12 15:53:41 2014 @@ -1,6 +1,8 @@ #include "../port/portfns.h" Dirtab* addarchfile(char*, int, long(*)(Chan*,void*,long,vlong), long(*)(Chan*,void*,long,vlong)); +extern int adec(int*); +extern int ainc(int*); extern void archreboot(void); extern void archreset(void); extern void armtimerset(int); @@ -92,11 +94,11 @@ 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); extern void setkernur(Ureg*, Proc*); /* only devproc.c */ extern void* sysexecregs(uintptr, ulong, int); extern void sysprocsetup(Proc*); +extern void validalign(uintptr, uint); extern void kexit(Ureg*); --- /sys/src/9/bitsy/trap.c Thu Jun 12 15:53:43 2014 +++ /sys/src/9/bitsy/trap.c Thu Jun 12 15:53:44 2014 @@ -917,10 +917,10 @@ } /* - * called in sysfile.c + * called in syscallfmt.c, sysfile.c, sysproc.c */ void -evenaddr(ulong addr) +validalign(uintptr addr, uint) { if(addr & 3){ postnote(up, 1, "sys: odd address", NDebug); --- /sys/src/9/bitsy/fns.h Thu Jun 12 15:53:44 2014 +++ /sys/src/9/bitsy/fns.h Thu Jun 12 15:53:45 2014 @@ -1,5 +1,7 @@ #include "../port/portfns.h" +int adec(int*); +int ainc(int*); void audiopower(int); void audioamppower(int); void audioicpower(int); @@ -23,7 +25,6 @@ void dmainit(void); void doze(void); void egpiobits(ulong, int); -void evenaddr(ulong); ulong findva(ulong, ulong, ulong); void flashprogpower(int); void flushmmu(void); @@ -110,6 +111,7 @@ void uartkick(void*); void uartrecv(Uart*, char); #define userureg(ur) (((ur)->psr & PsrMask) == PsrMusr) +void validalign(uintptr, uint); void vectors(void); void vtable(void); void wbflush(void); --- /sys/src/9/bitsy/main.c Thu Jun 12 15:53:46 2014 +++ /sys/src/9/bitsy/main.c Thu Jun 12 15:53:46 2014 @@ -526,8 +526,8 @@ return nil; } -long -adec(long *p) +int +adec(int *p) { int s; long v; @@ -538,14 +538,15 @@ return v; } -void -ainc(long *p) +int +ainc(int *p) { - int s; + int s, v; s = splhi(); - ++*p; + v = ++*p; splx(s); + return v; } int --- /sys/src/9/kw/arch.c Thu Jun 12 15:53:47 2014 +++ /sys/src/9/kw/arch.c Thu Jun 12 15:53:48 2014 @@ -28,10 +28,10 @@ } /* - * called in sysfile.c + * called in syscallfmt.c, sysfile.c, sysproc.c */ void -evenaddr(uintptr addr) +validalign(uintptr addr, uint) { if(addr & 3){ postnote(up, 1, "sys: odd address", NDebug); --- /sys/src/9/kw/fns.h Thu Jun 12 15:53:49 2014 +++ /sys/src/9/kw/fns.h Thu Jun 12 15:53:49 2014 @@ -29,6 +29,8 @@ #define coherence barriers +extern int adec(int*); +extern int ainc(int*); extern u32int controlget(void); extern u32int cpctget(void); extern u32int cpidget(void); @@ -122,13 +124,13 @@ 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); extern void setkernur(Ureg*, Proc*); /* only devproc.c */ extern void spldone(void); extern int splfhi(void); extern int splflo(void); extern void sysprocsetup(Proc*); +extern void validalign(uintptr, uint); /* * PCI --- /sys/src/9/mkfile Thu Jun 12 15:53:50 2014 +++ /sys/src/9/mkfile Thu Jun 12 15:53:50 2014 @@ -1,14 +1,14 @@ ARCH=\ bcm\ -# alphapc\ -# bitsy\ + alphapc\ + bitsy\ kw\ mtx\ omap\ - pc\ +# pc\ pcpae\ rb\ -# ppc\ + ppc\ teg2\ all:V: --- /sys/src/9/mtx/trap.c Thu Jun 12 15:53:51 2014 +++ /sys/src/9/mtx/trap.c Thu Jun 12 15:53:52 2014 @@ -526,10 +526,10 @@ } /* - * called in sysfile.c + * called in syscallfmt.c, sysfile.c, sysproc.c */ void -evenaddr(ulong addr) +validalign(uintptr addr, uint) { if(addr & 3){ postnote(up, 1, "sys: odd address", NDebug); --- /sys/src/9/mtx/fns.h Thu Jun 12 15:53:53 2014 +++ /sys/src/9/mtx/fns.h Thu Jun 12 15:53:54 2014 @@ -1,5 +1,7 @@ #include "../port/portfns.h" +int adec(int*); +int ainc(int*); uintptr cankaddr(uintmem); int cas(void*, int, int); void clockinit(void); @@ -14,7 +16,6 @@ void dumpregs(Ureg*); void delayloopinit(void); void eieio(void); -void evenaddr(ulong); void faultpower(Ureg*, ulong addr, int read); void fprestore(FPsave*); void fpsave(FPsave*); @@ -104,6 +105,7 @@ void tlbflush(ulong); void tlbflushall(void); #define userureg(ur) (((ur)->status & MSR_PR) != 0) +void validalign(uintptr, uint); void watchreset(void); #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) --- /sys/src/9/omap/arch.c Thu Jun 12 15:53:54 2014 +++ /sys/src/9/omap/arch.c Thu Jun 12 15:53:55 2014 @@ -28,10 +28,10 @@ } /* - * called in sysfile.c + * called in syscallfmt.c, sysfile.c, sysproc.c */ void -evenaddr(uintptr addr) +validalign(uintptr addr, uint) { if(addr & 3){ postnote(up, 1, "sys: odd address", NDebug); --- /sys/src/9/omap/fns.h Thu Jun 12 15:53:56 2014 +++ /sys/src/9/omap/fns.h Thu Jun 12 15:53:56 2014 @@ -11,6 +11,8 @@ #pragma varargck argpos _uartprint 1 +extern int adec(int*); +extern int ainc(int*); extern void archreboot(void); extern void archreset(void); extern void cachedinv(void); @@ -136,11 +138,11 @@ 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); extern void setkernur(Ureg*, Proc*); /* only devproc.c */ extern void* sysexecregs(uintptr, ulong, int); extern void sysprocsetup(Proc*); +extern void validalign(uintptr, uint); /* * PCI stuff. --- /sys/src/9/pc/fns.h Thu Jun 12 15:53:57 2014 +++ /sys/src/9/pc/fns.h Thu Jun 12 15:53:58 2014 @@ -2,6 +2,8 @@ void aamloop(int); Dirtab* addarchfile(char*, int, long(*)(Chan*,void*,long,vlong), long(*)(Chan*,void*,long,vlong)); +int adec(int*); +int ainc(int*); void archinit(void); int bios32call(BIOS32ci*, u16int[3]); int bios32ci(BIOS32si*, BIOS32ci*); @@ -26,7 +28,6 @@ void dmaend(int); int dmainit(int, int); long dmasetup(int, void*, long, int); -#define evenaddr(x) /* x86 doesn't care */ void fpclear(void); void fpenv(FPsave*); void fpinit(void); @@ -172,6 +173,7 @@ void upafree(uintmem, int); void upareserve(uintmem, int); #define userureg(ur) (((ur)->cs & 0xFFFF) == UESEL) +#define validalign(ptr, sz) /* x86 doesn't care */ void vectortable(void); void* vmap(uintmem, usize); void* vmappat(uintmem, usize, int); --- /sys/src/9/pcpae/fns.h Thu Jun 12 15:53:58 2014 +++ /sys/src/9/pcpae/fns.h Thu Jun 12 15:53:59 2014 @@ -2,6 +2,8 @@ void aamloop(int); Dirtab* addarchfile(char*, int, long(*)(Chan*,void*,long,vlong), long(*)(Chan*,void*,long,vlong)); +int adec(int*); +int ainc(int*); void archinit(void); void bootargs(void*); usize cankaddr(uintmem); @@ -16,7 +18,6 @@ void cpuidprint(void); void cycles(uvlong*); void delay(int); -#define evenaddr(x) /* x86 doesn't care */ void fpclear(void); void fpinit(void); void fpoff(void); @@ -158,6 +159,7 @@ void upafree(uintmem, int); void upareserve(uintmem, int); #define userureg(ur) (((ur)->cs & 0xFFFF) == UESEL) +#define validalign(addr, sz) /* x86 doesn't care */ void vectortable(void); void* vmappat(uintmem, usize, int); int vmapsync(uintptr); --- /sys/src/9/port/sysproc.c Thu Jun 12 15:54:00 2014 +++ /sys/src/9/port/sysproc.c Thu Jun 12 15:54:01 2014 @@ -314,7 +314,7 @@ nargs++; } } - evenaddr(arg[1]); + validalign(arg[1], sizeof(char**)); argp = (char**)arg[1]; validaddr((uintptr)argp, BY2WD, 0); while(*argp){ @@ -590,7 +590,7 @@ return pwait(nil); validaddr(arg[0], sizeof(OWaitmsg), 1); - evenaddr(arg[0]); + validalign(arg[0], BY2WD); /* who cares? */ pid = pwait(&w); if(pid >= 0){ ow = (OWaitmsg*)arg[0]; @@ -1085,7 +1085,7 @@ Segment *s; validaddr(arg[0], sizeof(long), 1); - evenaddr(arg[0]); + validalign(arg[0], sizeof(long)); addr = (long*)arg[0]; block = arg[1]; @@ -1104,7 +1104,7 @@ Segment *s; validaddr(arg[0], sizeof(long), 1); - evenaddr(arg[0]); + validalign(arg[0], sizeof(long)); addr = (long*)arg[0]; ms = arg[1]; @@ -1122,7 +1122,7 @@ Segment *s; validaddr(arg[0], sizeof(long), 1); - evenaddr(arg[0]); + validalign(arg[0], sizeof(long)); addr = (long*)arg[0]; delta = arg[1]; @@ -1132,4 +1132,15 @@ if(delta < 0 || *addr < 0) error(Ebadarg); return semrelease(s, addr, delta); +} + +long +sys_nsec(ulong *arg) +{ + validaddr(arg[0], sizeof(vlong), 1); + validalign(arg[0], sizeof(vlong)); + + *(vlong*)arg[0] = todget(nil); + + return 0; } --- /sys/src/9/port/sysfile.c Thu Jun 12 15:54:03 2014 +++ /sys/src/9/port/sysfile.c Thu Jun 12 15:54:04 2014 @@ -190,8 +190,8 @@ Dev *d; static char *datastr[] = {"data", "data1"}; - validaddr(arg[0], 2*BY2WD, 1); - evenaddr(arg[0]); + validaddr(arg[0], sizeof(fd), 1); + validalign(arg[0], sizeof(int)); d = devtab[devno('|', 0)]; c[0] = namec("#|", Atodir, 0, 0); c[1] = 0; @@ -215,8 +215,8 @@ error(Enofd); poperror(); - ((long*)arg[0])[0] = fd[0]; - ((long*)arg[0])[1] = fd[1]; + ((int*)arg[0])[0] = fd[0]; + ((int*)arg[0])[1] = fd[1]; return 0; } @@ -859,7 +859,8 @@ long sysseek(ulong *arg) { - validaddr(arg[0], BY2V, 1); + validaddr(arg[0], sizeof(vlong), 1); + validalign(arg[0], sizeof(vlong)); sseek(arg); return 0; } --- /sys/src/9/port/xalloc.c Thu Jun 12 15:54:05 2014 +++ /sys/src/9/port/xalloc.c Thu Jun 12 15:54:05 2014 @@ -126,8 +126,8 @@ Hole *h, **l; /* add room for magix & size overhead, round up to nearest vlong */ - size += BY2V + offsetof(Xhdr, data[0]); - size &= ~(BY2V-1); + size += sizeof(vlong) + offsetof(Xhdr, data[0]); + size &= ~(sizeof(vlong)-1); ilock(&xlists); l = &xlists.table; --- /sys/src/9/port/systab.h Thu Jun 12 15:54:06 2014 +++ /sys/src/9/port/systab.h Thu Jun 12 15:54:07 2014 @@ -53,7 +53,7 @@ Syscall syspread; Syscall syspwrite; Syscall systsemacquire; -Syscall sysdeath; +Syscall sys_nsec; Syscall *systab[]={ [SYSR1] sysr1, @@ -107,6 +107,7 @@ [PREAD] syspread, [PWRITE] syspwrite, [TSEMACQUIRE] systsemacquire, + [_NSEC] sys_nsec, }; char *sysctab[]={ @@ -161,6 +162,7 @@ [PREAD] "Pread", [PWRITE] "Pwrite", [TSEMACQUIRE] "Tsemacquire", + [_NSEC] "_Nsec", }; int nsyscall = (sizeof systab/sizeof systab[0]); --- /sys/src/9/port/syscallfmt.c Thu Jun 12 15:54:07 2014 +++ /sys/src/9/port/syscallfmt.c Thu Jun 12 15:54:08 2014 @@ -112,7 +112,9 @@ a = va_arg(list, char*); fmtuserstring(&fmt, a, ""); argv = va_arg(list, char**); - evenaddr(PTR2UINT(argv)); + if(argv == nil) + break; + validalign(PTR2UINT(argv), sizeof(char**)); for(;;){ validaddr((ulong)argv, sizeof(char**), 0); a = *(char **)argv; @@ -261,6 +263,10 @@ vl = va_arg(list, vlong); fmtprint(&fmt, " %lld", vl); break; + case _NSEC: + vl = va_arg(list, vlong); + fmtprint(&fmt, "%lld", vl); + break; } up->syscalltrace = fmtstrflush(&fmt); @@ -362,6 +368,9 @@ fmtprint(&fmt, " %lld", vl); } fmtprint(&fmt, " = %ld", ret); + break; + case _NSEC: + fmtprint(&fmt, " = %ld", ret); /* FoV */ break; } fmtprint(&fmt, " %s %#llud %#llud\n", errstr, start, stop); --- /sys/src/9/ppc/trap.c Thu Jun 12 15:54:09 2014 +++ /sys/src/9/ppc/trap.c Thu Jun 12 15:54:10 2014 @@ -583,10 +583,10 @@ } /* - * called in sysfile.c + * called in syscallfmt.c, sysfile.c, sysproc.c */ void -evenaddr(ulong addr) +validalign(uintptr addr, uint) { if(addr & 3){ postnote(up, 1, "sys: odd address", NDebug); --- /sys/src/9/ppc/fns.h Thu Jun 12 15:54:11 2014 +++ /sys/src/9/ppc/fns.h Thu Jun 12 15:54:12 2014 @@ -1,5 +1,7 @@ #include "../port/portfns.h" +int adec(int*); +int ainc(int*); ulong cankaddr(ulong); int cistrcmp(char*, char*); int cistrncmp(char*, char*, int); @@ -17,7 +19,6 @@ void dmiss(void); void dumpregs(Ureg*); void eieio(void); -void evenaddr(ulong); void faultpower(Ureg*, ulong addr, int read); void flashprogpower(int); void fpgareset(void); @@ -111,6 +112,7 @@ void trapinit(void); void trapvec(void); #define userureg(ur) (((ur)->status & MSR_PR) != 0) +void validalign(uintptr, uint); #define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1])) #define KADDR(a) ((void*)((ulong)(a)|KZERO)) #define PADDR(a) ((((ulong)(a)&0xf0000000)==0xf0000000)?(ulong)(a):((ulong)(a)&~KZERO)) --- /sys/src/9/rb/faultmips.c Thu Jun 12 15:54:12 2014 +++ /sys/src/9/rb/faultmips.c Thu Jun 12 15:54:13 2014 @@ -226,10 +226,10 @@ } /* - * called in sysfile.c + * called in syscallfmt.c, sysfile.c, sysproc.c */ void -evenaddr(ulong addr) +validalign(uintptr addr, uint) { if(addr & 3){ postnote(up, 1, "sys: odd address", NDebug); --- /sys/src/9/rb/fns.h Thu Jun 12 15:54:14 2014 +++ /sys/src/9/rb/fns.h Thu Jun 12 15:54:14 2014 @@ -1,5 +1,7 @@ #include "../port/portfns.h" +int adec(int*); +int ainc(int*); void arginit(void); int busprobe(ulong); ulong cankaddr(ulong); @@ -12,7 +14,6 @@ void coherence(void); void cycles(uvlong *); void dcflush(void*, ulong); -void evenaddr(ulong); void faultmips(Ureg*, int, int); ulong fcr31(void); void firmware(int); @@ -123,6 +124,7 @@ void touser(uintptr); void unleash(void); #define userureg(ur) ((ur)->status & KUSER) +void validalign(uintptr, uint); void vecinit(void); void vector0(void); void vector100(void); --- /sys/src/9/teg2/arch.c Thu Jun 12 15:54:15 2014 +++ /sys/src/9/teg2/arch.c Thu Jun 12 15:54:15 2014 @@ -28,10 +28,10 @@ } /* - * called in sysfile.c + * called in syscallfmt.c, sysfile.c, sysproc.c */ void -evenaddr(uintptr addr) +validalign(uintptr addr, uint) { if(addr & 3){ postnote(up, 1, "sys: odd address", NDebug); --- /sys/src/9/teg2/fns.h Thu Jun 12 15:54:16 2014 +++ /sys/src/9/teg2/fns.h Thu Jun 12 15:54:17 2014 @@ -14,8 +14,8 @@ #pragma varargck argpos _uartprint 1 -extern long ainc(long *); -extern long adec(long *); +extern int adec(int *); +extern int ainc(int *); extern void allcacheinfo(Memcache *); extern void allcacheson(void); extern int archether(unsigned, Ether *); @@ -198,13 +198,13 @@ 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); extern void setkernur(Ureg*, Proc*); /* only devproc.c */ extern void syscallfmt(int syscallno, ulong pc, va_list list); extern void sysretfmt(int syscallno, va_list list, long ret, uvlong start, uvlong stop); extern void* sysexecregs(uintptr, ulong, int); extern void sysprocsetup(Proc*); +extern void validalign(uintptr, uint); /* libc */ long labs(long); --- /sys/src/9/teg2/archtegra.c Thu Jun 12 15:54:18 2014 +++ /sys/src/9/teg2/archtegra.c Thu Jun 12 15:54:19 2014 @@ -198,8 +198,8 @@ struct Diag { Cacheline c0; Lock; - long cnt; - long sync; + int cnt; + int sync; Cacheline c1; }; @@ -466,7 +466,7 @@ } static void -synccpus(volatile long *cntp, int n) +synccpus(volatile int *cntp, int n) { ainc(cntp); while (*cntp < n) @@ -491,7 +491,7 @@ ilock(dp); if(dp->cnt != 0) - panic("cpu%d: diag: failed w count %ld", m->machno, dp->cnt); + panic("cpu%d: diag: failed w count %d", m->machno, dp->cnt); iunlock(dp); synccpus(&dp->sync, 2 * navailcpus); @@ -547,10 +547,10 @@ synccpus(&dp->sync, navailcpus); if(dp->sync < navailcpus || dp->sync >= 2 * navailcpus) - panic("cpu%d: diag: failed w dp->sync %ld", m->machno, + panic("cpu%d: diag: failed w dp->sync %d", m->machno, dp->sync); if(dp->cnt != 0) - panic("cpu%d: diag: failed w dp->cnt %ld", m->machno, + panic("cpu%d: diag: failed w dp->cnt %d", m->machno, dp->cnt); ilock(dp);