From e08a176007b0bb0589b05df41387b96928e641ee Mon Sep 17 00:00:00 2001 From: Ge van Geldorp Date: Tue, 20 Jun 2006 09:34:43 +0200 Subject: [PATCH] winedbg: Added x86_64 support. --- programs/winedbg/Makefile.in | 1 + programs/winedbg/be_x86_64.c | 154 +++++++++++++++++++++++++++++++++++++++++++ programs/winedbg/gdbproxy.c | 27 ++++++++ programs/winedbg/winedbg.c | 4 ++ 4 files changed, 186 insertions(+) create mode 100644 programs/winedbg/be_x86_64.c diff --git a/programs/winedbg/Makefile.in b/programs/winedbg/Makefile.in index eb2b6a4ac3a..cbfec6fb2da 100644 --- a/programs/winedbg/Makefile.in +++ b/programs/winedbg/Makefile.in @@ -11,6 +11,7 @@ C_SRCS = \ be_alpha.c \ be_i386.c \ be_ppc.c \ + be_x86_64.c \ break.c \ db_disasm.c \ display.c \ diff --git a/programs/winedbg/be_x86_64.c b/programs/winedbg/be_x86_64.c new file mode 100644 index 00000000000..0c90609d7c4 --- /dev/null +++ b/programs/winedbg/be_x86_64.c @@ -0,0 +1,154 @@ +/* + * Debugger x86_64 specific functions + * + * Copyright 2004 Vincent BĂ©ron + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "debugger.h" + +#if defined(__x86_64__) + +static unsigned be_x86_64_get_addr(HANDLE hThread, const CONTEXT* ctx, + enum be_cpu_addr bca, ADDRESS* addr) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static void be_x86_64_single_step(CONTEXT* ctx, unsigned enable) +{ + dbg_printf("not done\n"); +} + +static void be_x86_64_print_context(HANDLE hThread, const CONTEXT* ctx) +{ + dbg_printf("Context printing for x86_64 not done yet\n"); +} + +static void be_x86_64_print_segment_info(HANDLE hThread, const CONTEXT* ctx) +{ +} + +static struct dbg_internal_var be_x86_64_ctx[] = +{ + {0, NULL, 0, dbg_itype_none} +}; + +static const struct dbg_internal_var* be_x86_64_init_registers(CONTEXT* ctx) +{ + dbg_printf("not done\n"); + return be_x86_64_ctx; +} + +static unsigned be_x86_64_is_step_over_insn(void* insn) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static unsigned be_x86_64_is_function_return(void* insn) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static unsigned be_x86_64_is_break_insn(void* insn) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static unsigned be_x86_64_is_func_call(void* insn, void** insn_callee) +{ + return FALSE; +} + +static void be_x86_64_disasm_one_insn(ADDRESS* addr, int display) +{ + dbg_printf("Disasm NIY\n"); +} + +static unsigned be_x86_64_insert_Xpoint(HANDLE hProcess, const struct be_process_io* pio, + CONTEXT* ctx, enum be_xpoint_type type, + void* addr, unsigned long* val, unsigned size) +{ + dbg_printf("not done\n"); + return 0; +} + +static unsigned be_x86_64_remove_Xpoint(HANDLE hProcess, const struct be_process_io* pio, + CONTEXT* ctx, enum be_xpoint_type type, + void* addr, unsigned long val, unsigned size) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static unsigned be_x86_64_is_watchpoint_set(const CONTEXT* ctx, unsigned idx) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static void be_x86_64_clear_watchpoint(CONTEXT* ctx, unsigned idx) +{ + dbg_printf("not done\n"); +} + +static int be_x86_64_adjust_pc_for_break(CONTEXT* ctx, BOOL way) +{ + dbg_printf("not done\n"); + return 0; +} + +static int be_x86_64_fetch_integer(const struct dbg_lvalue* lvalue, unsigned size, + unsigned ext_sign, LONGLONG* ret) +{ + dbg_printf("not done\n"); + return FALSE; +} + +static int be_x86_64_fetch_float(const struct dbg_lvalue* lvalue, unsigned size, + long double* ret) +{ + dbg_printf("not done\n"); + return FALSE; +} + +struct backend_cpu be_x86_64 = +{ + be_cpu_linearize, + be_cpu_build_addr, + be_x86_64_get_addr, + be_x86_64_single_step, + be_x86_64_print_context, + be_x86_64_print_segment_info, + be_x86_64_init_registers, + be_x86_64_is_step_over_insn, + be_x86_64_is_function_return, + be_x86_64_is_break_insn, + be_x86_64_is_func_call, + be_x86_64_disasm_one_insn, + be_x86_64_insert_Xpoint, + be_x86_64_remove_Xpoint, + be_x86_64_is_watchpoint_set, + be_x86_64_clear_watchpoint, + be_x86_64_adjust_pc_for_break, + be_x86_64_fetch_integer, + be_x86_64_fetch_float, +}; +#endif diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c index 5e4cf29d0e6..45a452258d2 100644 --- a/programs/winedbg/gdbproxy.c +++ b/programs/winedbg/gdbproxy.c @@ -338,6 +338,33 @@ static size_t cpu_register_map[] = { FIELD_OFFSET(CONTEXT, Fpcr), FIELD_OFFSET(CONTEXT, SoftFpcr), }; +#elif defined(__x86_64__) +static size_t cpu_register_map[] = { + FIELD_OFFSET(CONTEXT, Rax), + FIELD_OFFSET(CONTEXT, Rbx), + FIELD_OFFSET(CONTEXT, Rcx), + FIELD_OFFSET(CONTEXT, Rdx), + FIELD_OFFSET(CONTEXT, Rsi), + FIELD_OFFSET(CONTEXT, Rdi), + FIELD_OFFSET(CONTEXT, Rbp), + FIELD_OFFSET(CONTEXT, Rsp), + FIELD_OFFSET(CONTEXT, R8), + FIELD_OFFSET(CONTEXT, R9), + FIELD_OFFSET(CONTEXT, R10), + FIELD_OFFSET(CONTEXT, R11), + FIELD_OFFSET(CONTEXT, R12), + FIELD_OFFSET(CONTEXT, R13), + FIELD_OFFSET(CONTEXT, R14), + FIELD_OFFSET(CONTEXT, R15), + FIELD_OFFSET(CONTEXT, Rip), + FIELD_OFFSET(CONTEXT, EFlags), + FIELD_OFFSET(CONTEXT, SegCs), + FIELD_OFFSET(CONTEXT, SegSs), + FIELD_OFFSET(CONTEXT, SegDs), + FIELD_OFFSET(CONTEXT, SegEs), + FIELD_OFFSET(CONTEXT, SegFs), + FIELD_OFFSET(CONTEXT, SegGs), +}; #else # error Define the registers map for your CPU #endif diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c index 8e317c5b11c..5810c78ce70 100644 --- a/programs/winedbg/winedbg.c +++ b/programs/winedbg/winedbg.c @@ -479,6 +479,8 @@ extern struct backend_cpu be_i386; extern struct backend_cpu be_ppc; #elif __ALPHA__ extern struct backend_cpu be_alpha; +#elif __x86_64__ +extern struct backend_cpu be_x86_64; #else # error CPU unknown #endif @@ -495,6 +497,8 @@ int main(int argc, char** argv) be_cpu = &be_ppc; #elif __ALPHA__ be_cpu = &be_alpha; +#elif __x86_64__ + be_cpu = &be_x86_64; #else # error CPU unknown #endif -- 2.11.4.GIT