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(s1: x86_regidx_table[i].name, s2: name + 1)) |
48 | return x86_regidx_table[i].idx; |
49 | return -ENOENT; |
50 | } |
51 | |