summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2019-09-15 01:47:05 +0000
committermidipix <writeonce@midipix.org>2019-09-15 01:47:05 +0000
commit8d9fdb008934d0d16003d1e09c2975aa26363276 (patch)
tree661cb5b92ca4513dc0f860b643b429a121c4cea7
parentc6959041fb68a2d30c17fb377b693baa7076f5dc (diff)
downloadchainport-8d9fdb008934d0d16003d1e09c2975aa26363276.tar.bz2
chainport-8d9fdb008934d0d16003d1e09c2975aa26363276.tar.xz
mgdb: amd64_winnt_init_reg_offsets(): initial implementation and integration.
-rw-r--r--overlay/mgdb/gdb/amd64-winnt-regcache.c69
-rw-r--r--overlay/mgdb/gdb/amd64-winnt-tdep.c5
2 files changed, 74 insertions, 0 deletions
diff --git a/overlay/mgdb/gdb/amd64-winnt-regcache.c b/overlay/mgdb/gdb/amd64-winnt-regcache.c
index 0cf7928..83a836c 100644
--- a/overlay/mgdb/gdb/amd64-winnt-regcache.c
+++ b/overlay/mgdb/gdb/amd64-winnt-regcache.c
@@ -14,6 +14,8 @@
struct regcache;
+static unsigned regoffs[AMD64_NUM_REGS];
+
static void amd64_winnt_supply_reg(
struct regcache * rcache,
int regnum, uintptr_t regval)
@@ -77,3 +79,70 @@ int amd64_winnt_fetch_registers(
return 0;
}
+
+#define AMD64_WINNT_INIT_REG_OFFSET(regnum,regmem) \
+ regoffs[regnum] = offsetof(mcontext_t,regmem)
+
+#define AMD64_WINNT_INIT_MX_REG_OFFSET(regidx,regmem) \
+ regoffs[regidx] = offsetof(mcontext_t,\
+ uc_flt.uc_flt_save.regmem)
+
+#define AMD64_WINNT_INIT_XSAVE_REG_OFFSET(ctrlidx,regmem) \
+ regoffs[AMD64_FCTRL_REGNUM+ctrlidx] = offsetof(mcontext_t,\
+ uc_flt.uc_flt_save.regmem)
+
+#define AMD64_WINNT_INIT_ST_REG_OFFSET(regnum,stidx) \
+ regoffs[AMD64_ST0_REGNUM+stidx] = offsetof(mcontext_t, \
+ uc_flt.uc_flt_save.uc_float_registers[stidx])
+
+#define AMD64_WINNT_INIT_XMM_REG_OFFSET(regnum,stidx) \
+ regoffs[AMD64_XMM0_REGNUM+stidx] = offsetof(mcontext_t, \
+ uc_flt.uc_flt_save.uc_float_registers[stidx])
+
+void amd64_winnt_init_reg_offsets(void)
+{
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_RAX_REGNUM,uc_rax);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_RBX_REGNUM,uc_rbx);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_RCX_REGNUM,uc_rcx);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_RDX_REGNUM,uc_rdx);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_RSI_REGNUM,uc_rsi);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_RDI_REGNUM,uc_rdi);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_RBP_REGNUM,uc_rbp);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_RSP_REGNUM,uc_rsp);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_R8_REGNUM, uc_r8);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_R9_REGNUM, uc_r9);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_R10_REGNUM,uc_r10);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_R11_REGNUM,uc_r11);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_R12_REGNUM,uc_r12);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_R13_REGNUM,uc_r13);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_R14_REGNUM,uc_r14);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_R15_REGNUM,uc_r15);
+
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_CS_REGNUM,uc_seg_cs);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_SS_REGNUM,uc_seg_ss);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_DS_REGNUM,uc_seg_ds);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_ES_REGNUM,uc_seg_es);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_FS_REGNUM,uc_seg_fs);
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_GS_REGNUM,uc_seg_gs);
+
+ AMD64_WINNT_INIT_REG_OFFSET(AMD64_EFLAGS_REGNUM,uc_eflags);
+ AMD64_WINNT_INIT_MX_REG_OFFSET(AMD64_MXCSR_REGNUM,uc_mx_csr);
+
+ AMD64_WINNT_INIT_XSAVE_REG_OFFSET(0,uc_control_word);
+ AMD64_WINNT_INIT_XSAVE_REG_OFFSET(0,uc_status_word);
+ AMD64_WINNT_INIT_XSAVE_REG_OFFSET(0,uc_tag_word);
+ AMD64_WINNT_INIT_XSAVE_REG_OFFSET(0,uc_error_selector);
+ AMD64_WINNT_INIT_XSAVE_REG_OFFSET(0,uc_error_offset);
+ AMD64_WINNT_INIT_XSAVE_REG_OFFSET(0,uc_data_selector);
+ AMD64_WINNT_INIT_XSAVE_REG_OFFSET(0,uc_data_offset);
+ AMD64_WINNT_INIT_XSAVE_REG_OFFSET(0,uc_error_opcode);
+
+ AMD64_WINNT_INIT_ST_REG_OFFSET(0,0);
+ AMD64_WINNT_INIT_ST_REG_OFFSET(1,1);
+ AMD64_WINNT_INIT_ST_REG_OFFSET(2,2);
+ AMD64_WINNT_INIT_ST_REG_OFFSET(3,3);
+ AMD64_WINNT_INIT_ST_REG_OFFSET(4,4);
+ AMD64_WINNT_INIT_ST_REG_OFFSET(5,5);
+ AMD64_WINNT_INIT_ST_REG_OFFSET(6,6);
+ AMD64_WINNT_INIT_ST_REG_OFFSET(7,7);
+}
diff --git a/overlay/mgdb/gdb/amd64-winnt-tdep.c b/overlay/mgdb/gdb/amd64-winnt-tdep.c
index ab06122..c9089dc 100644
--- a/overlay/mgdb/gdb/amd64-winnt-tdep.c
+++ b/overlay/mgdb/gdb/amd64-winnt-tdep.c
@@ -19,6 +19,8 @@
#define amd64_winnt_skip_main_prologue amd64_skip_main_prologue
#define amd64_winnt_frame_unwind amd64_windows_frame_unwind
+extern void amd64_winnt_init_reg_offsets(void);
+
static void amd64_winnt_init_abi (struct gdbarch_info info, struct gdbarch * gdbarch)
{
/* abi */
@@ -41,6 +43,9 @@ static void amd64_winnt_init_abi (struct gdbarch_info info, struct gdbarch * gdb
/* solibs */
set_solib_ops (gdbarch, &solib_target_so_ops);
+
+ /* register offsets */
+ amd64_winnt_init_reg_offsets();
}
void windows_init_abi (struct gdbarch_info info, struct gdbarch * gdbarch)