Update target_stop's documentation
[deliverable/binutils-gdb.git] / gdb / hppa-linux-tdep.c
index ebfc2f5759b4a660d6e9a5f05ff315f544860f3e..6bc604b6192c137475ea6d73ae2de4daefecf604 100644 (file)
@@ -1,7 +1,6 @@
 /* Target-dependent code for GNU/Linux running on PA-RISC, for GDB.
 
-   Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010
-   Free Software Foundation, Inc.
+   Copyright (C) 2004-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -32,7 +31,7 @@
 #include "regset.h"
 #include "regcache.h"
 #include "hppa-tdep.h"
-
+#include "linux-tdep.h"
 #include "elf/common.h"
 
 /* Map DWARF DBX register numbers to GDB register numbers.  */
@@ -56,7 +55,8 @@ hppa_linux_target_write_pc (struct regcache *regcache, CORE_ADDR v)
 {
   /* Probably this should be done by the kernel, but it isn't.  */
   regcache_cooked_write_unsigned (regcache, HPPA_PCOQ_HEAD_REGNUM, v | 0x3);
-  regcache_cooked_write_unsigned (regcache, HPPA_PCOQ_TAIL_REGNUM, (v + 4) | 0x3);
+  regcache_cooked_write_unsigned (regcache,
+                                 HPPA_PCOQ_TAIL_REGNUM, (v + 4) | 0x3);
 }
 
 /* An instruction to match.  */
@@ -98,7 +98,7 @@ insns_match_pattern (struct gdbarch *gdbarch, CORE_ADDR pc,
 
   for (i = 0; pattern[i].mask; i++)
     {
-      char buf[4];
+      gdb_byte buf[4];
 
       target_read_memory (npc, buf, 4);
       insn[i] = extract_unsigned_integer (buf, 4, byte_order);
@@ -169,7 +169,7 @@ hppa_linux_sigtramp_find_sigcontext (struct gdbarch *gdbarch, CORE_ADDR pc)
       if (insns_match_pattern (gdbarch, pc, hppa_sigtramp, dummy))
        {
          /* sigaltstack case: we have no way of knowing which offset to 
-            use in this case; default to new kernel handling. If this is
+            use in this case; default to new kernel handling.  If this is
             wrong the unwinding will fail.  */
          try = 2;
          sp = pc - pcoffs[try];
@@ -182,8 +182,8 @@ hppa_linux_sigtramp_find_sigcontext (struct gdbarch *gdbarch, CORE_ADDR pc)
 
   /* sp + sfoffs[try] points to a struct rt_sigframe, which contains
      a struct siginfo and a struct ucontext.  struct ucontext contains
-     a struct sigcontext. Return an offset to this sigcontext here.  Too 
-     bad we cannot include system specific headers :-(.  
+     a struct sigcontext.  Return an offset to this sigcontext here.  Too 
+     bad we cannot include system specific headers :-(.
      sizeof(struct siginfo) == 128
      offsetof(struct ucontext, uc_mcontext) == 24.  */
   return sp + sfoffs[try] + 128 + 24;
@@ -252,7 +252,7 @@ hppa_linux_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
       scptr += 4;
     }
 
-  /* IASQ/IAOQ. */
+  /* IASQ/IAOQ.  */
   info->saved_regs[HPPA_PCSQ_HEAD_REGNUM].addr = scptr;
   scptr += 4;
   info->saved_regs[HPPA_PCSQ_TAIL_REGNUM].addr = scptr;
@@ -313,6 +313,7 @@ hppa_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind hppa_linux_sigtramp_frame_unwind = {
   SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
   hppa_linux_sigtramp_frame_this_id,
   hppa_linux_sigtramp_frame_prev_register,
   NULL,
@@ -330,7 +331,8 @@ static const struct frame_unwind hppa_linux_sigtramp_frame_unwind = {
    d_un.d_ptr value is the global pointer.  */
 
 static CORE_ADDR
-hppa_linux_find_global_pointer (struct gdbarch *gdbarch, struct value *function)
+hppa_linux_find_global_pointer (struct gdbarch *gdbarch,
+                               struct value *function)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   struct obj_section *faddr_sect;
@@ -342,7 +344,7 @@ hppa_linux_find_global_pointer (struct gdbarch *gdbarch, struct value *function)
   if (faddr & 2)
     {
       int status;
-      char buf[4];
+      gdb_byte buf[4];
 
       faddr &= ~3;
 
@@ -354,7 +356,7 @@ hppa_linux_find_global_pointer (struct gdbarch *gdbarch, struct value *function)
   /* If the address is in the plt section, then the real function hasn't 
      yet been fixed up by the linker so we cannot determine the gp of 
      that function.  */
-  if (in_plt_section (faddr, NULL))
+  if (in_plt_section (faddr))
     return 0;
 
   faddr_sect = find_pc_section (faddr);
@@ -379,7 +381,7 @@ hppa_linux_find_global_pointer (struct gdbarch *gdbarch, struct value *function)
            {
              int status;
              LONGEST tag;
-             char buf[4];
+             gdb_byte buf[4];
 
              status = target_read_memory (addr, buf, sizeof (buf));
              if (status != 0)
@@ -395,7 +397,7 @@ hppa_linux_find_global_pointer (struct gdbarch *gdbarch, struct value *function)
                    break;
                  global_pointer = extract_unsigned_integer (buf, sizeof (buf),
                                                             byte_order);
-                 /* The payoff... */
+                 /* The payoff...  */
                  return global_pointer;
                }
 
@@ -421,84 +423,53 @@ hppa_linux_find_global_pointer (struct gdbarch *gdbarch, struct value *function)
  * cr10, cr15
  */
 
-#define GR_REGNUM(_n)  (HPPA_R0_REGNUM+_n)
-#define TR_REGNUM(_n)  (HPPA_TR0_REGNUM+_n)
-static const int greg_map[] =
+static const struct regcache_map_entry hppa_linux_gregmap[] =
   {
-    GR_REGNUM(0), GR_REGNUM(1), GR_REGNUM(2), GR_REGNUM(3),
-    GR_REGNUM(4), GR_REGNUM(5), GR_REGNUM(6), GR_REGNUM(7),
-    GR_REGNUM(8), GR_REGNUM(9), GR_REGNUM(10), GR_REGNUM(11),
-    GR_REGNUM(12), GR_REGNUM(13), GR_REGNUM(14), GR_REGNUM(15),
-    GR_REGNUM(16), GR_REGNUM(17), GR_REGNUM(18), GR_REGNUM(19),
-    GR_REGNUM(20), GR_REGNUM(21), GR_REGNUM(22), GR_REGNUM(23),
-    GR_REGNUM(24), GR_REGNUM(25), GR_REGNUM(26), GR_REGNUM(27),
-    GR_REGNUM(28), GR_REGNUM(29), GR_REGNUM(30), GR_REGNUM(31),
-
-    HPPA_SR4_REGNUM+1, HPPA_SR4_REGNUM+2, HPPA_SR4_REGNUM+3, HPPA_SR4_REGNUM+4,
-    HPPA_SR4_REGNUM, HPPA_SR4_REGNUM+5, HPPA_SR4_REGNUM+6, HPPA_SR4_REGNUM+7,
-
-    HPPA_PCOQ_HEAD_REGNUM, HPPA_PCOQ_TAIL_REGNUM,
-    HPPA_PCSQ_HEAD_REGNUM, HPPA_PCSQ_TAIL_REGNUM,
-
-    HPPA_SAR_REGNUM, HPPA_IIR_REGNUM, HPPA_ISR_REGNUM, HPPA_IOR_REGNUM,
-    HPPA_IPSW_REGNUM, HPPA_RCR_REGNUM,
-
-    TR_REGNUM(0), TR_REGNUM(1), TR_REGNUM(2), TR_REGNUM(3),
-    TR_REGNUM(4), TR_REGNUM(5), TR_REGNUM(6), TR_REGNUM(7),
-
-    HPPA_PID0_REGNUM, HPPA_PID1_REGNUM, HPPA_PID2_REGNUM, HPPA_PID3_REGNUM,
-    HPPA_CCR_REGNUM, HPPA_EIEM_REGNUM,
+    { 32, HPPA_R0_REGNUM },
+    { 1, HPPA_SR4_REGNUM+1 },
+    { 1, HPPA_SR4_REGNUM+2 },
+    { 1, HPPA_SR4_REGNUM+3 },
+    { 1, HPPA_SR4_REGNUM+4 },
+    { 1, HPPA_SR4_REGNUM },
+    { 1, HPPA_SR4_REGNUM+5 },
+    { 1, HPPA_SR4_REGNUM+6 },
+    { 1, HPPA_SR4_REGNUM+7 },
+    { 1, HPPA_PCOQ_HEAD_REGNUM },
+    { 1, HPPA_PCOQ_TAIL_REGNUM },
+    { 1, HPPA_PCSQ_HEAD_REGNUM },
+    { 1, HPPA_PCSQ_TAIL_REGNUM },
+    { 1, HPPA_SAR_REGNUM },
+    { 1, HPPA_IIR_REGNUM },
+    { 1, HPPA_ISR_REGNUM },
+    { 1, HPPA_IOR_REGNUM },
+    { 1, HPPA_IPSW_REGNUM },
+    { 1, HPPA_RCR_REGNUM },
+    { 8, HPPA_TR0_REGNUM },
+    { 4, HPPA_PID0_REGNUM },
+    { 1, HPPA_CCR_REGNUM },
+    { 1, HPPA_EIEM_REGNUM },
+    { 0 }
   };
 
-static void
-hppa_linux_supply_regset (const struct regset *regset,
-                         struct regcache *regcache,
-                         int regnum, const void *regs, size_t len)
-{
-  struct gdbarch *arch = get_regcache_arch (regcache);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (arch);
-  const char *buf = regs;
-  int i, offset;
-
-  offset = 0;
-  for (i = 0; i < ARRAY_SIZE (greg_map); i++)
-    {
-      if (regnum == greg_map[i] || regnum == -1)
-        regcache_raw_supply (regcache, greg_map[i], buf + offset);
-
-      offset += tdep->bytes_per_address;
-    }
-}
-
-static void
-hppa_linux_supply_fpregset (const struct regset *regset,
-                           struct regcache *regcache,
-                           int regnum, const void *regs, size_t len)
-{
-  const char *buf = regs;
-  int i, offset;
-
-  offset = 0;
-  for (i = 0; i < 64; i++)
-    {
-      if (regnum == HPPA_FP0_REGNUM + i || regnum == -1)
-        regcache_raw_supply (regcache, HPPA_FP0_REGNUM + i, 
-                            buf + offset);
-      offset += 4;
-    }
-}
+static const struct regcache_map_entry hppa_linux_fpregmap[] =
+  {
+    /* FIXME: Only works for 32-bit mode.  In 64-bit mode there should
+       be 32 fpregs, 8 bytes each.  */
+    { 64, HPPA_FP0_REGNUM, 4 },
+    { 0 }
+  };
 
 /* HPPA Linux kernel register set.  */
-static struct regset hppa_linux_regset =
+static const struct regset hppa_linux_regset =
 {
-  NULL,
-  hppa_linux_supply_regset
+  hppa_linux_gregmap,
+  regcache_supply_regset, regcache_collect_regset
 };
 
-static struct regset hppa_linux_fpregset =
+static const struct regset hppa_linux_fpregset =
 {
-  NULL,
-  hppa_linux_supply_fpregset
+  hppa_linux_fpregmap,
+  regcache_supply_regset, regcache_collect_regset
 };
 
 static const struct regset *
@@ -523,6 +494,8 @@ hppa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
+  linux_init_abi (info, gdbarch);
+
   /* GNU/Linux is always ELF.  */
   tdep->is_elf = 1;
 
@@ -560,6 +533,8 @@ hppa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 void
 _initialize_hppa_linux_tdep (void)
 {
-  gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_LINUX, hppa_linux_init_abi);
-  gdbarch_register_osabi (bfd_arch_hppa, bfd_mach_hppa20w, GDB_OSABI_LINUX, hppa_linux_init_abi);
+  gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_LINUX,
+                         hppa_linux_init_abi);
+  gdbarch_register_osabi (bfd_arch_hppa, bfd_mach_hppa20w,
+                         GDB_OSABI_LINUX, hppa_linux_init_abi);
 }
This page took 0.027119 seconds and 4 git commands to generate.