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((uintptr)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((uintptr)a, 1, 0);
54 fmtprint(f, "%#p/\"%s\"%s", a, t, suffix);
59 syscallfmt(ulong syscallno, uintptr pc, va_list list)
70 fmtprint(&fmt, "%uld %s ", up->pid, up->text);
72 if(syscallno >= nsyscall)
73 fmtprint(&fmt, " %uld ", syscallno);
75 fmtprint(&fmt, "%s ", sysctab[syscallno]?
76 sysctab[syscallno]: "huh?");
78 fmtprint(&fmt, "%p ", pc);
81 p = va_arg(list, uintptr);
82 fmtprint(&fmt, "%#p", p);
84 case _ERRSTR: /* deprecated */
88 a = va_arg(list, char*);
89 fmtuserstring(&fmt, a, "");
92 a = va_arg(list, char*);
93 fmtuserstring(&fmt, a, " ");
94 a = va_arg(list, char*);
95 fmtuserstring(&fmt, a, " ");
96 i[0] = va_arg(list, int);
97 fmtprint(&fmt, "%#ux", i[0]);
101 i[0] = va_arg(list, int);
102 fmtprint(&fmt, "%d", i[0]);
105 i[0] = va_arg(list, int);
106 i[1] = va_arg(list, int);
107 fmtprint(&fmt, "%d %d", i[0], i[1]);
110 l = va_arg(list, unsigned long);
111 fmtprint(&fmt, "%#lud ", l);
114 a = va_arg(list, char*);
115 fmtuserstring(&fmt, a, "");
116 argv = va_arg(list, char**);
117 evenaddr(PTR2UINT(argv));
119 validaddr((uintptr)argv, sizeof(char**), 0);
124 fmtuserstring(&fmt, a, "");
128 case _FSESSION: /* deprecated */
129 case _FSTAT: /* deprecated */
130 case _FWSTAT: /* obsolete */
131 i[0] = va_arg(list, int);
132 a = va_arg(list, char*);
133 fmtprint(&fmt, "%d %#p", i[0], a);
136 i[0] = va_arg(list, int);
137 a = va_arg(list, char*);
138 fmtprint(&fmt, "%d", i[0]);
139 fmtuserstring(&fmt, a, "");
143 v = va_arg(list, void*);
144 fmtprint(&fmt, "%#p ", v);
145 v = va_arg(list, void*);
146 fmtprint(&fmt, "%#p", v);
148 case _MOUNT: /* deprecated */
149 i[0] = va_arg(list, int);
150 fmtprint(&fmt, "%d ", i[0]);
151 a = va_arg(list, char*);
152 fmtuserstring(&fmt, a, " ");
153 i[0] = va_arg(list, int);
154 fmtprint(&fmt, "%#ux ", i[0]);
155 a = va_arg(list, char*);
156 fmtuserstring(&fmt, a, "");
159 a = va_arg(list, char*);
160 fmtuserstring(&fmt, a, " ");
161 i[0] = va_arg(list, int);
162 fmtprint(&fmt, "%#ux", i[0]);
164 case OSEEK: /* deprecated */
165 i[0] = va_arg(list, int);
166 l = va_arg(list, long);
167 i[1] = va_arg(list, int);
168 fmtprint(&fmt, "%d %ld %d", i[0], l, i[1]);
171 l = va_arg(list, long);
172 fmtprint(&fmt, "%ld", l);
174 case _STAT: /* obsolete */
175 case _WSTAT: /* obsolete */
176 a = va_arg(list, char*);
177 fmtuserstring(&fmt, a, " ");
178 a = va_arg(list, char*);
179 fmtprint(&fmt, "%#p", a);
182 i[0] = va_arg(list, int);
183 fmtprint(&fmt, "%#ux", i[0]);
187 v = va_arg(list, int*);
188 fmtprint(&fmt, "%#p", v);
191 a = va_arg(list, char*);
192 fmtuserstring(&fmt, a, " ");
193 i[0] = va_arg(list, int);
194 i[1] = va_arg(list, int);
195 fmtprint(&fmt, "%#ux %#ux", i[0], i[1]);
200 i[0] = va_arg(list, int);
201 a = va_arg(list, char*);
202 l = va_arg(list, unsigned long);
203 fmtprint(&fmt, "%d %#p %lud", i[0], a, l);
207 case _WAIT: /* deprecated */
208 v = va_arg(list, void*);
209 fmtprint(&fmt, "%#p", v);
212 i[0] = va_arg(list, int);
213 fmtprint(&fmt, "%d ", i[0]);
214 a = va_arg(list, char*);
215 fmtuserstring(&fmt, a, " ");
219 v = va_arg(list, void*);
220 l = va_arg(list, unsigned long);
221 fmtprint(&fmt, "%#p %lud", v, l);
224 a = va_arg(list, char*);
225 fmtuserstring(&fmt, a, " ");
226 a = va_arg(list, char*);
227 fmtuserstring(&fmt, a, "");
231 v = va_arg(list, int*);
232 i[0] = va_arg(list, int);
233 fmtprint(&fmt, "%#p %d", v, i[0]);
236 v = va_arg(list, int*);
237 l = va_arg(list, ulong);
238 fmtprint(&fmt, "%#p %ld", v, l);
241 v = va_arg(list, vlong*);
242 i[0] = va_arg(list, int);
243 vl = va_arg(list, vlong);
244 i[1] = va_arg(list, int);
245 fmtprint(&fmt, "%#p %d %#llux %d", v, i[0], vl, i[1]);
248 i[0] = va_arg(list, int);
249 i[1] = va_arg(list, int);
250 fmtprint(&fmt, "%d %d ", i[0], i[1]);
251 a = va_arg(list, char*);
252 fmtuserstring(&fmt, a, " ");
253 l = va_arg(list, unsigned long);
254 fmtprint(&fmt, "%lud", l);
258 a = va_arg(list, char*);
259 fmtuserstring(&fmt, a, " ");
263 a = va_arg(list, char*);
264 l = va_arg(list, unsigned long);
265 fmtprint(&fmt, "%#p %lud", a, l);
268 i[0] = va_arg(list, int);
269 i[1] = va_arg(list, int);
270 fmtprint(&fmt, "%d %d ", i[0], i[1]);
271 a = va_arg(list, char*);
272 fmtuserstring(&fmt, a, " ");
273 i[0] = va_arg(list, int);
274 fmtprint(&fmt, "%#ux ", i[0]);
275 a = va_arg(list, char*);
276 fmtuserstring(&fmt, a, "");
278 case _READ: /* deprecated */
280 i[0] = va_arg(list, int);
281 v = va_arg(list, void*);
282 l = va_arg(list, long);
283 fmtprint(&fmt, "%d %#p %ld", i[0], v, l);
284 if(syscallno == PREAD){
285 vl = va_arg(list, vlong);
286 fmtprint(&fmt, " %lld", vl);
289 case _WRITE: /* deprecated */
291 i[0] = va_arg(list, int);
292 v = va_arg(list, void*);
293 l = va_arg(list, long);
294 fmtprint(&fmt, "%d ", i[0]);
296 fmtrwdata(&fmt, v, len, " ");
297 fmtprint(&fmt, "%ld", l);
298 if(syscallno == PWRITE){
299 vl = va_arg(list, vlong);
300 fmtprint(&fmt, " %lld", vl);
304 if(sizeof(uintptr) == sizeof(vlong))
306 v = va_arg(list, vlong*);
307 fmtprint(&fmt, "%#p", v);
311 a = fmtstrflush(&fmt);
313 free(up->syscalltrace);
314 up->syscalltrace = a;
319 sysretfmt(ulong syscallno, va_list list, uintptr ret, uvlong start, uvlong stop)
336 if((void *)ret == (void*)-1)
337 errstr = up->syserrstr;
338 fmtprint(&fmt, " = %#p", (void *)ret);
341 a = va_arg(list, char*);
342 l = va_arg(list, unsigned long);
344 fmtuserstring(&fmt, a, " ");
345 fmtprint(&fmt, "%lud = %ld", l, (long)ret);
348 fmtprint(&fmt, "%#p/\"\" %lud = %ld", a, l, (long)ret);
349 errstr = up->syserrstr;
354 a = va_arg(list, char*);
355 if(syscallno == _ERRSTR)
358 l = va_arg(list, unsigned long);
360 fmtuserstring(&fmt, a, " ");
361 fmtprint(&fmt, "%lud = %ld", l, (long)ret);
364 fmtprint(&fmt, "\"\" %lud = %ld", l, (long)ret);
365 errstr = up->syserrstr;
369 i = va_arg(list, int);
371 a = va_arg(list, char*);
372 l = va_arg(list, unsigned long);
374 fmtuserstring(&fmt, a, " ");
375 fmtprint(&fmt, "%lud = %ld", l, (long)ret);
378 fmtprint(&fmt, "\"\" %lud = %ld", l, (long)ret);
379 errstr = up->syserrstr;
384 i = va_arg(list, int);
386 v = va_arg(list, void*);
387 l = va_arg(list, long);
390 fmtrwdata(&fmt, v, len, "");
393 fmtprint(&fmt, "/\"\"");
394 errstr = up->syserrstr;
396 fmtprint(&fmt, " %ld", l);
397 if(syscallno == PREAD){
398 vl = va_arg(list, vlong);
399 fmtprint(&fmt, " %lld", vl);
401 fmtprint(&fmt, " = %ld", (long)ret);
404 if(sizeof(uintptr) == sizeof(vlong)){
405 fmtprint(&fmt, " = %lld", (vlong)ret);
414 errstr = up->syserrstr;
415 fmtprint(&fmt, " = %ld", (long)ret);
418 fmtprint(&fmt, " %s %#llud %#llud\n", errstr, start, stop);
420 a = fmtstrflush(&fmt);
422 free(up->syscalltrace);
423 up->syscalltrace = a;