github.com/cnboonhan/delve@v0.0.0-20230908061759-363f2388c2fb/pkg/dwarf/regnum/i386.go (about) 1 package regnum 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 // The mapping between hardware registers and DWARF registers is specified 9 // in the System V ABI Intel386 Architecture Processor Supplement page 25, 10 // table 2.14 11 // https://www.uclibc.org/docs/psABI-i386.pdf 12 13 const ( 14 I386_Eax = 0 15 I386_Ecx = 1 16 I386_Edx = 2 17 I386_Ebx = 3 18 I386_Esp = 4 19 I386_Ebp = 5 20 I386_Esi = 6 21 I386_Edi = 7 22 I386_Eip = 8 23 I386_Eflags = 9 24 I386_ST0 = 11 // ST(1) through ST(7) follow 25 I386_XMM0 = 21 // XMM1 through XMM7 follow 26 I386_Es = 40 27 I386_Cs = 41 28 I386_Ss = 42 29 I386_Ds = 43 30 I386_Fs = 44 31 I386_Gs = 45 32 ) 33 34 var i386DwarfToName = map[int]string{ 35 I386_Eax: "Eax", 36 I386_Ecx: "Ecx", 37 I386_Edx: "Edx", 38 I386_Ebx: "Ebx", 39 I386_Esp: "Esp", 40 I386_Ebp: "Ebp", 41 I386_Esi: "Esi", 42 I386_Edi: "Edi", 43 I386_Eip: "Eip", 44 I386_Eflags: "Eflags", 45 I386_ST0: "ST(0)", 46 I386_ST0 + 1: "ST(1)", 47 I386_ST0 + 2: "ST(2)", 48 I386_ST0 + 3: "ST(3)", 49 I386_ST0 + 4: "ST(4)", 50 I386_ST0 + 5: "ST(5)", 51 I386_ST0 + 6: "ST(6)", 52 I386_ST0 + 7: "ST(7)", 53 I386_XMM0: "XMM0", 54 I386_XMM0 + 1: "XMM1", 55 I386_XMM0 + 2: "XMM2", 56 I386_XMM0 + 3: "XMM3", 57 I386_XMM0 + 4: "XMM4", 58 I386_XMM0 + 5: "XMM5", 59 I386_XMM0 + 6: "XMM6", 60 I386_XMM0 + 7: "XMM7", 61 I386_Es: "Es", 62 I386_Cs: "Cs", 63 I386_Ss: "Ss", 64 I386_Ds: "Ds", 65 I386_Fs: "Fs", 66 I386_Gs: "Gs", 67 } 68 69 var I386NameToDwarf = func() map[string]int { 70 r := make(map[string]int) 71 for regNum, regName := range i386DwarfToName { 72 r[strings.ToLower(regName)] = regNum 73 } 74 r["eflags"] = 9 75 r["st0"] = 11 76 r["st1"] = 12 77 r["st2"] = 13 78 r["st3"] = 14 79 r["st4"] = 15 80 r["st5"] = 16 81 r["st6"] = 17 82 r["st7"] = 18 83 return r 84 }() 85 86 func I386MaxRegNum() int { 87 max := int(I386_Eip) 88 for i := range i386DwarfToName { 89 if i > max { 90 max = i 91 } 92 } 93 return max 94 } 95 96 func I386ToName(num uint64) string { 97 name, ok := i386DwarfToName[int(num)] 98 if ok { 99 return name 100 } 101 return fmt.Sprintf("unknown%d", num) 102 }