2003-07-15 Michal Ludvig <mludvig@suse.cz>
authorMichal Ludvig <mludvig@suse.cz>
Tue, 15 Jul 2003 11:33:59 +0000 (11:33 +0000)
committerMichal Ludvig <mludvig@suse.cz>
Tue, 15 Jul 2003 11:33:59 +0000 (11:33 +0000)
* x86-64-linux-nat.c (regmap): Removed.
(supply_gregset, fill_gregset): Call
x86_64_linux_(fill,supply)_gregset functions.
* x86-64-linux-tdep.c (USER_*): New defines.
(user_to_gdb_regmap, x86_64_core_fns): New structure.
(x86_64_linux_supply_gregset, x86_64_linux_fill_gregset):
New functions.
(fetch_core_registers): Ditto.
(_initialize_x86_64_linux_tdep): Call add_core_fns().
* x86-64-linux-tdep.h: New file.
* config/i386/x86-64linux.mh (NATDEPFILES): Remove corelow.o
and core-regset.o.
* config/i386/x86-64linux.mt (TDEPFILES): Add corelow.o.

gdb/ChangeLog
gdb/config/i386/x86-64linux.mh
gdb/config/i386/x86-64linux.mt
gdb/x86-64-linux-nat.c
gdb/x86-64-linux-tdep.c

index e31abfc475ae6a65dd58c583df7cf26143f88efb..edc8e40f3ca000506b31d9756251e9cda05c6edb 100644 (file)
@@ -1,3 +1,19 @@
+2003-07-15  Michal Ludvig  <mludvig@suse.cz>
+
+       * x86-64-linux-nat.c (regmap): Removed.
+       (supply_gregset, fill_gregset): Call 
+       x86_64_linux_(fill,supply)_gregset functions.
+       * x86-64-linux-tdep.c (USER_*): New defines.
+       (user_to_gdb_regmap, x86_64_core_fns): New structure.
+       (x86_64_linux_supply_gregset, x86_64_linux_fill_gregset):
+       New functions.
+       (fetch_core_registers): Ditto.
+       (_initialize_x86_64_linux_tdep): Call add_core_fns().
+       * x86-64-linux-tdep.h: New file.
+       * config/i386/x86-64linux.mh (NATDEPFILES): Remove corelow.o
+       and core-regset.o.
+       * config/i386/x86-64linux.mt (TDEPFILES): Add corelow.o.
+
 2003-07-13  Mark Kettenis  <kettenis@gnu.org>
 
        * x86-64-tdep.c (x86_64_store_return_value): Use
index 0c3c855e0183ed0a6a4cae55a6961a469c3b1d90..32e7a8e0a856f5893903b452a6bd4326f6f1388e 100644 (file)
@@ -3,8 +3,8 @@
 XM_FILE= xm-i386.h
 
 NAT_FILE= nm-x86-64linux.h
-NATDEPFILES= infptrace.o inftarg.o fork-child.o corelow.o \
-       core-regset.o i386-nat.o x86-64-linux-nat.o \
+NATDEPFILES= infptrace.o inftarg.o fork-child.o \
+       i386-nat.o x86-64-linux-nat.o \
        linux-nat.o \
        proc-service.o thread-db.o lin-lwp.o linux-proc.o gcore.o 
 
index d448452322766d5fc313ef67e279cc565eba596f..bb33978de3f5a27667f3dac8eadfe4cd21deef3a 100644 (file)
@@ -1,7 +1,7 @@
 # Target: AMD x86-64 running GNU/Linux
 TDEPFILES= x86-64-tdep.o x86-64-linux-tdep.o \
        i386-tdep.o i387-tdep.o i386-linux-tdep.o \
-       solib.o solib-svr4.o solib-legacy.o
+       solib.o solib-svr4.o solib-legacy.o corelow.o
 
 GDB_MULTI_ARCH=GDB_MULTI_ARCH_TM
 
index 4a989ce07a759d70fa81134cc86494b5dfd6df02..c44c35e86472c86ba57eb00f3c01cda9f4433306 100644 (file)
 #include "gregset.h"
 
 #include "x86-64-tdep.h"
-
-/* The register sets used in GNU/Linux ELF core-dumps are identical to
-   the register sets used by `ptrace'.  The corresponding types are
-   `elf_gregset_t' for the general-purpose registers (with
-   `elf_greg_t' the type of a single GP register) and `elf_fpregset_t'
-   for the floating-point registers.  */
-
-/* Mapping between the general-purpose registers in `struct user'
-   format and GDB's register array layout.  */
-static int regmap[] =
-{
-  RAX, RBX, RCX, RDX,
-  RSI, RDI, RBP, RSP,
-  R8, R9, R10, R11,
-  R12, R13, R14, R15,
-  RIP, EFLAGS, CS, SS, 
-  DS, ES, FS, GS
-};
+#include "x86-64-linux-tdep.h"
 
 /* Which ptrace request retrieves which registers?
    These apply to the corresponding SET requests as well.  */
@@ -76,11 +59,7 @@ static int regmap[] =
 void
 supply_gregset (elf_gregset_t *gregsetp)
 {
-  elf_greg_t *regp = (elf_greg_t *) gregsetp;
-  int i;
-
-  for (i = 0; i < X86_64_NUM_GREGS; i++)
-    supply_register (i, regp + regmap[i]);
+  x86_64_linux_supply_gregset ((char *) gregsetp);
 }
 
 /* Fill register REGNO (if it is a general-purpose register) in
@@ -90,12 +69,7 @@ supply_gregset (elf_gregset_t *gregsetp)
 void
 fill_gregset (elf_gregset_t *gregsetp, int regno)
 {
-  elf_greg_t *regp = (elf_greg_t *) gregsetp;
-  int i;
-
-  for (i = 0; i < X86_64_NUM_GREGS; i++)
-    if (regno == -1 || regno == i)
-      regcache_collect (i, regp + regmap[i]);
+  x86_64_linux_fill_gregset ((char *) gregsetp, regno);
 }
 
 /* Fetch all general-purpose registers from process/thread TID and
index 8532685c896b354a2c5bf34cec176fcf42888c38..7aab1d4e2fa38bdfae41a25a30f44c5f3d29431b 100644 (file)
 #include "gdb_string.h"
 
 #include "x86-64-tdep.h"
+#include "x86-64-linux-tdep.h"
+
+/* Register indexes to 'struct user' come from <sys/reg.h>.  */
+
+#define USER_R15    0
+#define USER_R14    1
+#define USER_R13    2
+#define USER_R12    3
+#define USER_RBP    4
+#define USER_RBX    5
+#define USER_R11    6
+#define USER_R10    7
+#define USER_R9     8
+#define USER_R8     9
+#define USER_RAX    10
+#define USER_RCX    11
+#define USER_RDX    12
+#define USER_RSI    13
+#define USER_RDI    14
+#define USER_RIP    16
+#define USER_CS     17
+#define USER_EFLAGS 18
+#define USER_RSP    19
+#define USER_SS     20
+#define USER_DS     23
+#define USER_ES     24
+#define USER_FS     25
+#define USER_GS     26
+
+/* Mapping between the general-purpose registers in `struct user'
+   format and GDB's register array layout.  */
+
+static int user_to_gdb_regmap[] =
+{
+  USER_RAX, USER_RBX, USER_RCX, USER_RDX,
+  USER_RSI, USER_RDI, USER_RBP, USER_RSP,
+  USER_R8, USER_R9, USER_R10, USER_R11,
+  USER_R12, USER_R13, USER_R14, USER_R15,
+  USER_RIP, USER_EFLAGS, USER_CS, USER_SS,
+  USER_DS, USER_ES, USER_FS, USER_GS
+};
+
+/* Fill GDB's register array with the general-purpose register values
+   in *GREGSETP.  */
+
+void
+x86_64_linux_supply_gregset (char *regp)
+{
+  int i;
+
+  for (i = 0; i < X86_64_NUM_GREGS; i++)
+    supply_register (i, regp + (user_to_gdb_regmap[i] * 8));
+}
+
+/* Fill register REGNO (if it is a general-purpose register) in
+   *GREGSETPS with the value in GDB's register array.  If REGNO is -1,
+   do this for all registers.  */
+
+void
+x86_64_linux_fill_gregset (char *regp, int regno)
+{
+  int i;
+
+  for (i = 0; i < X86_64_NUM_GREGS; i++)
+    if (regno == -1 || regno == i)
+      regcache_collect (i, regp + (user_to_gdb_regmap[i] * 8));
+}
+
+/* The register sets used in GNU/Linux ELF core-dumps are identical to
+   the register sets used by `ptrace'.  The corresponding types are
+   `elf_gregset_t' for the general-purpose registers (with
+   `elf_greg_t' the type of a single GP register) and `elf_fpregset_t'
+   for the floating-point registers.  */
+
+static void
+fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
+                        int which, CORE_ADDR ignore)
+{
+  switch (which)
+    {
+    case 0:  /* Integer registers.  */
+      if (core_reg_size != 216)
+       warning ("Wrong size register set in core file.");
+      else
+       x86_64_linux_supply_gregset (core_reg_sect);
+      break;
+
+    case 2:  /* Floating point registers.  */
+    case 3:  /* "Extended" floating point registers.  This is gdb-speak
+               for SSE/SSE2. */
+      if (core_reg_size != 512)
+       warning ("Wrong size XMM register set in core file.");
+      else
+       x86_64_supply_fxsave (core_reg_sect);
+      break;
+
+    default:
+      /* Don't know what kind of register request this is; just ignore it.  */
+      break;
+    }
+}
+
+static struct core_fns x86_64_core_fns = 
+{
+  bfd_target_elf_flavour,              /* core_flavour */
+  default_check_format,                        /* check_format */
+  default_core_sniffer,                        /* core_sniffer */
+  fetch_core_registers,                        /* core_read_registers */
+  NULL                                 /* next */
+};
 
 #define LINUX_SIGTRAMP_INSN0   0x48    /* mov $NNNNNNNN, %rax */
 #define LINUX_SIGTRAMP_OFFSET0 0
@@ -175,6 +285,8 @@ extern void _initialize_x86_64_linux_tdep (void);
 void
 _initialize_x86_64_linux_tdep (void)
 {
+  add_core_fns (&x86_64_core_fns);
+
   gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64, GDB_OSABI_LINUX,
                          x86_64_linux_init_abi);
 }