From 8d9fdb008934d0d16003d1e09c2975aa26363276 Mon Sep 17 00:00:00 2001 From: midipix Date: Sun, 15 Sep 2019 01:47:05 +0000 Subject: mgdb: amd64_winnt_init_reg_offsets(): initial implementation and integration. --- overlay/mgdb/gdb/amd64-winnt-regcache.c | 69 +++++++++++++++++++++++++++++++++ overlay/mgdb/gdb/amd64-winnt-tdep.c | 5 +++ 2 files changed, 74 insertions(+) (limited to 'overlay') 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) -- cgit v1.2.3