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, vlong*);
236 i[0] = va_arg(list, int);
237 vl = va_arg(list, vlong);
238 i[1] = va_arg(list, int);
239 fmtprint(&fmt, "%#p %d %#llux %d", v, i[0], vl, i[1]);
242 i[0] = va_arg(list, int);
243 i[1] = va_arg(list, int);
244 fmtprint(&fmt, "%d %d ", i[0], i[1]);
245 a = va_arg(list, char*);
246 fmtuserstring(&fmt, a, " ");
247 l = va_arg(list, unsigned long);
248 fmtprint(&fmt, "%lud", l);
252 a = va_arg(list, char*);
253 fmtuserstring(&fmt, a, " ");
257 a = va_arg(list, char*);
258 l = va_arg(list, unsigned long);
259 fmtprint(&fmt, "%#p %lud", a, l);
262 i[0] = va_arg(list, int);
263 i[1] = va_arg(list, int);
264 fmtprint(&fmt, "%d %d ", i[0], i[1]);
265 a = va_arg(list, char*);
266 fmtuserstring(&fmt, a, " ");
267 i[0] = va_arg(list, int);
268 fmtprint(&fmt, "%#ux ", i[0]);
269 a = va_arg(list, char*);
270 fmtuserstring(&fmt, a, "");
272 case _READ: /* deprecated */
274 i[0] = va_arg(list, int);
275 v = va_arg(list, void*);
276 l = va_arg(list, long);
277 fmtprint(&fmt, "%d %#p %ld", i[0], v, l);
278 if(syscallno == PREAD){
279 vl = va_arg(list, vlong);
280 fmtprint(&fmt, " %lld", vl);
283 case _WRITE: /* deprecated */
285 i[0] = va_arg(list, int);
286 v = va_arg(list, void*);
287 l = va_arg(list, long);
288 fmtprint(&fmt, "%d ", i[0]);
290 fmtrwdata(&fmt, v, len, " ");
291 fmtprint(&fmt, "%ld", l);
292 if(syscallno == PWRITE){
293 vl = va_arg(list, vlong);
294 fmtprint(&fmt, " %lld", vl);
299 up->syscalltrace = fmtstrflush(&fmt);
303 sysretfmt(int syscallno, va_list list, long ret, uvlong start, uvlong stop)
315 free(up->syscalltrace);
322 fmtprint(&fmt, " = %ld", ret);
329 fmtprint(&fmt, " = %ld", ret);
335 if((void *)ret == (void*)-1)
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);
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);
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);
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, "/\"\"");
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);
404 up->syscalltrace = fmtstrflush(&fmt);