19ef1f84bSDavid du Colombier #include "u.h"
29ef1f84bSDavid du Colombier #include "../port/lib.h"
39ef1f84bSDavid du Colombier #include "mem.h"
49ef1f84bSDavid du Colombier #include "dat.h"
59ef1f84bSDavid du Colombier #include "fns.h"
69ef1f84bSDavid du Colombier
79ef1f84bSDavid du Colombier #include "/sys/src/libc/9syscall/sys.h"
89ef1f84bSDavid du Colombier
99ef1f84bSDavid du Colombier /*
109ef1f84bSDavid du Colombier * Print functions for system call tracing.
119ef1f84bSDavid du Colombier */
129ef1f84bSDavid du Colombier static void
fmtrwdata(Fmt * f,char * a,int n,char * suffix)139ef1f84bSDavid du Colombier fmtrwdata(Fmt* f, char* a, int n, char* suffix)
149ef1f84bSDavid du Colombier {
159ef1f84bSDavid du Colombier int i;
169ef1f84bSDavid du Colombier char *t;
179ef1f84bSDavid du Colombier
189ef1f84bSDavid du Colombier if(a == nil){
199ef1f84bSDavid du Colombier fmtprint(f, "0x0%s", suffix);
209ef1f84bSDavid du Colombier return;
219ef1f84bSDavid du Colombier }
229ef1f84bSDavid du Colombier a = validaddr(a, n, 0);
239ef1f84bSDavid du Colombier t = smalloc(n+1);
249ef1f84bSDavid du Colombier for(i = 0; i < n; i++){
259ef1f84bSDavid du Colombier if(a[i] > 0x20 && a[i] < 0x7f)
269ef1f84bSDavid du Colombier t[i] = a[i];
279ef1f84bSDavid du Colombier else
289ef1f84bSDavid du Colombier t[i] = '.';
299ef1f84bSDavid du Colombier }
309ef1f84bSDavid du Colombier
319ef1f84bSDavid du Colombier fmtprint(f, " %#p/\"%s\"%s", a, t, suffix);
329ef1f84bSDavid du Colombier free(t);
339ef1f84bSDavid du Colombier }
349ef1f84bSDavid du Colombier
359ef1f84bSDavid du Colombier static void
fmtuserstring(Fmt * f,char * a,char * suffix)369ef1f84bSDavid du Colombier fmtuserstring(Fmt* f, char* a, char* suffix)
379ef1f84bSDavid du Colombier {
389ef1f84bSDavid du Colombier int n;
399ef1f84bSDavid du Colombier char *t;
409ef1f84bSDavid du Colombier
419ef1f84bSDavid du Colombier if(a == nil){
429ef1f84bSDavid du Colombier fmtprint(f, "0/\"\"%s", suffix);
439ef1f84bSDavid du Colombier return;
449ef1f84bSDavid du Colombier }
459ef1f84bSDavid du Colombier a = validaddr(a, 1, 0);
469ef1f84bSDavid du Colombier n = ((char*)vmemchr(a, 0, 0x7fffffff) - a) + 1;
479ef1f84bSDavid du Colombier t = smalloc(n);
489ef1f84bSDavid du Colombier memmove(t, a, n);
499ef1f84bSDavid du Colombier t[n] = 0;
509ef1f84bSDavid du Colombier fmtprint(f, "%#p/\"%s\"%s", a, t, suffix);
519ef1f84bSDavid du Colombier free(t);
529ef1f84bSDavid du Colombier }
539ef1f84bSDavid du Colombier
549ef1f84bSDavid du Colombier /*
559ef1f84bSDavid du Colombier */
569ef1f84bSDavid du Colombier void
syscallfmt(int syscallno,va_list list)579ef1f84bSDavid du Colombier syscallfmt(int syscallno, va_list list)
589ef1f84bSDavid du Colombier {
599ef1f84bSDavid du Colombier long l;
609ef1f84bSDavid du Colombier Fmt fmt;
619ef1f84bSDavid du Colombier void *v;
629ef1f84bSDavid du Colombier vlong vl;
639ef1f84bSDavid du Colombier uintptr p;
649ef1f84bSDavid du Colombier int i[2], len;
659ef1f84bSDavid du Colombier char *a, **argv;
669ef1f84bSDavid du Colombier
679ef1f84bSDavid du Colombier fmtstrinit(&fmt);
689ef1f84bSDavid du Colombier fmtprint(&fmt, "%d %s ", up->pid, up->text);
699ef1f84bSDavid du Colombier
709ef1f84bSDavid du Colombier if(syscallno > nsyscall)
719ef1f84bSDavid du Colombier fmtprint(&fmt, " %d ", syscallno);
729ef1f84bSDavid du Colombier else
739ef1f84bSDavid du Colombier fmtprint(&fmt, "%s ", systab[syscallno].n);
749ef1f84bSDavid du Colombier
759ef1f84bSDavid du Colombier if(up->syscalltrace != nil)
769ef1f84bSDavid du Colombier free(up->syscalltrace);
779ef1f84bSDavid du Colombier
789ef1f84bSDavid du Colombier switch(syscallno){
799ef1f84bSDavid du Colombier case SYSR1:
809ef1f84bSDavid du Colombier p = va_arg(list, uintptr);
819ef1f84bSDavid du Colombier fmtprint(&fmt, "%#p", p);
829ef1f84bSDavid du Colombier break;
839ef1f84bSDavid du Colombier case _ERRSTR: /* deprecated */
849ef1f84bSDavid du Colombier case CHDIR:
859ef1f84bSDavid du Colombier case EXITS:
869ef1f84bSDavid du Colombier case REMOVE:
879ef1f84bSDavid du Colombier a = va_arg(list, char*);
889ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, "");
899ef1f84bSDavid du Colombier break;
909ef1f84bSDavid du Colombier case BIND:
919ef1f84bSDavid du Colombier a = va_arg(list, char*);
929ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
939ef1f84bSDavid du Colombier a = va_arg(list, char*);
949ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
959ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
969ef1f84bSDavid du Colombier fmtprint(&fmt, "%#ux", i[0]);
979ef1f84bSDavid du Colombier break;
989ef1f84bSDavid du Colombier case CLOSE:
999ef1f84bSDavid du Colombier case NOTED:
1009ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
1019ef1f84bSDavid du Colombier fmtprint(&fmt, "%d", i[0]);
1029ef1f84bSDavid du Colombier break;
1039ef1f84bSDavid du Colombier case DUP:
1049ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
1059ef1f84bSDavid du Colombier i[1] = va_arg(list, int);
1069ef1f84bSDavid du Colombier fmtprint(&fmt, "%d %d", i[0], i[1]);
1079ef1f84bSDavid du Colombier break;
1089ef1f84bSDavid du Colombier case ALARM:
1099ef1f84bSDavid du Colombier l = va_arg(list, unsigned long);
1109ef1f84bSDavid du Colombier fmtprint(&fmt, "%#lud ", l);
1119ef1f84bSDavid du Colombier break;
1129ef1f84bSDavid du Colombier case EXEC:
1139ef1f84bSDavid du Colombier a = va_arg(list, char*);
1149ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, "");
1159ef1f84bSDavid du Colombier argv = va_arg(list, char**);
1169ef1f84bSDavid du Colombier evenaddr(PTR2UINT(argv));
1179ef1f84bSDavid du Colombier for(;;){
1189ef1f84bSDavid du Colombier a = *(char**)validaddr(argv, sizeof(char**), 0);
1199ef1f84bSDavid du Colombier if(a == nil)
1209ef1f84bSDavid du Colombier break;
1219ef1f84bSDavid du Colombier fmtprint(&fmt, " ");
1229ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, "");
1239ef1f84bSDavid du Colombier argv++;
1249ef1f84bSDavid du Colombier }
1259ef1f84bSDavid du Colombier break;
1269ef1f84bSDavid du Colombier case _FSESSION: /* deprecated */
1279ef1f84bSDavid du Colombier case _FSTAT: /* deprecated */
1289ef1f84bSDavid du Colombier case _FWSTAT: /* obsolete */
1299ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
1309ef1f84bSDavid du Colombier a = va_arg(list, char*);
1319ef1f84bSDavid du Colombier fmtprint(&fmt, "%d %#p", i[0], a);
1329ef1f84bSDavid du Colombier break;
1339ef1f84bSDavid du Colombier case FAUTH:
1349ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
1359ef1f84bSDavid du Colombier a = va_arg(list, char*);
1369ef1f84bSDavid du Colombier fmtprint(&fmt, "%d", i[0]);
1379ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, "");
1389ef1f84bSDavid du Colombier break;
1399ef1f84bSDavid du Colombier case SEGBRK:
1409ef1f84bSDavid du Colombier case RENDEZVOUS:
1419ef1f84bSDavid du Colombier v = va_arg(list, void*);
1429ef1f84bSDavid du Colombier fmtprint(&fmt, "%#p ", v);
1439ef1f84bSDavid du Colombier v = va_arg(list, void*);
1449ef1f84bSDavid du Colombier fmtprint(&fmt, "%#p", v);
1459ef1f84bSDavid du Colombier break;
1469ef1f84bSDavid du Colombier case _MOUNT: /* deprecated */
1479ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
1489ef1f84bSDavid du Colombier fmtprint(&fmt, "%d ", i[0]);
1499ef1f84bSDavid du Colombier a = va_arg(list, char*);
1509ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
1519ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
1529ef1f84bSDavid du Colombier fmtprint(&fmt, "%#ux ", i[0]);
1539ef1f84bSDavid du Colombier a = va_arg(list, char*);
1549ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, "");
1559ef1f84bSDavid du Colombier break;
1569ef1f84bSDavid du Colombier case OPEN:
1579ef1f84bSDavid du Colombier a = va_arg(list, char*);
1589ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
1599ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
1609ef1f84bSDavid du Colombier fmtprint(&fmt, "%#ux", i[0]);
1619ef1f84bSDavid du Colombier break;
1629ef1f84bSDavid du Colombier case OSEEK: /* deprecated */
1639ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
1649ef1f84bSDavid du Colombier l = va_arg(list, long);
1659ef1f84bSDavid du Colombier i[1] = va_arg(list, int);
1669ef1f84bSDavid du Colombier fmtprint(&fmt, "%d %ld %d", i[0], l, i[1]);
1679ef1f84bSDavid du Colombier break;
1689ef1f84bSDavid du Colombier case SLEEP:
1699ef1f84bSDavid du Colombier l = va_arg(list, long);
1709ef1f84bSDavid du Colombier fmtprint(&fmt, "%ld", l);
1719ef1f84bSDavid du Colombier break;
1729ef1f84bSDavid du Colombier case _STAT: /* obsolete */
1739ef1f84bSDavid du Colombier case _WSTAT: /* obsolete */
1749ef1f84bSDavid du Colombier a = va_arg(list, char*);
1759ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
1769ef1f84bSDavid du Colombier a = va_arg(list, char*);
1779ef1f84bSDavid du Colombier fmtprint(&fmt, "%#p", a);
1789ef1f84bSDavid du Colombier break;
1799ef1f84bSDavid du Colombier case RFORK:
1809ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
1819ef1f84bSDavid du Colombier fmtprint(&fmt, "%#ux", i[0]);
1829ef1f84bSDavid du Colombier break;
1839ef1f84bSDavid du Colombier case PIPE:
1849ef1f84bSDavid du Colombier case BRK_:
1859ef1f84bSDavid du Colombier v = va_arg(list, int*);
1869ef1f84bSDavid du Colombier fmtprint(&fmt, "%#p", v);
1879ef1f84bSDavid du Colombier break;
1889ef1f84bSDavid du Colombier case CREATE:
1899ef1f84bSDavid du Colombier a = va_arg(list, char*);
1909ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
1919ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
1929ef1f84bSDavid du Colombier i[1] = va_arg(list, int);
1939ef1f84bSDavid du Colombier fmtprint(&fmt, "%#ux %#ux", i[0], i[1]);
1949ef1f84bSDavid du Colombier break;
1959ef1f84bSDavid du Colombier case FD2PATH:
1969ef1f84bSDavid du Colombier case FSTAT:
1979ef1f84bSDavid du Colombier case FWSTAT:
1989ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
1999ef1f84bSDavid du Colombier a = va_arg(list, char*);
2009ef1f84bSDavid du Colombier l = va_arg(list, unsigned long);
2019ef1f84bSDavid du Colombier fmtprint(&fmt, "%d %#p %lud", i[0], a, l);
2029ef1f84bSDavid du Colombier break;
2039ef1f84bSDavid du Colombier case NOTIFY:
2049ef1f84bSDavid du Colombier case SEGDETACH:
2059ef1f84bSDavid du Colombier case _WAIT: /* deprecated */
2069ef1f84bSDavid du Colombier v = va_arg(list, void*);
2079ef1f84bSDavid du Colombier fmtprint(&fmt, "%#p", v);
2089ef1f84bSDavid du Colombier break;
2099ef1f84bSDavid du Colombier case SEGATTACH:
2109ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
2119ef1f84bSDavid du Colombier fmtprint(&fmt, "%d ", i[0]);
2129ef1f84bSDavid du Colombier a = va_arg(list, char*);
2139ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
2149ef1f84bSDavid du Colombier /*FALLTHROUGH*/
2159ef1f84bSDavid du Colombier case SEGFREE:
2169ef1f84bSDavid du Colombier case SEGFLUSH:
2179ef1f84bSDavid du Colombier v = va_arg(list, void*);
2189ef1f84bSDavid du Colombier l = va_arg(list, unsigned long);
2199ef1f84bSDavid du Colombier fmtprint(&fmt, "%#p %lud", v, l);
2209ef1f84bSDavid du Colombier break;
2219ef1f84bSDavid du Colombier case UNMOUNT:
2229ef1f84bSDavid du Colombier a = va_arg(list, char*);
2239ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
2249ef1f84bSDavid du Colombier a = va_arg(list, char*);
2259ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, "");
2269ef1f84bSDavid du Colombier break;
2279ef1f84bSDavid du Colombier case SEMACQUIRE:
2289ef1f84bSDavid du Colombier case SEMRELEASE:
2299ef1f84bSDavid du Colombier v = va_arg(list, int*);
2309ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
2319ef1f84bSDavid du Colombier fmtprint(&fmt, "%#p %d", v, i[0]);
2329ef1f84bSDavid du Colombier break;
233*406c76faSDavid du Colombier case TSEMACQUIRE:
234*406c76faSDavid du Colombier v = va_arg(list, long*);
235*406c76faSDavid du Colombier l = va_arg(list, ulong);
236*406c76faSDavid du Colombier fmtprint(&fmt, "%#p %ld", v, l);
237*406c76faSDavid du Colombier break;
2389ef1f84bSDavid du Colombier case SEEK:
2399ef1f84bSDavid du Colombier v = va_arg(list, vlong*);
2409ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
2419ef1f84bSDavid du Colombier vl = va_arg(list, vlong);
2429ef1f84bSDavid du Colombier i[1] = va_arg(list, int);
2439ef1f84bSDavid du Colombier fmtprint(&fmt, "%#p %d %#llux %d", v, i[0], vl, i[1]);
2449ef1f84bSDavid du Colombier break;
2459ef1f84bSDavid du Colombier case FVERSION:
2469ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
2479ef1f84bSDavid du Colombier i[1] = va_arg(list, int);
2489ef1f84bSDavid du Colombier fmtprint(&fmt, "%d %d ", i[0], i[1]);
2499ef1f84bSDavid du Colombier a = va_arg(list, char*);
2509ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
2519ef1f84bSDavid du Colombier l = va_arg(list, unsigned long);
2529ef1f84bSDavid du Colombier fmtprint(&fmt, "%lud", l);
2539ef1f84bSDavid du Colombier break;
2549ef1f84bSDavid du Colombier case WSTAT:
2559ef1f84bSDavid du Colombier case STAT:
2569ef1f84bSDavid du Colombier a = va_arg(list, char*);
2579ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
2589ef1f84bSDavid du Colombier /*FALLTHROUGH*/
2599ef1f84bSDavid du Colombier case ERRSTR:
2609ef1f84bSDavid du Colombier case AWAIT:
2619ef1f84bSDavid du Colombier a = va_arg(list, char*);
2629ef1f84bSDavid du Colombier l = va_arg(list, unsigned long);
2639ef1f84bSDavid du Colombier fmtprint(&fmt, "%#p %lud", a, l);
2649ef1f84bSDavid du Colombier break;
2659ef1f84bSDavid du Colombier case MOUNT:
2669ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
2679ef1f84bSDavid du Colombier i[1] = va_arg(list, int);
2689ef1f84bSDavid du Colombier fmtprint(&fmt, "%d %d ", i[0], i[1]);
2699ef1f84bSDavid du Colombier a = va_arg(list, char*);
2709ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
2719ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
2729ef1f84bSDavid du Colombier fmtprint(&fmt, "%#ux ", i[0]);
2739ef1f84bSDavid du Colombier a = va_arg(list, char*);
2749ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, "");
2759ef1f84bSDavid du Colombier break;
2769ef1f84bSDavid du Colombier case _READ: /* deprecated */
2779ef1f84bSDavid du Colombier case PREAD:
2789ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
2799ef1f84bSDavid du Colombier v = va_arg(list, void*);
2809ef1f84bSDavid du Colombier l = va_arg(list, long);
2819ef1f84bSDavid du Colombier fmtprint(&fmt, "%d %#p %ld", i[0], v, l);
2829ef1f84bSDavid du Colombier if(syscallno == PREAD){
2839ef1f84bSDavid du Colombier vl = va_arg(list, vlong);
2849ef1f84bSDavid du Colombier fmtprint(&fmt, " %lld", vl);
2859ef1f84bSDavid du Colombier }
2869ef1f84bSDavid du Colombier break;
2879ef1f84bSDavid du Colombier case _WRITE: /* deprecated */
2889ef1f84bSDavid du Colombier case PWRITE:
2899ef1f84bSDavid du Colombier i[0] = va_arg(list, int);
2909ef1f84bSDavid du Colombier v = va_arg(list, void*);
2919ef1f84bSDavid du Colombier l = va_arg(list, long);
2929ef1f84bSDavid du Colombier fmtprint(&fmt, "%d ", i[0]);
2939ef1f84bSDavid du Colombier len = MIN(l, 64);
2949ef1f84bSDavid du Colombier fmtrwdata(&fmt, v, len, " ");
2959ef1f84bSDavid du Colombier fmtprint(&fmt, "%ld", l);
2969ef1f84bSDavid du Colombier if(syscallno == PWRITE){
2979ef1f84bSDavid du Colombier vl = va_arg(list, vlong);
2989ef1f84bSDavid du Colombier fmtprint(&fmt, " %lld", vl);
2999ef1f84bSDavid du Colombier }
3009ef1f84bSDavid du Colombier break;
3015891e653SDavid du Colombier case NSEC:
3025891e653SDavid du Colombier /* compilers on 32-bit systems insert &ret as only argument */
3035891e653SDavid du Colombier if (sizeof(void *) < sizeof(vlong))
3045891e653SDavid du Colombier fmtprint(&fmt, "%#p", va_arg(list, vlong*));
3055891e653SDavid du Colombier break;
3069ef1f84bSDavid du Colombier }
3079ef1f84bSDavid du Colombier up->syscalltrace = fmtstrflush(&fmt);
3089ef1f84bSDavid du Colombier }
3099ef1f84bSDavid du Colombier
3109ef1f84bSDavid du Colombier void
sysretfmt(int syscallno,va_list list,Ar0 * ar0,uvlong start,uvlong stop)3119ef1f84bSDavid du Colombier sysretfmt(int syscallno, va_list list, Ar0* ar0, uvlong start, uvlong stop)
3129ef1f84bSDavid du Colombier {
3139ef1f84bSDavid du Colombier long l;
3149ef1f84bSDavid du Colombier void* v;
3159ef1f84bSDavid du Colombier Fmt fmt;
3169ef1f84bSDavid du Colombier vlong vl;
3179ef1f84bSDavid du Colombier int i, len;
3189ef1f84bSDavid du Colombier char *a, *errstr;
3199ef1f84bSDavid du Colombier
3209ef1f84bSDavid du Colombier fmtstrinit(&fmt);
3219ef1f84bSDavid du Colombier
3229ef1f84bSDavid du Colombier if(up->syscalltrace)
3239ef1f84bSDavid du Colombier free(up->syscalltrace);
3249ef1f84bSDavid du Colombier
3259ef1f84bSDavid du Colombier errstr = "\"\"";
3269ef1f84bSDavid du Colombier switch(syscallno){
3279ef1f84bSDavid du Colombier default:
3289ef1f84bSDavid du Colombier if(ar0->i == -1)
329*406c76faSDavid du Colombier errstr = up->syserrstr;
3301721bb52SDavid du Colombier fmtprint(&fmt, " = %d", (int)ar0->i);
3319ef1f84bSDavid du Colombier break;
3329ef1f84bSDavid du Colombier case ALARM:
3339ef1f84bSDavid du Colombier case _WRITE:
3349ef1f84bSDavid du Colombier case PWRITE:
3359ef1f84bSDavid du Colombier if(ar0->l == -1)
336*406c76faSDavid du Colombier errstr = up->syserrstr;
3371721bb52SDavid du Colombier fmtprint(&fmt, " = %ld", (long)ar0->l);
3389ef1f84bSDavid du Colombier break;
3395891e653SDavid du Colombier case NSEC:
3405891e653SDavid du Colombier fmtprint(&fmt, " = %lld", ar0->vl);
3415891e653SDavid du Colombier break;
3429ef1f84bSDavid du Colombier case EXEC:
3439ef1f84bSDavid du Colombier case SEGBRK:
3449ef1f84bSDavid du Colombier case SEGATTACH:
3459ef1f84bSDavid du Colombier case RENDEZVOUS:
3469ef1f84bSDavid du Colombier if(ar0->v == (void*)-1)
347*406c76faSDavid du Colombier errstr = up->syserrstr;
3489ef1f84bSDavid du Colombier fmtprint(&fmt, " = %#p", ar0->v);
3499ef1f84bSDavid du Colombier break;
3509ef1f84bSDavid du Colombier case AWAIT:
3519ef1f84bSDavid du Colombier a = va_arg(list, char*);
3529ef1f84bSDavid du Colombier l = va_arg(list, unsigned long);
3539ef1f84bSDavid du Colombier if(ar0->i > 0){
3549ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
3551721bb52SDavid du Colombier fmtprint(&fmt, "%lud = %d", l, (int)ar0->i);
3569ef1f84bSDavid du Colombier }
3579ef1f84bSDavid du Colombier else{
3581721bb52SDavid du Colombier fmtprint(&fmt, "%#p/\"\" %lud = %d", a, l, (int)ar0->i);
359*406c76faSDavid du Colombier errstr = up->syserrstr;
3609ef1f84bSDavid du Colombier }
3619ef1f84bSDavid du Colombier break;
3629ef1f84bSDavid du Colombier case _ERRSTR:
3639ef1f84bSDavid du Colombier case ERRSTR:
3649ef1f84bSDavid du Colombier a = va_arg(list, char*);
3659ef1f84bSDavid du Colombier if(syscallno == _ERRSTR)
3669ef1f84bSDavid du Colombier l = 64;
3679ef1f84bSDavid du Colombier else
3689ef1f84bSDavid du Colombier l = va_arg(list, unsigned long);
3699ef1f84bSDavid du Colombier if(ar0->i > 0){
3709ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
3711721bb52SDavid du Colombier fmtprint(&fmt, "%lud = %d", l, (int)ar0->i);
3729ef1f84bSDavid du Colombier }
3739ef1f84bSDavid du Colombier else{
3741721bb52SDavid du Colombier fmtprint(&fmt, "\"\" %lud = %d", l, (int)ar0->i);
375*406c76faSDavid du Colombier errstr = up->syserrstr;
3769ef1f84bSDavid du Colombier }
3779ef1f84bSDavid du Colombier break;
3789ef1f84bSDavid du Colombier case FD2PATH:
3799ef1f84bSDavid du Colombier i = va_arg(list, int);
3809ef1f84bSDavid du Colombier USED(i);
3819ef1f84bSDavid du Colombier a = va_arg(list, char*);
3829ef1f84bSDavid du Colombier l = va_arg(list, unsigned long);
3839ef1f84bSDavid du Colombier if(ar0->i > 0){
3849ef1f84bSDavid du Colombier fmtuserstring(&fmt, a, " ");
3851721bb52SDavid du Colombier fmtprint(&fmt, "%lud = %d", l, (int)ar0->i);
3869ef1f84bSDavid du Colombier }
3879ef1f84bSDavid du Colombier else{
3881721bb52SDavid du Colombier fmtprint(&fmt, "\"\" %lud = %d", l, (int)ar0->i);
389*406c76faSDavid du Colombier errstr = up->syserrstr;
3909ef1f84bSDavid du Colombier }
3919ef1f84bSDavid du Colombier break;
3929ef1f84bSDavid du Colombier case _READ:
3939ef1f84bSDavid du Colombier case PREAD:
3949ef1f84bSDavid du Colombier i = va_arg(list, int);
3959ef1f84bSDavid du Colombier USED(i);
3969ef1f84bSDavid du Colombier v = va_arg(list, void*);
3979ef1f84bSDavid du Colombier l = va_arg(list, long);
3989ef1f84bSDavid du Colombier if(ar0->l > 0){
3999ef1f84bSDavid du Colombier len = MIN(ar0->l, 64);
4009ef1f84bSDavid du Colombier fmtrwdata(&fmt, v, len, "");
4019ef1f84bSDavid du Colombier }
4029ef1f84bSDavid du Colombier else{
4039ef1f84bSDavid du Colombier fmtprint(&fmt, "/\"\"");
404*406c76faSDavid du Colombier errstr = up->syserrstr;
4059ef1f84bSDavid du Colombier }
4069ef1f84bSDavid du Colombier fmtprint(&fmt, " %ld", l);
4079ef1f84bSDavid du Colombier if(syscallno == PREAD){
4089ef1f84bSDavid du Colombier vl = va_arg(list, vlong);
4099ef1f84bSDavid du Colombier fmtprint(&fmt, " %lld", vl);
4109ef1f84bSDavid du Colombier }
4111721bb52SDavid du Colombier fmtprint(&fmt, " = %d", (int)ar0->i);
4129ef1f84bSDavid du Colombier break;
4139ef1f84bSDavid du Colombier }
4149ef1f84bSDavid du Colombier fmtprint(&fmt, " %s %#llud %#llud\n", errstr, start, stop);
4159ef1f84bSDavid du Colombier
4169ef1f84bSDavid du Colombier up->syscalltrace = fmtstrflush(&fmt);
4179ef1f84bSDavid du Colombier }
418