* ppc-linux-tdep.c (ELF_NGREG, ELF_NFPREG, ELF_NVRREG)
authorDaniel Jacobowitz <drow@false.org>
Tue, 30 Jul 2002 19:03:49 +0000 (19:03 +0000)
committerDaniel Jacobowitz <drow@false.org>
Tue, 30 Jul 2002 19:03:49 +0000 (19:03 +0000)
        (ELF_FPREGSET_SIZE, ELF_GREGSET_SIZE): New enums.
        (fetch_core_registers, ppc_linux_supply_gregset)
        (ppc_linux_supply_fpregset): New functions.
        (ppc_linux_regset_core_fns): New.
        (_initialize_ppc_linux_tdep): Call add_core_fns.
        * ppc-tdep.h: Add prototypes for ppc_linux_supply_fpregset
        and ppc_linux_supply_gregset.
        * ppc-linux-nat.c (supply_gregset): Call ppc_linux_supply_gregset.
        (supply_fpregset): Call ppc_linux_supply_fpregset.
        * config/powerpc/linux.mh (NATDEPFILES): Remove core-regset.o and
        corelow.o.
        * config/powerpc/linux.mt (TDEPFILES): Add corelow.o.

gdb/ChangeLog
gdb/config/powerpc/linux.mh
gdb/config/powerpc/linux.mt
gdb/ppc-linux-nat.c
gdb/ppc-linux-tdep.c
gdb/ppc-tdep.h

index 48dc32fc6908fe42fb3f36f1288e93c25f8a1940..a3d2047a6a4afd783f799ce4175bb3d30d6047bd 100644 (file)
@@ -1,3 +1,19 @@
+2002-07-30  Daniel Jacobowitz  <drow@mvista.com>
+
+       * ppc-linux-tdep.c (ELF_NGREG, ELF_NFPREG, ELF_NVRREG)
+       (ELF_FPREGSET_SIZE, ELF_GREGSET_SIZE): New enums.
+       (fetch_core_registers, ppc_linux_supply_gregset)
+       (ppc_linux_supply_fpregset): New functions.
+       (ppc_linux_regset_core_fns): New.
+       (_initialize_ppc_linux_tdep): Call add_core_fns.
+       * ppc-tdep.h: Add prototypes for ppc_linux_supply_fpregset
+       and ppc_linux_supply_gregset.
+       * ppc-linux-nat.c (supply_gregset): Call ppc_linux_supply_gregset.
+       (supply_fpregset): Call ppc_linux_supply_fpregset.
+       * config/powerpc/linux.mh (NATDEPFILES): Remove core-regset.o and
+       corelow.o.
+       * config/powerpc/linux.mt (TDEPFILES): Add corelow.o.
+
 2002-07-30  Daniel Jacobowitz  <drow@mvista.com>
 
        * symtab.c (lookup_symbol): Demangle before lowercasing.
index 0e3c2a68feb82e0ee64891931215a162a4cbb033..d0a2104bd899355801baa4b88ad660378f1c31de 100644 (file)
@@ -4,8 +4,8 @@ XM_FILE= xm-linux.h
 XM_CLIBS=
 
 NAT_FILE= nm-linux.h
-NATDEPFILES= infptrace.o inftarg.o fork-child.o corelow.o linux-proc.o \
-       core-regset.o ppc-linux-nat.o proc-service.o thread-db.o lin-lwp.o \
+NATDEPFILES= infptrace.o inftarg.o fork-child.o linux-proc.o \
+       ppc-linux-nat.o proc-service.o thread-db.o lin-lwp.o \
        gcore.o
 
 LOADLIBES = -ldl -rdynamic
index a1d08c2d38e36f41593a8fc8fab5a221b772c099..1fb6fd8b8afad9b784830a11164640a5c2deaba9 100644 (file)
@@ -1,6 +1,6 @@
 # Target: Motorola PPC on Linux
 TDEPFILES= rs6000-tdep.o ppc-linux-tdep.o ppc-sysv-tdep.o solib.o \
-       solib-svr4.o solib-legacy.o
+       solib-svr4.o solib-legacy.o corelow.o
 TM_FILE= tm-linux.h
 
 SIM_OBS = remote-sim.o
index 25616c0f047c8aa0f024f1d78643bb3a5a1faf3c..721e05f8c245b93fee5d0fae800e4edcdb86494b 100644 (file)
@@ -475,21 +475,7 @@ store_inferior_registers (int regno)
 void
 supply_gregset (gdb_gregset_t *gregsetp)
 {
-  int regi;
-  register elf_greg_t *regp = (elf_greg_t *) gregsetp;
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
-
-  for (regi = 0; regi < 32; regi++)
-    supply_register (regi, (char *) (regp + regi));
-
-  supply_register (PC_REGNUM, (char *) (regp + PT_NIP));
-  supply_register (tdep->ppc_lr_regnum, (char *) (regp + PT_LNK));
-  supply_register (tdep->ppc_cr_regnum, (char *) (regp + PT_CCR));
-  supply_register (tdep->ppc_xer_regnum, (char *) (regp + PT_XER));
-  supply_register (tdep->ppc_ctr_regnum, (char *) (regp + PT_CTR));
-  if (tdep->ppc_mq_regnum != -1)
-    supply_register (tdep->ppc_mq_regnum, (char *) (regp + PT_MQ));
-  supply_register (tdep->ppc_ps_regnum, (char *) (regp + PT_MSR));
+  ppc_linux_supply_gregset ((char *) gregsetp);
 }
 
 void
@@ -525,12 +511,7 @@ fill_gregset (gdb_gregset_t *gregsetp, int regno)
 void
 supply_fpregset (gdb_fpregset_t * fpregsetp)
 {
-  int regi;
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
-
-  for (regi = 0; regi < 32; regi++)
-    supply_register (FP0_REGNUM + regi, (char *) (*fpregsetp + regi));
-  supply_register (tdep->ppc_fpscr_regnum, (char *) (*fpregsetp + 32));
+  ppc_linux_supply_fpregset ((char *) fpregsetp);
 }
 
 /* Given a pointer to a floating point register set in /proc format
index 1a88d4052d3aef5e181183670b0bb55fea2cac92..6adfe297170cf9a64c0552f1d3806caeaeb20ee5 100644 (file)
@@ -600,6 +600,88 @@ ppc_linux_svr4_fetch_link_map_offsets (void)
   return lmp;
 }
 
+enum {
+  ELF_NGREG = 48,
+  ELF_NFPREG = 33,
+  ELF_NVRREG = 33
+};
+
+enum {
+  ELF_GREGSET_SIZE = (ELF_NGREG * 4),
+  ELF_FPREGSET_SIZE = (ELF_NFPREG * 8)
+};
+
+void
+ppc_linux_supply_gregset (char *buf)
+{
+  int regi;
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
+
+  for (regi = 0; regi < 32; regi++)
+    supply_register (regi, buf + 4 * regi);
+
+  supply_register (PC_REGNUM, buf + 4 * PPC_LINUX_PT_NIP);
+  supply_register (tdep->ppc_lr_regnum, buf + 4 * PPC_LINUX_PT_LNK);
+  supply_register (tdep->ppc_cr_regnum, buf + 4 * PPC_LINUX_PT_CCR);
+  supply_register (tdep->ppc_xer_regnum, buf + 4 * PPC_LINUX_PT_XER);
+  supply_register (tdep->ppc_ctr_regnum, buf + 4 * PPC_LINUX_PT_CTR);
+  if (tdep->ppc_mq_regnum != -1)
+    supply_register (tdep->ppc_mq_regnum, buf + 4 * PPC_LINUX_PT_MQ);
+  supply_register (tdep->ppc_ps_regnum, buf + 4 * PPC_LINUX_PT_MSR);
+}
+
+void
+ppc_linux_supply_fpregset (char *buf)
+{
+  int regi;
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
+
+  for (regi = 0; regi < 32; regi++)
+    supply_register (FP0_REGNUM + regi, buf + 8 * regi);
+
+  /* The FPSCR is stored in the low order word of the last doubleword in the
+     fpregset.  */
+  supply_register (tdep->ppc_fpscr_regnum, buf + 8 * 32 + 4);
+}
+
+/*
+  Use a local version of this function to get the correct types for regsets.
+*/
+
+static void
+fetch_core_registers (char *core_reg_sect,
+                     unsigned core_reg_size,
+                     int which,
+                     CORE_ADDR reg_addr)
+{
+  if (which == 0)
+    {
+      if (core_reg_size == ELF_GREGSET_SIZE)
+       ppc_linux_supply_gregset (core_reg_sect);
+      else
+       warning ("wrong size gregset struct in core file");
+    }
+  else if (which == 2)
+    {
+      if (core_reg_size == ELF_FPREGSET_SIZE)
+       ppc_linux_supply_fpregset (core_reg_sect);
+      else
+       warning ("wrong size fpregset struct in core file");
+    }
+}
+
+/* Register that we are able to handle ELF file formats using standard
+   procfs "regset" structures.  */
+
+static struct core_fns ppc_linux_regset_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 */
+};
+
 static void
 ppc_linux_init_abi (struct gdbarch_info info,
                     struct gdbarch *gdbarch)
@@ -639,4 +721,5 @@ _initialize_ppc_linux_tdep (void)
 {
   gdbarch_register_osabi (bfd_arch_powerpc, GDB_OSABI_LINUX,
                          ppc_linux_init_abi);
+  add_core_fns (&ppc_linux_regset_core_fns);
 }
index 2f40742abcd0df0428d467572eed229dbf68485b..3bd741da2b190ea99cead2c9052fdfb81cf1c18b 100644 (file)
@@ -39,6 +39,8 @@ CORE_ADDR ppc_sysv_abi_push_arguments (int, struct value **, CORE_ADDR, int,
                                       CORE_ADDR);
 int ppc_linux_memory_remove_breakpoint (CORE_ADDR addr, char *contents_cache);
 struct link_map_offsets *ppc_linux_svr4_fetch_link_map_offsets (void);
+void ppc_linux_supply_gregset (char *buf);
+void ppc_linux_supply_fpregset (char *buf);
 
 
 /* From rs6000-tdep.c... */