2010-06-11 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / hppabsd-tdep.c
index f167f752c154246a97de463caa7a9ce69d0bfad5..4df40c91edb4152ea3c6cae7e9b7b61bd00ef10a 100644 (file)
@@ -1,6 +1,7 @@
 /* Target-dependent code for HP PA-RISC BSD's.
 
-   Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
-#include "arch-utils.h"
-#include "gdbtypes.h"
-#include "symtab.h"
 #include "objfiles.h"
-#include "osabi.h"
-#include "regcache.h"
-#include "regset.h"
 #include "target.h"
 #include "value.h"
 
-#include "gdb_assert.h"
-#include "gdb_string.h"
-
 #include "elf/common.h"
 
 #include "hppa-tdep.h"
+#include "hppabsd-tdep.h"
 #include "solib-svr4.h"
 
-/* Core file support.  */
-
-/* Sizeof `struct reg' in <machine/reg.h>.  */
-#define HPPABSD_SIZEOF_GREGS   (34 * 4)
-
-/* Supply register REGNUM from the buffer specified by GREGS and LEN
-   in the general-purpose register set REGSET to register cache
-   REGCACHE.  If REGNUM is -1, do this for all registers in REGSET.  */
-
-static void
-hppabsd_supply_gregset (const struct regset *regset, struct regcache *regcache,
-                    int regnum, const void *gregs, size_t len)
-{
-  const gdb_byte *regs = gregs;
-  size_t offset;
-  int i;
-
-  gdb_assert (len >= HPPABSD_SIZEOF_GREGS);
-
-  for (i = HPPA_R1_REGNUM, offset = 4; i <= HPPA_R31_REGNUM; i++, offset += 4)
-    {
-      if (regnum == -1 || regnum == i)
-       regcache_raw_supply (regcache, i, regs + offset);
-    }
-
-  if (regnum == -1 || regnum == HPPA_SAR_REGNUM)
-    regcache_raw_supply (regcache, HPPA_SAR_REGNUM, regs);
-  if (regnum == -1 || regnum == HPPA_PCOQ_HEAD_REGNUM)
-    regcache_raw_supply (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 32 * 4);
-  if (regnum == -1 || regnum == HPPA_PCOQ_TAIL_REGNUM)
-    regcache_raw_supply (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 33 * 4);
-}
-
-/* OpenBSD/hppa register set.  */
-
-static struct regset hppabsd_gregset =
-{
-  NULL,
-  hppabsd_supply_gregset
-};
-
-/* Return the appropriate register set for the core section identified
-   by SECT_NAME and SECT_SIZE.  */
-
-static const struct regset *
-hppabsd_regset_from_core_section (struct gdbarch *gdbarch,
-                                 const char *sect_name, size_t sect_size)
-{
-  if (strcmp (sect_name, ".reg") == 0 && sect_size >= HPPABSD_SIZEOF_GREGS)
-    return &hppabsd_gregset;
-
-  return NULL;
-}
-\f
-
-CORE_ADDR
-hppabsd_find_global_pointer (struct value *function)
+static CORE_ADDR
+hppabsd_find_global_pointer (struct gdbarch *gdbarch, struct value *function)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR faddr = value_as_address (function);
   struct obj_section *faddr_sec;
   gdb_byte buf[4];
@@ -103,7 +42,7 @@ hppabsd_find_global_pointer (struct value *function)
   if (faddr & 2)
     {
       if (target_read_memory ((faddr & ~3) + 4, buf, sizeof buf) == 0)
-       return extract_unsigned_integer (buf, sizeof buf);
+       return extract_unsigned_integer (buf, sizeof buf, byte_order);
     }
 
   /* If the address is in the .plt section, then the real function
@@ -125,9 +64,10 @@ hppabsd_find_global_pointer (struct value *function)
 
       if (sec < faddr_sec->objfile->sections_end)
        {
-         CORE_ADDR addr = sec->addr;
+         CORE_ADDR addr = obj_section_addr (sec);
+         CORE_ADDR endaddr = obj_section_endaddr (sec);
 
-         while (addr < sec->endaddr)
+         while (addr < endaddr)
            {
              gdb_byte buf[4];
              LONGEST tag;
@@ -135,7 +75,7 @@ hppabsd_find_global_pointer (struct value *function)
              if (target_read_memory (addr, buf, sizeof buf) != 0)
                break;
 
-             tag = extract_signed_integer (buf, sizeof buf);
+             tag = extract_signed_integer (buf, sizeof buf, byte_order);
              if (tag == DT_PLTGOT)
                {
                  CORE_ADDR pltgot;
@@ -143,11 +83,13 @@ hppabsd_find_global_pointer (struct value *function)
                  if (target_read_memory (addr + 4, buf, sizeof buf) != 0)
                    break;
 
-                 /* The OpenBSD ld.so doesn't relocate DT_PLTGOT, so
+                 /* The NetBSD/OpenBSD ld.so doesn't relocate DT_PLTGOT, so
                     we have to do it ourselves.  */
-                 pltgot = extract_unsigned_integer (buf, sizeof buf);
+                 pltgot = extract_unsigned_integer (buf, sizeof buf,
+                                                    byte_order);
                  pltgot += ANOFFSET (sec->objfile->section_offsets,
                                      SECT_OFF_TEXT (sec->objfile));
+
                  return pltgot;
                }
 
@@ -163,7 +105,7 @@ hppabsd_find_global_pointer (struct value *function)
 }
 \f
 
-static void
+void
 hppabsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
@@ -172,10 +114,6 @@ hppabsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_long_double_bit (gdbarch, 64);
   set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
 
-  /* Core file support.  */
-  set_gdbarch_regset_from_core_section
-    (gdbarch, hppabsd_regset_from_core_section);
-
   /* OpenBSD and NetBSD use ELF.  */
   tdep->is_elf = 1;
   tdep->find_global_pointer = hppabsd_find_global_pointer;
@@ -186,34 +124,3 @@ hppabsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_solib_svr4_fetch_link_map_offsets
     (gdbarch, svr4_ilp32_fetch_link_map_offsets);
 }
-\f
-
-/* OpenBSD uses uses the traditional NetBSD core file format, even for
-   ports that use ELF.  */
-#define GDB_OSABI_NETBSD_CORE GDB_OSABI_OPENBSD_ELF
-
-static enum gdb_osabi
-hppabsd_core_osabi_sniffer (bfd *abfd)
-{
-  if (strcmp (bfd_get_target (abfd), "netbsd-core") == 0)
-    return GDB_OSABI_NETBSD_CORE;
-
-  return GDB_OSABI_UNKNOWN;
-}
-\f
-
-/* Provide a prototype to silence -Wmissing-prototypes.  */
-void _initialize_hppabsd_tdep (void);
-
-void
-_initialize_hppabsd_tdep (void)
-{
-  /* BFD doesn't set a flavour for NetBSD style a.out core files.  */
-  gdbarch_register_osabi_sniffer (bfd_arch_hppa, bfd_target_unknown_flavour,
-                                 hppabsd_core_osabi_sniffer);
-
-  gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_NETBSD_ELF,
-                         hppabsd_init_abi);
-  gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_OPENBSD_ELF,
-                         hppabsd_init_abi);
-}
This page took 0.044748 seconds and 4 git commands to generate.