Commit 68117a91 authored by David du Colombier's avatar David du Colombier

runtime: fix x86 stack trace for call to heap memory on Plan 9

Russ Cox fixed this issue for other systems
in CL 12026, but the Plan 9 part was forgotten.

Fixes #11656.

Change-Id: I91c033687987ba43d13ad8f42e3fe4c7a78e6075
Reviewed-on: https://go-review.googlesource.com/12762Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent 17efbfc5
......@@ -49,20 +49,31 @@ func sighandler(_ureg *ureg, note *byte, gp *g) int {
memmove(unsafe.Pointer(_g_.m.notesig), unsafe.Pointer(note), uintptr(len(notestr)+1))
gp.sig = uint32(sig)
gp.sigpc = c.pc()
pc := uintptr(c.pc())
sp := uintptr(c.sp())
// If we don't recognize the PC as code
// but we do recognize the top pointer on the stack as code,
// then assume this was a call to non-code and treat like
// pc == 0, to make unwinding show the context.
if pc != 0 && findfunc(pc) == nil && findfunc(*(*uintptr)(unsafe.Pointer(sp))) != nil {
pc = 0
}
// Only push sigpanic if PC != 0.
//
// If PC == 0, probably panicked because of a call to a nil func.
// Not pushing that onto SP will make the trace look like a call
// to sigpanic instead. (Otherwise the trace will end at
// sigpanic and we won't get to see who faulted).
if c.pc() != 0 {
sp := c.sp()
if pc != 0 {
if regSize > ptrSize {
sp -= ptrSize
*(*uintptr)(unsafe.Pointer(sp)) = 0
}
sp -= ptrSize
*(*uintptr)(unsafe.Pointer(sp)) = c.pc()
*(*uintptr)(unsafe.Pointer(sp)) = pc
c.setsp(sp)
}
c.setpc(funcPC(sigpanic))
......
......@@ -8,10 +8,9 @@
// it manages to invoke the signal handler, so this test fails there.
// +build !darwin !386
//
// openbsd/386, netbsd/386, and plan9/386 don't work, not sure why.
// openbsd/386 and netbsd/386 don't work, not sure why.
// +build !openbsd !386
// +build !netbsd !386
// +build !plan9 !386
//
// windows doesn't work, because Windows exception handling
// delivers signals based on the current PC, and that current PC
......
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