2 * Print functions for system call tracing.
5 #include "../port/lib.h"
10 #include "/sys/src/libc/9syscall/sys.h"
12 // WE ARE OVERRUNNING SOMEHOW
14 fmtrwdata(Fmt* f, char* a, int n, char* suffix)
20 fmtprint(f, "0x0%s", suffix);
23 validaddr((ulong)a, n, 0);
26 for(i = 0; i < n; i++)
27 if(a[i] > 0x20 && a[i] < 0x7f) /* printable ascii? */
32 fmtprint(f, " %#p/\"%s\"%s", a, t, suffix);
37 fmtuserstring(Fmt* f, char* a, char* suffix)
43 fmtprint(f, "0/\"\"%s", suffix);
46 validaddr((ulong)a, 1, 0);
47 n = ((char*)vmemchr(a, 0, 0x7fffffff) - a) + 1;
51 fmtprint(f, "%#p/\"%s\"%s", a, t, suffix);
56 syscallfmt(ulong syscallno, ulong pc, va_list list)
67 fmtprint(&fmt, "%uld %s ", up->pid, up->text);
69 if(syscallno >= nsyscall)
70 fmtprint(&fmt, " %uld ", syscallno);
72 fmtprint(&fmt, "%s ", sysctab[syscallno]?
73 sysctab[syscallno]: "huh?");
75 fmtprint(&fmt, "%ulx ", pc);
78 p = va_arg(list, uintptr);
79 fmtprint(&fmt, "%#p", p);
81 case _ERRSTR: /* deprecated */
85 a = va_arg(list, char*);
86 fmtuserstring(&fmt, a, "");
89 a = va_arg(list, char*);
90 fmtuserstring(&fmt, a, " ");
91 a = va_arg(list, char*);
92 fmtuserstring(&fmt, a, " ");
93 i[0] = va_arg(list, int);
94 fmtprint(&fmt, "%#ux", i[0]);
98 i[0] = va_arg(list, int);
99 fmtprint(&fmt, "%d", i[0]);
102 i[0] = va_arg(list, int);
103 i[1] = va_arg(list, int);
104 fmtprint(&fmt, "%d %d", i[0], i[1]);
107 l = va_arg(list, unsigned long);
108 fmtprint(&fmt, "%#lud ", l);
111 a = va_arg(list, char*);
112 fmtuserstring(&fmt, a, "");
113 argv = va_arg(list, char**);
114 evenaddr(PTR2UINT(argv));
116 validaddr((ulong)argv, sizeof(char**), 0);
121 fmtuserstring(&fmt, a, "");
125 case _FSESSION: /* deprecated */
126 case _FSTAT: /* deprecated */
127 case _FWSTAT: /* obsolete */
128 i[0] = va_arg(list, int);
129 a = va_arg(list, char*);
130 fmtprint(&fmt, "%d %#p", i[0], a);
133 i[0] = va_arg(list, int);
134 a = va_arg(list, char*);
135 fmtprint(&fmt, "%d", i[0]);
136 fmtuserstring(&fmt, a, "");
140 v = va_arg(list, void*);
141 fmtprint(&fmt, "%#p ", v);
142 v = va_arg(list, void*);
143 fmtprint(&fmt, "%#p", v);
145 case _MOUNT: /* deprecated */
146 i[0] = va_arg(list, int);
147 fmtprint(&fmt, "%d ", i[0]);
148 a = va_arg(list, char*);
149 fmtuserstring(&fmt, a, " ");
150 i[0] = va_arg(list, int);
151 fmtprint(&fmt, "%#ux ", i[0]);
152 a = va_arg(list, char*);
153 fmtuserstring(&fmt, a, "");
156 a = va_arg(list, char*);
157 fmtuserstring(&fmt, a, " ");
158 i[0] = va_arg(list, int);
159 fmtprint(&fmt, "%#ux", i[0]);
161 case OSEEK: /* deprecated */
162 i[0] = va_arg(list, int);
163 l = va_arg(list, long);
164 i[1] = va_arg(list, int);
165 fmtprint(&fmt, "%d %ld %d", i[0], l, i[1]);
168 l = va_arg(list, long);
169 fmtprint(&fmt, "%ld", l);
171 case _STAT: /* obsolete */
172 case _WSTAT: /* obsolete */
173 a = va_arg(list, char*);
174 fmtuserstring(&fmt, a, " ");
175 a = va_arg(list, char*);
176 fmtprint(&fmt, "%#p", a);
179 i[0] = va_arg(list, int);
180 fmtprint(&fmt, "%#ux", i[0]);
184 v = va_arg(list, int*);
185 fmtprint(&fmt, "%#p", v);
188 a = va_arg(list, char*);
189 fmtuserstring(&fmt, a, " ");
190 i[0] = va_arg(list, int);
191 i[1] = va_arg(list, int);
192 fmtprint(&fmt, "%#ux %#ux", i[0], i[1]);
197 i[0] = va_arg(list, int);
198 a = va_arg(list, char*);
199 l = va_arg(list, unsigned long);
200 fmtprint(&fmt, "%d %#p %lud", i[0], a, l);
204 case _WAIT: /* deprecated */
205 v = va_arg(list, void*);
206 fmtprint(&fmt, "%#p", v);
209 i[0] = va_arg(list, int);
210 fmtprint(&fmt, "%d ", i[0]);
211 a = va_arg(list, char*);
212 fmtuserstring(&fmt, a, " ");
216 v = va_arg(list, void*);
217 l = va_arg(list, unsigned long);
218 fmtprint(&fmt, "%#p %lud", v, l);
221 a = va_arg(list, char*);
222 fmtuserstring(&fmt, a, " ");
223 a = va_arg(list, char*);
224 fmtuserstring(&fmt, a, "");
228 v = va_arg(list, int*);
229 i[0] = va_arg(list, int);
230 fmtprint(&fmt, "%#p %d", v, i[0]);
233 v = va_arg(list, int*);
234 l = va_arg(list, ulong);
235 fmtprint(&fmt, "%#p %ld", v, l);
238 v = va_arg(list, vlong*);
239 i[0] = va_arg(list, int);
240 vl = va_arg(list, vlong);
241 i[1] = va_arg(list, int);
242 fmtprint(&fmt, "%#p %d %#llux %d", v, i[0], vl, i[1]);
245 i[0] = va_arg(list, int);
246 i[1] = va_arg(list, int);
247 fmtprint(&fmt, "%d %d ", i[0], i[1]);
248 a = va_arg(list, char*);
249 fmtuserstring(&fmt, a, " ");
250 l = va_arg(list, unsigned long);
251 fmtprint(&fmt, "%lud", l);
255 a = va_arg(list, char*);
256 fmtuserstring(&fmt, a, " ");
260 a = va_arg(list, char*);
261 l = va_arg(list, unsigned long);
262 fmtprint(&fmt, "%#p %lud", a, l);
265 i[0] = va_arg(list, int);
266 i[1] = va_arg(list, int);
267 fmtprint(&fmt, "%d %d ", i[0], i[1]);
268 a = va_arg(list, char*);
269 fmtuserstring(&fmt, a, " ");
270 i[0] = va_arg(list, int);
271 fmtprint(&fmt, "%#ux ", i[0]);
272 a = va_arg(list, char*);
273 fmtuserstring(&fmt, a, "");
275 case _READ: /* deprecated */
277 i[0] = va_arg(list, int);
278 v = va_arg(list, void*);
279 l = va_arg(list, long);
280 fmtprint(&fmt, "%d %#p %ld", i[0], v, l);
281 if(syscallno == PREAD){
282 vl = va_arg(list, vlong);
283 fmtprint(&fmt, " %lld", vl);
286 case _WRITE: /* deprecated */
288 i[0] = va_arg(list, int);
289 v = va_arg(list, void*);
290 l = va_arg(list, long);
291 fmtprint(&fmt, "%d ", i[0]);
293 fmtrwdata(&fmt, v, len, " ");
294 fmtprint(&fmt, "%ld", l);
295 if(syscallno == PWRITE){
296 vl = va_arg(list, vlong);
297 fmtprint(&fmt, " %lld", vl);
302 a = fmtstrflush(&fmt);
304 free(up->syscalltrace);
305 up->syscalltrace = a;
310 sysretfmt(ulong syscallno, va_list list, long ret, uvlong start, uvlong stop)
328 errstr = up->syserrstr;
329 fmtprint(&fmt, " = %ld", ret);
335 if((void *)ret == (void*)-1)
336 errstr = up->syserrstr;
337 fmtprint(&fmt, " = %#p", (void *)ret);
340 a = va_arg(list, char*);
341 l = va_arg(list, unsigned long);
343 fmtuserstring(&fmt, a, " ");
344 fmtprint(&fmt, "%lud = %ld", l, ret);
347 fmtprint(&fmt, "%#p/\"\" %lud = %ld", a, l, ret);
348 errstr = up->syserrstr;
353 a = va_arg(list, char*);
354 if(syscallno == _ERRSTR)
357 l = va_arg(list, unsigned long);
359 fmtuserstring(&fmt, a, " ");
360 fmtprint(&fmt, "%lud = %ld", l, ret);
363 fmtprint(&fmt, "\"\" %lud = %ld", l, ret);
364 errstr = up->syserrstr;
368 i = va_arg(list, int);
370 a = va_arg(list, char*);
371 l = va_arg(list, unsigned long);
373 fmtuserstring(&fmt, a, " ");
374 fmtprint(&fmt, "%lud = %ld", l, ret);
377 fmtprint(&fmt, "\"\" %lud = %ld", l, ret);
378 errstr = up->syserrstr;
383 i = va_arg(list, int);
385 v = va_arg(list, void*);
386 l = va_arg(list, long);
389 fmtrwdata(&fmt, v, len, "");
392 fmtprint(&fmt, "/\"\"");
393 errstr = up->syserrstr;
395 fmtprint(&fmt, " %ld", l);
396 if(syscallno == PREAD){
397 vl = va_arg(list, vlong);
398 fmtprint(&fmt, " %lld", vl);
400 fmtprint(&fmt, " = %ld", ret);
403 fmtprint(&fmt, " %s %#llud %#llud\n", errstr, start, stop);
405 a = fmtstrflush(&fmt);
407 free(up->syscalltrace);
408 up->syscalltrace = a;