File: i386.go

package info (click to toggle)
delve 1.26.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,136 kB
  • sloc: ansic: 111,947; sh: 194; asm: 147; makefile: 43; python: 23
file content (102 lines) | stat: -rw-r--r-- 2,026 bytes parent folder | download | duplicates (3)
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package regnum

import (
	"fmt"
	"strings"
)

// The mapping between hardware registers and DWARF registers is specified
// in the System V ABI Intel386 Architecture Processor Supplement page 25,
// table 2.14
// https://www.uclibc.org/docs/psABI-i386.pdf

const (
	I386_Eax    = 0
	I386_Ecx    = 1
	I386_Edx    = 2
	I386_Ebx    = 3
	I386_Esp    = 4
	I386_Ebp    = 5
	I386_Esi    = 6
	I386_Edi    = 7
	I386_Eip    = 8
	I386_Eflags = 9
	I386_ST0    = 11 // ST(1) through ST(7) follow
	I386_XMM0   = 21 // XMM1 through XMM7 follow
	I386_Es     = 40
	I386_Cs     = 41
	I386_Ss     = 42
	I386_Ds     = 43
	I386_Fs     = 44
	I386_Gs     = 45
)

var i386DwarfToName = map[int]string{
	I386_Eax:      "Eax",
	I386_Ecx:      "Ecx",
	I386_Edx:      "Edx",
	I386_Ebx:      "Ebx",
	I386_Esp:      "Esp",
	I386_Ebp:      "Ebp",
	I386_Esi:      "Esi",
	I386_Edi:      "Edi",
	I386_Eip:      "Eip",
	I386_Eflags:   "Eflags",
	I386_ST0:      "ST(0)",
	I386_ST0 + 1:  "ST(1)",
	I386_ST0 + 2:  "ST(2)",
	I386_ST0 + 3:  "ST(3)",
	I386_ST0 + 4:  "ST(4)",
	I386_ST0 + 5:  "ST(5)",
	I386_ST0 + 6:  "ST(6)",
	I386_ST0 + 7:  "ST(7)",
	I386_XMM0:     "XMM0",
	I386_XMM0 + 1: "XMM1",
	I386_XMM0 + 2: "XMM2",
	I386_XMM0 + 3: "XMM3",
	I386_XMM0 + 4: "XMM4",
	I386_XMM0 + 5: "XMM5",
	I386_XMM0 + 6: "XMM6",
	I386_XMM0 + 7: "XMM7",
	I386_Es:       "Es",
	I386_Cs:       "Cs",
	I386_Ss:       "Ss",
	I386_Ds:       "Ds",
	I386_Fs:       "Fs",
	I386_Gs:       "Gs",
}

var I386NameToDwarf = func() map[string]int {
	r := make(map[string]int)
	for regNum, regName := range i386DwarfToName {
		r[strings.ToLower(regName)] = regNum
	}
	r["eflags"] = 9
	r["st0"] = 11
	r["st1"] = 12
	r["st2"] = 13
	r["st3"] = 14
	r["st4"] = 15
	r["st5"] = 16
	r["st6"] = 17
	r["st7"] = 18
	return r
}()

func I386MaxRegNum() int {
	max := int(I386_Eip)
	for i := range i386DwarfToName {
		if i > max {
			max = i
		}
	}
	return max
}

func I386ToName(num uint64) string {
	name, ok := i386DwarfToName[int(num)]
	if ok {
		return name
	}
	return fmt.Sprintf("unknown%d", num)
}