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