Commit e0d9342d authored by Alex Brainman's avatar Alex Brainman

runtime: use (*context) ip, setip, sp and setsp everywhere on windows

Also move dumpregs into defs_windows_*.go.

Change-Id: Ic077d7dbb133c7b812856e758d696d6fed557afd
Reviewed-on: https://go-review.googlesource.com/4650Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 00bc19e9
...@@ -107,6 +107,22 @@ func (c *context) sp() uintptr { return uintptr(c.esp) } ...@@ -107,6 +107,22 @@ func (c *context) sp() uintptr { return uintptr(c.esp) }
func (c *context) setip(x uintptr) { c.eip = uint32(x) } func (c *context) setip(x uintptr) { c.eip = uint32(x) }
func (c *context) setsp(x uintptr) { c.esp = uint32(x) } func (c *context) setsp(x uintptr) { c.esp = uint32(x) }
func dumpregs(r *context) {
print("eax ", hex(r.eax), "\n")
print("ebx ", hex(r.ebx), "\n")
print("ecx ", hex(r.ecx), "\n")
print("edx ", hex(r.edx), "\n")
print("edi ", hex(r.edi), "\n")
print("esi ", hex(r.esi), "\n")
print("ebp ", hex(r.ebp), "\n")
print("esp ", hex(r.esp), "\n")
print("eip ", hex(r.eip), "\n")
print("eflags ", hex(r.eflags), "\n")
print("cs ", hex(r.segcs), "\n")
print("fs ", hex(r.segfs), "\n")
print("gs ", hex(r.seggs), "\n")
}
type overlapped struct { type overlapped struct {
internal uint32 internal uint32
internalhigh uint32 internalhigh uint32
......
...@@ -122,6 +122,29 @@ func (c *context) sp() uintptr { return uintptr(c.rsp) } ...@@ -122,6 +122,29 @@ func (c *context) sp() uintptr { return uintptr(c.rsp) }
func (c *context) setip(x uintptr) { c.rip = uint64(x) } func (c *context) setip(x uintptr) { c.rip = uint64(x) }
func (c *context) setsp(x uintptr) { c.rsp = uint64(x) } func (c *context) setsp(x uintptr) { c.rsp = uint64(x) }
func dumpregs(r *context) {
print("rax ", hex(r.rax), "\n")
print("rbx ", hex(r.rbx), "\n")
print("rcx ", hex(r.rcx), "\n")
print("rdi ", hex(r.rdi), "\n")
print("rsi ", hex(r.rsi), "\n")
print("rbp ", hex(r.rbp), "\n")
print("rsp ", hex(r.rsp), "\n")
print("r8 ", hex(r.r8), "\n")
print("r9 ", hex(r.r9), "\n")
print("r10 ", hex(r.r10), "\n")
print("r11 ", hex(r.r11), "\n")
print("r12 ", hex(r.r12), "\n")
print("r13 ", hex(r.r13), "\n")
print("r14 ", hex(r.r14), "\n")
print("r15 ", hex(r.r15), "\n")
print("rip ", hex(r.rip), "\n")
print("rflags ", hex(r.eflags), "\n")
print("cs ", hex(r.segcs), "\n")
print("fs ", hex(r.segfs), "\n")
print("gs ", hex(r.seggs), "\n")
}
type overlapped struct { type overlapped struct {
internal uint64 internal uint64
internalhigh uint64 internalhigh uint64
......
...@@ -8,26 +8,10 @@ import ( ...@@ -8,26 +8,10 @@ import (
"unsafe" "unsafe"
) )
func dumpregs(r *context) {
print("eax ", hex(r.eax), "\n")
print("ebx ", hex(r.ebx), "\n")
print("ecx ", hex(r.ecx), "\n")
print("edx ", hex(r.edx), "\n")
print("edi ", hex(r.edi), "\n")
print("esi ", hex(r.esi), "\n")
print("ebp ", hex(r.ebp), "\n")
print("esp ", hex(r.esp), "\n")
print("eip ", hex(r.eip), "\n")
print("eflags ", hex(r.eflags), "\n")
print("cs ", hex(r.segcs), "\n")
print("fs ", hex(r.segfs), "\n")
print("gs ", hex(r.seggs), "\n")
}
func isgoexception(info *exceptionrecord, r *context) bool { func isgoexception(info *exceptionrecord, r *context) bool {
// Only handle exception if executing instructions in Go binary // Only handle exception if executing instructions in Go binary
// (not Windows library code). // (not Windows library code).
if r.eip < uint32(themoduledata.text) || uint32(themoduledata.etext) < r.eip { if r.ip() < themoduledata.text || themoduledata.etext < r.ip() {
return false return false
} }
...@@ -53,21 +37,21 @@ func exceptionhandler(info *exceptionrecord, r *context, gp *g) int32 { ...@@ -53,21 +37,21 @@ func exceptionhandler(info *exceptionrecord, r *context, gp *g) int32 {
gp.sig = info.exceptioncode gp.sig = info.exceptioncode
gp.sigcode0 = uintptr(info.exceptioninformation[0]) gp.sigcode0 = uintptr(info.exceptioninformation[0])
gp.sigcode1 = uintptr(info.exceptioninformation[1]) gp.sigcode1 = uintptr(info.exceptioninformation[1])
gp.sigpc = uintptr(r.eip) gp.sigpc = r.ip()
// Only push runtime·sigpanic if r->eip != 0. // Only push runtime·sigpanic if r.ip() != 0.
// If r->eip == 0, probably panicked because of a // If r.ip() == 0, probably panicked because of a
// call to a nil func. Not pushing that onto sp will // call to a nil func. Not pushing that onto sp will
// make the trace look like a call to runtime·sigpanic instead. // make the trace look like a call to runtime·sigpanic instead.
// (Otherwise the trace will end at runtime·sigpanic and we // (Otherwise the trace will end at runtime·sigpanic and we
// won't get to see who faulted.) // won't get to see who faulted.)
if r.eip != 0 { if r.ip() != 0 {
sp := unsafe.Pointer(uintptr(r.esp)) sp := unsafe.Pointer(r.sp())
sp = add(sp, ^uintptr(unsafe.Sizeof(uintptr(0))-1)) // sp-- sp = add(sp, ^uintptr(unsafe.Sizeof(uintptr(0))-1)) // sp--
*((*uintptr)(sp)) = uintptr(r.eip) *((*uintptr)(sp)) = r.ip()
r.esp = uint32(uintptr(sp)) r.setsp(uintptr(sp))
} }
r.eip = uint32(funcPC(sigpanic)) r.setip(funcPC(sigpanic))
return _EXCEPTION_CONTINUE_EXECUTION return _EXCEPTION_CONTINUE_EXECUTION
} }
...@@ -87,9 +71,9 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) int32 { ...@@ -87,9 +71,9 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) int32 {
} }
panicking = 1 panicking = 1
print("Exception ", hex(info.exceptioncode), " ", hex(info.exceptioninformation[0]), " ", hex(info.exceptioninformation[1]), " ", hex(r.eip), "\n") print("Exception ", hex(info.exceptioncode), " ", hex(info.exceptioninformation[0]), " ", hex(info.exceptioninformation[1]), " ", hex(r.ip()), "\n")
print("PC=", hex(r.eip), "\n") print("PC=", hex(r.ip()), "\n")
if _g_.m.lockedg != nil && _g_.m.ncgo > 0 && gp == _g_.m.g0 { if _g_.m.lockedg != nil && _g_.m.ncgo > 0 && gp == _g_.m.g0 {
print("signal arrived during cgo execution\n") print("signal arrived during cgo execution\n")
gp = _g_.m.lockedg gp = _g_.m.lockedg
...@@ -98,7 +82,7 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) int32 { ...@@ -98,7 +82,7 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) int32 {
var docrash bool var docrash bool
if gotraceback(&docrash) > 0 { if gotraceback(&docrash) > 0 {
tracebacktrap(uintptr(r.eip), uintptr(r.esp), 0, gp) tracebacktrap(r.ip(), r.sp(), 0, gp)
tracebackothers(gp) tracebackothers(gp)
dumpregs(r) dumpregs(r)
} }
......
...@@ -8,33 +8,10 @@ import ( ...@@ -8,33 +8,10 @@ import (
"unsafe" "unsafe"
) )
func dumpregs(r *context) {
print("rax ", hex(r.rax), "\n")
print("rbx ", hex(r.rbx), "\n")
print("rcx ", hex(r.rcx), "\n")
print("rdi ", hex(r.rdi), "\n")
print("rsi ", hex(r.rsi), "\n")
print("rbp ", hex(r.rbp), "\n")
print("rsp ", hex(r.rsp), "\n")
print("r8 ", hex(r.r8), "\n")
print("r9 ", hex(r.r9), "\n")
print("r10 ", hex(r.r10), "\n")
print("r11 ", hex(r.r11), "\n")
print("r12 ", hex(r.r12), "\n")
print("r13 ", hex(r.r13), "\n")
print("r14 ", hex(r.r14), "\n")
print("r15 ", hex(r.r15), "\n")
print("rip ", hex(r.rip), "\n")
print("rflags ", hex(r.eflags), "\n")
print("cs ", hex(r.segcs), "\n")
print("fs ", hex(r.segfs), "\n")
print("gs ", hex(r.seggs), "\n")
}
func isgoexception(info *exceptionrecord, r *context) bool { func isgoexception(info *exceptionrecord, r *context) bool {
// Only handle exception if executing instructions in Go binary // Only handle exception if executing instructions in Go binary
// (not Windows library code). // (not Windows library code).
if r.rip < uint64(themoduledata.text) || uint64(themoduledata.etext) < r.rip { if r.ip() < themoduledata.text || themoduledata.etext < r.ip() {
return false return false
} }
...@@ -61,21 +38,21 @@ func exceptionhandler(info *exceptionrecord, r *context, gp *g) int32 { ...@@ -61,21 +38,21 @@ func exceptionhandler(info *exceptionrecord, r *context, gp *g) int32 {
gp.sig = info.exceptioncode gp.sig = info.exceptioncode
gp.sigcode0 = uintptr(info.exceptioninformation[0]) gp.sigcode0 = uintptr(info.exceptioninformation[0])
gp.sigcode1 = uintptr(info.exceptioninformation[1]) gp.sigcode1 = uintptr(info.exceptioninformation[1])
gp.sigpc = uintptr(r.rip) gp.sigpc = r.ip()
// Only push runtime·sigpanic if r->rip != 0. // Only push runtime·sigpanic if r.ip() != 0.
// If r->rip == 0, probably panicked because of a // If r.ip() == 0, probably panicked because of a
// call to a nil func. Not pushing that onto sp will // call to a nil func. Not pushing that onto sp will
// make the trace look like a call to runtime·sigpanic instead. // make the trace look like a call to runtime·sigpanic instead.
// (Otherwise the trace will end at runtime·sigpanic and we // (Otherwise the trace will end at runtime·sigpanic and we
// won't get to see who faulted.) // won't get to see who faulted.)
if r.rip != 0 { if r.ip() != 0 {
sp := unsafe.Pointer(uintptr(r.rsp)) sp := unsafe.Pointer(r.sp())
sp = add(sp, ^uintptr(unsafe.Sizeof(uintptr(0))-1)) // sp-- sp = add(sp, ^uintptr(unsafe.Sizeof(uintptr(0))-1)) // sp--
*((*uintptr)(sp)) = uintptr(r.rip) *((*uintptr)(sp)) = r.ip()
r.rsp = uint64(uintptr(sp)) r.setsp(uintptr(sp))
} }
r.rip = uint64(funcPC(sigpanic)) r.setip(funcPC(sigpanic))
return _EXCEPTION_CONTINUE_EXECUTION return _EXCEPTION_CONTINUE_EXECUTION
} }
...@@ -106,9 +83,9 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) uint32 { ...@@ -106,9 +83,9 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) uint32 {
} }
panicking = 1 panicking = 1
print("Exception ", hex(info.exceptioncode), " ", hex(info.exceptioninformation[0]), " ", hex(info.exceptioninformation[1]), " ", hex(r.rip), "\n") print("Exception ", hex(info.exceptioncode), " ", hex(info.exceptioninformation[0]), " ", hex(info.exceptioninformation[1]), " ", hex(r.ip()), "\n")
print("PC=", hex(r.rip), "\n") print("PC=", hex(r.ip()), "\n")
if _g_.m.lockedg != nil && _g_.m.ncgo > 0 && gp == _g_.m.g0 { if _g_.m.lockedg != nil && _g_.m.ncgo > 0 && gp == _g_.m.g0 {
print("signal arrived during cgo execution\n") print("signal arrived during cgo execution\n")
gp = _g_.m.lockedg gp = _g_.m.lockedg
...@@ -117,7 +94,7 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) uint32 { ...@@ -117,7 +94,7 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) uint32 {
var docrash bool var docrash bool
if gotraceback(&docrash) > 0 { if gotraceback(&docrash) > 0 {
tracebacktrap(uintptr(r.rip), uintptr(r.rsp), 0, gp) tracebacktrap(r.ip(), r.sp(), 0, gp)
tracebackothers(gp) tracebackothers(gp)
dumpregs(r) dumpregs(r)
} }
......
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