# HG changeset patch # User Noah Evans # Date 1316446916 -7200 # Node ID b8d65a4850098db4f3d4cacb115e2116f3dae52c # Parent 9adfd913d396d815b6dda8309eb907ec4e60321d syscall.c: reenable ratrace. R=rminnich, nix-dev, nemo CC=john, nemo.mbox, nix-dev http://codereview.appspot.com/5049044 diff -r 9adfd913d396 -r b8d65a485009 sys/src/nix/k10/syscall.c --- a/sys/src/nix/k10/syscall.c Mon Sep 19 17:39:00 2011 +0200 +++ b/sys/src/nix/k10/syscall.c Mon Sep 19 17:41:56 2011 +0200 @@ -234,6 +234,7 @@ char *e; uintptr sp; int s; + vlong startns, stopns; Ar0 ar0; static Ar0 zar0; @@ -260,10 +261,27 @@ up->insyscall = 1; up->pc = ureg->ip; up->dbgreg = ureg; + sp = ureg->sp; + startns = 0; if(up->procctl == Proc_tracesyscall){ + /* + * Redundant validaddr. Do we care? + * Tracing syscalls is not exactly a fast path... + * Beware, validaddr currently does a pexit rather + * than an error if there's a problem; that might + * change in the future. + */ + if(sp < (USTKTOP-BIGPGSZ) || sp > (USTKTOP-sizeof(up->arg)-BY2SE)) + validaddr(UINT2PTR(sp), sizeof(up->arg)+BY2SE, 0); + + syscallfmt(scallnr, (va_list)(sp+BY2SE)); up->procctl = Proc_stopme; procctl(up); + if(up->syscalltrace) + free(up->syscalltrace); + up->syscalltrace = nil; + startns = todget(nil); } up->scallnr = scallnr; @@ -329,10 +347,15 @@ ureg->ax = ar0.p; if(up->procctl == Proc_tracesyscall){ + stopns = todget(nil); up->procctl = Proc_stopme; + sysretfmt(scallnr, (va_list)(sp+BY2SE), &ar0, startns, stopns); s = splhi(); procctl(up); splx(s); + if(up->syscalltrace) + free(up->syscalltrace); + up->syscalltrace = nil; }else if(up->procctl == Proc_totc || up->procctl == Proc_toac) procctl(up);