|
@@ -10,17 +10,20 @@
|
|
|
|
|
|
#include <stddef.h>
|
|
|
#include <dwarf-regs.h>
|
|
|
+#include <linux/ptrace.h> /* for struct user_pt_regs */
|
|
|
+#include "util.h"
|
|
|
|
|
|
struct pt_regs_dwarfnum {
|
|
|
const char *name;
|
|
|
unsigned int dwarfnum;
|
|
|
};
|
|
|
|
|
|
-#define STR(s) #s
|
|
|
#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
|
|
|
#define GPR_DWARFNUM_NAME(num) \
|
|
|
{.name = STR(%x##num), .dwarfnum = num}
|
|
|
#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
|
|
|
+#define DWARFNUM2OFFSET(index) \
|
|
|
+ (index * sizeof((struct user_pt_regs *)0)->regs[0])
|
|
|
|
|
|
/*
|
|
|
* Reference:
|
|
@@ -78,3 +81,13 @@ const char *get_arch_regstr(unsigned int n)
|
|
|
return roff->name;
|
|
|
return NULL;
|
|
|
}
|
|
|
+
|
|
|
+int regs_query_register_offset(const char *name)
|
|
|
+{
|
|
|
+ const struct pt_regs_dwarfnum *roff;
|
|
|
+
|
|
|
+ for (roff = regdwarfnum_table; roff->name != NULL; roff++)
|
|
|
+ if (!strcmp(roff->name, name))
|
|
|
+ return DWARFNUM2OFFSET(roff->dwarfnum);
|
|
|
+ return -EINVAL;
|
|
|
+}
|