* rs6000-aix-tdep.c: Include "regcache.h", "regset.h", and
authorUlrich Weigand <uweigand@de.ibm.com>
Sat, 28 Apr 2007 16:47:00 +0000 (16:47 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Sat, 28 Apr 2007 16:47:00 +0000 (16:47 +0000)
"gdb_string.h".
(rs6000_aix32_reg_offsets, rs6000_aix64_reg_offsets): New variables.
(rs6000_aix_supply_regset, rs6000_aix_collect_regset): New functions.
(rs6000_aix32_regset, rs6000_aix64_regset): New variables.
(rs6000_aix_regset_from_core_section): New function.
(rs6000_aix_init_osabi): Register it.
(_initialize_rs6000_aix_tdep): Register GDB_OSABI_AIX osabi and
sniffer for bfd_arch_powerpc as well as bfd_arch_rs6000.
* rs6000-nat.c (CoreRegs): Do not define type.
(fetch_core_registers, rs6000_core_fns): Remove.
(_initialize_core_rs6000): Do not register it.  Rename to ...
(_initialize_rs6000_nat): ... this.
* Makefile.in (rs6000-aix-tdep.o): Update dependencies.

gdb/ChangeLog
gdb/Makefile.in
gdb/rs6000-aix-tdep.c
gdb/rs6000-nat.c

index 8799fa602a5071c53d5c84e3047026fe232b29c4..d30267b12532f1b3bb7accc1471e0b9b09944859 100644 (file)
@@ -1,3 +1,20 @@
+2007-04-28  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * rs6000-aix-tdep.c: Include "regcache.h", "regset.h", and
+       "gdb_string.h".
+       (rs6000_aix32_reg_offsets, rs6000_aix64_reg_offsets): New variables.
+       (rs6000_aix_supply_regset, rs6000_aix_collect_regset): New functions.
+       (rs6000_aix32_regset, rs6000_aix64_regset): New variables.
+       (rs6000_aix_regset_from_core_section): New function.
+       (rs6000_aix_init_osabi): Register it.
+       (_initialize_rs6000_aix_tdep): Register GDB_OSABI_AIX osabi and
+       sniffer for bfd_arch_powerpc as well as bfd_arch_rs6000. 
+       * rs6000-nat.c (CoreRegs): Do not define type.
+       (fetch_core_registers, rs6000_core_fns): Remove.
+       (_initialize_core_rs6000): Do not register it.  Rename to ...
+       (_initialize_rs6000_nat): ... this.
+       * Makefile.in (rs6000-aix-tdep.o): Update dependencies.
+
 2007-04-27  Kevin Buettner  <kevinb@redhat.com>
 
        * dwarf2expr.c (unsigned_address_type): Add forward declaration.
index d17cd840b712ce1c4d1eb7a5a73a5e7102843fcb..92ca08bb2e235fe7d021f9f60921d3cfe4784c77 100644 (file)
@@ -2519,8 +2519,8 @@ rs6000-tdep.o: rs6000-tdep.c $(defs_h) $(frame_h) $(inferior_h) $(symtab_h) \
        $(coff_xcoff_h) $(libxcoff_h) $(elf_bfd_h) $(solib_svr4_h) \
        $(ppc_tdep_h) $(gdb_assert_h) $(dis_asm_h) $(trad_frame_h) \
        $(frame_unwind_h) $(frame_base_h) $(rs6000_tdep_h) $(dwarf2_frame_h)
-rs6000-aix-tdep.o: rs6000-aix-tdep.c $(defs_h) $(osabi_h) $(rs6000_tdep_h) \
-       $(ppc_tdep_h)
+rs6000-aix-tdep.o: rs6000-aix-tdep.c $(defs_h) $(gdb_string_h) $(osabi_h) \
+       $(regcache_h) $(regset_h) $(rs6000_tdep_h) $(ppc_tdep_h)
 s390-nat.o: s390-nat.c $(defs_h) $(regcache_h) $(inferior_h) \
        $(s390_tdep_h) $(target_h) $(linux_nat_h)
 s390-tdep.o: s390-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) $(inferior_h) \
index 6e195a23eed174fc965f4a68fba597f2703814ea..ee6b03962d6503d9b5d4ae0237e9282e090d9e29 100644 (file)
    Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
+#include "gdb_string.h"
 #include "osabi.h"
+#include "regcache.h"
+#include "regset.h"
 #include "rs6000-tdep.h"
 #include "ppc-tdep.h"
 
+
+/* Core file support.  */
+
+static struct ppc_reg_offsets rs6000_aix32_reg_offsets =
+{
+  /* General-purpose registers.  */
+  208, /* r0_offset */
+  24, /* pc_offset */
+  28, /* ps_offset */
+  32, /* cr_offset */
+  36, /* lr_offset */
+  40, /* ctr_offset */
+  44, /* xer_offset */
+  48, /* mq_offset */
+
+  /* Floating-point registers.  */
+  336, /* f0_offset */
+  56, /* fpscr_offset */
+
+  /* AltiVec registers.  */
+  -1, /* vr0_offset */
+  -1, /* vscr_offset */
+  -1 /* vrsave_offset */
+};
+
+static struct ppc_reg_offsets rs6000_aix64_reg_offsets =
+{
+  /* General-purpose registers.  */
+  0, /* r0_offset */
+  264, /* pc_offset */
+  256, /* ps_offset */
+  288, /* cr_offset */
+  272, /* lr_offset */
+  280, /* ctr_offset */
+  292, /* xer_offset */
+  -1, /* mq_offset */
+
+  /* Floating-point registers.  */
+  312, /* f0_offset */
+  296, /* fpscr_offset */
+
+  /* AltiVec registers.  */
+  -1, /* vr0_offset */
+  -1, /* vscr_offset */
+  -1 /* vrsave_offset */
+};
+
+
+/* Supply register REGNUM in the general-purpose register set REGSET
+   from the buffer specified by GREGS and LEN to register cache
+   REGCACHE.  If REGNUM is -1, do this for all registers in REGSET.  */
+
+static void
+rs6000_aix_supply_regset (const struct regset *regset,
+                         struct regcache *regcache, int regnum,
+                         const void *gregs, size_t len)
+{
+  ppc_supply_gregset (regset, regcache, regnum, gregs, len);
+
+  if (ppc_floating_point_unit_p (get_regcache_arch (regcache)))
+    ppc_supply_fpregset (regset, regcache, regnum, gregs, len);
+}
+
+/* Collect register REGNUM in the general-purpose register set
+   REGSET. from register cache REGCACHE into the buffer specified by
+   GREGS and LEN.  If REGNUM is -1, do this for all registers in
+   REGSET.  */
+
+static void
+rs6000_aix_collect_regset (const struct regset *regset,
+                          const struct regcache *regcache, int regnum,
+                          void *gregs, size_t len)
+{
+  ppc_collect_gregset (regset, regcache, regnum, gregs, len);
+
+  if (ppc_floating_point_unit_p (get_regcache_arch (regcache)))
+    ppc_collect_fpregset (regset, regcache, regnum, gregs, len);
+}
+
+/* AIX register set.  */
+
+static struct regset rs6000_aix32_regset =
+{
+  &rs6000_aix32_reg_offsets,
+  rs6000_aix_supply_regset,
+  rs6000_aix_collect_regset,
+};
+
+static struct regset rs6000_aix64_regset =
+{
+  &rs6000_aix64_reg_offsets,
+  rs6000_aix_supply_regset,
+  rs6000_aix_collect_regset,
+};
+
+/* Return the appropriate register set for the core section identified
+   by SECT_NAME and SECT_SIZE.  */
+
+static const struct regset *
+rs6000_aix_regset_from_core_section (struct gdbarch *gdbarch,
+                                    const char *sect_name, size_t sect_size)
+{
+  if (gdbarch_tdep (gdbarch)->wordsize == 4)
+    {
+      if (strcmp (sect_name, ".reg") == 0 && sect_size >= 592)
+        return &rs6000_aix32_regset;
+    }
+  else
+    {
+      if (strcmp (sect_name, ".reg") == 0 && sect_size >= 576)
+        return &rs6000_aix64_regset;
+    }
+
+  return NULL;
+}
+
+
 static enum gdb_osabi
 rs6000_aix_osabi_sniffer (bfd *abfd)
 {
@@ -42,6 +162,10 @@ rs6000_aix_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
   /* RS6000/AIX does not support PT_STEP.  Has to be simulated.  */
   set_gdbarch_software_single_step (gdbarch, rs6000_software_single_step);
 
+  /* Core file support.  */
+  set_gdbarch_regset_from_core_section
+    (gdbarch, rs6000_aix_regset_from_core_section);
+
   /* Minimum possible text address in AIX.  */
   gdbarch_tdep (gdbarch)->text_segment_base = 0x10000000;
 }
@@ -52,8 +176,13 @@ _initialize_rs6000_aix_tdep (void)
   gdbarch_register_osabi_sniffer (bfd_arch_rs6000,
                                   bfd_target_xcoff_flavour,
                                   rs6000_aix_osabi_sniffer);
+  gdbarch_register_osabi_sniffer (bfd_arch_powerpc,
+                                  bfd_target_xcoff_flavour,
+                                  rs6000_aix_osabi_sniffer);
 
   gdbarch_register_osabi (bfd_arch_rs6000, 0, GDB_OSABI_AIX,
                           rs6000_aix_init_osabi);
+  gdbarch_register_osabi (bfd_arch_powerpc, 0, GDB_OSABI_AIX,
+                          rs6000_aix_init_osabi);
 }
 
index 1281da22fcebbd487b50c24c95d07fa4f0c2b37e..dca083020c647bbc080f6ce88239beb6f139b4d8 100644 (file)
 # define ARCH64() (register_size (current_gdbarch, 0) == 8)
 #endif
 
-/* Union of 32-bit and 64-bit ".reg" core file sections. */
-
-typedef union {
-#ifdef ARCH3264
-  struct __context64 r64;
-#else
-  struct mstsave r64;
-#endif
-  struct mstsave r32;
-} CoreRegs;
-
 /* Union of 32-bit and 64-bit versions of ld_info. */
 
 typedef union {
@@ -142,8 +131,6 @@ static int objfile_symbol_add (void *);
 
 static void vmap_symtab (struct vmap *);
 
-static void fetch_core_registers (char *, unsigned int, int, CORE_ADDR);
-
 static void exec_one_dummy_insn (void);
 
 extern void fixup_breakpoints (CORE_ADDR low, CORE_ADDR high, CORE_ADDR delta);
@@ -624,87 +611,6 @@ exec_one_dummy_insn (void)
   write_pc (prev_pc);
   deprecated_remove_raw_breakpoint (bp);
 }
-
-/* Fetch registers from the register section in core bfd. */
-
-static void
-fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
-                     int which, CORE_ADDR reg_addr)
-{
-  CoreRegs *regs;
-  int regi;
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 
-
-  if (which != 0)
-    {
-      fprintf_unfiltered
-       (gdb_stderr,
-        "Gdb error: unknown parameter to fetch_core_registers().\n");
-      return;
-    }
-
-  regs = (CoreRegs *) core_reg_sect;
-
-  /* Put the register values from the core file section in the regcache.  */
-
-  if (ARCH64 ())
-    {
-      for (regi = 0; regi < ppc_num_gprs; regi++)
-        regcache_raw_supply (current_regcache, tdep->ppc_gp0_regnum + regi,
-                            (char *) &regs->r64.gpr[regi]);
-
-      if (tdep->ppc_fp0_regnum >= 0)
-        for (regi = 0; regi < ppc_num_fprs; regi++)
-          regcache_raw_supply (current_regcache, tdep->ppc_fp0_regnum + regi,
-                              (char *) &regs->r64.fpr[regi]);
-
-      regcache_raw_supply (current_regcache, PC_REGNUM,
-                          (char *) &regs->r64.iar);
-      regcache_raw_supply (current_regcache, tdep->ppc_ps_regnum,
-                          (char *) &regs->r64.msr);
-      regcache_raw_supply (current_regcache, tdep->ppc_cr_regnum,
-                          (char *) &regs->r64.cr);
-      regcache_raw_supply (current_regcache, tdep->ppc_lr_regnum,
-                          (char *) &regs->r64.lr);
-      regcache_raw_supply (current_regcache, tdep->ppc_ctr_regnum,
-                          (char *) &regs->r64.ctr);
-      regcache_raw_supply (current_regcache, tdep->ppc_xer_regnum,
-                          (char *) &regs->r64.xer);
-      if (tdep->ppc_fpscr_regnum >= 0)
-        regcache_raw_supply (current_regcache, tdep->ppc_fpscr_regnum,
-                            (char *) &regs->r64.fpscr);
-    }
-  else
-    {
-      for (regi = 0; regi < ppc_num_gprs; regi++)
-        regcache_raw_supply (current_regcache, tdep->ppc_gp0_regnum + regi,
-                            (char *) &regs->r32.gpr[regi]);
-
-      if (tdep->ppc_fp0_regnum >= 0)
-        for (regi = 0; regi < ppc_num_fprs; regi++)
-          regcache_raw_supply (current_regcache, tdep->ppc_fp0_regnum + regi,
-                              (char *) &regs->r32.fpr[regi]);
-
-      regcache_raw_supply (current_regcache, PC_REGNUM,
-                          (char *) &regs->r32.iar);
-      regcache_raw_supply (current_regcache, tdep->ppc_ps_regnum,
-                          (char *) &regs->r32.msr);
-      regcache_raw_supply (current_regcache, tdep->ppc_cr_regnum,
-                          (char *) &regs->r32.cr);
-      regcache_raw_supply (current_regcache, tdep->ppc_lr_regnum,
-                          (char *) &regs->r32.lr);
-      regcache_raw_supply (current_regcache, tdep->ppc_ctr_regnum,
-                          (char *) &regs->r32.ctr);
-      regcache_raw_supply (current_regcache, tdep->ppc_xer_regnum,
-                          (char *) &regs->r32.xer);
-      if (tdep->ppc_fpscr_regnum >= 0)
-        regcache_raw_supply (current_regcache, tdep->ppc_fpscr_regnum,
-                            (char *) &regs->r32.fpscr);
-      if (tdep->ppc_mq_regnum >= 0)
-       regcache_raw_supply (current_regcache, tdep->ppc_mq_regnum,
-                            (char *) &regs->r32.mq);
-    }
-}
 \f
 
 /* Copy information about text and data sections from LDI to VP for a 64-bit
@@ -1291,19 +1197,9 @@ find_toc_address (CORE_ADDR pc)
   error (_("Unable to find TOC entry for pc %s."), hex_string (pc));
 }
 \f
-/* Register that we are able to handle rs6000 core file formats. */
-
-static struct core_fns rs6000_core_fns =
-{
-  bfd_target_xcoff_flavour,            /* core_flavour */
-  default_check_format,                        /* check_format */
-  default_core_sniffer,                        /* core_sniffer */
-  fetch_core_registers,                        /* core_read_registers */
-  NULL                                 /* next */
-};
 
 void
-_initialize_core_rs6000 (void)
+_initialize_rs6000_nat (void)
 {
   struct target_ops *t;
 
@@ -1322,6 +1218,4 @@ _initialize_core_rs6000 (void)
   /* Initialize hook in rs6000-tdep.c for determining the TOC address
      when calling functions in the inferior.  */
   rs6000_find_toc_address_hook = find_toc_address;
-
-  deprecated_add_core_fns (&rs6000_core_fns);
 }