Also move dumpregs into defs_windows_*.go.
Change-Id: Ic077d7dbb133c7b812856e758d696d6fed557afd
Reviewed-on: https://go-review.googlesource.com/4650
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
func (c *context) setip(x uintptr) { c.eip = 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 {
internal uint32
internalhigh uint32
func (c *context) setip(x uintptr) { c.rip = 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 {
internal uint64
internalhigh uint64
"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 {
// Only handle exception if executing instructions in Go binary
// (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
}
gp.sig = info.exceptioncode
gp.sigcode0 = uintptr(info.exceptioninformation[0])
gp.sigcode1 = uintptr(info.exceptioninformation[1])
- gp.sigpc = uintptr(r.eip)
+ gp.sigpc = r.ip()
- // Only push runtime·sigpanic if r->eip != 0.
- // If r->eip == 0, probably panicked because of a
+ // Only push runtime·sigpanic if r.ip() != 0.
+ // If r.ip() == 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 runtime·sigpanic instead.
// (Otherwise the trace will end at runtime·sigpanic and we
// won't get to see who faulted.)
- if r.eip != 0 {
- sp := unsafe.Pointer(uintptr(r.esp))
+ if r.ip() != 0 {
+ sp := unsafe.Pointer(r.sp())
sp = add(sp, ^uintptr(unsafe.Sizeof(uintptr(0))-1)) // sp--
- *((*uintptr)(sp)) = uintptr(r.eip)
- r.esp = uint32(uintptr(sp))
+ *((*uintptr)(sp)) = r.ip()
+ r.setsp(uintptr(sp))
}
- r.eip = uint32(funcPC(sigpanic))
+ r.setip(funcPC(sigpanic))
return _EXCEPTION_CONTINUE_EXECUTION
}
}
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 {
print("signal arrived during cgo execution\n")
gp = _g_.m.lockedg
var docrash bool
if gotraceback(&docrash) > 0 {
- tracebacktrap(uintptr(r.eip), uintptr(r.esp), 0, gp)
+ tracebacktrap(r.ip(), r.sp(), 0, gp)
tracebackothers(gp)
dumpregs(r)
}
"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 {
// Only handle exception if executing instructions in Go binary
// (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
}
gp.sig = info.exceptioncode
gp.sigcode0 = uintptr(info.exceptioninformation[0])
gp.sigcode1 = uintptr(info.exceptioninformation[1])
- gp.sigpc = uintptr(r.rip)
+ gp.sigpc = r.ip()
- // Only push runtime·sigpanic if r->rip != 0.
- // If r->rip == 0, probably panicked because of a
+ // Only push runtime·sigpanic if r.ip() != 0.
+ // If r.ip() == 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 runtime·sigpanic instead.
// (Otherwise the trace will end at runtime·sigpanic and we
// won't get to see who faulted.)
- if r.rip != 0 {
- sp := unsafe.Pointer(uintptr(r.rsp))
+ if r.ip() != 0 {
+ sp := unsafe.Pointer(r.sp())
sp = add(sp, ^uintptr(unsafe.Sizeof(uintptr(0))-1)) // sp--
- *((*uintptr)(sp)) = uintptr(r.rip)
- r.rsp = uint64(uintptr(sp))
+ *((*uintptr)(sp)) = r.ip()
+ r.setsp(uintptr(sp))
}
- r.rip = uint64(funcPC(sigpanic))
+ r.setip(funcPC(sigpanic))
return _EXCEPTION_CONTINUE_EXECUTION
}
}
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 {
print("signal arrived during cgo execution\n")
gp = _g_.m.lockedg
var docrash bool
if gotraceback(&docrash) > 0 {
- tracebacktrap(uintptr(r.rip), uintptr(r.rsp), 0, gp)
+ tracebacktrap(r.ip(), r.sp(), 0, gp)
tracebackothers(gp)
dumpregs(r)
}