/***************************************************************/ /* mgdb: midipix-specific bits for gdb */ /* Copyright (C) 2019 Z. Gilboa */ /* Released under GPLv2 and GPLv3; see COPYING.MGDB. */ /***************************************************************/ #include "defs.h" #include "osabi.h" #include "regcache.h" #include "frame-unwind.h" #include "windows-tdep.h" #include "amd64-windows-tdep.c" #include #include #define amd64_winnt_push_dummy_call amd64_windows_push_dummy_call #define amd64_winnt_return_value amd64_windows_return_value #define amd64_winnt_skip_trampoline_code amd64_windows_skip_trampoline_code #define amd64_winnt_skip_prologue amd64_windows_skip_prologue #define amd64_winnt_skip_main_prologue amd64_skip_main_prologue #define amd64_winnt_frame_unwind amd64_windows_frame_unwind struct regcache; static void amd64_winnt_supply_reg( struct regcache * rcache, int regnum, uintptr_t regval) { regcache_raw_supply(rcache,regnum,®val); } static void amd64_winnt_supply_pc_regs( struct regcache * rcache, mcontext_t * regctx) { amd64_winnt_supply_reg(rcache,AMD64_RIP_REGNUM,regctx->uc_rip); } int amd64_winnt_fetch_registers( int pfd, struct regcache * rcache, int regnum, pid_t tid) { int ret; mcontext_t regctx; if ((ret = __dbg_regs_fetch(pfd,tid,®ctx)) < 0) return ret; if (regnum == AMD64_RIP_REGNUM) amd64_winnt_supply_pc_regs(rcache,®ctx); return 0; } static void amd64_winnt_init_abi (struct gdbarch_info info, struct gdbarch * gdbarch) { /* abi */ amd64_init_abi (info, gdbarch); windows_init_abi (info, gdbarch); /* out-of-band function calls */ set_gdbarch_push_dummy_call (gdbarch, amd64_winnt_push_dummy_call); set_gdbarch_return_value (gdbarch, amd64_winnt_return_value); set_gdbarch_skip_trampoline_code (gdbarch, amd64_winnt_skip_trampoline_code); /* skip prologue methods */ set_gdbarch_skip_prologue (gdbarch, amd64_windows_skip_prologue); set_gdbarch_skip_main_prologue (gdbarch, amd64_skip_main_prologue); /* todo: SEH unwinder */ frame_unwind_append_unwinder (gdbarch, &amd64_winnt_frame_unwind); /* todo: inferior-specific, dynamically detected size of long */ set_gdbarch_long_bit (gdbarch, 64); } extern initialize_file_ftype _initialize_amd64_winnt_tdep; void _initialize_amd64_winnt_tdep (void) { gdbarch_register_osabi( bfd_arch_i386, bfd_mach_x86_64, GDB_OSABI_WINNT, amd64_winnt_init_abi); }