Skip to content

Commit

Permalink
runtime: use (*context) ip, setip, sp and setsp everywhere on windows
Browse files Browse the repository at this point in the history
Also move dumpregs into defs_windows_*.go.

Change-Id: Ic077d7dbb133c7b812856e758d696d6fed557afd
Reviewed-on: https://go-review.googlesource.com/4650
Reviewed-by: Brad Fitzpatrick <[email protected]>
  • Loading branch information
alexbrainman committed Apr 9, 2015
1 parent 00bc19e commit e0d9342
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 63 deletions.
16 changes: 16 additions & 0 deletions src/runtime/defs_windows_386.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) 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
Expand Down
23 changes: 23 additions & 0 deletions src/runtime/defs_windows_amd64.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) 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
Expand Down
40 changes: 12 additions & 28 deletions src/runtime/os1_windows_386.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,10 @@ import (
"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
}

Expand All @@ -53,21 +37,21 @@ func exceptionhandler(info *exceptionrecord, r *context, gp *g) int32 {
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
}

Expand All @@ -87,9 +71,9 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) int32 {
}
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
Expand All @@ -98,7 +82,7 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) int32 {

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)
}
Expand Down
47 changes: 12 additions & 35 deletions src/runtime/os1_windows_amd64.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,33 +8,10 @@ import (
"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
}

Expand All @@ -61,21 +38,21 @@ func exceptionhandler(info *exceptionrecord, r *context, gp *g) int32 {
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
}

Expand Down Expand Up @@ -106,9 +83,9 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) uint32 {
}
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
Expand All @@ -117,7 +94,7 @@ func lastcontinuehandler(info *exceptionrecord, r *context, gp *g) uint32 {

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)
}
Expand Down

0 comments on commit e0d9342

Please sign in to comment.