0001
0002
0003
0004
0005
0006
0007
0008 #include <errno.h>
0009 #include <stddef.h>
0010 #include <string.h>
0011 #include <dwarf-regs.h>
0012 #include <linux/ptrace.h> /* for struct user_pt_regs */
0013 #include <linux/stringify.h>
0014
0015 struct pt_regs_dwarfnum {
0016 const char *name;
0017 unsigned int dwarfnum;
0018 };
0019
0020 #define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
0021 #define GPR_DWARFNUM_NAME(num) \
0022 {.name = __stringify(%x##num), .dwarfnum = num}
0023 #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
0024 #define DWARFNUM2OFFSET(index) \
0025 (index * sizeof((struct user_pt_regs *)0)->regs[0])
0026
0027
0028
0029
0030
0031 static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
0032 GPR_DWARFNUM_NAME(0),
0033 GPR_DWARFNUM_NAME(1),
0034 GPR_DWARFNUM_NAME(2),
0035 GPR_DWARFNUM_NAME(3),
0036 GPR_DWARFNUM_NAME(4),
0037 GPR_DWARFNUM_NAME(5),
0038 GPR_DWARFNUM_NAME(6),
0039 GPR_DWARFNUM_NAME(7),
0040 GPR_DWARFNUM_NAME(8),
0041 GPR_DWARFNUM_NAME(9),
0042 GPR_DWARFNUM_NAME(10),
0043 GPR_DWARFNUM_NAME(11),
0044 GPR_DWARFNUM_NAME(12),
0045 GPR_DWARFNUM_NAME(13),
0046 GPR_DWARFNUM_NAME(14),
0047 GPR_DWARFNUM_NAME(15),
0048 GPR_DWARFNUM_NAME(16),
0049 GPR_DWARFNUM_NAME(17),
0050 GPR_DWARFNUM_NAME(18),
0051 GPR_DWARFNUM_NAME(19),
0052 GPR_DWARFNUM_NAME(20),
0053 GPR_DWARFNUM_NAME(21),
0054 GPR_DWARFNUM_NAME(22),
0055 GPR_DWARFNUM_NAME(23),
0056 GPR_DWARFNUM_NAME(24),
0057 GPR_DWARFNUM_NAME(25),
0058 GPR_DWARFNUM_NAME(26),
0059 GPR_DWARFNUM_NAME(27),
0060 GPR_DWARFNUM_NAME(28),
0061 GPR_DWARFNUM_NAME(29),
0062 REG_DWARFNUM_NAME("%lr", 30),
0063 REG_DWARFNUM_NAME("%sp", 31),
0064 REG_DWARFNUM_END,
0065 };
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075 const char *get_arch_regstr(unsigned int n)
0076 {
0077 const struct pt_regs_dwarfnum *roff;
0078 for (roff = regdwarfnum_table; roff->name != NULL; roff++)
0079 if (roff->dwarfnum == n)
0080 return roff->name;
0081 return NULL;
0082 }
0083
0084 int regs_query_register_offset(const char *name)
0085 {
0086 const struct pt_regs_dwarfnum *roff;
0087
0088 for (roff = regdwarfnum_table; roff->name != NULL; roff++)
0089 if (!strcmp(roff->name, name))
0090 return DWARFNUM2OFFSET(roff->dwarfnum);
0091 return -EINVAL;
0092 }