package regnum import ( "fmt" "strings" ) // The mapping between hardware registers and DWARF registers is specified // in the System V ABI AMD64 Architecture Processor Supplement v. 1.0 page 61, // figure 3.36 // https://gitlab.com/x86-psABIs/x86-64-ABI/-/tree/master const ( AMD64_Rax = 0 AMD64_Rdx = 1 AMD64_Rcx = 2 AMD64_Rbx = 3 AMD64_Rsi = 4 AMD64_Rdi = 5 AMD64_Rbp = 6 AMD64_Rsp = 7 AMD64_R8 = 8 AMD64_R9 = 9 AMD64_R10 = 10 AMD64_R11 = 11 AMD64_R12 = 12 AMD64_R13 = 13 AMD64_R14 = 14 AMD64_R15 = 15 AMD64_Rip = 16 AMD64_XMM0 = 17 // XMM1 through XMM15 follow AMD64_ST0 = 33 // ST(1) through ST(7) follow AMD64_Rflags = 49 AMD64_Es = 50 AMD64_Cs = 51 AMD64_Ss = 52 AMD64_Ds = 53 AMD64_Fs = 54 AMD64_Gs = 55 AMD64_Fs_base = 58 AMD64_Gs_base = 59 AMD64_MXCSR = 64 AMD64_CW = 65 AMD64_SW = 66 AMD64_XMM16 = 67 // XMM17 through XMM31 follow AMD64_K0 = 118 // k1 through k7 follow ) var amd64DwarfToName = map[uint64]string{ AMD64_Rax: "Rax", AMD64_Rdx: "Rdx", AMD64_Rcx: "Rcx", AMD64_Rbx: "Rbx", AMD64_Rsi: "Rsi", AMD64_Rdi: "Rdi", AMD64_Rbp: "Rbp", AMD64_Rsp: "Rsp", AMD64_R8: "R8", AMD64_R9: "R9", AMD64_R10: "R10", AMD64_R11: "R11", AMD64_R12: "R12", AMD64_R13: "R13", AMD64_R14: "R14", AMD64_R15: "R15", AMD64_Rip: "Rip", AMD64_XMM0: "XMM0", AMD64_XMM0 + 1: "XMM1", AMD64_XMM0 + 2: "XMM2", AMD64_XMM0 + 3: "XMM3", AMD64_XMM0 + 4: "XMM4", AMD64_XMM0 + 5: "XMM5", AMD64_XMM0 + 6: "XMM6", AMD64_XMM0 + 7: "XMM7", AMD64_XMM0 + 8: "XMM8", AMD64_XMM0 + 9: "XMM9", AMD64_XMM0 + 10: "XMM10", AMD64_XMM0 + 11: "XMM11", AMD64_XMM0 + 12: "XMM12", AMD64_XMM0 + 13: "XMM13", AMD64_XMM0 + 14: "XMM14", AMD64_XMM0 + 15: "XMM15", AMD64_ST0: "ST(0)", AMD64_ST0 + 1: "ST(1)", AMD64_ST0 + 2: "ST(2)", AMD64_ST0 + 3: "ST(3)", AMD64_ST0 + 4: "ST(4)", AMD64_ST0 + 5: "ST(5)", AMD64_ST0 + 6: "ST(6)", AMD64_ST0 + 7: "ST(7)", AMD64_Rflags: "Rflags", AMD64_Es: "Es", AMD64_Cs: "Cs", AMD64_Ss: "Ss", AMD64_Ds: "Ds", AMD64_Fs: "Fs", AMD64_Gs: "Gs", AMD64_Fs_base: "Fs_base", AMD64_Gs_base: "Gs_base", AMD64_MXCSR: "MXCSR", AMD64_CW: "CW", AMD64_SW: "SW", AMD64_XMM16: "XMM16", AMD64_XMM16 + 1: "XMM17", AMD64_XMM16 + 2: "XMM18", AMD64_XMM16 + 3: "XMM19", AMD64_XMM16 + 4: "XMM20", AMD64_XMM16 + 5: "XMM21", AMD64_XMM16 + 6: "XMM22", AMD64_XMM16 + 7: "XMM23", AMD64_XMM16 + 8: "XMM24", AMD64_XMM16 + 9: "XMM25", AMD64_XMM16 + 10: "XMM26", AMD64_XMM16 + 11: "XMM27", AMD64_XMM16 + 12: "XMM28", AMD64_XMM16 + 13: "XMM29", AMD64_XMM16 + 14: "XMM30", AMD64_XMM16 + 15: "XMM31", AMD64_K0: "K0", AMD64_K0 + 1: "K1", AMD64_K0 + 2: "K2", AMD64_K0 + 3: "K3", AMD64_K0 + 4: "K4", AMD64_K0 + 5: "K5", AMD64_K0 + 6: "K6", AMD64_K0 + 7: "K7", } var AMD64NameToDwarf = func() map[string]int { r := make(map[string]int) for regNum, regName := range amd64DwarfToName { r[strings.ToLower(regName)] = int(regNum) } r["eflags"] = 49 r["st0"] = 33 r["st1"] = 34 r["st2"] = 35 r["st3"] = 36 r["st4"] = 37 r["st5"] = 38 r["st6"] = 39 r["st7"] = 40 return r }() func AMD64MaxRegNum() uint64 { max := uint64(AMD64_Rip) for i := range amd64DwarfToName { if i > max { max = i } } return max } func AMD64ToName(num uint64) string { name, ok := amd64DwarfToName[num] if ok { return name } return fmt.Sprintf("unknown%d", num) }