syscallfmt: fix syscall trace for kw/opamp4

This commit is contained in:
cinap_lenrek 2012-12-04 07:26:33 +01:00
parent 4ae38efc1c
commit 580a8ae857
2 changed files with 29 additions and 39 deletions

View file

@ -206,40 +206,26 @@ syscall(Ureg* ureg)
spllo();
sp = ureg->sp;
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-BY2PG) || sp > (USTKTOP-sizeof(Sargs)-BY2WD))
validaddr(sp, sizeof(Sargs)+BY2WD, 0);
syscallfmt(scallnr, ureg->pc, (va_list)(sp+BY2WD));
up->procctl = Proc_stopme;
procctl(up);
if (up->syscalltrace)
free(up->syscalltrace);
up->syscalltrace = nil;
}
up->nerrlab = 0;
ret = -1;
startns = todget(nil);
if(!waserror()){
if(sp < (USTKTOP-BY2PG) || sp > (USTKTOP-sizeof(Sargs)-BY2WD))
validaddr(sp, sizeof(Sargs)+BY2WD, 0);
up->s = *((Sargs*)(sp+BY2WD));
if(up->procctl == Proc_tracesyscall){
syscallfmt(scallnr, ureg->pc, (va_list)up->s.args);
s = splhi();
up->procctl = Proc_stopme;
procctl(up);
splx(s);
startns = todget(nil);
}
if(scallnr >= nsyscall){
pprint("bad sys call number %d pc %#lux\n",
scallnr, ureg->pc);
postnote(up, 1, "sys: bad sys call", NDebug);
error(Ebadarg);
}
if(sp < (USTKTOP-BY2PG) || sp > (USTKTOP-sizeof(Sargs)-BY2WD))
validaddr(sp, sizeof(Sargs)+BY2WD, 0);
up->s = *((Sargs*)(sp+BY2WD));
up->psstate = sysctab[scallnr];
/* iprint("%s: syscall %s\n", up->text, sysctab[scallnr]?sysctab[scallnr]:"huh?"); */
@ -270,21 +256,18 @@ syscall(Ureg* ureg)
if(up->procctl == Proc_tracesyscall){
stopns = todget(nil);
up->procctl = Proc_stopme;
sysretfmt(scallnr, (va_list)(sp+BY2WD), ret, startns, stopns);
sysretfmt(scallnr, (va_list)up->s.args, ret, startns, stopns);
s = splhi();
up->procctl = Proc_stopme;
procctl(up);
splx(s);
if(up->syscalltrace)
free(up->syscalltrace);
up->syscalltrace = nil;
}
up->insyscall = 0;
up->psstate = 0;
if(scallnr == NOTED)
noted(ureg, *(ulong*)(sp+BY2WD));
noted(ureg, up->s.args[0]);
splhi();
if(scallnr != RFORK && (up->procctl || up->nnote))

View file

@ -317,16 +317,13 @@ syscall(Ureg *ureg)
int scall, ret;
ulong s, sp;
char *e;
vlong startns, stopns;
m->syscall++;
up->insyscall = 1;
up->pc = ureg->pc;
up->dbgreg = ureg;
cycles(&up->kentry);
if(up->procctl == Proc_tracesyscall){
up->procctl = Proc_stopme;
procctl(up);
}
scall = ureg->r0;
up->scallnr = scall;
spllo();
@ -335,12 +332,20 @@ syscall(Ureg *ureg)
up->nerrlab = 0;
ret = -1;
if(!waserror()){
validaddr(sp, sizeof(Sargs) + BY2WD, 0);
up->s = *((Sargs*)(sp + BY2WD));
if(up->procctl == Proc_tracesyscall){
syscallfmt(scall, ureg->pc, (va_list)up->s.args);
s = splhi();
up->procctl = Proc_stopme;
procctl(up);
splx(s);
startns = todget(nil);
}
if(scall >= nsyscall){
postnote(up, 1, "sys: bad syscall", NDebug);
error(Ebadarg);
}
validaddr(sp, sizeof(Sargs) + BY2WD, 0);
up->s = *((Sargs*)(sp + BY2WD));
up->psstate = sysctab[scall];
ret = systab[scall](up->s.args);
poperror();
@ -354,8 +359,10 @@ syscall(Ureg *ureg)
ureg->r0 = ret;
if(up->procctl == Proc_tracesyscall){
up->procctl = Proc_stopme;
stopns = todget(nil);
sysretfmt(scall, (va_list)up->s.args, ret, startns, stopns);
s = splhi();
up->procctl = Proc_stopme;
procctl(up);
splx(s);
}
@ -364,7 +371,7 @@ syscall(Ureg *ureg)
up->psstate = nil;
if(scall == NOTED)
noted(ureg, *(ulong *)(sp + BY2WD));
noted(ureg, up->s.args[0]);
if(scall != RFORK && (up->procctl || up->nnote)){
splhi();
notify(ureg);