Commit 9ab2ffe8 authored by Jordan Rhee's avatar Jordan Rhee Committed by Austin Clements

runtime: windows/arm fix tracebacks printed from sigpanic

The exception handler modifies the stack and continuation context so
it looks like the faulting code calls sigpanic() directly. The call was
not set up correctly on ARM, because it did not handle the link register
correctly. This change handles the link register correctly for ARM.

Updates #28854

Change-Id: I7ccf838adfc05cd968a5edd7d19ebba6a2478360
Reviewed-on: https://go-review.googlesource.com/c/150957
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: default avatarAustin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 9fe9853a
......@@ -105,10 +105,11 @@ func (c *context) ip() uintptr { return uintptr(c.eip) }
func (c *context) sp() uintptr { return uintptr(c.esp) }
// 386 does not have link register, so this returns 0.
func (c *context) lr() uintptr { return 0 }
func (c *context) lr() uintptr { return 0 }
func (c *context) set_lr(x uintptr) {}
func (c *context) setip(x uintptr) { c.eip = uint32(x) }
func (c *context) setsp(x uintptr) { c.esp = uint32(x) }
func (c *context) set_ip(x uintptr) { c.eip = uint32(x) }
func (c *context) set_sp(x uintptr) { c.esp = uint32(x) }
func dumpregs(r *context) {
print("eax ", hex(r.eax), "\n")
......
......@@ -120,10 +120,11 @@ func (c *context) ip() uintptr { return uintptr(c.rip) }
func (c *context) sp() uintptr { return uintptr(c.rsp) }
// Amd64 does not have link register, so this returns 0.
func (c *context) lr() uintptr { return 0 }
func (c *context) lr() uintptr { return 0 }
func (c *context) set_lr(x uintptr) {}
func (c *context) setip(x uintptr) { c.rip = uint64(x) }
func (c *context) setsp(x uintptr) { c.rsp = uint64(x) }
func (c *context) set_ip(x uintptr) { c.rip = uint64(x) }
func (c *context) set_sp(x uintptr) { c.rsp = uint64(x) }
func dumpregs(r *context) {
print("rax ", hex(r.rax), "\n")
......
......@@ -104,8 +104,9 @@ func (c *context) ip() uintptr { return uintptr(c.pc) }
func (c *context) sp() uintptr { return uintptr(c.spr) }
func (c *context) lr() uintptr { return uintptr(c.lrr) }
func (c *context) setip(x uintptr) { c.pc = uint32(x) }
func (c *context) setsp(x uintptr) { c.spr = uint32(x) }
func (c *context) set_ip(x uintptr) { c.pc = uint32(x) }
func (c *context) set_sp(x uintptr) { c.spr = uint32(x) }
func (c *context) set_lr(x uintptr) { c.lrr = uint32(x) }
func dumpregs(r *context) {
print("r0 ", hex(r.r0), "\n")
......
......@@ -117,10 +117,18 @@ func exceptionhandler(info *exceptionrecord, r *context, gp *g) int32 {
if r.ip() != 0 {
sp := unsafe.Pointer(r.sp())
sp = add(sp, ^(unsafe.Sizeof(uintptr(0)) - 1)) // sp--
*((*uintptr)(sp)) = r.ip()
r.setsp(uintptr(sp))
r.set_sp(uintptr(sp))
switch GOARCH {
default:
panic("unsupported architecture")
case "386", "amd64":
*((*uintptr)(sp)) = r.ip()
case "arm":
*((*uintptr)(sp)) = r.lr()
r.set_lr(r.ip())
}
}
r.setip(funcPC(sigpanic))
r.set_ip(funcPC(sigpanic))
return _EXCEPTION_CONTINUE_EXECUTION
}
......
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