diff -r c7e9b5edb8d4 src/9vx/Makefrag --- a/src/9vx/Makefrag Sun Dec 27 09:49:22 2009 -0800 +++ b/src/9vx/Makefrag Tue Mar 16 21:29:23 2010 -0700 @@ -74,6 +74,7 @@ devmnt.o \ devproc.o \ devpipe.o \ + devram.o \ devroot.o \ devsd.o \ devsrv.o \ diff -r c7e9b5edb8d4 src/9vx/a/AUTOGEN --- a/src/9vx/a/AUTOGEN Sun Dec 27 09:49:22 2009 -0800 +++ b/src/9vx/a/AUTOGEN Tue Mar 16 21:29:23 2010 -0700 @@ -38,6 +38,7 @@ /sys/src/9/port/devmnt.c /sys/src/9/port/devpipe.c /sys/src/9/port/devproc.c +/sys/src/9/port/devram.c /sys/src/9/port/devroot.c /sys/src/9/port/devsrv.c /sys/src/9/port/devtls.c diff -r c7e9b5edb8d4 src/9vx/a/devproc.c --- a/src/9vx/a/devproc.c Sun Dec 27 09:49:22 2009 -0800 +++ b/src/9vx/a/devproc.c Tue Mar 16 21:29:23 2010 -0700 @@ -31,6 +31,7 @@ Qtext, Qwait, Qprofile, + Qtruss, }; enum @@ -84,6 +85,7 @@ "text", {Qtext}, 0, 0000, "wait", {Qwait}, 0, 0400, "profile", {Qprofile}, 0, 0400, + "truss", {Qtruss}, 0, 0400, }; static @@ -397,6 +399,7 @@ case Qwait: case Qregs: case Qfpregs: + case Qtruss: nonone(p); break; @@ -706,6 +709,12 @@ memmove(a, &up->genbuf[offset], n); return n; + case Qtruss: + if (! p->syscalltrace) + return 0; + n = readstr(offset, a, n, p->syscalltrace); + return n; + case Qmem: if(offset < USTKTOP) return procctlmemio(p, offset, n, va, 1); diff -r c7e9b5edb8d4 src/9vx/a/portdat.h --- a/src/9vx/a/portdat.h Sun Dec 27 09:49:22 2009 -0800 +++ b/src/9vx/a/portdat.h Tue Mar 16 21:29:23 2010 -0700 @@ -752,6 +752,9 @@ * machine specific MMU */ PMMU pmmu; + /* syscall trace */ + char *syscalltrace; + }; enum diff -r c7e9b5edb8d4 src/9vx/devtab.c --- a/src/9vx/devtab.c Sun Dec 27 09:49:22 2009 -0800 +++ b/src/9vx/devtab.c Tue Mar 16 21:29:23 2010 -0700 @@ -8,6 +8,7 @@ extern Dev consdevtab; extern Dev rootdevtab; extern Dev pipedevtab; +extern Dev ramdevtab; extern Dev ssldevtab; extern Dev tlsdevtab; extern Dev mousedevtab; @@ -38,6 +39,7 @@ &mousedevtab, &pipedevtab, &procdevtab, + &ramdevtab, &srvdevtab, &ssldevtab, &tlsdevtab, diff -r c7e9b5edb8d4 src/9vx/trap.c --- a/src/9vx/trap.c Sun Dec 27 09:49:22 2009 -0800 +++ b/src/9vx/trap.c Tue Mar 16 21:29:23 2010 -0700 @@ -198,8 +198,18 @@ up->dbgreg = ureg; if(up->procctl == Proc_tracesyscall){ + uint32 *sp = (uint32*)(up->pmmu.uzero + ureg->usp); up->procctl = Proc_stopme; + if (up->syscalltrace) + free(up->syscalltrace); + up->syscalltrace = smprint("%d [%s] %s %#ux %08ux %08ux %08ux %08uxh", + up->pid, up->text, + sysctab[ureg->ax], sp[0], sp[1], sp[2], sp[3]); procctl(up); + /* you must have read the string by now. The free above is really not needed */ + if (up->syscalltrace) + free(up->syscalltrace); + up->syscalltrace = NULL; } scallnr = ureg->ax; @@ -260,9 +270,19 @@ if(up->procctl == Proc_tracesyscall){ up->procctl = Proc_stopme; + if (up->syscalltrace) + free(up->syscalltrace); + if(ureg->ax == -1) + up->syscalltrace = smprint("= %s\n", up->syserrstr); + else + up->syscalltrace = smprint("= %#ux\n", ureg->ax); s = splhi(); procctl(up); splx(s); + /* you must have read the string by now. The free above is really not needed */ + if (up->syscalltrace) + free(up->syscalltrace); + up->syscalltrace = NULL; } up->insyscall = 0;