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);
25 for(i = 0; i < n; i++)
26 if(a[i] > 0x20 && a[i] < 0x7f) /* printable ascii? */
31 fmtprint(f, " %#p/\"%s\"%s", a, t, suffix);
36 fmtuserstring(Fmt* f, char* a, char* suffix)
42 fmtprint(f, "0/\"\"%s", suffix);
45 validaddr((ulong)a, 1, 0);
46 n = ((char*)vmemchr(a, 0, 0x7fffffff) - a) + 1;
50 fmtprint(f, "%#p/\"%s\"%s", a, t, suffix);
55 syscallfmt(int syscallno, ulong pc, va_list list)
66 fmtprint(&fmt, "%uld %s ", up->pid, up->text);
68 if(syscallno > nsyscall)
69 fmtprint(&fmt, " %d ", syscallno);
71 fmtprint(&fmt, "%s ", sysctab[syscallno]?
72 sysctab[syscallno]: "huh?");
74 fmtprint(&fmt, "%ulx ", pc);
75 if(up->syscalltrace != nil)
76 free(up->syscalltrace);
80 p = va_arg(list, uintptr);
81 fmtprint(&fmt, "%#p", p);
83 case _ERRSTR: /* deprecated */
87 a = va_arg(list, char*);
88 fmtuserstring(&fmt, a, "");
91 a = va_arg(list, char*);
92 fmtuserstring(&fmt, a, " ");
93 a = va_arg(list, char*);
94 fmtuserstring(&fmt, a, " ");
95 i[0] = va_arg(list, int);
96 fmtprint(&fmt, "%#ux", i[0]);
100 i[0] = va_arg(list, int);
101 fmtprint(&fmt, "%d", i[0]);
104 i[0] = va_arg(list, int);
105 i[1] = va_arg(list, int);
106 fmtprint(&fmt, "%d %d", i[0], i[1]);
109 l = va_arg(list, unsigned long);
110 fmtprint(&fmt, "%#lud ", l);
113 a = va_arg(list, char*);
114 fmtuserstring(&fmt, a, "");
115 argv = va_arg(list, char**);
116 evenaddr(PTR2UINT(argv));
118 validaddr((ulong)argv, sizeof(char**), 0);
123 fmtuserstring(&fmt, a, "");
127 case _FSESSION: /* deprecated */
128 case _FSTAT: /* deprecated */
129 case _FWSTAT: /* obsolete */
130 i[0] = va_arg(list, int);
131 a = va_arg(list, char*);
132 fmtprint(&fmt, "%d %#p", i[0], a);
135 i[0] = va_arg(list, int);
136 a = va_arg(list, char*);
137 fmtprint(&fmt, "%d", i[0]);
138 fmtuserstring(&fmt, a, "");
142 v = va_arg(list, void*);
143 fmtprint(&fmt, "%#p ", v);
144 v = va_arg(list, void*);
145 fmtprint(&fmt, "%#p", v);
147 case _MOUNT: /* deprecated */
148 i[0] = va_arg(list, int);
149 fmtprint(&fmt, "%d ", i[0]);
150 a = va_arg(list, char*);
151 fmtuserstring(&fmt, a, " ");
152 i[0] = va_arg(list, int);
153 fmtprint(&fmt, "%#ux ", i[0]);
154 a = va_arg(list, char*);
155 fmtuserstring(&fmt, a, "");
158 a = va_arg(list, char*);
159 fmtuserstring(&fmt, a, " ");
160 i[0] = va_arg(list, int);
161 fmtprint(&fmt, "%#ux", i[0]);
163 case OSEEK: /* deprecated */
164 i[0] = va_arg(list, int);
165 l = va_arg(list, long);
166 i[1] = va_arg(list, int);
167 fmtprint(&fmt, "%d %ld %d", i[0], l, i[1]);
170 l = va_arg(list, long);
171 fmtprint(&fmt, "%ld", l);
173 case _STAT: /* obsolete */
174 case _WSTAT: /* obsolete */
175 a = va_arg(list, char*);
176 fmtuserstring(&fmt, a, " ");
177 a = va_arg(list, char*);
178 fmtprint(&fmt, "%#p", a);
181 i[0] = va_arg(list, int);
182 fmtprint(&fmt, "%#ux", i[0]);
186 v = va_arg(list, int*);
187 fmtprint(&fmt, "%#p", v);
190 a = va_arg(list, char*);
191 fmtuserstring(&fmt, a, " ");
192 i[0] = va_arg(list, int);
193 i[1] = va_arg(list, int);
194 fmtprint(&fmt, "%#ux %#ux", i[0], i[1]);
199 i[0] = va_arg(list, int);
200 a = va_arg(list, char*);
201 l = va_arg(list, unsigned long);
202 fmtprint(&fmt, "%d %#p %lud", i[0], a, l);
206 case _WAIT: /* deprecated */
207 v = va_arg(list, void*);
208 fmtprint(&fmt, "%#p", v);
211 i[0] = va_arg(list, int);
212 fmtprint(&fmt, "%d ", i[0]);
213 a = va_arg(list, char*);
214 fmtuserstring(&fmt, a, " ");
218 v = va_arg(list, void*);
219 l = va_arg(list, unsigned long);
220 fmtprint(&fmt, "%#p %lud", v, l);
223 a = va_arg(list, char*);
224 fmtuserstring(&fmt, a, " ");
225 a = va_arg(list, char*);
226 fmtuserstring(&fmt, a, "");
230 v = va_arg(list, int*);
231 i[0] = va_arg(list, int);
232 fmtprint(&fmt, "%#p %d", v, i[0]);
235 v = va_arg(list, int*);
236 l = va_arg(list, ulong);
237 fmtprint(&fmt, "%#p %ld", v, l);
240 v = va_arg(list, vlong*);
241 i[0] = va_arg(list, int);
242 vl = va_arg(list, vlong);
243 i[1] = va_arg(list, int);
244 fmtprint(&fmt, "%#p %d %#llux %d", v, i[0], vl, i[1]);
247 i[0] = va_arg(list, int);
248 i[1] = va_arg(list, int);
249 fmtprint(&fmt, "%d %d ", i[0], i[1]);
250 a = va_arg(list, char*);
251 fmtuserstring(&fmt, a, " ");
252 l = va_arg(list, unsigned long);
253 fmtprint(&fmt, "%lud", l);
257 a = va_arg(list, char*);
258 fmtuserstring(&fmt, a, " ");
262 a = va_arg(list, char*);
263 l = va_arg(list, unsigned long);
264 fmtprint(&fmt, "%#p %lud", a, l);
267 i[0] = va_arg(list, int);
268 i[1] = va_arg(list, int);
269 fmtprint(&fmt, "%d %d ", i[0], i[1]);
270 a = va_arg(list, char*);
271 fmtuserstring(&fmt, a, " ");
272 i[0] = va_arg(list, int);
273 fmtprint(&fmt, "%#ux ", i[0]);
274 a = va_arg(list, char*);
275 fmtuserstring(&fmt, a, "");
277 case _READ: /* deprecated */
279 i[0] = va_arg(list, int);
280 v = va_arg(list, void*);
281 l = va_arg(list, long);
282 fmtprint(&fmt, "%d %#p %ld", i[0], v, l);
283 if(syscallno == PREAD){
284 vl = va_arg(list, vlong);
285 fmtprint(&fmt, " %lld", vl);
288 case _WRITE: /* deprecated */
290 i[0] = va_arg(list, int);
291 v = va_arg(list, void*);
292 l = va_arg(list, long);
293 fmtprint(&fmt, "%d ", i[0]);
295 fmtrwdata(&fmt, v, len, " ");
296 fmtprint(&fmt, "%ld", l);
297 if(syscallno == PWRITE){
298 vl = va_arg(list, vlong);
299 fmtprint(&fmt, " %lld", vl);
304 up->syscalltrace = fmtstrflush(&fmt);
308 sysretfmt(int syscallno, va_list list, long ret, uvlong start, uvlong stop)
320 free(up->syscalltrace);
329 errstr = up->syserrstr;
330 fmtprint(&fmt, " = %ld", ret);
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, ret);
348 fmtprint(&fmt, "%#p/\"\" %lud = %ld", a, l, 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, ret);
364 fmtprint(&fmt, "\"\" %lud = %ld", l, 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, ret);
378 fmtprint(&fmt, "\"\" %lud = %ld", l, 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", ret);
404 fmtprint(&fmt, " %s %#llud %#llud\n", errstr, start, stop);
405 up->syscalltrace = fmtstrflush(&fmt);