1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package runtime
const _CONTEXT_CONTROL = 0x10001
type floatingsavearea struct {
controlword uint32
statusword uint32
tagword uint32
erroroffset uint32
errorselector uint32
dataoffset uint32
dataselector uint32
registerarea [80]uint8
cr0npxstate uint32
}
type context struct {
contextflags uint32
dr0 uint32
dr1 uint32
dr2 uint32
dr3 uint32
dr6 uint32
dr7 uint32
floatsave floatingsavearea
seggs uint32
segfs uint32
seges uint32
segds uint32
edi uint32
esi uint32
ebx uint32
edx uint32
ecx uint32
eax uint32
ebp uint32
eip uint32
segcs uint32
eflags uint32
esp uint32
segss uint32
extendedregisters [512]uint8
}
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) set_lr(x uintptr) {}
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")
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")
}
|