diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-02-09 02:23:33 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-02-09 02:23:33 +0100 |
commit | 9bdf602ebbdcfcb4baaeb17499a1f1f6865ddc61 (patch) | |
tree | 783adcfb8552f812c5d7347c7e23d95472984ee0 | |
parent | 9d8f5a14662f6500c21ac4fa0afd083fc9e2467a (diff) |
pc64: pass Ureg* argument in BP to userspace note handler
-rw-r--r-- | sys/src/9/pc64/trap.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/src/9/pc64/trap.c b/sys/src/9/pc64/trap.c index 6b2154c3f..f40429bff 100644 --- a/sys/src/9/pc64/trap.c +++ b/sys/src/9/pc64/trap.c @@ -851,11 +851,12 @@ if(0) print("%s %lud: notify %#p %#p %#p %s\n", sp -= BY2WD+ERRMAX; memmove((char*)sp, up->note[0].msg, ERRMAX); sp -= 3*BY2WD; - *(uintptr*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */ - *(uintptr*)(sp+1*BY2WD) = (uintptr)up->ureg; /* arg 1 is ureg* */ - *(uintptr*)(sp+0*BY2WD) = 0; /* arg 0 is pc */ + ((uintptr*)sp)[2] = sp + 3*BY2WD; /* arg2 string */ + ((uintptr*)sp)[1] = (uintptr)up->ureg; /* arg1 is ureg* */ + ((uintptr*)sp)[0] = 0; /* arg0 is pc */ ureg->sp = sp; ureg->pc = (uintptr)up->notify; + ureg->bp = (uintptr)up->ureg; /* arg1 passed in RARG */ ureg->cs = UESEL; ureg->ss = ureg->ds = ureg->es = UDSEL; up->notified = 1; @@ -920,7 +921,7 @@ if(0) print("%s %lud: noted %#p %#p\n", break; case NSAVE: - if(!okaddr(nureg->pc, BY2WD, 0) + if(!okaddr(nureg->pc, 1, 0) || !okaddr(nureg->sp, BY2WD, 0)){ qunlock(&up->debug); pprint("suicide: trap in noted\n"); @@ -930,6 +931,7 @@ if(0) print("%s %lud: noted %#p %#p\n", sp = oureg-4*BY2WD-ERRMAX; splhi(); ureg->sp = sp; + ureg->bp = oureg; /* arg 1 passed in RARG */ ((uintptr*)sp)[1] = oureg; /* arg 1 0(FP) is ureg* */ ((uintptr*)sp)[0] = 0; /* arg 0 is pc */ break; |