Use canonicalize_file_name unconditionally
[deliverable/binutils-gdb.git] / gdb / hppa-hpux-nat.c
index 56bb17c780eda854c78294a929a7f246dd144119..65a2b85f5893344c9edebd771c56f2769805ac6a 100644 (file)
@@ -1,12 +1,12 @@
 /* Native-dependent code for PA-RISC HP-UX.
 
-   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2004-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "inferior.h"
 #include "regcache.h"
 #include "target.h"
 
-#include "gdb_assert.h"
 #include <sys/ptrace.h>
+#include <sys/utsname.h>
 #include <machine/save_state.h>
 
 #ifdef HAVE_TTRACE
 #endif
 
 #include "hppa-tdep.h"
+#include "solib-som.h"
 #include "inf-ptrace.h"
 #include "inf-ttrace.h"
 
-/* Non-zero if we should pretend not to be a runnable target.  */
-int child_suppress_run = 0;
-
 /* Return the offset of register REGNUM within `struct save_state'.
    The offset returns depends on the flags in the "flags" register and
    the register size (32-bit or 64-bit).  These are taken from
    REGCACHE.  */
 
-LONGEST
+static LONGEST
 hppa_hpux_save_state_offset (struct regcache *regcache, int regnum)
 {
   LONGEST offset;
@@ -87,8 +83,10 @@ hppa_hpux_save_state_offset (struct regcache *regcache, int regnum)
 #endif
 
 static void
-hppa_hpux_fetch_register (int regnum)
+hppa_hpux_fetch_register (struct regcache *regcache, int regnum)
 {
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR addr;
   size_t size;
   PTRACE_TYPE_RET *buf;
@@ -98,8 +96,8 @@ hppa_hpux_fetch_register (int regnum)
   pid = ptid_get_pid (inferior_ptid);
 
   /* This isn't really an address, but ptrace thinks of it as one.  */
-  addr = hppa_hpux_save_state_offset(current_regcache, regnum);
-  size = register_size (current_gdbarch, regnum);
+  addr = hppa_hpux_save_state_offset (regcache, regnum);
+  size = register_size (gdbarch, regnum);
 
   gdb_assert (size == 4 || size == 8);
   buf = alloca (size);
@@ -110,7 +108,8 @@ hppa_hpux_fetch_register (int regnum)
 
     if (ttrace (TT_LWP_RUREGS, pid, lwp, addr, size, (uintptr_t)buf) == -1)
       error (_("Couldn't read register %s (#%d): %s"),
-            REGISTER_NAME (regnum), regnum, safe_strerror (errno));
+            gdbarch_register_name (gdbarch, regnum),
+            regnum, safe_strerror (errno));
   }
 #else
   {
@@ -123,7 +122,8 @@ hppa_hpux_fetch_register (int regnum)
        buf[i] = ptrace (PT_RUREGS, pid, (PTRACE_TYPE_ARG3) addr, 0, 0);
        if (errno != 0)
          error (_("Couldn't read register %s (#%d): %s"),
-                REGISTER_NAME (regnum), regnum, safe_strerror (errno));
+                gdbarch_register_name (gdbarch, regnum),
+                regnum, safe_strerror (errno));
 
        addr += sizeof (PTRACE_TYPE_RET);
       }
@@ -134,28 +134,34 @@ hppa_hpux_fetch_register (int regnum)
      `struct save_state', even for 64-bit code.  */
   if (regnum == HPPA_FLAGS_REGNUM && size == 8)
     {
-      ULONGEST flags = extract_unsigned_integer ((gdb_byte *)buf, 4);
-      store_unsigned_integer ((gdb_byte *)buf, 8, flags);
+      ULONGEST flags;
+      flags = extract_unsigned_integer ((gdb_byte *)buf, 4, byte_order);
+      store_unsigned_integer ((gdb_byte *)buf, 8, byte_order, flags);
     }
 
-  regcache_raw_supply (current_regcache, regnum, buf);
+  regcache_raw_supply (regcache, regnum, buf);
 }
 
 static void
-hppa_hpux_fetch_inferior_registers (int regnum)
+hppa_hpux_fetch_inferior_registers (struct target_ops *ops,
+                                   struct regcache *regcache, int regnum)
 {
   if (regnum == -1)
-    for (regnum = 0; regnum < NUM_REGS; regnum++)
-      hppa_hpux_fetch_register (regnum);
+    for (regnum = 0;
+        regnum < gdbarch_num_regs (get_regcache_arch (regcache));
+        regnum++)
+      hppa_hpux_fetch_register (regcache, regnum);
   else
-    hppa_hpux_fetch_register (regnum);
+    hppa_hpux_fetch_register (regcache, regnum);
 }
 
 /* Store register REGNUM into the inferior.  */
 
 static void
-hppa_hpux_store_register (int regnum)
+hppa_hpux_store_register (struct regcache *regcache, int regnum)
 {
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   CORE_ADDR addr;
   size_t size;
   PTRACE_TYPE_RET *buf;
@@ -164,20 +170,21 @@ hppa_hpux_store_register (int regnum)
   pid = ptid_get_pid (inferior_ptid);
 
   /* This isn't really an address, but ptrace thinks of it as one.  */
-  addr = hppa_hpux_save_state_offset(current_regcache, regnum);
-  size = register_size (current_gdbarch, regnum);
+  addr = hppa_hpux_save_state_offset (regcache, regnum);
+  size = register_size (gdbarch, regnum);
 
   gdb_assert (size == 4 || size == 8);
   buf = alloca (size);
 
-  regcache_raw_collect (current_regcache, regnum, buf);
+  regcache_raw_collect (regcache, regnum, buf);
 
   /* Take care with the "flags" register.  It's stored as an `int' in
      `struct save_state', even for 64-bit code.  */
   if (regnum == HPPA_FLAGS_REGNUM && size == 8)
     {
-      ULONGEST flags = extract_unsigned_integer ((gdb_byte *)buf, 8);
-      store_unsigned_integer ((gdb_byte *)buf, 4, flags);
+      ULONGEST flags;
+      flags = extract_unsigned_integer ((gdb_byte *)buf, 8, byte_order);
+      store_unsigned_integer ((gdb_byte *)buf, 4, byte_order, flags);
       size = 4;
     }
 
@@ -187,7 +194,8 @@ hppa_hpux_store_register (int regnum)
 
     if (ttrace (TT_LWP_WUREGS, pid, lwp, addr, size, (uintptr_t)buf) == -1)
       error (_("Couldn't write register %s (#%d): %s"),
-            REGISTER_NAME (regnum), regnum, safe_strerror (errno));
+            gdbarch_register_name (gdbarch, regnum),
+            regnum, safe_strerror (errno));
   }
 #else
   {
@@ -200,7 +208,8 @@ hppa_hpux_store_register (int regnum)
        ptrace (PT_WUREGS, pid, (PTRACE_TYPE_ARG3) addr, buf[i], 0);
        if (errno != 0)
          error (_("Couldn't write register %s (#%d): %s"),
-                REGISTER_NAME (regnum), regnum, safe_strerror (errno));
+                gdbarch_register_name (gdbarch, regnum),
+                regnum, safe_strerror (errno));
 
        addr += sizeof (PTRACE_TYPE_RET);
       }
@@ -212,24 +221,33 @@ hppa_hpux_store_register (int regnum)
    this for all registers (including the floating point registers).  */
 
 static void
-hppa_hpux_store_inferior_registers (int regnum)
+hppa_hpux_store_inferior_registers (struct target_ops *ops,
+                                   struct regcache *regcache, int regnum)
 {
   if (regnum == -1)
-    for (regnum = 0; regnum < NUM_REGS; regnum++)
-      hppa_hpux_store_register (regnum);
+    for (regnum = 0;
+        regnum < gdbarch_num_regs (get_regcache_arch (regcache));
+        regnum++)
+      hppa_hpux_store_register (regcache, regnum);
   else
-    hppa_hpux_store_register (regnum);
+    hppa_hpux_store_register (regcache, regnum);
 }
 
-static int
-hppa_hpux_child_can_run (void)
+/* Set hpux_major_release variable to the value retrieved from a call to
+   uname function.  */
+
+static void
+set_hpux_major_release (void)
 {
-  /* This variable is controlled by modules that layer their own
-     process structure atop that provided here.  The code in
-     hpux-thread.c does this to support the HP-UX user-mode DCE
-     threads.  */
-  return !child_suppress_run;
+  struct utsname x;
+  char *p;
+
+  uname (&x);
+  p = strchr (x.release, '.');
+  if (p)
+    hpux_major_release = atoi (p + 1);
 }
+
 \f
 
 /* Prevent warning from -Wmissing-prototypes.  */
@@ -240,6 +258,8 @@ _initialize_hppa_hpux_nat (void)
 {
   struct target_ops *t;
 
+  set_hpux_major_release ();
+
 #ifdef HAVE_TTRACE
   t = inf_ttrace_target ();
 #else
@@ -248,7 +268,6 @@ _initialize_hppa_hpux_nat (void)
 
   t->to_fetch_registers = hppa_hpux_fetch_inferior_registers;
   t->to_store_registers = hppa_hpux_store_inferior_registers;
-  t->to_can_run = hppa_hpux_child_can_run;
 
   add_target (t);
 }
This page took 0.02623 seconds and 4 git commands to generate.