--- /sys/src/9k/k10/mem.h +++ /sys/src/9k/k10/mem.h @@ -104,3 +104,6 @@ /* this can go when the arguments to mmuput change */ #define PPN(x) ((x) & ~(PGSZ-1)) /* GAK */ + +#define KVATOP (KSEG0&KSEG1&KSEG2) +#define iskaddr(a) (((uintptr)(a)&KVATOP) == KVATOP) --- /sys/src/9k/port/chan.c +++ /sys/src/9k/port/chan.c @@ -1604,7 +1604,7 @@ validname0(char *aname, int slashok, int dup, uintptr pc) Rune r; name = aname; - if((PTR2UINT(name) & KZERO) != KZERO){ /* hmmmm */ + if(!iskaddr(name)){ if(!dup) print("warning: validname* called from %#p with user pointer", pc); ename = vmemchr(name, 0, (1<<16)); --- /sys/src/9k/port/devaoe.c +++ /sys/src/9k/port/devaoe.c @@ -1157,8 +1157,6 @@ strategy(Aoedev *d, Srb *srb) poperror(); } -#define iskaddr(a) ((uintptr)(a) > KZERO) - static long rw(Aoedev *d, int write, uchar *db, long len, uvlong off) { --- /sys/src/9k/port/devproc.c +++ /sys/src/9k/port/devproc.c @@ -755,7 +755,7 @@ procread(Chan *c, void *va, long n, vlong off) return readstr(offset, va, n, p->syscalltrace); case Qmem: - if(offset < KZERO + if(!iskaddr(offset) || (offset >= USTKTOP-USTKSIZE && offset < USTKTOP)){ r = procctlmemio(p, offset, n, va, 1); psdecref(p); --- /sys/src/9k/port/fault.c +++ /sys/src/9k/port/fault.c @@ -315,7 +315,7 @@ vmemchr(void *s, int c, int n) return t; a += r; n -= r; - if(a < KZERO) + if(!iskaddr(a)) validaddr(UINT2PTR(a), 1, 0); } --- /sys/src/9k/port/sysseg.c +++ /sys/src/9k/port/sysseg.c @@ -190,7 +190,7 @@ segattach(Proc* p, int attr, char* name, uintptr va, usize len) uintptr pgsize; /* BUG: Only ok for now */ - if((va != 0 && va < UTZERO) || (va & KZERO) == KZERO) + if((va != 0 && va < UTZERO) || iskaddr(va)) error("virtual address in kernel"); vmemchr(name, 0, ~0);