Commit cf37254b authored by Russ Cox's avatar Russ Cox

runtime: fix Caller crash on 386.

Fixes #176.

R=r
https://golang.org/cl/166044
parent 6301fb41
...@@ -42,7 +42,7 @@ traceback(byte *pc0, byte *sp, G *g) ...@@ -42,7 +42,7 @@ traceback(byte *pc0, byte *sp, G *g)
if(f == nil) { if(f == nil) {
// dangerous, but poke around to see if it is a closure // dangerous, but poke around to see if it is a closure
// ADDL $xxx, SP; RET // ADDL $xxx, SP; RET
if((uint64)pc > 0x1000 && p[0] == 0x81 && p[1] == 0xc4 && p[6] == 0xc3) { if(pc > 0x1000 && p[0] == 0x81 && p[1] == 0xc4 && p[6] == 0xc3) {
sp += *(uint32*)(p+2) + 8; sp += *(uint32*)(p+2) + 8;
pc = *(uintptr*)(sp - 8); pc = *(uintptr*)(sp - 8);
if(pc <= 0x1000) if(pc <= 0x1000)
...@@ -130,7 +130,7 @@ runtime·Caller(int32 n, uintptr retpc, String retfile, int32 retline, bool retb ...@@ -130,7 +130,7 @@ runtime·Caller(int32 n, uintptr retpc, String retfile, int32 retline, bool retb
// see if it is a closure. // see if it is a closure.
p = (byte*)pc; p = (byte*)pc;
// ADDL $xxx, SP; RET // ADDL $xxx, SP; RET
if(p[0] == 0x81 && p[1] == 0xc4 && p[6] == 0xc3) { if(pc > 0x1000 && p[0] == 0x81 && p[1] == 0xc4 && p[6] == 0xc3) {
sp += *(uint32*)(p+2) + sizeof(uintptr); sp += *(uint32*)(p+2) + sizeof(uintptr);
goto loop; goto loop;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment