xref: /plan9/sys/src/9/port/syscallfmt.c (revision fac6300f1f1b25611e114fc0bdda9cf428c13da4)
1fcbb35d1SDavid du Colombier /*
2fcbb35d1SDavid du Colombier  * Print functions for system call tracing.
3fcbb35d1SDavid du Colombier  */
4fcbb35d1SDavid du Colombier #include "u.h"
5fcbb35d1SDavid du Colombier #include "../port/lib.h"
6fcbb35d1SDavid du Colombier #include "mem.h"
7fcbb35d1SDavid du Colombier #include "dat.h"
8fcbb35d1SDavid du Colombier #include "fns.h"
9fcbb35d1SDavid du Colombier 
10fcbb35d1SDavid du Colombier #include "/sys/src/libc/9syscall/sys.h"
11fcbb35d1SDavid du Colombier 
12fcbb35d1SDavid du Colombier // WE ARE OVERRUNNING SOMEHOW
13fcbb35d1SDavid du Colombier static void
fmtrwdata(Fmt * f,char * a,int n,char * suffix)14fcbb35d1SDavid du Colombier fmtrwdata(Fmt* f, char* a, int n, char* suffix)
15fcbb35d1SDavid du Colombier {
16fcbb35d1SDavid du Colombier 	int i;
17fcbb35d1SDavid du Colombier 	char *t;
18fcbb35d1SDavid du Colombier 
19fcbb35d1SDavid du Colombier 	if(a == nil){
20fcbb35d1SDavid du Colombier 		fmtprint(f, "0x0%s", suffix);
21fcbb35d1SDavid du Colombier 		return;
22fcbb35d1SDavid du Colombier 	}
23fcbb35d1SDavid du Colombier 	validaddr((ulong)a, n, 0);
24fcbb35d1SDavid du Colombier 	t = smalloc(n+1);
25fcbb35d1SDavid du Colombier 	for(i = 0; i < n; i++)
26fcbb35d1SDavid du Colombier 		if(a[i] > 0x20 && a[i] < 0x7f)	/* printable ascii? */
27fcbb35d1SDavid du Colombier 			t[i] = a[i];
28fcbb35d1SDavid du Colombier 		else
29fcbb35d1SDavid du Colombier 			t[i] = '.';
30fcbb35d1SDavid du Colombier 
31fcbb35d1SDavid du Colombier 	fmtprint(f, " %#p/\"%s\"%s", a, t, suffix);
32fcbb35d1SDavid du Colombier 	free(t);
33fcbb35d1SDavid du Colombier }
34fcbb35d1SDavid du Colombier 
35fcbb35d1SDavid du Colombier static void
fmtuserstring(Fmt * f,char * a,char * suffix)36fcbb35d1SDavid du Colombier fmtuserstring(Fmt* f, char* a, char* suffix)
37fcbb35d1SDavid du Colombier {
38fcbb35d1SDavid du Colombier 	int n;
39fcbb35d1SDavid du Colombier 	char *t;
40fcbb35d1SDavid du Colombier 
41fcbb35d1SDavid du Colombier 	if(a == nil){
42fcbb35d1SDavid du Colombier 		fmtprint(f, "0/\"\"%s", suffix);
43fcbb35d1SDavid du Colombier 		return;
44fcbb35d1SDavid du Colombier 	}
45fcbb35d1SDavid du Colombier 	validaddr((ulong)a, 1, 0);
46fcbb35d1SDavid du Colombier 	n = ((char*)vmemchr(a, 0, 0x7fffffff) - a) + 1;
47fcbb35d1SDavid du Colombier 	t = smalloc(n+1);
48fcbb35d1SDavid du Colombier 	memmove(t, a, n);
49fcbb35d1SDavid du Colombier 	t[n] = 0;
50fcbb35d1SDavid du Colombier 	fmtprint(f, "%#p/\"%s\"%s", a, t, suffix);
51fcbb35d1SDavid du Colombier 	free(t);
52fcbb35d1SDavid du Colombier }
53fcbb35d1SDavid du Colombier 
54fcbb35d1SDavid du Colombier void
syscallfmt(int syscallno,ulong pc,va_list list)55fcbb35d1SDavid du Colombier syscallfmt(int syscallno, ulong pc, va_list list)
56fcbb35d1SDavid du Colombier {
57fcbb35d1SDavid du Colombier 	long l;
58fcbb35d1SDavid du Colombier 	Fmt fmt;
59fcbb35d1SDavid du Colombier 	void *v;
60fcbb35d1SDavid du Colombier 	vlong vl;
61fcbb35d1SDavid du Colombier 	uintptr p;
62fcbb35d1SDavid du Colombier 	int i[2], len;
63fcbb35d1SDavid du Colombier 	char *a, **argv;
64fcbb35d1SDavid du Colombier 
65fcbb35d1SDavid du Colombier 	fmtstrinit(&fmt);
66fcbb35d1SDavid du Colombier 	fmtprint(&fmt, "%uld %s ", up->pid, up->text);
67fcbb35d1SDavid du Colombier 
68fcbb35d1SDavid du Colombier 	if(syscallno > nsyscall)
69fcbb35d1SDavid du Colombier 		fmtprint(&fmt, " %d ", syscallno);
70fcbb35d1SDavid du Colombier 	else
71fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%s ", sysctab[syscallno]?
72fcbb35d1SDavid du Colombier 			sysctab[syscallno]: "huh?");
73fcbb35d1SDavid du Colombier 
74fcbb35d1SDavid du Colombier 	fmtprint(&fmt, "%ulx ", pc);
75fcbb35d1SDavid du Colombier 	if(up->syscalltrace != nil)
76fcbb35d1SDavid du Colombier 		free(up->syscalltrace);
77fcbb35d1SDavid du Colombier 
78fcbb35d1SDavid du Colombier 	switch(syscallno){
79fcbb35d1SDavid du Colombier 	case SYSR1:
80fcbb35d1SDavid du Colombier 		p = va_arg(list, uintptr);
81fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#p", p);
82fcbb35d1SDavid du Colombier 		break;
83fcbb35d1SDavid du Colombier 	case _ERRSTR:					/* deprecated */
84fcbb35d1SDavid du Colombier 	case CHDIR:
85fcbb35d1SDavid du Colombier 	case EXITS:
86fcbb35d1SDavid du Colombier 	case REMOVE:
87fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
88fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, "");
89fcbb35d1SDavid du Colombier 		break;
90fcbb35d1SDavid du Colombier 	case BIND:
91fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
92fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, " ");
93fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
94fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, " ");
95fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
96fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#ux",  i[0]);
97fcbb35d1SDavid du Colombier 		break;
98fcbb35d1SDavid du Colombier 	case CLOSE:
99fcbb35d1SDavid du Colombier 	case NOTED:
100fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
101fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d", i[0]);
102fcbb35d1SDavid du Colombier 		break;
103fcbb35d1SDavid du Colombier 	case DUP:
104fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
105fcbb35d1SDavid du Colombier 		i[1] = va_arg(list, int);
106fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d %d", i[0], i[1]);
107fcbb35d1SDavid du Colombier 		break;
108fcbb35d1SDavid du Colombier 	case ALARM:
109fcbb35d1SDavid du Colombier 		l = va_arg(list, unsigned long);
110fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#lud ", l);
111fcbb35d1SDavid du Colombier 		break;
112fcbb35d1SDavid du Colombier 	case EXEC:
113fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
114fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, "");
115fcbb35d1SDavid du Colombier 		argv = va_arg(list, char**);
116*fac6300fSDavid du Colombier 		validalign(PTR2UINT(argv), sizeof(char*));
117fcbb35d1SDavid du Colombier 		for(;;){
118fcbb35d1SDavid du Colombier 			validaddr((ulong)argv, sizeof(char**), 0);
119fcbb35d1SDavid du Colombier 			a = *(char **)argv;
120fcbb35d1SDavid du Colombier 			if(a == nil)
121fcbb35d1SDavid du Colombier 				break;
122fcbb35d1SDavid du Colombier 			fmtprint(&fmt, " ");
123fcbb35d1SDavid du Colombier 			fmtuserstring(&fmt, a, "");
124fcbb35d1SDavid du Colombier 			argv++;
125fcbb35d1SDavid du Colombier 		}
126fcbb35d1SDavid du Colombier 		break;
127fcbb35d1SDavid du Colombier 	case _FSESSION:					/* deprecated */
128fcbb35d1SDavid du Colombier 	case _FSTAT:					/* deprecated */
129fcbb35d1SDavid du Colombier 	case _FWSTAT:					/* obsolete */
130fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
131fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
132fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d %#p", i[0], a);
133fcbb35d1SDavid du Colombier 		break;
134fcbb35d1SDavid du Colombier 	case FAUTH:
135fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
136fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
137fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d", i[0]);
138fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, "");
139fcbb35d1SDavid du Colombier 		break;
140fcbb35d1SDavid du Colombier 	case SEGBRK:
141fcbb35d1SDavid du Colombier 	case RENDEZVOUS:
142fcbb35d1SDavid du Colombier 		v = va_arg(list, void*);
143fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#p ", v);
144fcbb35d1SDavid du Colombier 		v = va_arg(list, void*);
145fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#p", v);
146fcbb35d1SDavid du Colombier 		break;
147fcbb35d1SDavid du Colombier 	case _MOUNT:					/* deprecated */
148fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
149fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d ", i[0]);
150fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
151fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, " ");
152fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
153fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#ux ", i[0]);
154fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
155fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, "");
156fcbb35d1SDavid du Colombier 		break;
157fcbb35d1SDavid du Colombier 	case OPEN:
158fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
159fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, " ");
160fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
161fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#ux", i[0]);
162fcbb35d1SDavid du Colombier 		break;
163fcbb35d1SDavid du Colombier 	case OSEEK:					/* deprecated */
164fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
165fcbb35d1SDavid du Colombier 		l = va_arg(list, long);
166fcbb35d1SDavid du Colombier 		i[1] = va_arg(list, int);
167fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d %ld %d", i[0], l, i[1]);
168fcbb35d1SDavid du Colombier 		break;
169fcbb35d1SDavid du Colombier 	case SLEEP:
170fcbb35d1SDavid du Colombier 		l = va_arg(list, long);
171fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%ld", l);
172fcbb35d1SDavid du Colombier 		break;
173fcbb35d1SDavid du Colombier 	case _STAT:					/* obsolete */
174fcbb35d1SDavid du Colombier 	case _WSTAT:					/* obsolete */
175fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
176fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, " ");
177fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
178fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#p", a);
179fcbb35d1SDavid du Colombier 		break;
180fcbb35d1SDavid du Colombier 	case RFORK:
181fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
182fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#ux", i[0]);
183fcbb35d1SDavid du Colombier 		break;
184fcbb35d1SDavid du Colombier 	case PIPE:
185fcbb35d1SDavid du Colombier 	case BRK_:
186fcbb35d1SDavid du Colombier 		v = va_arg(list, int*);
187fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#p", v);
188fcbb35d1SDavid du Colombier 		break;
189fcbb35d1SDavid du Colombier 	case CREATE:
190fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
191fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, " ");
192fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
193fcbb35d1SDavid du Colombier 		i[1] = va_arg(list, int);
194fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#ux %#ux", i[0], i[1]);
195fcbb35d1SDavid du Colombier 		break;
196fcbb35d1SDavid du Colombier 	case FD2PATH:
197fcbb35d1SDavid du Colombier 	case FSTAT:
198fcbb35d1SDavid du Colombier 	case FWSTAT:
199fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
200fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
201fcbb35d1SDavid du Colombier 		l = va_arg(list, unsigned long);
202fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d %#p %lud", i[0], a, l);
203fcbb35d1SDavid du Colombier 		break;
204fcbb35d1SDavid du Colombier 	case NOTIFY:
205fcbb35d1SDavid du Colombier 	case SEGDETACH:
206fcbb35d1SDavid du Colombier 	case _WAIT:					/* deprecated */
207fcbb35d1SDavid du Colombier 		v = va_arg(list, void*);
208fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#p", v);
209fcbb35d1SDavid du Colombier 		break;
210fcbb35d1SDavid du Colombier 	case SEGATTACH:
211fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
212fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d ", i[0]);
213fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
214fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, " ");
215fcbb35d1SDavid du Colombier 		/*FALLTHROUGH*/
216fcbb35d1SDavid du Colombier 	case SEGFREE:
217fcbb35d1SDavid du Colombier 	case SEGFLUSH:
218fcbb35d1SDavid du Colombier 		v = va_arg(list, void*);
219fcbb35d1SDavid du Colombier 		l = va_arg(list, unsigned long);
220fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#p %lud", v, l);
221fcbb35d1SDavid du Colombier 		break;
222fcbb35d1SDavid du Colombier 	case UNMOUNT:
223fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
224fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, " ");
225fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
226fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, "");
227fcbb35d1SDavid du Colombier 		break;
228fcbb35d1SDavid du Colombier 	case SEMACQUIRE:
229fcbb35d1SDavid du Colombier 	case SEMRELEASE:
230fcbb35d1SDavid du Colombier 		v = va_arg(list, int*);
231fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
232fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#p %d", v, i[0]);
233fcbb35d1SDavid du Colombier 		break;
23409525e75SDavid du Colombier 	case TSEMACQUIRE:
23509525e75SDavid du Colombier 		v = va_arg(list, long*);
23609525e75SDavid du Colombier 		l = va_arg(list, ulong);
23709525e75SDavid du Colombier 		fmtprint(&fmt, "%#p %ld", v, l);
23809525e75SDavid du Colombier 		break;
239fcbb35d1SDavid du Colombier 	case SEEK:
240fcbb35d1SDavid du Colombier 		v = va_arg(list, vlong*);
241fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
242fcbb35d1SDavid du Colombier 		vl = va_arg(list, vlong);
243fcbb35d1SDavid du Colombier 		i[1] = va_arg(list, int);
244fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#p %d %#llux %d", v, i[0], vl, i[1]);
245fcbb35d1SDavid du Colombier 		break;
246fcbb35d1SDavid du Colombier 	case FVERSION:
247fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
248fcbb35d1SDavid du Colombier 		i[1] = va_arg(list, int);
249fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d %d ", i[0], i[1]);
250fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
251fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, " ");
252fcbb35d1SDavid du Colombier 		l = va_arg(list, unsigned long);
253fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%lud", l);
254fcbb35d1SDavid du Colombier 		break;
255fcbb35d1SDavid du Colombier 	case WSTAT:
256fcbb35d1SDavid du Colombier 	case STAT:
257fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
258fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, " ");
259fcbb35d1SDavid du Colombier 		/*FALLTHROUGH*/
260fcbb35d1SDavid du Colombier 	case ERRSTR:
261fcbb35d1SDavid du Colombier 	case AWAIT:
262fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
263fcbb35d1SDavid du Colombier 		l = va_arg(list, unsigned long);
264fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#p %lud", a, l);
265fcbb35d1SDavid du Colombier 		break;
266fcbb35d1SDavid du Colombier 	case MOUNT:
267fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
268fcbb35d1SDavid du Colombier 		i[1] = va_arg(list, int);
269fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d %d ", i[0], i[1]);
270fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
271fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, " ");
272fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
273fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%#ux ", i[0]);
274fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
275fcbb35d1SDavid du Colombier 		fmtuserstring(&fmt, a, "");
276fcbb35d1SDavid du Colombier 		break;
277fcbb35d1SDavid du Colombier 	case _READ:					/* deprecated */
278fcbb35d1SDavid du Colombier 	case PREAD:
279fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
280fcbb35d1SDavid du Colombier 		v = va_arg(list, void*);
281fcbb35d1SDavid du Colombier 		l = va_arg(list, long);
282fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d %#p %ld", i[0], v, l);
283fcbb35d1SDavid du Colombier 		if(syscallno == PREAD){
284fcbb35d1SDavid du Colombier 			vl = va_arg(list, vlong);
285fcbb35d1SDavid du Colombier 			fmtprint(&fmt, " %lld", vl);
286fcbb35d1SDavid du Colombier 		}
287fcbb35d1SDavid du Colombier 		break;
288fcbb35d1SDavid du Colombier 	case _WRITE:					/* deprecated */
289fcbb35d1SDavid du Colombier 	case PWRITE:
290fcbb35d1SDavid du Colombier 		i[0] = va_arg(list, int);
291fcbb35d1SDavid du Colombier 		v = va_arg(list, void*);
292fcbb35d1SDavid du Colombier 		l = va_arg(list, long);
293fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%d ", i[0]);
294fcbb35d1SDavid du Colombier 		len = MIN(l, 64);
295fcbb35d1SDavid du Colombier 		fmtrwdata(&fmt, v, len, " ");
296fcbb35d1SDavid du Colombier 		fmtprint(&fmt, "%ld", l);
297fcbb35d1SDavid du Colombier 		if(syscallno == PWRITE){
298fcbb35d1SDavid du Colombier 			vl = va_arg(list, vlong);
299fcbb35d1SDavid du Colombier 			fmtprint(&fmt, " %lld", vl);
300fcbb35d1SDavid du Colombier 		}
301fcbb35d1SDavid du Colombier 		break;
302*fac6300fSDavid du Colombier 	case NSEC:
303*fac6300fSDavid du Colombier 		v = va_arg(list, vlong*);
304*fac6300fSDavid du Colombier 		fmtprint(&fmt, "%#p", v);
305*fac6300fSDavid du Colombier 		break;
306fcbb35d1SDavid du Colombier 	}
307fcbb35d1SDavid du Colombier 
308fcbb35d1SDavid du Colombier 	up->syscalltrace = fmtstrflush(&fmt);
309fcbb35d1SDavid du Colombier }
310fcbb35d1SDavid du Colombier 
311fcbb35d1SDavid du Colombier void
sysretfmt(int syscallno,va_list list,long ret,uvlong start,uvlong stop)312fcbb35d1SDavid du Colombier sysretfmt(int syscallno, va_list list, long ret, uvlong start, uvlong stop)
313fcbb35d1SDavid du Colombier {
314fcbb35d1SDavid du Colombier 	long l;
315fcbb35d1SDavid du Colombier 	void* v;
316fcbb35d1SDavid du Colombier 	Fmt fmt;
317fcbb35d1SDavid du Colombier 	vlong vl;
318fcbb35d1SDavid du Colombier 	int i, len;
319fcbb35d1SDavid du Colombier 	char *a, *errstr;
320fcbb35d1SDavid du Colombier 
321fcbb35d1SDavid du Colombier 	fmtstrinit(&fmt);
322fcbb35d1SDavid du Colombier 
323fcbb35d1SDavid du Colombier 	if(up->syscalltrace)
324fcbb35d1SDavid du Colombier 		free(up->syscalltrace);
325fcbb35d1SDavid du Colombier 
326fcbb35d1SDavid du Colombier 	errstr = "\"\"";
327fcbb35d1SDavid du Colombier 	switch(syscallno){
328fcbb35d1SDavid du Colombier 	default:
329fcbb35d1SDavid du Colombier 	case ALARM:
330fcbb35d1SDavid du Colombier 	case _WRITE:
331fcbb35d1SDavid du Colombier 	case PWRITE:
332fcbb35d1SDavid du Colombier 		if(ret == -1)
33300a4193cSDavid du Colombier 			errstr = up->syserrstr;
334fcbb35d1SDavid du Colombier 		fmtprint(&fmt, " = %ld", ret);
335fcbb35d1SDavid du Colombier 		break;
336fcbb35d1SDavid du Colombier 	case EXEC:
337fcbb35d1SDavid du Colombier 	case SEGBRK:
338fcbb35d1SDavid du Colombier 	case SEGATTACH:
339fcbb35d1SDavid du Colombier 	case RENDEZVOUS:
340fcbb35d1SDavid du Colombier 		if((void *)ret == (void*)-1)
34100a4193cSDavid du Colombier 			errstr = up->syserrstr;
342fcbb35d1SDavid du Colombier 		fmtprint(&fmt, " = %#p", (void *)ret);
343fcbb35d1SDavid du Colombier 		break;
344fcbb35d1SDavid du Colombier 	case AWAIT:
345fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
346fcbb35d1SDavid du Colombier 		l = va_arg(list, unsigned long);
347fcbb35d1SDavid du Colombier 		if(ret > 0){
348fcbb35d1SDavid du Colombier 			fmtuserstring(&fmt, a, " ");
349fcbb35d1SDavid du Colombier 			fmtprint(&fmt, "%lud = %ld", l, ret);
350fcbb35d1SDavid du Colombier 		}
351fcbb35d1SDavid du Colombier 		else{
352fcbb35d1SDavid du Colombier 			fmtprint(&fmt, "%#p/\"\" %lud = %ld", a, l, ret);
35300a4193cSDavid du Colombier 			errstr = up->syserrstr;
354fcbb35d1SDavid du Colombier 		}
355fcbb35d1SDavid du Colombier 		break;
356fcbb35d1SDavid du Colombier 	case _ERRSTR:
357fcbb35d1SDavid du Colombier 	case ERRSTR:
358fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
359fcbb35d1SDavid du Colombier 		if(syscallno == _ERRSTR)
360fcbb35d1SDavid du Colombier 			l = 64;
361fcbb35d1SDavid du Colombier 		else
362fcbb35d1SDavid du Colombier 			l = va_arg(list, unsigned long);
363fcbb35d1SDavid du Colombier 		if(ret > 0){
364fcbb35d1SDavid du Colombier 			fmtuserstring(&fmt, a, " ");
365fcbb35d1SDavid du Colombier 			fmtprint(&fmt, "%lud = %ld", l, ret);
366fcbb35d1SDavid du Colombier 		}
367fcbb35d1SDavid du Colombier 		else{
368fcbb35d1SDavid du Colombier 			fmtprint(&fmt, "\"\" %lud = %ld", l, ret);
36900a4193cSDavid du Colombier 			errstr = up->syserrstr;
370fcbb35d1SDavid du Colombier 		}
371fcbb35d1SDavid du Colombier 		break;
372fcbb35d1SDavid du Colombier 	case FD2PATH:
373fcbb35d1SDavid du Colombier 		i = va_arg(list, int);
374fcbb35d1SDavid du Colombier 		USED(i);
375fcbb35d1SDavid du Colombier 		a = va_arg(list, char*);
376fcbb35d1SDavid du Colombier 		l = va_arg(list, unsigned long);
377fcbb35d1SDavid du Colombier 		if(ret > 0){
378fcbb35d1SDavid du Colombier 			fmtuserstring(&fmt, a, " ");
379fcbb35d1SDavid du Colombier 			fmtprint(&fmt, "%lud = %ld", l, ret);
380fcbb35d1SDavid du Colombier 		}
381fcbb35d1SDavid du Colombier 		else{
382fcbb35d1SDavid du Colombier 			fmtprint(&fmt, "\"\" %lud = %ld", l, ret);
38300a4193cSDavid du Colombier 			errstr = up->syserrstr;
384fcbb35d1SDavid du Colombier 		}
385fcbb35d1SDavid du Colombier 		break;
386fcbb35d1SDavid du Colombier 	case _READ:
387fcbb35d1SDavid du Colombier 	case PREAD:
388fcbb35d1SDavid du Colombier 		i = va_arg(list, int);
389fcbb35d1SDavid du Colombier 		USED(i);
390fcbb35d1SDavid du Colombier 		v = va_arg(list, void*);
391fcbb35d1SDavid du Colombier 		l = va_arg(list, long);
392fcbb35d1SDavid du Colombier 		if(ret > 0){
393fcbb35d1SDavid du Colombier 			len = MIN(ret, 64);
394fcbb35d1SDavid du Colombier 			fmtrwdata(&fmt, v, len, "");
395fcbb35d1SDavid du Colombier 		}
396fcbb35d1SDavid du Colombier 		else{
397fcbb35d1SDavid du Colombier 			fmtprint(&fmt, "/\"\"");
39800a4193cSDavid du Colombier 			errstr = up->syserrstr;
399fcbb35d1SDavid du Colombier 		}
400fcbb35d1SDavid du Colombier 		fmtprint(&fmt, " %ld", l);
401fcbb35d1SDavid du Colombier 		if(syscallno == PREAD){
402fcbb35d1SDavid du Colombier 			vl = va_arg(list, vlong);
403fcbb35d1SDavid du Colombier 			fmtprint(&fmt, " %lld", vl);
404fcbb35d1SDavid du Colombier 		}
405fcbb35d1SDavid du Colombier 		fmtprint(&fmt, " = %ld", ret);
406fcbb35d1SDavid du Colombier 		break;
407*fac6300fSDavid du Colombier 	case NSEC:
408*fac6300fSDavid du Colombier 		fmtprint(&fmt, " = %ld", ret);		/* FoV */
409*fac6300fSDavid du Colombier 		break;
410fcbb35d1SDavid du Colombier 	}
411fcbb35d1SDavid du Colombier 	fmtprint(&fmt, " %s %#llud %#llud\n", errstr, start, stop);
412fcbb35d1SDavid du Colombier 	up->syscalltrace = fmtstrflush(&fmt);
413fcbb35d1SDavid du Colombier }
414