| 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 2 | /* |
| 3 | * dwarf-regs.c : Mapping of DWARF debug register numbers into register names. |
| 4 | * Extracted from probe-finder.c |
| 5 | * |
| 6 | * Written by Masami Hiramatsu <mhiramat@redhat.com> |
| 7 | */ |
| 8 | |
| 9 | #include <errno.h> /* for EINVAL */ |
| 10 | #include <string.h> /* for strcmp */ |
| 11 | #include <linux/kernel.h> /* for ARRAY_SIZE */ |
| 12 | #include <dwarf-regs.h> |
| 13 | |
| 14 | struct dwarf_regs_idx { |
| 15 | const char *name; |
| 16 | int idx; |
| 17 | }; |
| 18 | |
| 19 | static const struct dwarf_regs_idx x86_regidx_table[] = { |
| 20 | { "rax" , 0 }, { "eax" , 0 }, { "ax" , 0 }, { "al" , 0 }, |
| 21 | { "rdx" , 1 }, { "edx" , 1 }, { "dx" , 1 }, { "dl" , 1 }, |
| 22 | { "rcx" , 2 }, { "ecx" , 2 }, { "cx" , 2 }, { "cl" , 2 }, |
| 23 | { "rbx" , 3 }, { "edx" , 3 }, { "bx" , 3 }, { "bl" , 3 }, |
| 24 | { "rsi" , 4 }, { "esi" , 4 }, { "si" , 4 }, { "sil" , 4 }, |
| 25 | { "rdi" , 5 }, { "edi" , 5 }, { "di" , 5 }, { "dil" , 5 }, |
| 26 | { "rbp" , 6 }, { "ebp" , 6 }, { "bp" , 6 }, { "bpl" , 6 }, |
| 27 | { "rsp" , 7 }, { "esp" , 7 }, { "sp" , 7 }, { "spl" , 7 }, |
| 28 | { "r8" , 8 }, { "r8d" , 8 }, { "r8w" , 8 }, { "r8b" , 8 }, |
| 29 | { "r9" , 9 }, { "r9d" , 9 }, { "r9w" , 9 }, { "r9b" , 9 }, |
| 30 | { "r10" , 10 }, { "r10d" , 10 }, { "r10w" , 10 }, { "r10b" , 10 }, |
| 31 | { "r11" , 11 }, { "r11d" , 11 }, { "r11w" , 11 }, { "r11b" , 11 }, |
| 32 | { "r12" , 12 }, { "r12d" , 12 }, { "r12w" , 12 }, { "r12b" , 12 }, |
| 33 | { "r13" , 13 }, { "r13d" , 13 }, { "r13w" , 13 }, { "r13b" , 13 }, |
| 34 | { "r14" , 14 }, { "r14d" , 14 }, { "r14w" , 14 }, { "r14b" , 14 }, |
| 35 | { "r15" , 15 }, { "r15d" , 15 }, { "r15w" , 15 }, { "r15b" , 15 }, |
| 36 | { "rip" , DWARF_REG_PC }, |
| 37 | }; |
| 38 | |
| 39 | int get_x86_regnum(const char *name) |
| 40 | { |
| 41 | unsigned int i; |
| 42 | |
| 43 | if (*name != '%') |
| 44 | return -EINVAL; |
| 45 | |
| 46 | for (i = 0; i < ARRAY_SIZE(x86_regidx_table); i++) |
| 47 | if (!strcmp(x86_regidx_table[i].name, name + 1)) |
| 48 | return x86_regidx_table[i].idx; |
| 49 | return -ENOENT; |
| 50 | } |
| 51 | |