shithub: riscv

Download patch

ref: 6c2e983d328874ea41cb35bacb510bf2709a229f
parent: b99ecee6cd8c7c9fce1ff2cfa56d5a6807a0fc7c
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jan 19 19:47:55 EST 2014

kernel: apply uintptr for ulong when a pointer is stored

this change is in preparation for amd64. the systab calling
convention was also changed to return uintptr (as segattach
returns a pointer) and the arguments are now passed as
va_list which handles amd64 arguments properly (all arguments
are passed in 64bit quantities on the stack, tho the upper
part will not be initialized when the element is smaller
than 8 bytes).

this is partial. xalloc needs to be converted in the future.

--- a/sys/src/9/alphapc/mmu.c
+++ b/sys/src/9/alphapc/mmu.c
@@ -274,7 +274,7 @@
 }
 
 void
-checkmmu(ulong, ulong)
+checkmmu(uintptr, uintptr)
 {
 }
 
--- a/sys/src/9/alphapc/trap.c
+++ b/sys/src/9/alphapc/trap.c
@@ -728,7 +728,7 @@
 
 		up->s = *((Sargs*)(sp+2*BY2WD));
 		up->psstate = sysctab[scallnr];
-		ret = systab[scallnr](up->s.args);
+		ret = systab[scallnr]((va_list)up->s.args);
 		poperror();
 	}else{
 		/* failure: save the error buffer for errstr */
@@ -794,8 +794,8 @@
 	p->kparg = arg;
 }
 
-long
-execregs(ulong entry, ulong ssize, ulong nargs)
+uintptr
+execregs(uintptr entry, ulong ssize, ulong nargs)
 {
 	Ureg *ur;
 	ulong *sp;
@@ -809,7 +809,7 @@
 	return USTKTOP-BY2WD;			/* address of user-level clock */
 }
 
-ulong
+uintptr
 userpc(void)
 {
 	Ureg *ur;
@@ -842,7 +842,7 @@
 	xp->r26 = (ulong)sched;
 }
 
-ulong
+uintptr
 dbgpc(Proc *p)
 {
 	Ureg *ur;
--- a/sys/src/9/bitsy/mmu.c
+++ b/sys/src/9/bitsy/mmu.c
@@ -523,7 +523,7 @@
 }
 
 void
-checkmmu(ulong, ulong)
+checkmmu(uintptr, uintptr)
 {
 }
 
--- a/sys/src/9/bitsy/trap.c
+++ b/sys/src/9/bitsy/trap.c
@@ -557,7 +557,7 @@
 		up->s = *((Sargs*)(sp+BY2WD));
 		up->psstate = sysctab[scallnr];
 
-		ret = systab[scallnr](up->s.args);
+		ret = systab[scallnr]((va_list)up->s.args);
 		poperror();
 	}else{
 		/* failure: save the error buffer for errstr */
@@ -757,7 +757,7 @@
 /*
  *  return the userpc the last exception happened at
  */
-ulong
+uintptr
 userpc(void)
 {
 	Ureg *ureg;
@@ -829,8 +829,8 @@
 /*
  *  setup stack, initial PC, and any arch dependent regs for an execing user proc.
  */
-long
-execregs(ulong entry, ulong ssize, ulong nargs)
+uintptr
+execregs(uintptr entry, ulong ssize, ulong nargs)
 {
 	ulong *sp;
 	Ureg *ureg;
@@ -901,7 +901,7 @@
 /*
  *  pc output by ps
  */
-ulong
+uintptr
 dbgpc(Proc *p)
 {
 	Ureg *ureg;
--- a/sys/src/9/boot/boot.c
+++ b/sys/src/9/boot/boot.c
@@ -30,7 +30,7 @@
 
 		print("argc=%d\n", argc);
 		for(i = 0; i < argc; i++)
-			print("%lux %s ", (ulong)argv[i], argv[i]);
+			print("%p %s ", argv[i], argv[i]);
 		print("\n");
 	}
 	USED(argc);
--- a/sys/src/9/kw/syscall.c
+++ b/sys/src/9/kw/syscall.c
@@ -224,7 +224,7 @@
 
 	/*	iprint("%s: syscall %s\n", up->text, sysctab[scallnr]?sysctab[scallnr]:"huh?"); */
 
-		ret = systab[scallnr](up->s.args);
+		ret = systab[scallnr]((va_list)up->s.args);
 		poperror();
 	}else{
 		/* failure: save the error buffer for errstr */
@@ -275,8 +275,8 @@
 	kexit(ureg);
 }
 
-long
-execregs(ulong entry, ulong ssize, ulong nargs)
+uintptr
+execregs(uintptr entry, ulong ssize, ulong nargs)
 {
 	ulong *sp;
 	Ureg *ureg;
--- a/sys/src/9/mtx/mmu.c
+++ b/sys/src/9/mtx/mmu.c
@@ -235,7 +235,7 @@
 }
 
 void
-checkmmu(ulong, ulong)
+checkmmu(uintptr, uintptr)
 {
 }
 
--- a/sys/src/9/mtx/trap.c
+++ b/sys/src/9/mtx/trap.c
@@ -533,8 +533,8 @@
 	}
 }
 
-long
-execregs(ulong entry, ulong ssize, ulong nargs)
+uintptr
+execregs(uintptr entry, ulong ssize, ulong nargs)
 {
 	ulong *sp;
 	Ureg *ureg;
@@ -566,7 +566,7 @@
 	p->insyscall = 0;
 }
 
-ulong
+uintptr
 userpc(void)
 {
 	Ureg *ureg;
@@ -600,7 +600,7 @@
 	ureg->sp = p->sched.sp+4;
 }
 
-ulong
+uintptr
 dbgpc(Proc *p)
 {
 	Ureg *ureg;
--- a/sys/src/9/omap/syscall.c
+++ b/sys/src/9/omap/syscall.c
@@ -222,7 +222,7 @@
 
 	/*	iprint("%s: syscall %s\n", up->text, sysctab[scallnr]?sysctab[scallnr]:"huh?"); */
 
-		ret = systab[scallnr](up->s.args);
+		ret = systab[scallnr]((va_list)up->s.args);
 		poperror();
 	}else{
 		/* failure: save the error buffer for errstr */
@@ -271,8 +271,9 @@
 	kexit(ureg);
 }
 
-long	/* void* */
-execregs(ulong entry, ulong ssize, ulong nargs)
+
+uintptr
+execregs(uintptr entry, ulong ssize, ulong nargs)
 {
 	ulong *sp;
 	Ureg *ureg;
--- a/sys/src/9/omap4/arch.c
+++ b/sys/src/9/omap4/arch.c
@@ -11,13 +11,13 @@
 
 void (*proctrace)(Proc *, int, vlong);
 
-ulong
+uintptr
 userpc(void)
 {
 	return dbgpc(up);
 }
 
-ulong
+uintptr
 dbgpc(Proc *p)
 {
 	Ureg *ureg;
@@ -101,8 +101,8 @@
 	p->insyscall = 0;
 }
 
-long
-execregs(ulong entry, ulong ssize, ulong nargs)
+uintptr
+execregs(uintptr entry, ulong ssize, ulong nargs)
 {
 	ulong *sp;
 	Ureg *ureg;
--- a/sys/src/9/pc/dat.h
+++ b/sys/src/9/pc/dat.h
@@ -38,7 +38,7 @@
 {
 	ulong	key;
 	ulong	sr;
-	ulong	pc;
+	uintptr	pc;
 	Proc	*p;
 	Mach	*m;
 	ushort	isilock;
--- a/sys/src/9/pc/mmu.c
+++ b/sys/src/9/pc/mmu.c
@@ -475,7 +475,7 @@
  * Error checking only.
  */
 void
-checkmmu(ulong va, ulong pa)
+checkmmu(uintptr va, uintptr pa)
 {
 	if(up->mmupdb == 0)
 		return;
@@ -482,7 +482,7 @@
 	if(!(vpd[PDX(va)]&PTEVALID) || !(vpt[VPTX(va)]&PTEVALID))
 		return;
 	if(PPN(vpt[VPTX(va)]) != pa)
-		print("%ld %s: va=%#08lux pa=%#08lux pte=%#08lux\n",
+		print("%ld %s: va=%#p pa=%#p pte=%#08lux\n",
 			up->pid, up->text,
 			va, pa, vpt[VPTX(va)]);
 }
--- a/sys/src/9/pc/trap.c
+++ b/sys/src/9/pc/trap.c
@@ -760,8 +760,7 @@
 			error(Ebadarg);
 		}
 		up->psstate = sysctab[scallnr];
-
-		ret = systab[scallnr](up->s.args);
+		ret = systab[scallnr]((va_list)up->s.args);
 		poperror();
 	}else{
 		/* failure: save the error buffer for errstr */
@@ -975,8 +974,8 @@
 	}
 }
 
-long
-execregs(ulong entry, ulong ssize, ulong nargs)
+uintptr
+execregs(uintptr entry, ulong ssize, ulong nargs)
 {
 	ulong *sp;
 	Ureg *ureg;
@@ -996,7 +995,7 @@
 /*
  *  return the userpc the last exception happened at
  */
-ulong
+uintptr
 userpc(void)
 {
 	Ureg *ureg;
--- a/sys/src/9/port/allocb.c
+++ b/sys/src/9/port/allocb.c
@@ -21,7 +21,7 @@
 _allocb(int size)
 {
 	Block *b;
-	ulong addr;
+	uintptr addr;
 
 	if((b = mallocz(sizeof(Block)+size+Hdrspc, 0)) == nil)
 		return nil;
@@ -34,13 +34,13 @@
 	_xinc(&b->ref);
 
 	/* align start of data portion by rounding up */
-	addr = (ulong)b;
+	addr = (uintptr)b;
 	addr = ROUND(addr + sizeof(Block), BLOCKALIGN);
 	b->base = (uchar*)addr;
 
 	/* align end of data portion by rounding down */
 	b->lim = ((uchar*)b) + msize(b);
-	addr = (ulong)(b->lim);
+	addr = (uintptr)(b->lim);
 	addr = addr & ~(BLOCKALIGN-1);
 	b->lim = (uchar*)addr;
 
--- a/sys/src/9/port/auth.c
+++ b/sys/src/9/port/auth.c
@@ -19,59 +19,68 @@
 	return strcmp(eve, up->user) == 0;
 }
 
-long
-sysfversion(ulong *arg)
+uintptr
+sysfversion(va_list list)
 {
+	uint msize, arglen;
 	char *vers;
-	uint arglen, m, msize;
 	Chan *c;
+	int fd;
 
-	msize = arg[1];
-	vers = (char*)arg[2];
-	arglen = arg[3];
-	validaddr(arg[2], arglen, 1);
+	fd = va_arg(list, int);
+	msize = va_arg(list, uint);
+	vers = va_arg(list, char*);
+	arglen = va_arg(list, uint);
+	validaddr((uintptr)vers, arglen, 1);
 	/* check there's a NUL in the version string */
 	if(arglen==0 || memchr(vers, 0, arglen)==0)
 		error(Ebadarg);
-	c = fdtochan(arg[0], ORDWR, 0, 1);
+	c = fdtochan(fd, ORDWR, 0, 1);
 	if(waserror()){
 		cclose(c);
 		nexterror();
 	}
-
-	m = mntversion(c, vers, msize, arglen);
-
+	msize = mntversion(c, vers, msize, arglen);
 	cclose(c);
 	poperror();
-	return m;
+	return msize;
 }
 
-long
-sys_fsession(ulong *arg)
+uintptr
+sys_fsession(va_list list)
 {
-	/* deprecated; backwards compatibility only */
+	int fd;
+	char *str;
+	uint len;
 
-	if(arg[2] == 0)
+	/* deprecated; backwards compatibility only */
+	fd = va_arg(list, int);
+	str = va_arg(list, char*);
+	len = va_arg(list, uint);
+	if(len == 0)
 		error(Ebadarg);
-	validaddr(arg[1], arg[2], 1);
-	((uchar*)arg[1])[0] = '\0';
+	validaddr((uintptr)str, len, 1);
+	*str = '\0';
+	USED(fd);
 	return 0;
 }
 
-long
-sysfauth(ulong *arg)
+uintptr
+sysfauth(va_list list)
 {
 	Chan *c, *ac;
 	char *aname;
 	int fd;
 
-	validaddr(arg[1], 1, 0);
-	aname = validnamedup((char*)arg[1], 1);
+	fd = va_arg(list, int);
+	aname = va_arg(list, char*);
+	validaddr((uintptr)aname, 1, 0);
+	aname = validnamedup(aname, 1);
 	if(waserror()){
 		free(aname);
 		nexterror();
 	}
-	c = fdtochan(arg[0], ORDWR, 0, 1);
+	c = fdtochan(fd, ORDWR, 0, 1);
 	if(waserror()){
 		cclose(c);
 		nexterror();
@@ -96,8 +105,7 @@
 
 	/* always mark it close on exec */
 	ac->flag |= CCEXEC;
-
-	return fd;
+	return (uintptr)fd;
 }
 
 /*
--- a/sys/src/9/port/chan.c
+++ b/sys/src/9/port/chan.c
@@ -1721,7 +1721,7 @@
  * to access unchecked addresses.) 
  */
 static char*
-validname0(char *aname, int slashok, int dup, ulong pc)
+validname0(char *aname, int slashok, int dup, uintptr pc)
 {
 	char *ename, *name, *s;
 	int c, n;
@@ -1728,7 +1728,7 @@
 	Rune r;
 
 	name = aname;
-	if((ulong)name < KZERO){
+	if((uintptr)name < KZERO){
 		if(!dup)
 			print("warning: validname called from %#p with user pointer", pc);
 		ename = vmemchr(name, 0, (1<<16));
--- a/sys/src/9/port/devkprof.c
+++ b/sys/src/9/port/devkprof.c
@@ -11,8 +11,8 @@
 
 struct
 {
-	int	minpc;
-	int	maxpc;
+	uintptr	minpc;
+	uintptr	maxpc;
 	int	nbuf;
 	int	time;
 	ulong	*buf;
@@ -30,7 +30,7 @@
 };
 
 static void
-_kproftimer(ulong pc)
+_kproftimer(uintptr pc)
 {
 	extern void spldone(void);
 
@@ -40,7 +40,7 @@
 	 *  if the pc is coming out of spllo or splx,
 	 *  use the pc saved when we went splhi.
 	 */
-	if(pc>=(ulong)spllo && pc<=(ulong)spldone)
+	if(pc>=(uintptr)spllo && pc<=(uintptr)spldone)
 		pc = m->splpc;
 
 	kprof.buf[0] += TK2MS(1);
@@ -67,7 +67,7 @@
 
 	/* allocate when first used */
 	kprof.minpc = KTZERO;
-	kprof.maxpc = (ulong)etext;
+	kprof.maxpc = (uintptr)etext;
 	kprof.nbuf = (kprof.maxpc-kprof.minpc) >> LRES;
 	n = kprof.nbuf*SZ;
 	if(kprof.buf == 0) {
--- a/sys/src/9/port/devproc.c
+++ b/sys/src/9/port/devproc.c
@@ -152,7 +152,7 @@
 #define	NOTEID(q)	((q).vers)
 
 void	procctlreq(Proc*, char*, int);
-int	procctlmemio(Proc*, ulong, int, void*, int);
+int	procctlmemio(Proc*, uintptr, int, void*, int);
 Chan*	proctext(Chan*, Proc*);
 Segment* txt2data(Proc*, Segment*);
 int	procstopped(void*);
@@ -699,7 +699,7 @@
 	int i, j, m, navail, ne, rsize;
 	long l;
 	uchar *rptr;
-	ulong offset;
+	uintptr offset;
 	Confmem *cm;
 	Mntwalk *mw;
 	Proc *p;
@@ -766,9 +766,9 @@
 			error(Eperm);
 
 		/* validate kernel addresses */
-		if(offset < (ulong)end) {
-			if(offset+n > (ulong)end)
-				n = (ulong)end - offset;
+		if(offset < (uintptr)end) {
+			if(offset+n > (uintptr)end)
+				n = (uintptr)end - offset;
 			memmove(a, (char*)offset, n);
 			return n;
 		}
@@ -910,7 +910,7 @@
 			sg = p->seg[i];
 			if(sg == 0)
 				continue;
-			j += sprint(statbuf+j, "%-6s %c%c %.8lux %.8lux %4ld\n",
+			j += sprint(statbuf+j, "%-6s %c%c %p %p %4ld\n",
 				sname[sg->type&SG_TYPE],
 				sg->type&SG_RONLY ? 'R' : ' ',
 				sg->profile ? 'P' : ' ',
@@ -1533,13 +1533,13 @@
 }
 
 int
-procctlmemio(Proc *p, ulong offset, int n, void *va, int read)
+procctlmemio(Proc *p, uintptr offset, int n, void *va, int read)
 {
 	KMap *k;
 	Pte *pte;
 	Page *pg;
 	Segment *s;
-	ulong soff, l;
+	uintptr soff, l;
 	char *a = va, *b;
 
 	for(;;) {
--- a/sys/src/9/port/fault.c
+++ b/sys/src/9/port/fault.c
@@ -6,7 +6,7 @@
 #include	"../port/error.h"
 
 int
-fault(ulong addr, int read)
+fault(uintptr addr, int read)
 {
 	Segment *s;
 	char *sps;
@@ -70,18 +70,19 @@
 	pexit(s, freemem);
 }
 
-void	(*checkaddr)(ulong, Segment *, Page *);
-ulong	addr2check;
+void	(*checkaddr)(uintptr, Segment *, Page *);
+uintptr	addr2check;
 
 int
-fixfault(Segment *s, ulong addr, int read, int doputmmu)
+fixfault(Segment *s, uintptr addr, int read, int doputmmu)
 {
 	int type;
 	int ref;
 	Pte **p, *etp;
-	ulong mmuphys=0, soff;
+	ulong mmuphys=0;
+	uintptr soff;
 	Page **pg, *lkp, *new;
-	Page *(*fn)(Segment*, ulong);
+	Page *(*fn)(Segment*, uintptr);
 
 	addr &= ~(BY2PG-1);
 	soff = addr-s->base;
@@ -198,7 +199,7 @@
 }
 
 void
-pio(Segment *s, ulong addr, ulong soff, Page **p)
+pio(Segment *s, uintptr addr, uintptr soff, Page **p)
 {
 	Page *new;
 	KMap *k;
@@ -205,7 +206,7 @@
 	Chan *c;
 	int n, ask;
 	char *kaddr;
-	ulong daddr;
+	uintptr daddr;
 	Page *loadrec;
 
 retry:
@@ -310,7 +311,7 @@
  * Called only in a system call
  */
 int
-okaddr(ulong addr, ulong len, int write)
+okaddr(uintptr addr, ulong len, int write)
 {
 	Segment *s;
 
@@ -332,10 +333,10 @@
 }
 
 void
-validaddr(ulong addr, ulong len, int write)
+validaddr(uintptr addr, ulong len, int write)
 {
 	if(!okaddr(addr, len, write)){
-		pprint("suicide: invalid address %#lux/%lud in sys call pc=%#lux\n", addr, len, userpc());
+		pprint("suicide: invalid address %#p/%lud in sys call pc=%#p\n", addr, len, userpc());
 		postnote(up, 1, "sys: bad address in syscall", NDebug);
 		error(Ebadarg);
 	}
@@ -348,10 +349,10 @@
 vmemchr(void *s, int c, int n)
 {
 	int m;
-	ulong a;
+	uintptr a;
 	void *t;
 
-	a = (ulong)s;
+	a = (uintptr)s;
 	while(PGROUND(a) != PGROUND(a+n-1)){
 		/* spans pages; handle this page */
 		m = BY2PG - (a & (BY2PG-1));
@@ -369,7 +370,7 @@
 }
 
 Segment*
-seg(Proc *p, ulong addr, int dolock)
+seg(Proc *p, uintptr addr, int dolock)
 {
 	Segment **s, **et, *n;
 
@@ -392,12 +393,13 @@
 	return 0;
 }
 
-extern void checkmmu(ulong, ulong);
+extern void checkmmu(uintptr, uintptr);
+
 void
 checkpages(void)
 {
 	int checked;
-	ulong addr, off;
+	uintptr addr, off;
 	Pte *p;
 	Page *pg;
 	Segment **sp, **ep, *s;
--- a/sys/src/9/port/mksystab
+++ b/sys/src/9/port/mksystab
@@ -5,7 +5,7 @@
 cat <<'!'
 #include "/sys/src/libc/9syscall/sys.h"
 
-typedef long Syscall(ulong*);
+typedef uintptr Syscall(va_list);
 
 !
 
--- a/sys/src/9/port/page.c
+++ b/sys/src/9/port/page.c
@@ -118,7 +118,7 @@
 }
 
 Page*
-newpage(int clear, Segment **s, ulong va)
+newpage(int clear, Segment **s, uintptr va)
 {
 	Page *p;
 	KMap *k;
@@ -409,7 +409,7 @@
 }
 
 void
-cachedel(Image *i, ulong daddr)
+cachedel(Image *i, uintptr daddr)
 {
 	Page *f;
 
@@ -434,7 +434,7 @@
 }
 
 Page *
-lookpage(Image *i, ulong daddr)
+lookpage(Image *i, uintptr daddr)
 {
 	Page *f;
 
@@ -574,7 +574,7 @@
 	nwrong = 0;
 	for(i=0; i<np; i++){
 		if(palloc.pages[i].ref != ref[i]){
-			iprint("page %#.8lux ref %d actual %lud\n", 
+			iprint("page %#p ref %d actual %lud\n", 
 				palloc.pages[i].pa, palloc.pages[i].ref, ref[i]);
 			ref[i] = 1;
 			nwrong++;
@@ -627,7 +627,7 @@
 						continue;
 					if(print){
 						if(ref[pagenumber(entry)])
-							iprint("page %#.8lux in segment %#p\n", entry->pa, s);
+							iprint("page %#p in segment %#p\n", entry->pa, s);
 						continue;
 					}
 					if(ref[pagenumber(entry)]++ == 0)
--- a/sys/src/9/port/portdat.h
+++ b/sys/src/9/port/portdat.h
@@ -83,7 +83,7 @@
 	Lock	use;
 	Proc	*head;		/* list of waiting processes */
 	Proc	*tail;
-	ulong	wpc;		/* pc of writer */
+	uintptr	wpc;		/* pc of writer */
 	Proc	*wproc;		/* writing proc */
 	int	readers;	/* number of readers */
 	int	writer;		/* number of writers */
@@ -97,7 +97,7 @@
 
 struct Sargs
 {
-	ulong	args[MAXSYSARG];
+	uchar	args[MAXSYSARG*BY2WD];
 };
 
 /*
@@ -313,9 +313,9 @@
 struct Page
 {
 	Lock;
-	ulong	pa;			/* Physical address in memory */
-	ulong	va;			/* Virtual address for user */
-	ulong	daddr;			/* Disc address on swap */
+	uintptr	pa;			/* Physical address in memory */
+	uintptr	va;			/* Virtual address for user */
+	uintptr	daddr;			/* Disc address on swap */
 	ulong	gen;			/* Generation counter for swap */
 	ushort	ref;			/* Reference count */
 	char	modref;			/* Simulated modify/reference bits */
@@ -378,9 +378,9 @@
 };
 
 #define PG_ONSWAP	1
-#define onswap(s)	(((ulong)s)&PG_ONSWAP)
-#define pagedout(s)	(((ulong)s)==0 || onswap(s))
-#define swapaddr(s)	(((ulong)s)&~PG_ONSWAP)
+#define onswap(s)	(((uintptr)s)&PG_ONSWAP)
+#define pagedout(s)	(((uintptr)s)==0 || onswap(s))
+#define swapaddr(s)	(((uintptr)s)&~PG_ONSWAP)
 
 #define SEGMAXSIZE	(SEGMAPSIZE*PTEMAPMEM)
 
@@ -388,9 +388,9 @@
 {
 	ulong	attr;			/* Segment attributes */
 	char	*name;			/* Attach name */
-	ulong	pa;			/* Physical address */
+	uintptr	pa;			/* Physical address */
 	ulong	size;			/* Maximum segment size in pages */
-	Page	*(*pgalloc)(Segment*, ulong);	/* Allocation if we need it */
+	Page	*(*pgalloc)(Segment*, uintptr);	/* Allocation if we need it */
 	void	(*pgfree)(Page*);
 };
 
@@ -409,11 +409,11 @@
 	QLock	lk;
 	ushort	steal;		/* Page stealer lock */
 	ushort	type;		/* segment type */
-	ulong	base;		/* virtual base */
-	ulong	top;		/* virtual top */
+	uintptr	base;		/* virtual base */
+	uintptr	top;		/* virtual top */
 	ulong	size;		/* size in pages */
-	ulong	fstart;		/* start address in file for demand load */
-	ulong	flen;		/* length of segment in file */
+	uintptr	fstart;		/* start address in file for demand load */
+	uintptr	flen;		/* length of segment in file */
 	int	flushme;	/* maintain icache for this segment */
 	Image	*image;		/* text in file attached to this segment */
 	Physseg *pseg;
@@ -490,8 +490,8 @@
 
 struct Pallocmem
 {
-	ulong base;
-	ulong npage;
+	uintptr	base;
+	ulong	npage;
 };
 
 struct Palloc
@@ -671,7 +671,7 @@
 	ulong	privatemem;	/* proc does not let anyone read mem */
 	int	hang;		/* hang at next exec for debug */
 	int	procctl;	/* Control for /proc debugging */
-	ulong	pc;		/* DEBUG only */
+	uintptr	pc;		/* DEBUG only */
 
 	Lock	rlock;		/* sync sleep/wakeup with postnote */
 	Rendez	*r;		/* rendezvous point slept on */
@@ -734,7 +734,7 @@
 	Edf	*edf;		/* if non-null, real-time proc, edf contains scheduling params */
 	int	trace;		/* process being traced? */
 
-	ulong	qpc;		/* pc calling last blocking qlock */
+	uintptr	qpc;		/* pc calling last blocking qlock */
 	QLock	*eql;		/* interruptable eqlock */
 
 	int	setargs;	/* process changed its args */
--- a/sys/src/9/port/portfns.h
+++ b/sys/src/9/port/portfns.h
@@ -9,12 +9,12 @@
 Block*		allocb(int);
 int		anyhigher(void);
 int		anyready(void);
-Image*		attachimage(int, Chan*, ulong, ulong);
+Image*		attachimage(int, Chan*, uintptr, ulong);
 Page*		auxpage(void);
 Block*		bl2mem(uchar*, Block*, int);
 int		blocklen(Block*);
 void		bootlinks(void);
-void		cachedel(Image*, ulong);
+void		cachedel(Image*, uintptr);
 void		cachepage(Page*, Image*);
 void		callwithureg(void(*)(Ureg*));
 char*		chanpath(Chan*);
@@ -51,7 +51,7 @@
 void		cunmount(Chan*, Chan*);
 void		cupdate(Chan*, uchar*, int, vlong);
 void		cwrite(Chan*, uchar*, int, vlong);
-ulong		dbgpc(Proc*);
+uintptr		dbgpc(Proc*);
 long		decref(Ref*);
 int		decrypt(void*, void*, int);
 void		delay(int);
@@ -99,17 +99,17 @@
 int		eqqid(Qid, Qid);
 void		error(char*);
 void		eqlock(QLock*);
-long		execregs(ulong, ulong, ulong);
+uintptr		execregs(uintptr, ulong, ulong);
 void		exhausted(char*);
 void		exit(int);
 uvlong		fastticks(uvlong*);
 uvlong		fastticks2ns(uvlong);
 uvlong		fastticks2us(uvlong);
-int		fault(ulong, int);
+int		fault(uintptr, int);
 void		fdclose(int, int);
 Chan*		fdtochan(int, int, int, int);
 int		findmount(Chan**, Mhead**, int, int, Qid);
-int		fixfault(Segment*, ulong, int, int);
+int		fixfault(Segment*, uintptr, int, int);
 void		flushmmu(void);
 void		forceclosefgrp(void);
 void		forkchild(Proc*, Ureg*);
@@ -120,8 +120,8 @@
 int		freebroken(void);
 void		freepte(Segment*, Pte*);
 void		getcolor(ulong, ulong*, ulong*, ulong*);
-ulong		getmalloctag(void*);
-ulong		getrealloctag(void*);
+uintptr		getmalloctag(void*);
+uintptr		getrealloctag(void*);
 void		gotolabel(Label*);
 char*		getconfenv(void);
 long		hostdomainwrite(char*, int);
@@ -129,7 +129,7 @@
 void		hzsched(void);
 Block*		iallocb(int);
 void		iallocsummary(void);
-long		ibrk(ulong, int);
+long		ibrk(uintptr, int);
 void		ilock(Lock*);
 void		iunlock(Lock*);
 long		incref(Ref*);
@@ -138,7 +138,7 @@
 void		isdir(Chan*);
 int		iseve(void);
 int		islo(void);
-Segment*	isoverlap(Proc*, ulong, int);
+Segment*	isoverlap(Proc*, uintptr, int);
 int		ispages(void*);
 int		isphysseg(char*);
 void		ixsummary(void);
@@ -146,7 +146,7 @@
 void		killbig(char*);
 void		kproc(char*, void(*)(void*), void*);
 void		kprocchild(Proc*, void (*)(void*), void*);
-void		(*kproftimer)(ulong);
+void		(*kproftimer)(uintptr);
 void		ksetenv(char*, char*, int);
 void		kstrcpy(char*, char*, int);
 void		kstrdup(char**, char*);
@@ -158,7 +158,7 @@
 long		logread(Log*, void*, ulong, long);
 void		log(Log*, int, char*, ...);
 Cmdtab*		lookupcmd(Cmdbuf*, Cmdtab*, int);
-Page*		lookpage(Image*, ulong);
+Page*		lookpage(Image*, uintptr);
 #define		MS2NS(n) (((vlong)(n))*1000000LL)
 void		machinit(void);
 void*		mallocz(ulong, int);
@@ -167,7 +167,7 @@
 void		mallocsummary(void);
 Block*		mem2bl(uchar*, int);
 int		mcountseg(Segment*);
-void		mfreeseg(Segment*, ulong, int);
+void		mfreeseg(Segment*, uintptr, int);
 void		microdelay(int);
 uvlong		mk64fract(uvlong, uvlong);
 void		mkqid(Qid*, vlong, ulong, int);
@@ -189,7 +189,7 @@
 int		newfd(Chan*);
 Mhead*		newmhead(Chan*);
 Mount*		newmount(Mhead*, Chan*, int, char*);
-Page*		newpage(int, Segment **, ulong);
+Page*		newpage(int, Segment **, uintptr);
 Path*		newpath(char*);
 Pgrp*		newpgrp(void);
 Rgrp*		newrgrp(void);
@@ -198,7 +198,7 @@
 int		notify(Ureg*);
 int		nrand(int);
 uvlong		ns2fastticks(uvlong);
-int		okaddr(ulong, ulong, int);
+int		okaddr(uintptr, ulong, int);
 int		openmode(ulong);
 Block*		packblock(Block*);
 Block*		padblock(Block*, int);
@@ -214,7 +214,7 @@
 void		pgrpcpy(Pgrp*, Pgrp*);
 void		pgrpnote(ulong, char*, long, int);
 int		pidalloc(Proc*);
-void		pio(Segment *, ulong, ulong, Page **);
+void		pio(Segment *, uintptr, uintptr, Page **);
 #define		poperror()		up->nerrlab--
 void		portcountpagerefs(ulong*, int);
 int		postnote(Proc*, int, char*, int);
@@ -287,7 +287,7 @@
 void*		realloc(void *v, ulong size);
 void		rebootcmd(int, char**);
 void		reboot(void*, void*, ulong);
-void		relocateseg(Segment*, ulong);
+void		relocateseg(Segment*, uintptr);
 void		renameuser(char*, char*);
 void		resched(char*);
 void		resrcwait(char*);
@@ -302,14 +302,14 @@
 void		schedinit(void);
 void		(*screenputs)(char*, int);
 long		seconds(void);
-ulong		segattach(Proc*, ulong, char *, ulong, ulong);
-void		segclock(ulong);
+uintptr		segattach(Proc*, ulong, char *, uintptr, ulong);
+void		segclock(uintptr);
 void		segpage(Segment*, Page*);
 int		setcolor(ulong, ulong, ulong, ulong);
 void		setkernur(Ureg*, Proc*);
 int		setlabel(Label*);
-void		setmalloctag(void*, ulong);
-void		setrealloctag(void*, ulong);
+void		setmalloctag(void*, uintptr);
+void		setrealloctag(void*, uintptr);
 void		setregisters(Ureg*, char*, char*, int);
 void		setswapchan(Chan*);
 char*		skipslash(char*);
@@ -322,11 +322,11 @@
 char*		srvname(Chan*);
 void		srvrenameuser(char*, char*);
 void		shrrenameuser(char*, char*);
-int		swapcount(ulong);
+int		swapcount(uintptr);
 int		swapfull(void);
 void		swapinit(void);
-void		syscallfmt(ulong syscallno, ulong pc, va_list list);
-void		sysretfmt(ulong syscallno, va_list list, long ret, uvlong start, uvlong stop);
+void		syscallfmt(ulong syscallno, uintptr pc, va_list list);
+void		sysretfmt(ulong syscallno, va_list list, uintptr ret, uvlong start, uvlong stop);
 void		timeradd(Timer*);
 void		timerdel(Timer*);
 void		timersinit(void);
@@ -356,9 +356,9 @@
 void		unlock(Lock*);
 uvlong		us2fastticks(uvlong);
 void		userinit(void);
-ulong		userpc(void);
+uintptr		userpc(void);
 long		userwrite(char*, int);
-void		validaddr(ulong, ulong, int);
+void		validaddr(uintptr, ulong, int);
 void		validname(char*, int);
 char*		validnamedup(char*, int);
 void		validstat(uchar*, int);
@@ -378,8 +378,8 @@
 void		yield(void);
 Segment*	data2txt(Segment*);
 Segment*	dupseg(Segment**, int, int);
-Segment*	newseg(int, ulong, ulong);
-Segment*	seg(Proc*, ulong, int);
+Segment*	newseg(int, uintptr, ulong);
+Segment*	seg(Proc*, uintptr, int);
 void		hnputv(void*, uvlong);
 void		hnputl(void*, uint);
 void		hnputs(void*, ushort);
--- a/sys/src/9/port/proc.c
+++ b/sys/src/9/port/proc.c
@@ -743,7 +743,7 @@
 	s = splhi();
 
 	if(up->nlocks.ref)
-		print("process %lud sleeps with %lud locks held, last lock %#p locked at pc %#lux, sleep called from %#p\n",
+		print("process %lud sleeps with %lud locks held, last lock %#p locked at pc %#p, sleep called from %#p\n",
 			up->pid, up->nlocks.ref, up->lastlock, up->lastlock->pc, getcallerpc(&r));
 	lock(r);
 	lock(&up->rlock);
@@ -1283,9 +1283,10 @@
 	s = p->psstate;
 	if(s == 0)
 		s = statename[p->state];
-	print("%3lud:%10s pc %8lux dbgpc %8lux  %8s (%s) ut %ld st %ld bss %lux qpc %lux nl %lud nd %lud lpc %lux pri %lud\n",
+	print("%3lud:%10s pc %#p dbgpc %#p  %8s (%s) ut %ld st %ld bss %lux qpc %#p nl %lud nd %lud lpc %#p pri %lud\n",
 		p->pid, p->text, p->pc, dbgpc(p),  s, statename[p->state],
-		p->time[0], p->time[1], bss, p->qpc, p->nlocks.ref, p->delaysched, p->lastlock ? p->lastlock->pc : 0, p->priority);
+		p->time[0], p->time[1], bss, p->qpc, p->nlocks.ref, p->delaysched,
+		p->lastlock ? p->lastlock->pc : 0, p->priority);
 }
 
 void
--- a/sys/src/9/port/segment.c
+++ b/sys/src/9/port/segment.c
@@ -47,7 +47,7 @@
 }
 
 Segment *
-newseg(int type, ulong base, ulong size)
+newseg(int type, uintptr base, ulong size)
 {
 	Segment *s;
 	int mapsize;
@@ -125,7 +125,7 @@
 }
 
 void
-relocateseg(Segment *s, ulong offset)
+relocateseg(Segment *s, uintptr offset)
 {
 	Page **pg, *x;
 	Pte *pte, **p, **endpte;
@@ -214,7 +214,7 @@
 segpage(Segment *s, Page *p)
 {
 	Pte **pte;
-	ulong off;
+	uintptr off;
 	Page **pg;
 
 	if(p->va < s->base || p->va >= s->top)
@@ -234,7 +234,7 @@
 }
 
 Image*
-attachimage(int type, Chan *c, ulong base, ulong len)
+attachimage(int type, Chan *c, uintptr base, ulong len)
 {
 	Image *i, **l;
 
@@ -392,10 +392,11 @@
 }
 
 long
-ibrk(ulong addr, int seg)
+ibrk(uintptr addr, int seg)
 {
 	Segment *s, *ns;
-	ulong newtop, newsize;
+	uintptr newtop;
+	ulong newsize;
 	int i, mapsize;
 	Pte **map;
 
@@ -492,10 +493,10 @@
  *  called with s->lk locked
  */
 void
-mfreeseg(Segment *s, ulong start, int pages)
+mfreeseg(Segment *s, uintptr start, int pages)
 {
 	int i, j, size;
-	ulong soff;
+	uintptr soff;
 	Page *pg;
 	Page *list;
 
@@ -553,11 +554,11 @@
 }
 
 Segment*
-isoverlap(Proc *p, ulong va, int len)
+isoverlap(Proc *p, uintptr va, int len)
 {
 	int i;
 	Segment *ns;
-	ulong newtop;
+	uintptr newtop;
 
 	newtop = va+len;
 	for(i = 0; i < NSEG; i++) {
@@ -615,8 +616,8 @@
 	return rv;
 }
 
-ulong
-segattach(Proc *p, ulong attr, char *name, ulong va, ulong len)
+uintptr
+segattach(Proc *p, ulong attr, char *name, uintptr va, ulong len)
 {
 	int sno;
 	Segment *s, *os;
@@ -625,7 +626,7 @@
 	if(va != 0 && va >= USTKTOP)
 		error(Ebadarg);
 
-	validaddr((ulong)name, 1, 0);
+	validaddr((uintptr)name, 1, 0);
 	vmemchr(name, 0, ~0);
 
 	for(sno = 0; sno < NSEG; sno++)
@@ -708,16 +709,17 @@
 	}
 }
 
-long
-syssegflush(ulong *arg)
+uintptr
+syssegflush(va_list list)
 {
 	Segment *s;
-	ulong addr, l;
+	ulong len, l;
 	Pte *pte;
-	int chunk, ps, pe, len;
+	int chunk, ps, pe;
+	uintptr addr;
 
-	addr = arg[0];
-	len = arg[1];
+	addr = va_arg(list, uintptr);
+	len = va_arg(list, ulong);
 
 	while(len > 0) {
 		s = seg(up, addr, 1);
@@ -760,7 +762,7 @@
 }
 
 void
-segclock(ulong pc)
+segclock(uintptr pc)
 {
 	Segment *s;
 
--- a/sys/src/9/port/swap.c
+++ b/sys/src/9/port/swap.c
@@ -77,7 +77,7 @@
 	uchar *idx;
 
 	lock(&swapalloc);
-	idx = &swapalloc.swmap[((ulong)p)/BY2PG];
+	idx = &swapalloc.swmap[((uintptr)p)/BY2PG];
 	if(*idx == 0)
 		panic("putswap %#p ref == 0", p);
 
@@ -111,7 +111,7 @@
 	uchar *idx;
 
 	lock(&swapalloc);
-	idx = &swapalloc.swmap[((ulong)p)/BY2PG];
+	idx = &swapalloc.swmap[((uintptr)p)/BY2PG];
 	if(*idx == 255)
 		swapalloc.xref++;
 	else {
@@ -122,7 +122,7 @@
 }
 
 int
-swapcount(ulong daddr)
+swapcount(uintptr daddr)
 {
 	return swapalloc.swmap[daddr/BY2PG];
 }
@@ -309,7 +309,7 @@
 static void
 pagepte(int type, Page **pg)
 {
-	ulong daddr;
+	uintptr daddr;
 	Page *outp;
 
 	outp = *pg;
--- a/sys/src/9/port/syscallfmt.c
+++ b/sys/src/9/port/syscallfmt.c
@@ -20,7 +20,7 @@
 		fmtprint(f, "0x0%s", suffix);
 		return;
 	}
-	validaddr((ulong)a, n, 0);
+	validaddr((uintptr)a, n, 0);
 	t = smalloc(n+1);
 	t[n] = 0;
 	for(i = 0; i < n; i++)
@@ -43,7 +43,7 @@
 		fmtprint(f, "0/\"\"%s", suffix);
 		return;
 	}
-	validaddr((ulong)a, 1, 0);
+	validaddr((uintptr)a, 1, 0);
 	n = ((char*)vmemchr(a, 0, 0x7fffffff) - a) + 1;
 	t = smalloc(n+1);
 	memmove(t, a, n);
@@ -53,7 +53,7 @@
 }
 
 void
-syscallfmt(ulong syscallno, ulong pc, va_list list)
+syscallfmt(ulong syscallno, uintptr pc, va_list list)
 {
 	long l;
 	Fmt fmt;
@@ -72,7 +72,7 @@
 		fmtprint(&fmt, "%s ", sysctab[syscallno]?
 			sysctab[syscallno]: "huh?");
 
-	fmtprint(&fmt, "%ulx ", pc);
+	fmtprint(&fmt, "%p ", pc);
 	switch(syscallno){
 	case SYSR1:
 		p = va_arg(list, uintptr);
@@ -113,7 +113,7 @@
 		argv = va_arg(list, char**);
 		evenaddr(PTR2UINT(argv));
 		for(;;){
-			validaddr((ulong)argv, sizeof(char**), 0);
+			validaddr((uintptr)argv, sizeof(char**), 0);
 			a = *(char **)argv;
 			if(a == nil)
 				break;
@@ -307,7 +307,7 @@
 }
 
 void
-sysretfmt(ulong syscallno, va_list list, long ret, uvlong start, uvlong stop)
+sysretfmt(ulong syscallno, va_list list, uintptr ret, uvlong start, uvlong stop)
 {
 	long l;
 	void* v;
@@ -324,9 +324,9 @@
 	case ALARM:
 	case _WRITE:
 	case PWRITE:
-		if(ret == -1)
+		if((long)ret == -1)
 			errstr = up->syserrstr;
-		fmtprint(&fmt, " = %ld", ret);
+		fmtprint(&fmt, " = %ld", (long)ret);
 		break;
 	case EXEC:
 	case SEGBRK:
@@ -341,10 +341,10 @@
 		l = va_arg(list, unsigned long);
 		if(ret > 0){
 			fmtuserstring(&fmt, a, " ");
-			fmtprint(&fmt, "%lud = %ld", l, ret);
+			fmtprint(&fmt, "%lud = %ld", l, (long)ret);
 		}
 		else{
-			fmtprint(&fmt, "%#p/\"\" %lud = %ld", a, l, ret);
+			fmtprint(&fmt, "%#p/\"\" %lud = %ld", a, l, (long)ret);
 			errstr = up->syserrstr;
 		}
 		break;
@@ -357,10 +357,10 @@
 			l = va_arg(list, unsigned long);
 		if(ret > 0){
 			fmtuserstring(&fmt, a, " ");
-			fmtprint(&fmt, "%lud = %ld", l, ret);
+			fmtprint(&fmt, "%lud = %ld", l, (long)ret);
 		}
 		else{
-			fmtprint(&fmt, "\"\" %lud = %ld", l, ret);
+			fmtprint(&fmt, "\"\" %lud = %ld", l, (long)ret);
 			errstr = up->syserrstr;
 		}
 		break;
@@ -371,10 +371,10 @@
 		l = va_arg(list, unsigned long);
 		if(ret > 0){
 			fmtuserstring(&fmt, a, " ");
-			fmtprint(&fmt, "%lud = %ld", l, ret);
+			fmtprint(&fmt, "%lud = %ld", l, (long)ret);
 		}
 		else{
-			fmtprint(&fmt, "\"\" %lud = %ld", l, ret);
+			fmtprint(&fmt, "\"\" %lud = %ld", l, (long)ret);
 			errstr = up->syserrstr;
 		}
 		break;
@@ -397,7 +397,7 @@
 			vl = va_arg(list, vlong);
 			fmtprint(&fmt, " %lld", vl);
 		}
-		fmtprint(&fmt, " = %ld", ret);
+		fmtprint(&fmt, " = %ld", (long)ret);
 		break;
 	}
 	fmtprint(&fmt, " %s %#llud %#llud\n", errstr, start, stop);
--- a/sys/src/9/port/sysfile.c
+++ b/sys/src/9/port/sysfile.c
@@ -113,7 +113,6 @@
 	f->fd[fd[0]] = c[0];
 	f->fd[fd[1]] = c[1];
 	unlockfgrp(f);
-
 	return 0;
 }
 
@@ -155,7 +154,6 @@
 			cclose(c);
 		error(Ebadusefd);
 	}
-
 	return c;
 }
 
@@ -170,29 +168,36 @@
 	return o;
 }
 
-long
-sysfd2path(ulong *arg)
+uintptr
+sysfd2path(va_list list)
 {
 	Chan *c;
+	char *buf;
+	uint len;
+	int fd;
 
-	validaddr(arg[1], arg[2], 1);
-
-	c = fdtochan(arg[0], -1, 0, 1);
-	snprint((char*)arg[1], arg[2], "%s", chanpath(c));
+	fd = va_arg(list, int);
+	buf = va_arg(list, char*);
+	len = va_arg(list, uint);
+	validaddr((uintptr)buf, len, 1);
+	c = fdtochan(fd, -1, 0, 1);
+	snprint(buf, len, "%s", chanpath(c));
 	cclose(c);
 	return 0;
 }
 
-long
-syspipe(ulong *arg)
+uintptr
+syspipe(va_list list)
 {
-	int fd[2];
+	int *fd;
 	Chan *c[2];
 	Dev *d;
 	static char *datastr[] = {"data", "data1"};
 
-	validaddr(arg[0], 2*BY2WD, 1);
-	evenaddr(arg[0]);
+	fd = va_arg(list, int*);
+	validaddr((uintptr)fd, 2*sizeof(int), 1);
+	evenaddr((uintptr)fd);
+
 	d = devtab[devno('|', 0)];
 	c[0] = namec("#|", Atodir, 0, 0);
 	c[1] = 0;
@@ -215,24 +220,23 @@
 	if(newfd2(fd, c) < 0)
 		error(Enofd);
 	poperror();
-
-	((long*)arg[0])[0] = fd[0];
-	((long*)arg[0])[1] = fd[1];
 	return 0;
 }
 
-long
-sysdup(ulong *arg)
+uintptr
+sysdup(va_list list)
 {
 	int fd;
 	Chan *c, *oc;
 	Fgrp *f = up->fgrp;
 
+	fd = va_arg(list, int);
+
 	/*
 	 * Close after dup'ing, so date > #d/1 works
 	 */
-	c = fdtochan(arg[0], -1, 0, 1);
-	fd = arg[1];
+	c = fdtochan(fd, -1, 0, 1);
+	fd = va_arg(list, int);
 	if(fd != -1){
 		lock(f);
 		if(fd<0 || growfd(f, fd)<0) {
@@ -258,19 +262,22 @@
 			error(Enofd);
 		poperror();
 	}
-
-	return fd;
+	return (uintptr)fd;
 }
 
-long
-sysopen(ulong *arg)
+uintptr
+sysopen(va_list list)
 {
 	int fd;
 	Chan *c;
+	char *name;
+	ulong mode;
 
-	openmode(arg[1]);	/* error check only */
-	validaddr(arg[0], 1, 0);
-	c = namec((char*)arg[0], Aopen, arg[1], 0);
+	name = va_arg(list, char*);
+	mode = va_arg(list, ulong);
+	openmode(mode);	/* error check only */
+	validaddr((uintptr)name, 1, 0);
+	c = namec(name, Aopen, mode, 0);
 	if(waserror()){
 		cclose(c);
 		nexterror();
@@ -279,7 +286,7 @@
 	if(fd < 0)
 		error(Enofd);
 	poperror();
-	return fd;
+	return (uintptr)fd;
 }
 
 void
@@ -311,12 +318,14 @@
 	cclose(c);
 }
 
-long
-sysclose(ulong *arg)
+uintptr
+sysclose(va_list list)
 {
-	fdtochan(arg[0], -1, 0, 0);
-	fdclose(arg[0], 0);
+	int fd;
 
+	fd = va_arg(list, int);
+	fdtochan(fd, -1, 0, 0);
+	fdclose(fd, 0);
 	return 0;
 }
 
@@ -625,17 +634,14 @@
 }
 
 static long
-read(ulong *arg, vlong *offp)
+read(int fd, uchar *p, long n, vlong *offp)
 {
-	long n, nn, nnn;
-	uchar *p;
+	long nn, nnn;
 	Chan *c;
 	vlong off;
 
-	n = arg[2];
-	validaddr(arg[1], n, 1);
-	p = (void*)arg[1];
-	c = fdtochan(arg[0], OREAD, 1, 1);
+	validaddr((uintptr)p, n, 1);
+	c = fdtochan(fd, OREAD, 1, 1);
 
 	if(waserror()){
 		cclose(c);
@@ -688,43 +694,51 @@
 
 	poperror();
 	cclose(c);
-
 	return nnn;
 }
 
-long
-sys_read(ulong *arg)
+uintptr
+sys_read(va_list list)
 {
-	return read(arg, nil);
+	int fd;
+	void *buf;
+	long len;
+
+	fd = va_arg(list, int);
+	buf = va_arg(list, void*);
+	len = va_arg(list, long);
+	return (uintptr)read(fd, buf, len, nil);
 }
 
-long
-syspread(ulong *arg)
+uintptr
+syspread(va_list list)
 {
-	vlong v;
-	va_list list;
+	int fd;
+	void *buf;
+	long len;
+	vlong off, *offp;
 
-	/* use varargs to guarantee alignment of vlong */
-	va_start(list, arg[2]);
-	v = va_arg(list, vlong);
-	va_end(list);
-
-	if(v == ~0ULL)
-		return read(arg, nil);
-
-	return read(arg, &v);
+	fd = va_arg(list, int);
+	buf = va_arg(list, void*);
+	len = va_arg(list, long);
+	off = va_arg(list, vlong);
+	if(off != ~0ULL)
+		offp = &off;
+	else
+		offp = nil;
+	return (uintptr)read(fd, buf, len, offp);
 }
 
 static long
-write(ulong *arg, vlong *offp)
+write(int fd, void *buf, long len, vlong *offp)
 {
 	Chan *c;
 	long m, n;
 	vlong off;
 
-	validaddr(arg[1], arg[2], 0);
+	validaddr((uintptr)buf, len, 0);
 	n = 0;
-	c = fdtochan(arg[0], OWRITE, 1, 1);
+	c = fdtochan(fd, OWRITE, 1, 1);
 	if(waserror()) {
 		if(offp == nil){
 			lock(c);
@@ -738,7 +752,7 @@
 	if(c->qid.type & QTDIR)
 		error(Eisdir);
 
-	n = arg[2];
+	n = len;
 
 	if(offp == nil){	/* use and maintain channel's offset */
 		lock(c);
@@ -751,8 +765,7 @@
 	if(off < 0)
 		error(Enegoff);
 
-	m = devtab[c->type]->write(c, (void*)arg[1], n, off);
-
+	m = devtab[c->type]->write(c, buf, n, off);
 	if(offp == nil && m < n){
 		lock(c);
 		c->offset -= n - m;
@@ -761,35 +774,43 @@
 
 	poperror();
 	cclose(c);
-
 	return m;
 }
 
-long
-sys_write(ulong *arg)
+uintptr
+sys_write(va_list list)
 {
-	return write(arg, nil);
+	int fd;
+	void *buf;
+	long len;
+
+	fd = va_arg(list, int);
+	buf = va_arg(list, void*);
+	len = va_arg(list, long);
+	return (uintptr)write(fd, buf, len, nil);
 }
 
-long
-syspwrite(ulong *arg)
+uintptr
+syspwrite(va_list list)
 {
-	vlong v;
-	va_list list;
+	int fd;
+	void *buf;
+	long len;
+	vlong off, *offp;
 
-	/* use varargs to guarantee alignment of vlong */
-	va_start(list, arg[2]);
-	v = va_arg(list, vlong);
-	va_end(list);
-
-	if(v == ~0ULL)
-		return write(arg, nil);
-
-	return write(arg, &v);
+	fd = va_arg(list, int);
+	buf = va_arg(list, void*);
+	len = va_arg(list, long);
+	off = va_arg(list, vlong);
+	if(off != ~0ULL)
+		offp = &off;
+	else
+		offp = nil;
+	return (uintptr)write(fd, buf, len, offp);
 }
 
-static void
-sseek(ulong *arg)
+static vlong
+sseek(int fd, vlong o, int type)
 {
 	Chan *c;
 	uchar buf[sizeof(Dir)+100];
@@ -796,12 +817,8 @@
 	Dir dir;
 	int n;
 	vlong off;
-	union {
-		vlong v;
-		ulong u[2];
-	} o;
 
-	c = fdtochan(arg[1], -1, 1, 1);
+	c = fdtochan(fd, -1, 1, 1);
 	if(waserror()){
 		cclose(c);
 		nexterror();
@@ -810,11 +827,9 @@
 		error(Eisstream);
 
 	off = 0;
-	o.u[0] = arg[2];
-	o.u[1] = arg[3];
-	switch(arg[4]){
+	switch(type){
 	case 0:
-		off = o.v;
+		off = o;
 		if((c->qid.type & QTDIR) && off != 0)
 			error(Eisdir);
 		if(off < 0)
@@ -826,7 +841,7 @@
 		if(c->qid.type & QTDIR)
 			error(Eisdir);
 		lock(c);	/* lock for read/write update */
-		off = o.v + c->offset;
+		off = o + c->offset;
 		if(off < 0){
 			unlock(c);
 			error(Enegoff);
@@ -841,7 +856,7 @@
 		n = devtab[c->type]->stat(c, buf, sizeof buf);
 		if(convM2D(buf, n, &dir, nil) == 0)
 			error("internal error: stat error in seek");
-		off = dir.length + o.v;
+		off = dir.length + o;
 		if(off < 0)
 			error(Enegoff);
 		c->offset = off;
@@ -850,38 +865,41 @@
 	default:
 		error(Ebadarg);
 	}
-	*(vlong*)arg[0] = off;
 	c->uri = 0;
 	c->dri = 0;
 	cclose(c);
 	poperror();
+	return off;
 }
 
-long
-sysseek(ulong *arg)
+uintptr
+sysseek(va_list list)
 {
-	validaddr(arg[0], BY2V, 1);
-	sseek(arg);
+	int fd, t;
+	vlong n, *v;
+
+	v = va_arg(list, vlong*);
+	validaddr((uintptr)v, sizeof(vlong), 1);
+
+	fd = va_arg(list, int);
+	n = va_arg(list, vlong);
+	t = va_arg(list, int);
+
+	*v = sseek(fd, n, t);
+
 	return 0;
 }
 
-long
-sysoseek(ulong *arg)
+uintptr
+sysoseek(va_list list)
 {
-	union {
-		vlong v;
-		ulong u[2];
-	} o;
-	ulong a[5];
+	int fd, t;
+	long n;
 
-	o.v = (long)arg[1];
-	a[0] = (ulong)&o.v;
-	a[1] = arg[0];
-	a[2] = o.u[0];
-	a[3] = o.u[1];
-	a[4] = arg[2];
-	sseek(a);
-	return o.v;
+	fd = va_arg(list, int);
+	n = va_arg(list, long);
+	t = va_arg(list, int);
+	return (uintptr)sseek(fd, n, t);
 }
 
 void
@@ -926,58 +944,67 @@
 	return p->s;
 }
 
-long
-sysfstat(ulong *arg)
+uintptr
+sysfstat(va_list list)
 {
 	Chan *c;
+	int fd;
 	uint l;
+	uchar *s;
 
-	l = arg[2];
-	validaddr(arg[1], l, 1);
-	c = fdtochan(arg[0], -1, 0, 1);
+	fd = va_arg(list, int);
+	s = va_arg(list, uchar*);
+	l = va_arg(list, uint);
+	validaddr((uintptr)s, l, 1);
+
+	c = fdtochan(fd, -1, 0, 1);
 	if(waserror()) {
 		cclose(c);
 		nexterror();
 	}
-	l = devtab[c->type]->stat(c, (uchar*)arg[1], l);
+	l = devtab[c->type]->stat(c, s, l);
 	poperror();
 	cclose(c);
 	return l;
 }
 
-long
-sysstat(ulong *arg)
+uintptr
+sysstat(va_list list)
 {
 	char *name;
 	Chan *c;
-	uint l;
+	uint l, r;
+	uchar *s;
 
-	l = arg[2];
-	validaddr(arg[1], l, 1);
-	validaddr(arg[0], 1, 0);
-	c = namec((char*)arg[0], Aaccess, 0, 0);
+	name = va_arg(list, char*);
+	s = va_arg(list, uchar*);
+	l = va_arg(list, uint);
+	validaddr((uintptr)s, l, 1);
+	validaddr((uintptr)name, 1, 0);
+	c = namec(name, Aaccess, 0, 0);
 	if(waserror()){
 		cclose(c);
 		nexterror();
 	}
-	l = devtab[c->type]->stat(c, (uchar*)arg[1], l);
+	r = devtab[c->type]->stat(c, s, l);
 	name = pathlast(c->path);
 	if(name)
-		l = dirsetname(name, strlen(name), (uchar*)arg[1], l, arg[2]);
+		r = dirsetname(name, strlen(name), s, r, l);
 
 	poperror();
 	cclose(c);
-	return l;
+	return r;
 }
 
-long
-syschdir(ulong *arg)
+uintptr
+syschdir(va_list list)
 {
 	Chan *c;
+	char *name;
 
-	validaddr(arg[0], 1, 0);
-
-	c = namec((char*)arg[0], Atodir, 0, 0);
+	name = va_arg(list, char*);
+	validaddr((uintptr)name, 1, 0);
+	c = namec(name, Atodir, 0, 0);
 	cclose(up->dot);
 	up->dot = c;
 	return 0;
@@ -999,7 +1026,7 @@
 		error(Ebadarg);
 
 	if(ismount){
-		validaddr((ulong)spec, 1, 0);
+		validaddr((uintptr)spec, 1, 0);
 		spec = validnamedup(spec, 1);
 		if(waserror()){
 			free(spec);
@@ -1033,7 +1060,7 @@
 		cclose(bc);
 	}else{
 		spec = 0;
-		validaddr((ulong)arg0, 1, 0);
+		validaddr((uintptr)arg0, 1, 0);
 		c0 = namec(arg0, Abind, 0, 0);
 	}
 
@@ -1042,7 +1069,7 @@
 		nexterror();
 	}
 
-	validaddr((ulong)arg1, 1, 0);
+	validaddr((uintptr)arg1, 1, 0);
 	c1 = namec(arg1, Amount, 0, 0);
 	if(waserror()){
 		cclose(c1);
@@ -1063,33 +1090,59 @@
 	return ret;
 }
 
-long
-sysbind(ulong *arg)
+uintptr
+sysbind(va_list list)
 {
-	return bindmount(0, -1, -1, (char*)arg[0], (char*)arg[1], arg[2], nil);
+	char *arg0, *arg1;
+	ulong flag;
+
+	arg0 = va_arg(list, char*);
+	arg1 = va_arg(list, char*);
+	flag = va_arg(list, ulong);
+	return (uintptr)bindmount(0, -1, -1, arg0, arg1, flag, nil);
 }
 
-long
-sysmount(ulong *arg)
+uintptr
+sysmount(va_list list)
 {
-	return bindmount(1, arg[0], arg[1], nil, (char*)arg[2], arg[3], (char*)arg[4]);
+	char *arg1, *spec;
+	ulong flag;
+	int fd, afd;
+
+	fd = va_arg(list, int);
+	afd = va_arg(list, int);
+	arg1 = va_arg(list, char*);
+	flag = va_arg(list, ulong);
+	spec = va_arg(list, char*);
+	return (uintptr)bindmount(1, fd, afd, nil, arg1, flag, spec);
 }
 
-long
-sys_mount(ulong *arg)
+uintptr
+sys_mount(va_list list)
 {
-	return bindmount(1, arg[0], -1, nil, (char*)arg[1], arg[2], (char*)arg[3]);
+	char *arg1, *spec;
+	ulong flag;
+	int fd;
+
+	fd = va_arg(list, int);
+	arg1 = va_arg(list, char*);
+	flag = va_arg(list, ulong);
+	spec = va_arg(list, char*);
+	return (uintptr)bindmount(1, fd, -1, nil, arg1, flag, spec);
 }
 
-long
-sysunmount(ulong *arg)
+uintptr
+sysunmount(va_list list)
 {
 	Chan *cmount, *cmounted;
+	char *name, *old;
 
-	cmounted = 0;
+	name = va_arg(list, char*);
+	old = va_arg(list, char*);
 
-	validaddr(arg[1], 1, 0);
-	cmount = namec((char *)arg[1], Amount, 0, 0);
+	cmounted = 0;
+	validaddr((uintptr)old, 1, 0);
+	cmount = namec(old, Amount, 0, 0);
 	if(waserror()) {
 		cclose(cmount);
 		if(cmounted)
@@ -1097,7 +1150,7 @@
 		nexterror();
 	}
 
-	if(arg[0]) {
+	if(name) {
 		/*
 		 * This has to be namec(..., Aopen, ...) because
 		 * if arg[0] is something like /srv/cs or /fd/0,
@@ -1104,8 +1157,8 @@
 		 * opening it is the only way to get at the real
 		 * Chan underneath.
 		 */
-		validaddr(arg[0], 1, 0);
-		cmounted = namec((char*)arg[0], Aopen, OREAD, 0);
+		validaddr((uintptr)name, 1, 0);
+		cmounted = namec(name, Aopen, OREAD, 0);
 	}
 	cunmount(cmount, cmounted);
 	poperror();
@@ -1115,15 +1168,19 @@
 	return 0;
 }
 
-long
-syscreate(ulong *arg)
+uintptr
+syscreate(va_list list)
 {
-	int fd;
+	int fd, mode, perm;
+	char *name;
 	Chan *c;
 
-	openmode(arg[1]&~OEXCL);	/* error check only; OEXCL okay here */
-	validaddr(arg[0], 1, 0);
-	c = namec((char*)arg[0], Acreate, arg[1], arg[2]);
+	name = va_arg(list, char*);
+	mode = va_arg(list, int);
+	perm = va_arg(list, int);
+	openmode(mode&~OEXCL);	/* error check only; OEXCL okay here */
+	validaddr((uintptr)name, 1, 0);
+	c = namec(name, Acreate, mode, perm);
 	if(waserror()) {
 		cclose(c);
 		nexterror();
@@ -1132,16 +1189,18 @@
 	if(fd < 0)
 		error(Enofd);
 	poperror();
-	return fd;
+	return (uintptr)fd;
 }
 
-long
-sysremove(ulong *arg)
+uintptr
+sysremove(va_list list)
 {
+	char *name;
 	Chan *c;
 
-	validaddr(arg[0], 1, 0);
-	c = namec((char*)arg[0], Aremove, 0, 0);
+	name = va_arg(list, char*);
+	validaddr((uintptr)name, 1, 0);
+	c = namec(name, Aremove, 0, 0);
 	/*
 	 * Removing mount points is disallowed to avoid surprises
 	 * (which should be removed: the mount point or the mounted Chan?).
@@ -1191,31 +1250,39 @@
 	return l;
 }
 
-long
-syswstat(ulong *arg)
+uintptr
+syswstat(va_list list)
 {
+	char *name;
+	uchar *s;
 	Chan *c;
 	uint l;
 
-	l = arg[2];
-	validaddr(arg[1], l, 0);
-	validstat((uchar*)arg[1], l);
-	validaddr(arg[0], 1, 0);
-	c = namec((char*)arg[0], Aaccess, 0, 0);
-	return wstat(c, (uchar*)arg[1], l);
+	name = va_arg(list, char*);
+	s = va_arg(list, uchar*);
+	l = va_arg(list, uint);
+	validaddr((uintptr)s, l, 0);
+	validstat(s, l);
+	validaddr((uintptr)name, 1, 0);
+	c = namec(name, Aaccess, 0, 0);
+	return (uintptr)wstat(c, s, l);
 }
 
-long
-sysfwstat(ulong *arg)
+uintptr
+sysfwstat(va_list list)
 {
+	uchar *s;
 	Chan *c;
 	uint l;
+	int fd;
 
-	l = arg[2];
-	validaddr(arg[1], l, 0);
-	validstat((uchar*)arg[1], l);
-	c = fdtochan(arg[0], -1, 1, 1);
-	return wstat(c, (uchar*)arg[1], l);
+	fd = va_arg(list, int);
+	s = va_arg(list, uchar*);
+	l = va_arg(list, uint);
+	validaddr((uintptr)s, l, 0);
+	validstat(s, l);
+	c = fdtochan(fd, -1, 1, 1);
+	return (uintptr)wstat(c, s, l);
 }
 
 static void
@@ -1252,19 +1319,21 @@
 	PBIT16(p, d->dev);
 }
 
-long
-sys_stat(ulong *arg)
+uintptr
+sys_stat(va_list list)
 {
 	Chan *c;
 	uint l;
-	uchar buf[128];	/* old DIRLEN plus a little should be plenty */
+	uchar *s, buf[128];	/* old DIRLEN plus a little should be plenty */
 	char strs[128], *name;
 	Dir d;
 	char old[] = "old stat system call - recompile";
 
-	validaddr(arg[1], 116, 1);
-	validaddr(arg[0], 1, 0);
-	c = namec((char*)arg[0], Aaccess, 0, 0);
+	name = va_arg(list, char*);
+	s = va_arg(list, uchar*);
+	validaddr((uintptr)s, 116, 1);
+	validaddr((uintptr)name, 1, 0);
+	c = namec(name, Aaccess, 0, 0);
 	if(waserror()){
 		cclose(c);
 		nexterror();
@@ -1279,7 +1348,7 @@
 	l = convM2D(buf, l, &d, strs);
 	if(l == 0)
 		error(old);
-	packoldstat((uchar*)arg[1], &d);
+	packoldstat(s, &d);
 	
 	poperror();
 	cclose(c);
@@ -1286,19 +1355,22 @@
 	return 0;
 }
 
-long
-sys_fstat(ulong *arg)
+uintptr
+sys_fstat(va_list list)
 {
 	Chan *c;
 	char *name;
 	uint l;
-	uchar buf[128];	/* old DIRLEN plus a little should be plenty */
+	uchar *s, buf[128];	/* old DIRLEN plus a little should be plenty */
 	char strs[128];
 	Dir d;
 	char old[] = "old fstat system call - recompile";
+	int fd;
 
-	validaddr(arg[1], 116, 1);
-	c = fdtochan(arg[0], -1, 0, 1);
+	fd = va_arg(list, int);
+	s = va_arg(list, uchar*);
+	validaddr((uintptr)s, 116, 1);
+	c = fdtochan(fd, -1, 0, 1);
 	if(waserror()){
 		cclose(c);
 		nexterror();
@@ -1313,7 +1385,7 @@
 	l = convM2D(buf, l, &d, strs);
 	if(l == 0)
 		error(old);
-	packoldstat((uchar*)arg[1], &d);
+	packoldstat(s, &d);
 	
 	poperror();
 	cclose(c);
@@ -1320,16 +1392,16 @@
 	return 0;
 }
 
-long
-sys_wstat(ulong *)
+uintptr
+sys_wstat(va_list)
 {
 	error("old wstat system call - recompile");
-	return -1;
+	return (uintptr)-1;
 }
 
-long
-sys_fwstat(ulong *)
+uintptr
+sys_fwstat(va_list)
 {
 	error("old fwstat system call - recompile");
-	return -1;
+	return (uintptr)-1;
 }
--- a/sys/src/9/port/sysproc.c
+++ b/sys/src/9/port/sysproc.c
@@ -14,8 +14,8 @@
 extern void checkpages(void);
 extern void checkpagerefs(void);
 
-long
-sysr1(ulong*)
+uintptr
+sysr1(va_list)
 {
 	if(!iseve())
 		error(Eperm);
@@ -29,8 +29,8 @@
 	pexit("fork aborted", 1);
 }
 
-long
-sysrfork(ulong *arg)
+uintptr
+sysrfork(va_list list)
 {
 	Proc *p;
 	int n, i;
@@ -41,7 +41,7 @@
 	ulong pid, flag;
 	Mach *wm;
 
-	flag = arg[0];
+	flag = va_arg(list, ulong);
 	/* Check flags before we commit */
 	if((flag & (RFFDG|RFCFDG)) == (RFFDG|RFCFDG))
 		error(Ebadarg);
@@ -221,7 +221,7 @@
 		procwired(p, wm->machno);
 	ready(p);
 	sched();
-	return pid;
+	return (uintptr)pid;
 }
 
 static ulong
@@ -233,29 +233,30 @@
 	return (cp[0]<<24) | (cp[1]<<16) | (cp[2]<<8) | cp[3];
 }
 
-long
-sysexec(ulong *arg)
+uintptr
+sysexec(va_list list)
 {
 	Segment *s, *ts;
-	ulong t, d, b;
 	int i;
 	Chan *tc;
-	char **argv, **argp;
+	char **argv, **argp, **argp0;
 	char *a, *charp, *args, *file, *file0;
 	char *progarg[sizeof(Exec)/2+1], *elem, progelem[64];
-	ulong ssize, tstk, nargs, nbytes, n, bssend;
+	ulong magic, ssize, nargs, nbytes, n;
+	uintptr t, d, b, entry, bssend, text, data, bss, tstk;
 	int indir;
 	Exec exec;
 	char line[sizeof(Exec)];
 	Fgrp *f;
 	Image *img;
-	ulong magic, text, entry, data, bss;
 	Tos *tos;
 
 	a = nil;
 	elem = nil;
-	validaddr(arg[0], 1, 0);
-	file0 = validnamedup((char*)arg[0], 1);
+	file0 = va_arg(list, char*);
+	validaddr((uintptr)file0, 1, 0);
+	argp0 = va_arg(list, char**);
+	file0 = validnamedup(file0, 1);
 	if(waserror()){
 		free(file0);
 		free(elem);
@@ -305,8 +306,7 @@
 		 */
 		progarg[n++] = file;
 		progarg[n] = 0;
-		validaddr(arg[1], BY2WD, 1);
-		arg[1] += BY2WD;
+		argp0++;
 		file = progarg[0];
 		if(strlen(elem) >= sizeof progelem)
 			error(Ebadexec);
@@ -338,14 +338,14 @@
 			nargs++;
 		}
 	}
-	evenaddr(arg[1]);
-	argp = (char**)arg[1];
-	validaddr((ulong)argp, BY2WD, 0);
+	argp = argp0;
+	evenaddr((uintptr)argp);
+	validaddr((uintptr)argp, BY2WD, 0);
 	while(*argp){
 		a = *argp++;
-		if(((ulong)argp&(BY2PG-1)) < BY2WD)
-			validaddr((ulong)argp, BY2WD, 0);
-		validaddr((ulong)a, 1, 0);
+		if(((uintptr)argp&(BY2PG-1)) < BY2WD)
+			validaddr((uintptr)argp, BY2WD, 0);
+		validaddr((uintptr)a, 1, 0);
 		nbytes += ((char*)vmemchr(a, 0, 0x7FFFFFFF) - a) + 1;
 		nargs++;
 	}
@@ -393,12 +393,12 @@
 	if(indir)
 		argp = progarg;
 	else
-		argp = (char**)arg[1];
+		argp = argp0;
 
 	for(i=0; i<nargs; i++){
 		if(indir && *argp==0) {
 			indir = 0;
-			argp = (char**)arg[1];
+			argp = argp0;
 		}
 		*argv++ = charp + (USTKTOP-tstk);
 		n = strlen(*argp) + 1;
@@ -557,45 +557,45 @@
 	return 0;
 }
 
-long
-syssleep(ulong *arg)
+uintptr
+syssleep(va_list list)
 {
+	long ms;
 
-	int n;
-
-	n = arg[0];
-	if(n <= 0) {
+	ms = va_arg(list, long);
+	if(ms <= 0) {
 		if (up->edf && (up->edf->flags & Admitted))
 			edfyield();
 		else
 			yield();
-		return 0;
+	} else {
+		if(ms < TK2MS(1))
+			ms = TK2MS(1);
+		tsleep(&up->sleep, return0, 0, ms);
 	}
-	if(n < TK2MS(1))
-		n = TK2MS(1);
-	tsleep(&up->sleep, return0, 0, n);
 	return 0;
 }
 
-long
-sysalarm(ulong *arg)
+uintptr
+sysalarm(va_list list)
 {
-	return procalarm(arg[0]);
+	return (uintptr)procalarm(va_arg(list, ulong));
 }
 
-long
-sysexits(ulong *arg)
+
+uintptr
+sysexits(va_list list)
 {
 	char *status;
 	char *inval = "invalid exit string";
 	char buf[ERRMAX];
 
-	status = (char*)arg[0];
+	status = va_arg(list, char*);
 	if(status){
 		if(waserror())
 			status = inval;
 		else{
-			validaddr((ulong)status, 1, 0);
+			validaddr((uintptr)status, 1, 0);
 			if(vmemchr(status, 0, ERRMAX) == 0){
 				memmove(buf, status, ERRMAX);
 				buf[ERRMAX-1] = 0;
@@ -606,53 +606,57 @@
 
 	}
 	pexit(status, 1);
-	return 0;		/* not reached */
+	return 0;	/* not reached */
 }
 
-long
-sys_wait(ulong *arg)
+uintptr
+sys_wait(va_list list)
 {
 	int pid;
 	Waitmsg w;
 	OWaitmsg *ow;
 
-	if(arg[0] == 0)
-		return pwait(nil);
-
-	validaddr(arg[0], sizeof(OWaitmsg), 1);
-	evenaddr(arg[0]);
-	pid = pwait(&w);
-	if(pid >= 0){
-		ow = (OWaitmsg*)arg[0];
-		readnum(0, ow->pid, NUMSIZE, w.pid, NUMSIZE);
-		readnum(0, ow->time+TUser*NUMSIZE, NUMSIZE, w.time[TUser], NUMSIZE);
-		readnum(0, ow->time+TSys*NUMSIZE, NUMSIZE, w.time[TSys], NUMSIZE);
-		readnum(0, ow->time+TReal*NUMSIZE, NUMSIZE, w.time[TReal], NUMSIZE);
-		strncpy(ow->msg, w.msg, sizeof(ow->msg)-1);
-		ow->msg[sizeof(ow->msg)-1] = '\0';
+	ow = va_arg(list, OWaitmsg*);
+	if(ow == 0)
+		pid = pwait(nil);
+	else {
+		validaddr((uintptr)ow, sizeof(OWaitmsg), 1);
+		evenaddr((uintptr)ow);
+		pid = pwait(&w);
+		if(pid >= 0){
+			readnum(0, ow->pid, NUMSIZE, w.pid, NUMSIZE);
+			readnum(0, ow->time+TUser*NUMSIZE, NUMSIZE, w.time[TUser], NUMSIZE);
+			readnum(0, ow->time+TSys*NUMSIZE, NUMSIZE, w.time[TSys], NUMSIZE);
+			readnum(0, ow->time+TReal*NUMSIZE, NUMSIZE, w.time[TReal], NUMSIZE);
+			strncpy(ow->msg, w.msg, sizeof(ow->msg)-1);
+			ow->msg[sizeof(ow->msg)-1] = '\0';
+		}
 	}
-	return pid;
+	return (uintptr)pid;
 }
 
-long
-sysawait(ulong *arg)
+uintptr
+sysawait(va_list list)
 {
 	int i;
 	int pid;
+	char *p;
 	Waitmsg w;
-	ulong n;
+	uint n;
 
-	n = arg[1];
-	validaddr(arg[0], n, 1);
+	p = va_arg(list, char*);
+	n = va_arg(list, uint);
+	validaddr((uintptr)p, n, 1);
 	pid = pwait(&w);
 	if(pid < 0)
-		return -1;
-	i = snprint((char*)arg[0], n, "%d %lud %lud %lud %q",
-		w.pid,
-		w.time[TUser], w.time[TSys], w.time[TReal],
-		w.msg);
-
-	return i;
+		i = -1;
+	else {
+		i = snprint(p, n, "%d %lud %lud %lud %q",
+			w.pid,
+			w.time[TUser], w.time[TSys], w.time[TReal],
+			w.msg);
+	}
+	return (uintptr)i;
 }
 
 void
@@ -668,7 +672,7 @@
 	va_end(va);
 }
 
-static long
+static int
 generrstr(char *buf, uint nbuf)
 {
 	char tmp[ERRMAX];
@@ -675,7 +679,7 @@
 
 	if(nbuf == 0)
 		error(Ebadarg);
-	validaddr((ulong)buf, nbuf, 1);
+	validaddr((uintptr)buf, nbuf, 1);
 	if(nbuf > sizeof tmp)
 		nbuf = sizeof tmp;
 	memmove(tmp, buf, nbuf);
@@ -688,44 +692,51 @@
 	return 0;
 }
 
-long
-syserrstr(ulong *arg)
+uintptr
+syserrstr(va_list list)
 {
-	return generrstr((char*)arg[0], arg[1]);
+	char *buf;
+	uint len;
+
+	buf = va_arg(list, char*);
+	len = va_arg(list, uint);
+	return (uintptr)generrstr(buf, len);
 }
 
 /* compatibility for old binaries */
-long
-sys_errstr(ulong *arg)
+uintptr
+sys_errstr(va_list list)
 {
-	return generrstr((char*)arg[0], 64);
+	return (uintptr)generrstr(va_arg(list, char*), 64);
 }
 
-long
-sysnotify(ulong *arg)
+uintptr
+sysnotify(va_list list)
 {
-	if(arg[0] != 0)
-		validaddr(arg[0], sizeof(ulong), 0);
-	up->notify = (int(*)(void*, char*))(arg[0]);
+	int (*f)(void*, char*);
+	f = va_arg(list, void*);
+	if(f != 0)
+		validaddr((uintptr)f, sizeof(void*), 0);
+	up->notify = f;
 	return 0;
 }
 
-long
-sysnoted(ulong *arg)
+uintptr
+sysnoted(va_list list)
 {
-	if(arg[0]!=NRSTR && !up->notified)
+	if(va_arg(list, int) !=NRSTR && !up->notified)
 		error(Egreg);
 	return 0;
 }
 
-long
-syssegbrk(ulong *arg)
+uintptr
+syssegbrk(va_list list)
 {
 	int i;
-	ulong addr;
+	uintptr addr;
 	Segment *s;
 
-	addr = arg[0];
+	addr = va_arg(list, uintptr);
 	for(i = 0; i < NSEG; i++) {
 		s = up->seg[i];
 		if(s == 0 || addr < s->base || addr >= s->top)
@@ -736,27 +747,37 @@
 		case SG_STACK:
 			error(Ebadarg);
 		default:
-			return ibrk(arg[1], i);
+			return (uintptr)ibrk(va_arg(list, uintptr), i);
 		}
 	}
-
 	error(Ebadarg);
-	return 0;		/* not reached */
+	return 0;	/* not reached */
 }
 
-long
-syssegattach(ulong *arg)
+uintptr
+syssegattach(va_list list)
 {
-	return segattach(up, arg[0], (char*)arg[1], arg[2], arg[3]);
+	ulong attr;
+	char *name;
+	uintptr va;
+	ulong len;
+
+	attr = va_arg(list, ulong);
+	name = va_arg(list, char*);
+	va = va_arg(list, uintptr);
+	len = va_arg(list, ulong);
+	return segattach(up, attr, name, va, len);
 }
 
-long
-syssegdetach(ulong *arg)
+uintptr
+syssegdetach(va_list list)
 {
 	int i;
-	ulong addr;
+	uintptr addr;
 	Segment *s;
 
+	addr = va_arg(list, uintptr);
+
 	qlock(&up->seglock);
 	if(waserror()){
 		qunlock(&up->seglock);
@@ -764,7 +785,6 @@
 	}
 
 	s = 0;
-	addr = arg[0];
 	for(i = 0; i < NSEG; i++)
 		if(s = up->seg[i]) {
 			qlock(&s->lk);
@@ -795,17 +815,19 @@
 	return 0;
 }
 
-long
-syssegfree(ulong *arg)
+uintptr
+syssegfree(va_list list)
 {
 	Segment *s;
-	ulong from, to;
+	uintptr from, to;
 
-	from = arg[0];
+	from = va_arg(list, uintptr);
 	s = seg(up, from, 1);
 	if(s == nil)
 		error(Ebadarg);
-	to = (from + arg[1]) & ~(BY2PG-1);
+	to = va_arg(list, ulong);
+	to += from;
+	to &= ~(BY2PG-1);
 	from = PGROUND(from);
 
 	if(to > s->top) {
@@ -816,24 +838,24 @@
 	mfreeseg(s, from, (to - from) / BY2PG);
 	qunlock(&s->lk);
 	flushmmu();
-
 	return 0;
 }
 
 /* For binary compatibility */
-long
-sysbrk_(ulong *arg)
+uintptr
+sysbrk_(va_list list)
 {
-	return ibrk(arg[0], BSEG);
+	return (uintptr)ibrk(va_arg(list, uintptr), BSEG);
 }
 
-long
-sysrendezvous(ulong *arg)
+uintptr
+sysrendezvous(va_list list)
 {
-	uintptr tag, val;
+	uintptr tag, val, new;
 	Proc *p, **l;
 
-	tag = arg[0];
+	tag = va_arg(list, uintptr);
+	new = va_arg(list, uintptr);
 	l = &REND(up->rgrp, tag);
 
 	lock(up->rgrp);
@@ -841,7 +863,7 @@
 		if(p->rendtag == tag) {
 			*l = p->rendhash;
 			val = p->rendval;
-			p->rendval = arg[1];
+			p->rendval = new;
 			unlock(up->rgrp);
 
 			ready(p);
@@ -853,7 +875,7 @@
 
 	/* Going to sleep here */
 	up->rendtag = tag;
-	up->rendval = arg[1];
+	up->rendval = new;
 	up->rendhash = *l;
 	*l = up;
 	up->state = Rendezvous;
@@ -1102,65 +1124,62 @@
 	return 1;
 }
 
-long
-syssemacquire(ulong *arg)
+uintptr
+syssemacquire(va_list list)
 {
 	int block;
 	long *addr;
 	Segment *s;
 
-	evenaddr(arg[0]);
-	addr = (long*)arg[0];
-	block = arg[1];
-
-	s = seg(up, (ulong)addr, 0);
-	if(s == nil || (s->type&SG_RONLY) != 0 || (ulong)addr+sizeof(long) > s->top){
-		validaddr((ulong)addr, sizeof(long), 1);
+	addr = va_arg(list, long*);
+	block = va_arg(list, int);
+	evenaddr((uintptr)addr);
+	s = seg(up, (uintptr)addr, 0);
+	if(s == nil || (s->type&SG_RONLY) != 0 || (uintptr)addr+sizeof(long) > s->top){
+		validaddr((uintptr)addr, sizeof(long), 1);
 		error(Ebadarg);
 	}
 	if(*addr < 0)
 		error(Ebadarg);
-	return semacquire(s, addr, block);
+	return (uintptr)semacquire(s, addr, block);
 }
 
-long
-systsemacquire(ulong *arg)
+uintptr
+systsemacquire(va_list list)
 {
 	long *addr;
 	ulong ms;
 	Segment *s;
 
-	evenaddr(arg[0]);
-	addr = (long*)arg[0];
-	ms = arg[1];
-
-	s = seg(up, (ulong)addr, 0);
-	if(s == nil || (s->type&SG_RONLY) != 0 || (ulong)addr+sizeof(long) > s->top){
-		validaddr((ulong)addr, sizeof(long), 1);
+	addr = va_arg(list, long*);
+	ms = va_arg(list, ulong);
+	evenaddr((uintptr)addr);
+	s = seg(up, (uintptr)addr, 0);
+	if(s == nil || (s->type&SG_RONLY) != 0 || (uintptr)addr+sizeof(long) > s->top){
+		validaddr((uintptr)addr, sizeof(long), 1);
 		error(Ebadarg);
 	}
 	if(*addr < 0)
 		error(Ebadarg);
-	return tsemacquire(s, addr, ms);
+	return (uintptr)tsemacquire(s, addr, ms);
 }
 
-long
-syssemrelease(ulong *arg)
+uintptr
+syssemrelease(va_list list)
 {
 	long *addr, delta;
 	Segment *s;
 
-	evenaddr(arg[0]);
-	addr = (long*)arg[0];
-	delta = arg[1];
-
-	s = seg(up, (ulong)addr, 0);
-	if(s == nil || (s->type&SG_RONLY) != 0 || (ulong)addr+sizeof(long) > s->top){
-		validaddr((ulong)addr, sizeof(long), 1);
+	addr = va_arg(list, long*);
+	delta = va_arg(list, long);
+	evenaddr((uintptr)addr);
+	s = seg(up, (uintptr)addr, 0);
+	if(s == nil || (s->type&SG_RONLY) != 0 || (uintptr)addr+sizeof(long) > s->top){
+		validaddr((uintptr)addr, sizeof(long), 1);
 		error(Ebadarg);
 	}
 	/* delta == 0 is a no-op, not a release */
 	if(delta < 0 || *addr < 0)
 		error(Ebadarg);
-	return semrelease(s, addr, delta);
+	return (uintptr)semrelease(s, addr, delta);
 }
--- a/sys/src/9/port/systab.h
+++ b/sys/src/9/port/systab.h
@@ -1,6 +1,6 @@
 #include "/sys/src/libc/9syscall/sys.h"
 
-typedef long Syscall(ulong*);
+typedef uintptr Syscall(va_list);
 
 Syscall sysr1;
 Syscall sys_errstr;
--- a/sys/src/9/port/taslock.c
+++ b/sys/src/9/port/taslock.c
@@ -51,12 +51,12 @@
 }
 
 void
-lockloop(Lock *l, ulong pc)
+lockloop(Lock *l, uintptr pc)
 {
 	Proc *p;
 
 	p = l->p;
-	print("lock %#p loop key %#lux pc %#lux held by pc %#lux proc %lud\n",
+	print("lock %#p loop key %#lux pc %#p held by pc %#p proc %lud\n",
 		l, l->key, pc, l->pc, p ? p->pid : 0);
 	dumpaproc(up);
 	if(p != nil)
@@ -67,7 +67,7 @@
 lock(Lock *l)
 {
 	int i;
-	ulong pc;
+	uintptr pc;
 
 	pc = getcallerpc(&l);
 
@@ -98,7 +98,7 @@
 				 * Priority inversion, yield on a uniprocessor; on a
 				 * multiprocessor, the other processor will unlock
 				 */
-				print("inversion %#p pc %#lux proc %lud held by pc %#lux proc %lud\n",
+				print("inversion %#p pc %#p proc %lud held by pc %#p 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 */
 			}
@@ -129,7 +129,7 @@
 ilock(Lock *l)
 {
 	ulong x;
-	ulong pc;
+	uintptr pc;
 
 	pc = getcallerpc(&l);
 	lockstats.locks++;
@@ -203,9 +203,9 @@
 	if(l->key == 0)
 		print("unlock: not locked: pc %#p\n", getcallerpc(&l));
 	if(l->isilock)
-		print("unlock of ilock: pc %lux, held by %lux\n", getcallerpc(&l), l->pc);
+		print("unlock of ilock: pc %#p, held by %#p\n", getcallerpc(&l), l->pc);
 	if(l->p != up)
-		print("unlock: up changed: pc %#p, acquired at pc %lux, lock p %#p, unlock up %#p\n", getcallerpc(&l), l->pc, l->p, up);
+		print("unlock: up changed: pc %#p, acquired at pc %#p, lock p %#p, unlock up %#p\n", getcallerpc(&l), l->pc, l->p, up);
 	l->m = nil;
 	l->key = 0;
 	coherence();
@@ -240,9 +240,9 @@
 	if(l->key == 0)
 		print("iunlock: not locked: pc %#p\n", getcallerpc(&l));
 	if(!l->isilock)
-		print("iunlock of lock: pc %#p, held by %#lux\n", getcallerpc(&l), l->pc);
+		print("iunlock of lock: pc %#p, held by %#p\n", getcallerpc(&l), l->pc);
 	if(islo())
-		print("iunlock while lo: pc %#p, held by %#lux\n", getcallerpc(&l), l->pc);
+		print("iunlock while lo: pc %#p, held by %#p\n", getcallerpc(&l), l->pc);
 
 	sr = l->sr;
 	l->m = nil;
--- a/sys/src/9/ppc/mmu.c
+++ b/sys/src/9/ppc/mmu.c
@@ -262,7 +262,7 @@
 }
 
 void
-checkmmu(ulong, ulong)
+checkmmu(uintptr, uintptr)
 {
 }
 
--- a/sys/src/9/ppc/trap.c
+++ b/sys/src/9/ppc/trap.c
@@ -525,8 +525,8 @@
 	}
 }
 
-long
-execregs(ulong entry, ulong ssize, ulong nargs)
+uintptr
+execregs(uintptr entry, ulong ssize, ulong nargs)
 {
 	ulong *sp;
 	Ureg *ureg;
@@ -559,7 +559,7 @@
 	p->insyscall = 0;
 }
 
-ulong
+uintptr
 userpc(void)
 {
 	Ureg *ureg;
@@ -593,7 +593,7 @@
 	ureg->sp = p->sched.sp+4;
 }
 
-ulong
+uintptr
 dbgpc(Proc *p)
 {
 	Ureg *ureg;
@@ -651,7 +651,7 @@
 		up->s = *((Sargs*)(sp+BY2WD));
 		up->psstate = sysctab[scallnr];
 
-		ret = systab[scallnr](up->s.args);
+		ret = systab[scallnr]((va_list)up->s.args);
 		poperror();
 	}else{
 		/* failure: save the error buffer for errstr */
--- a/sys/src/9/teg2/syscall.c
+++ b/sys/src/9/teg2/syscall.c
@@ -248,7 +248,7 @@
 
 	/*	iprint("%s: syscall %s\n", up->text, sysctab[scallnr]?sysctab[scallnr]:"huh?"); */
 
-		ret = systab[scallnr](up->s.args);
+		ret = systab[scallnr]((va_list)up->s.args);
 		poperror();
 	}else{
 		/* failure: save the error buffer for errstr */
@@ -304,8 +304,8 @@
 	kexit(ureg);
 }
 
-long
-execregs(ulong entry, ulong ssize, ulong nargs)
+uintptr
+execregs(uintptr entry, ulong ssize, ulong nargs)
 {
 	ulong *sp;
 	Ureg *ureg;
--