xref: /plan9-contrib/sys/src/9k/port/syscallfmt.c (revision 406c76facc4b13aa2a55454bf4091aab9f03da22)
19ef1f84bSDavid du Colombier #include "u.h"
29ef1f84bSDavid du Colombier #include "../port/lib.h"
39ef1f84bSDavid du Colombier #include "mem.h"
49ef1f84bSDavid du Colombier #include "dat.h"
59ef1f84bSDavid du Colombier #include "fns.h"
69ef1f84bSDavid du Colombier 
79ef1f84bSDavid du Colombier #include "/sys/src/libc/9syscall/sys.h"
89ef1f84bSDavid du Colombier 
99ef1f84bSDavid du Colombier /*
109ef1f84bSDavid du Colombier  * Print functions for system call tracing.
119ef1f84bSDavid du Colombier  */
129ef1f84bSDavid du Colombier static void
fmtrwdata(Fmt * f,char * a,int n,char * suffix)139ef1f84bSDavid du Colombier fmtrwdata(Fmt* f, char* a, int n, char* suffix)
149ef1f84bSDavid du Colombier {
159ef1f84bSDavid du Colombier 	int i;
169ef1f84bSDavid du Colombier 	char *t;
179ef1f84bSDavid du Colombier 
189ef1f84bSDavid du Colombier 	if(a == nil){
199ef1f84bSDavid du Colombier 		fmtprint(f, "0x0%s", suffix);
209ef1f84bSDavid du Colombier 		return;
219ef1f84bSDavid du Colombier 	}
229ef1f84bSDavid du Colombier 	a = validaddr(a, n, 0);
239ef1f84bSDavid du Colombier 	t = smalloc(n+1);
249ef1f84bSDavid du Colombier 	for(i = 0; i < n; i++){
259ef1f84bSDavid du Colombier 		if(a[i] > 0x20 && a[i] < 0x7f)
269ef1f84bSDavid du Colombier 			t[i] = a[i];
279ef1f84bSDavid du Colombier 		else
289ef1f84bSDavid du Colombier 			t[i] = '.';
299ef1f84bSDavid du Colombier 	}
309ef1f84bSDavid du Colombier 
319ef1f84bSDavid du Colombier 	fmtprint(f, " %#p/\"%s\"%s", a, t, suffix);
329ef1f84bSDavid du Colombier 	free(t);
339ef1f84bSDavid du Colombier }
349ef1f84bSDavid du Colombier 
359ef1f84bSDavid du Colombier static void
fmtuserstring(Fmt * f,char * a,char * suffix)369ef1f84bSDavid du Colombier fmtuserstring(Fmt* f, char* a, char* suffix)
379ef1f84bSDavid du Colombier {
389ef1f84bSDavid du Colombier 	int n;
399ef1f84bSDavid du Colombier 	char *t;
409ef1f84bSDavid du Colombier 
419ef1f84bSDavid du Colombier 	if(a == nil){
429ef1f84bSDavid du Colombier 		fmtprint(f, "0/\"\"%s", suffix);
439ef1f84bSDavid du Colombier 		return;
449ef1f84bSDavid du Colombier 	}
459ef1f84bSDavid du Colombier 	a = validaddr(a, 1, 0);
469ef1f84bSDavid du Colombier 	n = ((char*)vmemchr(a, 0, 0x7fffffff) - a) + 1;
479ef1f84bSDavid du Colombier 	t = smalloc(n);
489ef1f84bSDavid du Colombier 	memmove(t, a, n);
499ef1f84bSDavid du Colombier 	t[n] = 0;
509ef1f84bSDavid du Colombier 	fmtprint(f, "%#p/\"%s\"%s", a, t, suffix);
519ef1f84bSDavid du Colombier 	free(t);
529ef1f84bSDavid du Colombier }
539ef1f84bSDavid du Colombier 
549ef1f84bSDavid du Colombier /*
559ef1f84bSDavid du Colombier  */
569ef1f84bSDavid du Colombier void
syscallfmt(int syscallno,va_list list)579ef1f84bSDavid du Colombier syscallfmt(int syscallno, va_list list)
589ef1f84bSDavid du Colombier {
599ef1f84bSDavid du Colombier 	long l;
609ef1f84bSDavid du Colombier 	Fmt fmt;
619ef1f84bSDavid du Colombier 	void *v;
629ef1f84bSDavid du Colombier 	vlong vl;
639ef1f84bSDavid du Colombier 	uintptr p;
649ef1f84bSDavid du Colombier 	int i[2], len;
659ef1f84bSDavid du Colombier 	char *a, **argv;
669ef1f84bSDavid du Colombier 
679ef1f84bSDavid du Colombier 	fmtstrinit(&fmt);
689ef1f84bSDavid du Colombier 	fmtprint(&fmt, "%d %s ", up->pid, up->text);
699ef1f84bSDavid du Colombier 
709ef1f84bSDavid du Colombier 	if(syscallno > nsyscall)
719ef1f84bSDavid du Colombier 		fmtprint(&fmt, " %d ", syscallno);
729ef1f84bSDavid du Colombier 	else
739ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%s ", systab[syscallno].n);
749ef1f84bSDavid du Colombier 
759ef1f84bSDavid du Colombier 	if(up->syscalltrace != nil)
769ef1f84bSDavid du Colombier 		free(up->syscalltrace);
779ef1f84bSDavid du Colombier 
789ef1f84bSDavid du Colombier 	switch(syscallno){
799ef1f84bSDavid du Colombier 	case SYSR1:
809ef1f84bSDavid du Colombier 		p = va_arg(list, uintptr);
819ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#p", p);
829ef1f84bSDavid du Colombier 		break;
839ef1f84bSDavid du Colombier 	case _ERRSTR:					/* deprecated */
849ef1f84bSDavid du Colombier 	case CHDIR:
859ef1f84bSDavid du Colombier 	case EXITS:
869ef1f84bSDavid du Colombier 	case REMOVE:
879ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
889ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, "");
899ef1f84bSDavid du Colombier 		break;
909ef1f84bSDavid du Colombier 	case BIND:
919ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
929ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, " ");
939ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
949ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, " ");
959ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
969ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#ux",  i[0]);
979ef1f84bSDavid du Colombier 		break;
989ef1f84bSDavid du Colombier 	case CLOSE:
999ef1f84bSDavid du Colombier 	case NOTED:
1009ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
1019ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d", i[0]);
1029ef1f84bSDavid du Colombier 		break;
1039ef1f84bSDavid du Colombier 	case DUP:
1049ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
1059ef1f84bSDavid du Colombier 		i[1] = va_arg(list, int);
1069ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d %d", i[0], i[1]);
1079ef1f84bSDavid du Colombier 		break;
1089ef1f84bSDavid du Colombier 	case ALARM:
1099ef1f84bSDavid du Colombier 		l = va_arg(list, unsigned long);
1109ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#lud ", l);
1119ef1f84bSDavid du Colombier 		break;
1129ef1f84bSDavid du Colombier 	case EXEC:
1139ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
1149ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, "");
1159ef1f84bSDavid du Colombier 		argv = va_arg(list, char**);
1169ef1f84bSDavid du Colombier 		evenaddr(PTR2UINT(argv));
1179ef1f84bSDavid du Colombier 		for(;;){
1189ef1f84bSDavid du Colombier 			a = *(char**)validaddr(argv, sizeof(char**), 0);
1199ef1f84bSDavid du Colombier 			if(a == nil)
1209ef1f84bSDavid du Colombier 				break;
1219ef1f84bSDavid du Colombier 			fmtprint(&fmt, " ");
1229ef1f84bSDavid du Colombier 			fmtuserstring(&fmt, a, "");
1239ef1f84bSDavid du Colombier 			argv++;
1249ef1f84bSDavid du Colombier 		}
1259ef1f84bSDavid du Colombier 		break;
1269ef1f84bSDavid du Colombier 	case _FSESSION:					/* deprecated */
1279ef1f84bSDavid du Colombier 	case _FSTAT:					/* deprecated */
1289ef1f84bSDavid du Colombier 	case _FWSTAT:					/* obsolete */
1299ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
1309ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
1319ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d %#p", i[0], a);
1329ef1f84bSDavid du Colombier 		break;
1339ef1f84bSDavid du Colombier 	case FAUTH:
1349ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
1359ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
1369ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d", i[0]);
1379ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, "");
1389ef1f84bSDavid du Colombier 		break;
1399ef1f84bSDavid du Colombier 	case SEGBRK:
1409ef1f84bSDavid du Colombier 	case RENDEZVOUS:
1419ef1f84bSDavid du Colombier 		v = va_arg(list, void*);
1429ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#p ", v);
1439ef1f84bSDavid du Colombier 		v = va_arg(list, void*);
1449ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#p", v);
1459ef1f84bSDavid du Colombier 		break;
1469ef1f84bSDavid du Colombier 	case _MOUNT:					/* deprecated */
1479ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
1489ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d ", i[0]);
1499ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
1509ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, " ");
1519ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
1529ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#ux ", i[0]);
1539ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
1549ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, "");
1559ef1f84bSDavid du Colombier 		break;
1569ef1f84bSDavid du Colombier 	case OPEN:
1579ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
1589ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, " ");
1599ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
1609ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#ux", i[0]);
1619ef1f84bSDavid du Colombier 		break;
1629ef1f84bSDavid du Colombier 	case OSEEK:					/* deprecated */
1639ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
1649ef1f84bSDavid du Colombier 		l = va_arg(list, long);
1659ef1f84bSDavid du Colombier 		i[1] = va_arg(list, int);
1669ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d %ld %d", i[0], l, i[1]);
1679ef1f84bSDavid du Colombier 		break;
1689ef1f84bSDavid du Colombier 	case SLEEP:
1699ef1f84bSDavid du Colombier 		l = va_arg(list, long);
1709ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%ld", l);
1719ef1f84bSDavid du Colombier 		break;
1729ef1f84bSDavid du Colombier 	case _STAT:					/* obsolete */
1739ef1f84bSDavid du Colombier 	case _WSTAT:					/* obsolete */
1749ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
1759ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, " ");
1769ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
1779ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#p", a);
1789ef1f84bSDavid du Colombier 		break;
1799ef1f84bSDavid du Colombier 	case RFORK:
1809ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
1819ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#ux", i[0]);
1829ef1f84bSDavid du Colombier 		break;
1839ef1f84bSDavid du Colombier 	case PIPE:
1849ef1f84bSDavid du Colombier 	case BRK_:
1859ef1f84bSDavid du Colombier 		v = va_arg(list, int*);
1869ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#p", v);
1879ef1f84bSDavid du Colombier 		break;
1889ef1f84bSDavid du Colombier 	case CREATE:
1899ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
1909ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, " ");
1919ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
1929ef1f84bSDavid du Colombier 		i[1] = va_arg(list, int);
1939ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#ux %#ux", i[0], i[1]);
1949ef1f84bSDavid du Colombier 		break;
1959ef1f84bSDavid du Colombier 	case FD2PATH:
1969ef1f84bSDavid du Colombier 	case FSTAT:
1979ef1f84bSDavid du Colombier 	case FWSTAT:
1989ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
1999ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
2009ef1f84bSDavid du Colombier 		l = va_arg(list, unsigned long);
2019ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d %#p %lud", i[0], a, l);
2029ef1f84bSDavid du Colombier 		break;
2039ef1f84bSDavid du Colombier 	case NOTIFY:
2049ef1f84bSDavid du Colombier 	case SEGDETACH:
2059ef1f84bSDavid du Colombier 	case _WAIT:					/* deprecated */
2069ef1f84bSDavid du Colombier 		v = va_arg(list, void*);
2079ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#p", v);
2089ef1f84bSDavid du Colombier 		break;
2099ef1f84bSDavid du Colombier 	case SEGATTACH:
2109ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
2119ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d ", i[0]);
2129ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
2139ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, " ");
2149ef1f84bSDavid du Colombier 		/*FALLTHROUGH*/
2159ef1f84bSDavid du Colombier 	case SEGFREE:
2169ef1f84bSDavid du Colombier 	case SEGFLUSH:
2179ef1f84bSDavid du Colombier 		v = va_arg(list, void*);
2189ef1f84bSDavid du Colombier 		l = va_arg(list, unsigned long);
2199ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#p %lud", v, l);
2209ef1f84bSDavid du Colombier 		break;
2219ef1f84bSDavid du Colombier 	case UNMOUNT:
2229ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
2239ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, " ");
2249ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
2259ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, "");
2269ef1f84bSDavid du Colombier 		break;
2279ef1f84bSDavid du Colombier 	case SEMACQUIRE:
2289ef1f84bSDavid du Colombier 	case SEMRELEASE:
2299ef1f84bSDavid du Colombier 		v = va_arg(list, int*);
2309ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
2319ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#p %d", v, i[0]);
2329ef1f84bSDavid du Colombier 		break;
233*406c76faSDavid du Colombier 	case TSEMACQUIRE:
234*406c76faSDavid du Colombier 		v = va_arg(list, long*);
235*406c76faSDavid du Colombier 		l = va_arg(list, ulong);
236*406c76faSDavid du Colombier 		fmtprint(&fmt, "%#p %ld", v, l);
237*406c76faSDavid du Colombier 		break;
2389ef1f84bSDavid du Colombier 	case SEEK:
2399ef1f84bSDavid du Colombier 		v = va_arg(list, vlong*);
2409ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
2419ef1f84bSDavid du Colombier 		vl = va_arg(list, vlong);
2429ef1f84bSDavid du Colombier 		i[1] = va_arg(list, int);
2439ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#p %d %#llux %d", v, i[0], vl, i[1]);
2449ef1f84bSDavid du Colombier 		break;
2459ef1f84bSDavid du Colombier 	case FVERSION:
2469ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
2479ef1f84bSDavid du Colombier 		i[1] = va_arg(list, int);
2489ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d %d ", i[0], i[1]);
2499ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
2509ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, " ");
2519ef1f84bSDavid du Colombier 		l = va_arg(list, unsigned long);
2529ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%lud", l);
2539ef1f84bSDavid du Colombier 		break;
2549ef1f84bSDavid du Colombier 	case WSTAT:
2559ef1f84bSDavid du Colombier 	case STAT:
2569ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
2579ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, " ");
2589ef1f84bSDavid du Colombier 		/*FALLTHROUGH*/
2599ef1f84bSDavid du Colombier 	case ERRSTR:
2609ef1f84bSDavid du Colombier 	case AWAIT:
2619ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
2629ef1f84bSDavid du Colombier 		l = va_arg(list, unsigned long);
2639ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#p %lud", a, l);
2649ef1f84bSDavid du Colombier 		break;
2659ef1f84bSDavid du Colombier 	case MOUNT:
2669ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
2679ef1f84bSDavid du Colombier 		i[1] = va_arg(list, int);
2689ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d %d ", i[0], i[1]);
2699ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
2709ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, " ");
2719ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
2729ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%#ux ", i[0]);
2739ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
2749ef1f84bSDavid du Colombier 		fmtuserstring(&fmt, a, "");
2759ef1f84bSDavid du Colombier 		break;
2769ef1f84bSDavid du Colombier 	case _READ:					/* deprecated */
2779ef1f84bSDavid du Colombier 	case PREAD:
2789ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
2799ef1f84bSDavid du Colombier 		v = va_arg(list, void*);
2809ef1f84bSDavid du Colombier 		l = va_arg(list, long);
2819ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d %#p %ld", i[0], v, l);
2829ef1f84bSDavid du Colombier 		if(syscallno == PREAD){
2839ef1f84bSDavid du Colombier 			vl = va_arg(list, vlong);
2849ef1f84bSDavid du Colombier 			fmtprint(&fmt, " %lld", vl);
2859ef1f84bSDavid du Colombier 		}
2869ef1f84bSDavid du Colombier 		break;
2879ef1f84bSDavid du Colombier 	case _WRITE:					/* deprecated */
2889ef1f84bSDavid du Colombier 	case PWRITE:
2899ef1f84bSDavid du Colombier 		i[0] = va_arg(list, int);
2909ef1f84bSDavid du Colombier 		v = va_arg(list, void*);
2919ef1f84bSDavid du Colombier 		l = va_arg(list, long);
2929ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%d ", i[0]);
2939ef1f84bSDavid du Colombier 		len = MIN(l, 64);
2949ef1f84bSDavid du Colombier 		fmtrwdata(&fmt, v, len, " ");
2959ef1f84bSDavid du Colombier 		fmtprint(&fmt, "%ld", l);
2969ef1f84bSDavid du Colombier 		if(syscallno == PWRITE){
2979ef1f84bSDavid du Colombier 			vl = va_arg(list, vlong);
2989ef1f84bSDavid du Colombier 			fmtprint(&fmt, " %lld", vl);
2999ef1f84bSDavid du Colombier 		}
3009ef1f84bSDavid du Colombier 		break;
3015891e653SDavid du Colombier 	case NSEC:
3025891e653SDavid du Colombier 		/* compilers on 32-bit systems insert &ret as only argument */
3035891e653SDavid du Colombier 		if (sizeof(void *) < sizeof(vlong))
3045891e653SDavid du Colombier 			fmtprint(&fmt, "%#p", va_arg(list, vlong*));
3055891e653SDavid du Colombier 		break;
3069ef1f84bSDavid du Colombier 	}
3079ef1f84bSDavid du Colombier 	up->syscalltrace = fmtstrflush(&fmt);
3089ef1f84bSDavid du Colombier }
3099ef1f84bSDavid du Colombier 
3109ef1f84bSDavid du Colombier void
sysretfmt(int syscallno,va_list list,Ar0 * ar0,uvlong start,uvlong stop)3119ef1f84bSDavid du Colombier sysretfmt(int syscallno, va_list list, Ar0* ar0, uvlong start, uvlong stop)
3129ef1f84bSDavid du Colombier {
3139ef1f84bSDavid du Colombier 	long l;
3149ef1f84bSDavid du Colombier 	void* v;
3159ef1f84bSDavid du Colombier 	Fmt fmt;
3169ef1f84bSDavid du Colombier 	vlong vl;
3179ef1f84bSDavid du Colombier 	int i, len;
3189ef1f84bSDavid du Colombier 	char *a, *errstr;
3199ef1f84bSDavid du Colombier 
3209ef1f84bSDavid du Colombier 	fmtstrinit(&fmt);
3219ef1f84bSDavid du Colombier 
3229ef1f84bSDavid du Colombier 	if(up->syscalltrace)
3239ef1f84bSDavid du Colombier 		free(up->syscalltrace);
3249ef1f84bSDavid du Colombier 
3259ef1f84bSDavid du Colombier 	errstr = "\"\"";
3269ef1f84bSDavid du Colombier 	switch(syscallno){
3279ef1f84bSDavid du Colombier 	default:
3289ef1f84bSDavid du Colombier 		if(ar0->i == -1)
329*406c76faSDavid du Colombier 			errstr = up->syserrstr;
3301721bb52SDavid du Colombier 		fmtprint(&fmt, " = %d", (int)ar0->i);
3319ef1f84bSDavid du Colombier 		break;
3329ef1f84bSDavid du Colombier 	case ALARM:
3339ef1f84bSDavid du Colombier 	case _WRITE:
3349ef1f84bSDavid du Colombier 	case PWRITE:
3359ef1f84bSDavid du Colombier 		if(ar0->l == -1)
336*406c76faSDavid du Colombier 			errstr = up->syserrstr;
3371721bb52SDavid du Colombier 		fmtprint(&fmt, " = %ld", (long)ar0->l);
3389ef1f84bSDavid du Colombier 		break;
3395891e653SDavid du Colombier 	case NSEC:
3405891e653SDavid du Colombier 		fmtprint(&fmt, " = %lld", ar0->vl);
3415891e653SDavid du Colombier 		break;
3429ef1f84bSDavid du Colombier 	case EXEC:
3439ef1f84bSDavid du Colombier 	case SEGBRK:
3449ef1f84bSDavid du Colombier 	case SEGATTACH:
3459ef1f84bSDavid du Colombier 	case RENDEZVOUS:
3469ef1f84bSDavid du Colombier 		if(ar0->v == (void*)-1)
347*406c76faSDavid du Colombier 			errstr = up->syserrstr;
3489ef1f84bSDavid du Colombier 		fmtprint(&fmt, " = %#p", ar0->v);
3499ef1f84bSDavid du Colombier 		break;
3509ef1f84bSDavid du Colombier 	case AWAIT:
3519ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
3529ef1f84bSDavid du Colombier 		l = va_arg(list, unsigned long);
3539ef1f84bSDavid du Colombier 		if(ar0->i > 0){
3549ef1f84bSDavid du Colombier 			fmtuserstring(&fmt, a, " ");
3551721bb52SDavid du Colombier 			fmtprint(&fmt, "%lud = %d", l, (int)ar0->i);
3569ef1f84bSDavid du Colombier 		}
3579ef1f84bSDavid du Colombier 		else{
3581721bb52SDavid du Colombier 			fmtprint(&fmt, "%#p/\"\" %lud = %d", a, l, (int)ar0->i);
359*406c76faSDavid du Colombier 			errstr = up->syserrstr;
3609ef1f84bSDavid du Colombier 		}
3619ef1f84bSDavid du Colombier 		break;
3629ef1f84bSDavid du Colombier 	case _ERRSTR:
3639ef1f84bSDavid du Colombier 	case ERRSTR:
3649ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
3659ef1f84bSDavid du Colombier 		if(syscallno == _ERRSTR)
3669ef1f84bSDavid du Colombier 			l = 64;
3679ef1f84bSDavid du Colombier 		else
3689ef1f84bSDavid du Colombier 			l = va_arg(list, unsigned long);
3699ef1f84bSDavid du Colombier 		if(ar0->i > 0){
3709ef1f84bSDavid du Colombier 			fmtuserstring(&fmt, a, " ");
3711721bb52SDavid du Colombier 			fmtprint(&fmt, "%lud = %d", l, (int)ar0->i);
3729ef1f84bSDavid du Colombier 		}
3739ef1f84bSDavid du Colombier 		else{
3741721bb52SDavid du Colombier 			fmtprint(&fmt, "\"\" %lud = %d", l, (int)ar0->i);
375*406c76faSDavid du Colombier 			errstr = up->syserrstr;
3769ef1f84bSDavid du Colombier 		}
3779ef1f84bSDavid du Colombier 		break;
3789ef1f84bSDavid du Colombier 	case FD2PATH:
3799ef1f84bSDavid du Colombier 		i = va_arg(list, int);
3809ef1f84bSDavid du Colombier 		USED(i);
3819ef1f84bSDavid du Colombier 		a = va_arg(list, char*);
3829ef1f84bSDavid du Colombier 		l = va_arg(list, unsigned long);
3839ef1f84bSDavid du Colombier 		if(ar0->i > 0){
3849ef1f84bSDavid du Colombier 			fmtuserstring(&fmt, a, " ");
3851721bb52SDavid du Colombier 			fmtprint(&fmt, "%lud = %d", l, (int)ar0->i);
3869ef1f84bSDavid du Colombier 		}
3879ef1f84bSDavid du Colombier 		else{
3881721bb52SDavid du Colombier 			fmtprint(&fmt, "\"\" %lud = %d", l, (int)ar0->i);
389*406c76faSDavid du Colombier 			errstr = up->syserrstr;
3909ef1f84bSDavid du Colombier 		}
3919ef1f84bSDavid du Colombier 		break;
3929ef1f84bSDavid du Colombier 	case _READ:
3939ef1f84bSDavid du Colombier 	case PREAD:
3949ef1f84bSDavid du Colombier 		i = va_arg(list, int);
3959ef1f84bSDavid du Colombier 		USED(i);
3969ef1f84bSDavid du Colombier 		v = va_arg(list, void*);
3979ef1f84bSDavid du Colombier 		l = va_arg(list, long);
3989ef1f84bSDavid du Colombier 		if(ar0->l > 0){
3999ef1f84bSDavid du Colombier 			len = MIN(ar0->l, 64);
4009ef1f84bSDavid du Colombier 			fmtrwdata(&fmt, v, len, "");
4019ef1f84bSDavid du Colombier 		}
4029ef1f84bSDavid du Colombier 		else{
4039ef1f84bSDavid du Colombier 			fmtprint(&fmt, "/\"\"");
404*406c76faSDavid du Colombier 			errstr = up->syserrstr;
4059ef1f84bSDavid du Colombier 		}
4069ef1f84bSDavid du Colombier 		fmtprint(&fmt, " %ld", l);
4079ef1f84bSDavid du Colombier 		if(syscallno == PREAD){
4089ef1f84bSDavid du Colombier 			vl = va_arg(list, vlong);
4099ef1f84bSDavid du Colombier 			fmtprint(&fmt, " %lld", vl);
4109ef1f84bSDavid du Colombier 		}
4111721bb52SDavid du Colombier 		fmtprint(&fmt, " = %d", (int)ar0->i);
4129ef1f84bSDavid du Colombier 		break;
4139ef1f84bSDavid du Colombier 	}
4149ef1f84bSDavid du Colombier 	fmtprint(&fmt, " %s %#llud %#llud\n", errstr, start, stop);
4159ef1f84bSDavid du Colombier 
4169ef1f84bSDavid du Colombier 	up->syscalltrace = fmtstrflush(&fmt);
4179ef1f84bSDavid du Colombier }
418