From: Joel Sing Date: Fri, 17 Aug 2012 11:53:02 +0000 (+1000) Subject: runtime: fix netbsd/386 stack pointer handling X-Git-Tag: go1.1rc2~2633 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=1b6557a0cf54a901db38b13b78f919b7959286ee;p=gostls13.git runtime: fix netbsd/386 stack pointer handling When manipulating the stack pointer use the UESP register instead of the ESP register, since the UESP register is the one that gets restored from the machine context. Fixes broken tests on netbsd/386. R=golang-dev, minux.ma, r, bsiegert CC=golang-dev https://golang.org/cl/6465054 --- diff --git a/src/pkg/runtime/signal_netbsd_386.c b/src/pkg/runtime/signal_netbsd_386.c index e50c526788..fcb92f3b20 100644 --- a/src/pkg/runtime/signal_netbsd_386.c +++ b/src/pkg/runtime/signal_netbsd_386.c @@ -29,7 +29,7 @@ runtime·dumpregs(McontextT *mc) runtime·printf("edi %x\n", mc->__gregs[REG_EDI]); runtime·printf("esi %x\n", mc->__gregs[REG_ESI]); runtime·printf("ebp %x\n", mc->__gregs[REG_EBP]); - runtime·printf("esp %x\n", mc->__gregs[REG_ESP]); + runtime·printf("esp %x\n", mc->__gregs[REG_UESP]); runtime·printf("eip %x\n", mc->__gregs[REG_EIP]); runtime·printf("eflags %x\n", mc->__gregs[REG_EFL]); runtime·printf("cs %x\n", mc->__gregs[REG_CS]); @@ -47,7 +47,7 @@ runtime·sighandler(int32 sig, Siginfo *info, void *context, G *gp) if(sig == SIGPROF) { runtime·sigprof((uint8*)mc->__gregs[REG_EIP], - (uint8*)mc->__gregs[REG_ESP], nil, gp); + (uint8*)mc->__gregs[REG_UESP], nil, gp); return; } @@ -71,9 +71,9 @@ runtime·sighandler(int32 sig, Siginfo *info, void *context, G *gp) // (Otherwise the trace will end at runtime·sigpanic // and we won't get to see who faulted.) if(mc->__gregs[REG_EIP] != 0) { - sp = (uintptr*)mc->__gregs[REG_ESP]; + sp = (uintptr*)mc->__gregs[REG_UESP]; *--sp = mc->__gregs[REG_EIP]; - mc->__gregs[REG_ESP] = (uintptr)sp; + mc->__gregs[REG_UESP] = (uintptr)sp; } mc->__gregs[REG_EIP] = (uintptr)runtime·sigpanic; return; @@ -100,7 +100,7 @@ Throw: if(runtime·gotraceback()){ runtime·traceback((void*)mc->__gregs[REG_EIP], - (void*)mc->__gregs[REG_ESP], 0, gp); + (void*)mc->__gregs[REG_UESP], 0, gp); runtime·tracebackothers(gp); runtime·dumpregs(mc); }