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")
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")
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")
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
}