From 54709339f53222b83c17a894f507309ed204e639 Mon Sep 17 00:00:00 2001 From: Pierre Muller Date: Tue, 20 Apr 2010 00:17:05 +0000 Subject: [PATCH] * win32-i386-low.c: Add 64-bit support. (CONTEXT_EXTENDED_REGISTERS): Set macro to zero if not exisiting. (init_registers_amd64): Declare. (mappings): Add 64-bit version of array. (init_windows_x86): New function. (the_low_target): Change init_arch field to init_windows_x86. --- gdb/gdbserver/ChangeLog | 9 ++++ gdb/gdbserver/win32-i386-low.c | 92 +++++++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 1 deletion(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index b26c853931..be325b5f81 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,12 @@ +2010-04-19 Pierre Muller + + * win32-i386-low.c: Add 64-bit support. + (CONTEXT_EXTENDED_REGISTERS): Set macro to zero if not exisiting. + (init_registers_amd64): Declare. + (mappings): Add 64-bit version of array. + (init_windows_x86): New function. + (the_low_target): Change init_arch field to init_windows_x86. + 2010-04-19 Pierre Muller * win32-low.c: Adapt to support also 64-bit architecture. diff --git a/gdb/gdbserver/win32-i386-low.c b/gdb/gdbserver/win32-i386-low.c index bd146b92df..6f5ab09bb0 100644 --- a/gdb/gdbserver/win32-i386-low.c +++ b/gdb/gdbserver/win32-i386-low.c @@ -19,13 +19,22 @@ #include "win32-low.h" #include "i386-low.h" +#ifndef CONTEXT_EXTENDED_REGISTERS +#define CONTEXT_EXTENDED_REGISTERS 0 +#endif + #define FCS_REGNUM 27 #define FOP_REGNUM 31 #define FLAG_TRACE_BIT 0x100 +#ifdef __x86_64 +/* Defined in auto-generated file reg-i386.c. */ +void init_registers_amd64 (void); +#else /* Defined in auto-generated file reg-i386.c. */ void init_registers_i386 (void); +#endif static struct i386_debug_reg_state debug_reg_state; @@ -214,6 +223,8 @@ i386_single_step (win32_thread_info *th) th->context.EFlags |= FLAG_TRACE_BIT; } +#ifndef __x86_64 + /* An array of offset mappings into a Win32 Context structure. This is a one-to-one mapping which is indexed by gdb's register numbers. It retrieves an offset into the context structure where @@ -269,6 +280,75 @@ static const int mappings[] = { }; #undef context_offset +#else /* __x86_64 */ + +#define context_offset(x) (offsetof (CONTEXT, x)) +static const int mappings[] = +{ + context_offset (Rax), + context_offset (Rbx), + context_offset (Rcx), + context_offset (Rdx), + context_offset (Rsi), + context_offset (Rdi), + context_offset (Rbp), + context_offset (Rsp), + context_offset (R8), + context_offset (R9), + context_offset (R10), + context_offset (R11), + context_offset (R12), + context_offset (R13), + context_offset (R14), + context_offset (R15), + context_offset (Rip), + context_offset (EFlags), + context_offset (SegCs), + context_offset (SegSs), + context_offset (SegDs), + context_offset (SegEs), + context_offset (SegFs), + context_offset (SegGs), + context_offset (FloatSave.FloatRegisters[0]), + context_offset (FloatSave.FloatRegisters[1]), + context_offset (FloatSave.FloatRegisters[2]), + context_offset (FloatSave.FloatRegisters[3]), + context_offset (FloatSave.FloatRegisters[4]), + context_offset (FloatSave.FloatRegisters[5]), + context_offset (FloatSave.FloatRegisters[6]), + context_offset (FloatSave.FloatRegisters[7]), + context_offset (FloatSave.ControlWord), + context_offset (FloatSave.StatusWord), + context_offset (FloatSave.TagWord), + context_offset (FloatSave.ErrorSelector), + context_offset (FloatSave.ErrorOffset), + context_offset (FloatSave.DataSelector), + context_offset (FloatSave.DataOffset), + context_offset (FloatSave.ErrorSelector) + /* XMM0-7 */ , + context_offset (Xmm0), + context_offset (Xmm1), + context_offset (Xmm2), + context_offset (Xmm3), + context_offset (Xmm4), + context_offset (Xmm5), + context_offset (Xmm6), + context_offset (Xmm7), + context_offset (Xmm8), + context_offset (Xmm9), + context_offset (Xmm10), + context_offset (Xmm11), + context_offset (Xmm12), + context_offset (Xmm13), + context_offset (Xmm14), + context_offset (Xmm15), + /* MXCSR */ + context_offset (FloatSave.MxCsr) +}; +#undef context_offset + +#endif /* __x86_64 */ + /* Fetch register from gdbserver regcache data. */ static void i386_fetch_inferior_register (struct regcache *regcache, @@ -303,8 +383,18 @@ i386_store_inferior_register (struct regcache *regcache, static const unsigned char i386_win32_breakpoint = 0xcc; #define i386_win32_breakpoint_len 1 +static void +init_windows_x86 (void) +{ +#ifdef __x86_64 + init_registers_amd64 (); +#else + init_registers_i386 (); +#endif +} + struct win32_target_ops the_low_target = { - init_registers_i386, + init_windows_x86, sizeof (mappings) / sizeof (mappings[0]), i386_initial_stuff, i386_get_thread_context, -- 2.34.1