* win32-i386-low.c: Add 64-bit support.
authorPierre Muller <muller@sourceware.org>
Tue, 20 Apr 2010 00:17:05 +0000 (00:17 +0000)
committerPierre Muller <muller@sourceware.org>
Tue, 20 Apr 2010 00:17:05 +0000 (00:17 +0000)
(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
gdb/gdbserver/win32-i386-low.c

index b26c8539311b0970c7187e19c13968a6000a270b..be325b5f81475ef31d48422bcee3cbbbff35c631 100644 (file)
@@ -1,3 +1,12 @@
+2010-04-19  Pierre Muller  <muller@ics.u-strasbg.fr>
+
+       * 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  <muller@ics.u-strasbg.fr>
 
        * win32-low.c: Adapt to support also 64-bit architecture.
index bd146b92dfc153af243c6cd3c645fe8718ea58f6..6f5ab09bb0f11d9263133d37a876c80eb9f483ca 100644 (file)
 #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,