summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/386/traceback.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/386/traceback.c')
-rw-r--r--src/pkg/runtime/386/traceback.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/pkg/runtime/386/traceback.c b/src/pkg/runtime/386/traceback.c
index 05724d9ac..22a1bee5d 100644
--- a/src/pkg/runtime/386/traceback.c
+++ b/src/pkg/runtime/386/traceback.c
@@ -27,19 +27,19 @@ traceback(byte *pc0, byte *sp, G *g)
stk = (Stktop*)g->stackbase;
for(n=0; n<100; n++) {
- while(pc == (uintptr)retfromnewstack) {
+ if(pc == (uint64)sys·lessstack) {
+ // printf("--\n");
// pop to earlier stack block
- sp = stk->oldsp;
- stk = (Stktop*)stk->oldbase;
- pc = *(uintptr*)(sp+sizeof(uintptr));
- sp += 2*sizeof(uintptr); // two irrelevant calls on stack: morestack plus its call
+ pc = (uintptr)stk->gobuf.pc;
+ sp = stk->gobuf.sp;
+ stk = (Stktop*)stk->stackbase;
}
f = findfunc(pc);
if(f == nil) {
// dangerous, but poke around to see if it is a closure
p = (byte*)pc;
// ADDL $xxx, SP; RET
- if(p[0] == 0x81 && p[1] == 0xc4 && p[6] == 0xc3) {
+ if(p != 0 && p[0] == 0x81 && p[1] == 0xc4 && p[6] == 0xc3) {
sp += *(uint32*)(p+2) + 8;
pc = *(uintptr*)(sp - 8);
if(pc <= 0x1000)
@@ -109,11 +109,10 @@ runtime·Caller(int32 n, uintptr retpc, String retfile, int32 retline, bool retb
// now unwind n levels
stk = (Stktop*)g->stackbase;
while(n-- > 0) {
- while(pc == (uintptr)retfromnewstack) {
- sp = stk->oldsp;
- stk = (Stktop*)stk->oldbase;
- pc = *((uintptr*)sp + 1);
- sp += 2*sizeof(uintptr);
+ while(pc == (uintptr)sys·lessstack) {
+ pc = (uintptr)stk->gobuf.pc;
+ sp = stk->gobuf.sp;
+ stk = (Stktop*)stk->stackbase;
}
if(f->frame < sizeof(uintptr)) // assembly functions lie