Use gdbpy_enter in python.c
[deliverable/binutils-gdb.git] / gdb / ppc-linux-nat.c
index 1ff00a6d04e6251eb5206b0d5b041be297d543be..a56d154d3126c69431eff0717d6b4bcbe15f9d96 100644 (file)
@@ -1,6 +1,6 @@
 /* PPC GNU/Linux native support.
 
-   Copyright (C) 1988-2013 Free Software Foundation, Inc.
+   Copyright (C) 1988-2017 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 "gdb_string.h"
 #include "observer.h"
 #include "frame.h"
 #include "inferior.h"
 #include "gdbthread.h"
 #include "gdbcore.h"
 #include "regcache.h"
-#include "gdb_assert.h"
 #include "target.h"
 #include "linux-nat.h"
-
-#include <stdint.h>
 #include <sys/types.h>
-#include <sys/param.h>
 #include <signal.h>
 #include <sys/user.h>
 #include <sys/ioctl.h>
 #include "gdb_wait.h"
 #include <fcntl.h>
 #include <sys/procfs.h>
-#include <sys/ptrace.h>
+#include "nat/gdb_ptrace.h"
 
 /* Prototypes for supply_gregset etc.  */
 #include "gregset.h"
 #include "elf/common.h"
 #include "auxv.h"
 
-/* This sometimes isn't defined.  */
-#ifndef PT_ORIG_R3
-#define PT_ORIG_R3 34
-#endif
-#ifndef PT_TRAP
-#define PT_TRAP 40
-#endif
-
-/* The PPC_FEATURE_* defines should be provided by <asm/cputable.h>.
-   If they aren't, we can provide them ourselves (their values are fixed
-   because they are part of the kernel ABI).  They are used in the AT_HWCAP
-   entry of the AUXV.  */
-#ifndef PPC_FEATURE_CELL
-#define PPC_FEATURE_CELL 0x00010000
-#endif
-#ifndef PPC_FEATURE_BOOKE
-#define PPC_FEATURE_BOOKE 0x00008000
-#endif
-#ifndef PPC_FEATURE_HAS_DFP
-#define PPC_FEATURE_HAS_DFP    0x00000400  /* Decimal Floating Point.  */
-#endif
-
-/* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a
-   configure time check.  Some older glibc's (for instance 2.2.1)
-   don't have a specific powerpc version of ptrace.h, and fall back on
-   a generic one.  In such cases, sys/ptrace.h defines
-   PTRACE_GETFPXREGS and PTRACE_SETFPXREGS to the same numbers that
-   ppc kernel's asm/ptrace.h defines PTRACE_GETVRREGS and
-   PTRACE_SETVRREGS to be.  This also makes a configury check pretty
-   much useless.  */
-
-/* These definitions should really come from the glibc header files,
-   but Glibc doesn't know about the vrregs yet.  */
-#ifndef PTRACE_GETVRREGS
-#define PTRACE_GETVRREGS 18
-#define PTRACE_SETVRREGS 19
-#endif
-
-/* PTRACE requests for POWER7 VSX registers.  */
-#ifndef PTRACE_GETVSXREGS
-#define PTRACE_GETVSXREGS 27
-#define PTRACE_SETVSXREGS 28
-#endif
-
-/* Similarly for the ptrace requests for getting / setting the SPE
-   registers (ev0 -- ev31, acc, and spefscr).  See the description of
-   gdb_evrregset_t for details.  */
-#ifndef PTRACE_GETEVRREGS
-#define PTRACE_GETEVRREGS 20
-#define PTRACE_SETEVRREGS 21
-#endif
+#include "nat/ppc-linux.h"
 
 /* Similarly for the hardware watchpoint support.  These requests are used
-   when the BookE kernel interface is not available.  */
+   when the PowerPC HWDEBUG ptrace interface is not available.  */
 #ifndef PTRACE_GET_DEBUGREG
 #define PTRACE_GET_DEBUGREG    25
 #endif
 #define PTRACE_GETSIGINFO    0x4202
 #endif
 
-/* These requests are used when the BookE kernel interface is available.
-   It exposes the additional debug features of BookE processors, such as
-   ranged breakpoints and watchpoints and hardware-accelerated condition
-   evaluation.  */
+/* These requests are used when the PowerPC HWDEBUG ptrace interface is
+   available.  It exposes the debug facilities of PowerPC processors, as well
+   as additional features of BookE processors, such as ranged breakpoints and
+   watchpoints and hardware-accelerated condition evaluation.  */
 #ifndef PPC_PTRACE_GETHWDBGINFO
 
-/* Not having PPC_PTRACE_GETHWDBGINFO defined means that the new BookE
-   interface is not present in ptrace.h, so we'll have to pretty much include
-   it all here so that the code at least compiles on older systems.  */
+/* Not having PPC_PTRACE_GETHWDBGINFO defined means that the PowerPC HWDEBUG 
+   ptrace interface is not present in ptrace.h, so we'll have to pretty much
+   include it all here so that the code at least compiles on older systems.  */
 #define PPC_PTRACE_GETHWDBGINFO 0x89
 #define PPC_PTRACE_SETHWDEBUG   0x88
 #define PPC_PTRACE_DELHWDEBUG   0x87
@@ -178,7 +123,11 @@ struct ppc_hw_breakpoint
         (1<<((n)+PPC_BREAKPOINT_CONDITION_BE_SHIFT))
 #endif /* PPC_PTRACE_GETHWDBGINFO */
 
-
+/* Feature defined on Linux kernel v3.9: DAWR interface, that enables wider
+   watchpoint (up to 512 bytes).  */
+#ifndef PPC_DEBUG_FEATURE_DATA_BP_DAWR
+#define PPC_DEBUG_FEATURE_DATA_BP_DAWR 0x10
+#endif /* PPC_DEBUG_FEATURE_DATA_BP_DAWR */
 
 /* Similarly for the general-purpose (gp0 -- gp31)
    and floating-point registers (fp0 -- fp31).  */
@@ -861,11 +810,11 @@ ppc_linux_fetch_inferior_registers (struct target_ops *ops,
                                    struct regcache *regcache, int regno)
 {
   /* Overload thread id onto process id.  */
-  int tid = TIDGET (inferior_ptid);
+  int tid = ptid_get_lwp (inferior_ptid);
 
   /* No thread id, just use process id.  */
   if (tid == 0)
-    tid = PIDGET (inferior_ptid);
+    tid = ptid_get_pid (inferior_ptid);
 
   if (regno == -1)
     fetch_ppc_registers (regcache, tid);
@@ -1362,16 +1311,17 @@ ppc_linux_get_hwcap (void)
 }
 
 /* The cached DABR value, to install in new threads.
-   This variable is used when we are dealing with non-BookE
-   processors.  */
+   This variable is used when the PowerPC HWDEBUG ptrace
+   interface is not available.  */
 static long saved_dabr_value;
 
 /* Global structure that will store information about the available
-   features on this BookE processor.  */
-static struct ppc_debug_info booke_debug_info;
+   features provided by the PowerPC HWDEBUG ptrace interface.  */
+static struct ppc_debug_info hwdebug_info;
 
 /* Global variable that holds the maximum number of slots that the
-   kernel will use.  This is only used when the processor is BookE.  */
+   kernel will use.  This is only used when PowerPC HWDEBUG ptrace interface
+   is available.  */
 static size_t max_slots_number = 0;
 
 struct hw_break_tuple
@@ -1381,7 +1331,8 @@ struct hw_break_tuple
 };
 
 /* This is an internal VEC created to store information about *points inserted
-   for each thread.  This is used for BookE processors.  */
+   for each thread.  This is used when PowerPC HWDEBUG ptrace interface is
+   available.  */
 typedef struct thread_points
   {
     /* The TID to which this *point relates.  */
@@ -1398,64 +1349,64 @@ DEF_VEC_P (thread_points_p);
 
 VEC(thread_points_p) *ppc_threads = NULL;
 
-/* The version of the kernel interface that we will use if the processor is
-   BookE.  */
+/* The version of the PowerPC HWDEBUG kernel interface that we will use, if
+   available.  */
 #define PPC_DEBUG_CURRENT_VERSION 1
 
-/* Returns non-zero if we support the ptrace interface which enables
-   booke debugging resources.  */
+/* Returns non-zero if we support the PowerPC HWDEBUG ptrace interface.  */
 static int
-have_ptrace_booke_interface (void)
+have_ptrace_hwdebug_interface (void)
 {
-  static int have_ptrace_booke_interface = -1;
+  static int have_ptrace_hwdebug_interface = -1;
 
-  if (have_ptrace_booke_interface == -1)
+  if (have_ptrace_hwdebug_interface == -1)
     {
       int tid;
 
-      tid = TIDGET (inferior_ptid);
+      tid = ptid_get_lwp (inferior_ptid);
       if (tid == 0)
-       tid = PIDGET (inferior_ptid);
+       tid = ptid_get_pid (inferior_ptid);
 
-      /* Check for kernel support for BOOKE debug registers.  */
-      if (ptrace (PPC_PTRACE_GETHWDBGINFO, tid, 0, &booke_debug_info) >= 0)
+      /* Check for kernel support for PowerPC HWDEBUG ptrace interface.  */
+      if (ptrace (PPC_PTRACE_GETHWDBGINFO, tid, 0, &hwdebug_info) >= 0)
        {
-         /* Check whether ptrace BOOKE interface is functional and
+         /* Check whether PowerPC HWDEBUG ptrace interface is functional and
             provides any supported feature.  */
-         if (booke_debug_info.features != 0)
+         if (hwdebug_info.features != 0)
            {
-             have_ptrace_booke_interface = 1;
-             max_slots_number = booke_debug_info.num_instruction_bps
-               + booke_debug_info.num_data_bps
-               + booke_debug_info.num_condition_regs;
-             return have_ptrace_booke_interface;
+             have_ptrace_hwdebug_interface = 1;
+             max_slots_number = hwdebug_info.num_instruction_bps
+               + hwdebug_info.num_data_bps
+               + hwdebug_info.num_condition_regs;
+             return have_ptrace_hwdebug_interface;
            }
        }
-      /* Old school interface and no BOOKE debug registers support.  */
-      have_ptrace_booke_interface = 0;
-      memset (&booke_debug_info, 0, sizeof (struct ppc_debug_info));
+      /* Old school interface and no PowerPC HWDEBUG ptrace support.  */
+      have_ptrace_hwdebug_interface = 0;
+      memset (&hwdebug_info, 0, sizeof (struct ppc_debug_info));
     }
 
-  return have_ptrace_booke_interface;
+  return have_ptrace_hwdebug_interface;
 }
 
 static int
-ppc_linux_can_use_hw_breakpoint (int type, int cnt, int ot)
+ppc_linux_can_use_hw_breakpoint (struct target_ops *self,
+                                enum bptype type, int cnt, int ot)
 {
   int total_hw_wp, total_hw_bp;
 
-  if (have_ptrace_booke_interface ())
+  if (have_ptrace_hwdebug_interface ())
     {
-      /* For PPC BookE processors, the number of available hardware
-         watchpoints and breakpoints is stored at the booke_debug_info
-        struct.  */
-      total_hw_bp = booke_debug_info.num_instruction_bps;
-      total_hw_wp = booke_debug_info.num_data_bps;
+      /* When PowerPC HWDEBUG ptrace interface is available, the number of
+        available hardware watchpoints and breakpoints is stored at the
+        hwdebug_info struct.  */
+      total_hw_bp = hwdebug_info.num_instruction_bps;
+      total_hw_wp = hwdebug_info.num_data_bps;
     }
   else
     {
-      /* For PPC server processors, we accept 1 hardware watchpoint and 0
-        hardware breakpoints.  */
+      /* When we do not have PowerPC HWDEBUG ptrace interface, we should
+        consider having 1 hardware watchpoint and no hardware breakpoints.  */
       total_hw_bp = 0;
       total_hw_wp = 1;
     }
@@ -1468,11 +1419,16 @@ ppc_linux_can_use_hw_breakpoint (int type, int cnt, int ot)
     }
   else if (type == bp_hardware_breakpoint)
     {
+      if (total_hw_bp == 0)
+       {
+         /* No hardware breakpoint support. */
+         return 0;
+       }
       if (cnt > total_hw_bp)
        return -1;
     }
 
-  if (!have_ptrace_booke_interface ())
+  if (!have_ptrace_hwdebug_interface ())
     {
       int tid;
       ptid_t ptid = inferior_ptid;
@@ -1480,9 +1436,9 @@ ppc_linux_can_use_hw_breakpoint (int type, int cnt, int ot)
       /* We need to know whether ptrace supports PTRACE_SET_DEBUGREG
         and whether the target has DABR.  If either answer is no, the
         ptrace call will return -1.  Fail in that case.  */
-      tid = TIDGET (ptid);
+      tid = ptid_get_lwp (ptid);
       if (tid == 0)
-       tid = PIDGET (ptid);
+       tid = ptid_get_pid (ptid);
 
       if (ptrace (PTRACE_SET_DEBUGREG, tid, 0, 0) == -1)
        return 0;
@@ -1492,36 +1448,45 @@ ppc_linux_can_use_hw_breakpoint (int type, int cnt, int ot)
 }
 
 static int
-ppc_linux_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
+ppc_linux_region_ok_for_hw_watchpoint (struct target_ops *self,
+                                      CORE_ADDR addr, int len)
 {
   /* Handle sub-8-byte quantities.  */
   if (len <= 0)
     return 0;
 
-  /* The new BookE ptrace interface tells if there are alignment restrictions
-     for watchpoints in the processors.  In that case, we use that information
-     to determine the hardcoded watchable region for watchpoints.  */
-  if (have_ptrace_booke_interface ())
+  /* The PowerPC HWDEBUG ptrace interface tells if there are alignment
+     restrictions for watchpoints in the processors.  In that case, we use that
+     information to determine the hardcoded watchable region for
+     watchpoints.  */
+  if (have_ptrace_hwdebug_interface ())
     {
+      int region_size;
       /* Embedded DAC-based processors, like the PowerPC 440 have ranged
         watchpoints and can watch any access within an arbitrary memory
         region. This is useful to watch arrays and structs, for instance.  It
          takes two hardware watchpoints though.  */
       if (len > 1
-         && booke_debug_info.features & PPC_DEBUG_FEATURE_DATA_BP_RANGE
+         && hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_RANGE
          && ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
        return 2;
+      /* Check if the processor provides DAWR interface.  */
+      if (hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_DAWR)
+       /* DAWR interface allows to watch up to 512 byte wide ranges which
+          can't cross a 512 byte boundary.  */
+       region_size = 512;
+      else
+       region_size = hwdebug_info.data_bp_alignment;
       /* Server processors provide one hardware watchpoint and addr+len should
          fall in the watchable region provided by the ptrace interface.  */
-      if (booke_debug_info.data_bp_alignment
-         && (addr + len > (addr & ~(booke_debug_info.data_bp_alignment - 1))
-             + booke_debug_info.data_bp_alignment))
+      if (region_size
+         && (addr + len > (addr & ~(region_size - 1)) + region_size))
        return 0;
     }
   /* addr+len must fall in the 8 byte watchable region for DABR-based
-     processors (i.e., server processors).  Without the new BookE ptrace
-     interface, DAC-based processors (i.e., embedded processors) will use
-     addresses aligned to 4-bytes due to the way the read/write flags are
+     processors (i.e., server processors).  Without the new PowerPC HWDEBUG 
+     ptrace interface, DAC-based processors (i.e., embedded processors) will
+     use addresses aligned to 4-bytes due to the way the read/write flags are
      passed in the old ptrace interface.  */
   else if (((ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
           && (addr + len) > (addr & ~3) + 4)
@@ -1533,7 +1498,7 @@ ppc_linux_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
 
 /* This function compares two ppc_hw_breakpoint structs field-by-field.  */
 static int
-booke_cmp_hw_point (struct ppc_hw_breakpoint *a, struct ppc_hw_breakpoint *b)
+hwdebug_point_cmp (struct ppc_hw_breakpoint *a, struct ppc_hw_breakpoint *b)
 {
   return (a->trigger_type == b->trigger_type
          && a->addr_mode == b->addr_mode
@@ -1548,7 +1513,7 @@ booke_cmp_hw_point (struct ppc_hw_breakpoint *a, struct ppc_hw_breakpoint *b)
    it returns NULL.  If ALLOC_NEW is non-zero, a new thread_points for the
    provided TID will be created and returned.  */
 static struct thread_points *
-booke_find_thread_points_by_tid (int tid, int alloc_new)
+hwdebug_find_thread_points_by_tid (int tid, int alloc_new)
 {
   int i;
   struct thread_points *t;
@@ -1563,9 +1528,8 @@ booke_find_thread_points_by_tid (int tid, int alloc_new)
      if the wanted one does not exist?  */
   if (alloc_new)
     {
-      t = xmalloc (sizeof (struct thread_points));
-      t->hw_breaks
-       = xzalloc (max_slots_number * sizeof (struct hw_break_tuple));
+      t = XNEW (struct thread_points);
+      t->hw_breaks = XCNEWVEC (struct hw_break_tuple, max_slots_number);
       t->tid = tid;
       VEC_safe_push (thread_points_p, ppc_threads, t);
     }
@@ -1577,11 +1541,11 @@ booke_find_thread_points_by_tid (int tid, int alloc_new)
    *point (i.e., calling `ptrace' in order to issue the request to the
    kernel) and registering it internally in GDB.  */
 static void
-booke_insert_point (struct ppc_hw_breakpoint *b, int tid)
+hwdebug_insert_point (struct ppc_hw_breakpoint *b, int tid)
 {
   int i;
   long slot;
-  struct ppc_hw_breakpoint *p = xmalloc (sizeof (struct ppc_hw_breakpoint));
+  struct ppc_hw_breakpoint *p = XNEW (struct ppc_hw_breakpoint);
   struct hw_break_tuple *hw_breaks;
   struct cleanup *c = make_cleanup (xfree, p);
   struct thread_points *t;
@@ -1595,7 +1559,7 @@ booke_insert_point (struct ppc_hw_breakpoint *b, int tid)
     perror_with_name (_("Unexpected error setting breakpoint or watchpoint"));
 
   /* Everything went fine, so we have to register this *point.  */
-  t = booke_find_thread_points_by_tid (tid, 1);
+  t = hwdebug_find_thread_points_by_tid (tid, 1);
   gdb_assert (t != NULL);
   hw_breaks = t->hw_breaks;
 
@@ -1617,18 +1581,18 @@ booke_insert_point (struct ppc_hw_breakpoint *b, int tid)
    *point (i.e., calling `ptrace' in order to issue the request to the
    kernel), and unregistering it internally at GDB.  */
 static void
-booke_remove_point (struct ppc_hw_breakpoint *b, int tid)
+hwdebug_remove_point (struct ppc_hw_breakpoint *b, int tid)
 {
   int i;
   struct hw_break_tuple *hw_breaks;
   struct thread_points *t;
 
-  t = booke_find_thread_points_by_tid (tid, 0);
+  t = hwdebug_find_thread_points_by_tid (tid, 0);
   gdb_assert (t != NULL);
   hw_breaks = t->hw_breaks;
 
   for (i = 0; i < max_slots_number; i++)
-    if (hw_breaks[i].hw_break && booke_cmp_hw_point (hw_breaks[i].hw_break, b))
+    if (hw_breaks[i].hw_break && hwdebug_point_cmp (hw_breaks[i].hw_break, b))
       break;
 
   gdb_assert (i != max_slots_number);
@@ -1651,8 +1615,8 @@ booke_remove_point (struct ppc_hw_breakpoint *b, int tid)
 static int
 ppc_linux_ranged_break_num_registers (struct target_ops *target)
 {
-  return ((have_ptrace_booke_interface ()
-          && booke_debug_info.features & PPC_DEBUG_FEATURE_INSN_BP_RANGE)?
+  return ((have_ptrace_hwdebug_interface ()
+          && hwdebug_info.features & PPC_DEBUG_FEATURE_INSN_BP_RANGE)?
          2 : -1);
 }
 
@@ -1660,19 +1624,20 @@ ppc_linux_ranged_break_num_registers (struct target_ops *target)
    success, 1 if hardware breakpoints are not supported or -1 for failure.  */
 
 static int
-ppc_linux_insert_hw_breakpoint (struct gdbarch *gdbarch,
+ppc_linux_insert_hw_breakpoint (struct target_ops *self,
+                               struct gdbarch *gdbarch,
                                  struct bp_target_info *bp_tgt)
 {
   struct lwp_info *lp;
   struct ppc_hw_breakpoint p;
 
-  if (!have_ptrace_booke_interface ())
+  if (!have_ptrace_hwdebug_interface ())
     return -1;
 
   p.version = PPC_DEBUG_CURRENT_VERSION;
   p.trigger_type = PPC_BREAKPOINT_TRIGGER_EXECUTE;
   p.condition_mode = PPC_BREAKPOINT_CONDITION_NONE;
-  p.addr = (uint64_t) bp_tgt->placed_address;
+  p.addr = (uint64_t) (bp_tgt->placed_address = bp_tgt->reqstd_address);
   p.condition_value = 0;
 
   if (bp_tgt->length)
@@ -1690,19 +1655,20 @@ ppc_linux_insert_hw_breakpoint (struct gdbarch *gdbarch,
     }
 
   ALL_LWPS (lp)
-    booke_insert_point (&p, TIDGET (lp->ptid));
+    hwdebug_insert_point (&p, ptid_get_lwp (lp->ptid));
 
   return 0;
 }
 
 static int
-ppc_linux_remove_hw_breakpoint (struct gdbarch *gdbarch,
+ppc_linux_remove_hw_breakpoint (struct target_ops *self,
+                               struct gdbarch *gdbarch,
                                  struct bp_target_info *bp_tgt)
 {
   struct lwp_info *lp;
   struct ppc_hw_breakpoint p;
 
-  if (!have_ptrace_booke_interface ())
+  if (!have_ptrace_hwdebug_interface ())
     return -1;
 
   p.version = PPC_DEBUG_CURRENT_VERSION;
@@ -1726,19 +1692,19 @@ ppc_linux_remove_hw_breakpoint (struct gdbarch *gdbarch,
     }
 
   ALL_LWPS (lp)
-    booke_remove_point (&p, TIDGET (lp->ptid));
+    hwdebug_remove_point (&p, ptid_get_lwp (lp->ptid));
 
   return 0;
 }
 
 static int
-get_trigger_type (int rw)
+get_trigger_type (enum target_hw_bp_type type)
 {
   int t;
 
-  if (rw == hw_read)
+  if (type == hw_read)
     t = PPC_BREAKPOINT_TRIGGER_READ;
-  else if (rw == hw_write)
+  else if (type == hw_write)
     t = PPC_BREAKPOINT_TRIGGER_WRITE;
   else
     t = PPC_BREAKPOINT_TRIGGER_READ | PPC_BREAKPOINT_TRIGGER_WRITE;
@@ -1753,12 +1719,12 @@ get_trigger_type (int rw)
 
 static int
 ppc_linux_insert_mask_watchpoint (struct target_ops *ops, CORE_ADDR addr,
-                                 CORE_ADDR mask, int rw)
+                                 CORE_ADDR mask, enum target_hw_bp_type rw)
 {
   struct lwp_info *lp;
   struct ppc_hw_breakpoint p;
 
-  gdb_assert (have_ptrace_booke_interface ());
+  gdb_assert (have_ptrace_hwdebug_interface ());
 
   p.version = PPC_DEBUG_CURRENT_VERSION;
   p.trigger_type = get_trigger_type (rw);
@@ -1769,7 +1735,7 @@ ppc_linux_insert_mask_watchpoint (struct target_ops *ops, CORE_ADDR addr,
   p.condition_value = 0;
 
   ALL_LWPS (lp)
-    booke_insert_point (&p, TIDGET (lp->ptid));
+    hwdebug_insert_point (&p, ptid_get_lwp (lp->ptid));
 
   return 0;
 }
@@ -1781,12 +1747,12 @@ ppc_linux_insert_mask_watchpoint (struct target_ops *ops, CORE_ADDR addr,
 
 static int
 ppc_linux_remove_mask_watchpoint (struct target_ops *ops, CORE_ADDR addr,
-                                 CORE_ADDR mask, int rw)
+                                 CORE_ADDR mask, enum target_hw_bp_type rw)
 {
   struct lwp_info *lp;
   struct ppc_hw_breakpoint p;
 
-  gdb_assert (have_ptrace_booke_interface ());
+  gdb_assert (have_ptrace_hwdebug_interface ());
 
   p.version = PPC_DEBUG_CURRENT_VERSION;
   p.trigger_type = get_trigger_type (rw);
@@ -1797,7 +1763,7 @@ ppc_linux_remove_mask_watchpoint (struct target_ops *ops, CORE_ADDR addr,
   p.condition_value = 0;
 
   ALL_LWPS (lp)
-    booke_remove_point (&p, TIDGET (lp->ptid));
+    hwdebug_remove_point (&p, ptid_get_lwp (lp->ptid));
 
   return 0;
 }
@@ -1807,14 +1773,14 @@ static int
 can_use_watchpoint_cond_accel (void)
 {
   struct thread_points *p;
-  int tid = TIDGET (inferior_ptid);
-  int cnt = booke_debug_info.num_condition_regs, i;
+  int tid = ptid_get_lwp (inferior_ptid);
+  int cnt = hwdebug_info.num_condition_regs, i;
   CORE_ADDR tmp_value;
 
-  if (!have_ptrace_booke_interface () || cnt == 0)
+  if (!have_ptrace_hwdebug_interface () || cnt == 0)
     return 0;
 
-  p = booke_find_thread_points_by_tid (tid, 0);
+  p = hwdebug_find_thread_points_by_tid (tid, 0);
 
   if (p)
     {
@@ -1853,10 +1819,10 @@ calculate_dvc (CORE_ADDR addr, int len, CORE_ADDR data_value,
      We need to calculate where our watch region is relative to that
      window and enable comparison of the bytes which fall within it.  */
 
-  align_offset = addr % booke_debug_info.sizeof_condition;
+  align_offset = addr % hwdebug_info.sizeof_condition;
   addr_end_data = addr + len;
   addr_end_dvc = (addr - align_offset
-                 + booke_debug_info.sizeof_condition);
+                 + hwdebug_info.sizeof_condition);
   num_bytes_off_dvc = (addr_end_data > addr_end_dvc)?
                         addr_end_data - addr_end_dvc : 0;
   num_byte_enable = len - num_bytes_off_dvc;
@@ -1940,7 +1906,7 @@ check_condition (CORE_ADDR watch_addr, struct expression *cond,
   if (cond->elts[0].opcode != BINOP_EQUAL)
     return 0;
 
-  fetch_subexp_value (cond, &pc, &left_val, NULL, &left_chain);
+  fetch_subexp_value (cond, &pc, &left_val, NULL, &left_chain, 0);
   num_accesses_left = num_memory_accesses (left_chain);
 
   if (left_val == NULL || num_accesses_left < 0)
@@ -1950,7 +1916,7 @@ check_condition (CORE_ADDR watch_addr, struct expression *cond,
       return 0;
     }
 
-  fetch_subexp_value (cond, &pc, &right_val, NULL, &right_chain);
+  fetch_subexp_value (cond, &pc, &right_val, NULL, &right_chain, 0);
   num_accesses_right = num_memory_accesses (right_chain);
 
   if (right_val == NULL || num_accesses_right < 0)
@@ -1999,13 +1965,14 @@ check_condition (CORE_ADDR watch_addr, struct expression *cond,
    the condition expression, thus only triggering the watchpoint when it is
    true.  */
 static int
-ppc_linux_can_accel_watchpoint_condition (CORE_ADDR addr, int len, int rw,
+ppc_linux_can_accel_watchpoint_condition (struct target_ops *self,
+                                         CORE_ADDR addr, int len, int rw,
                                          struct expression *cond)
 {
   CORE_ADDR data_value;
 
-  return (have_ptrace_booke_interface ()
-         && booke_debug_info.num_condition_regs > 0
+  return (have_ptrace_hwdebug_interface ()
+         && hwdebug_info.num_condition_regs > 0
          && check_condition (addr, cond, &data_value, &len));
 }
 
@@ -2016,17 +1983,17 @@ ppc_linux_can_accel_watchpoint_condition (CORE_ADDR addr, int len, int rw,
 
 static void
 create_watchpoint_request (struct ppc_hw_breakpoint *p, CORE_ADDR addr,
-                          int len, int rw, struct expression *cond,
-                          int insert)
+                          int len, enum target_hw_bp_type type,
+                          struct expression *cond, int insert)
 {
   if (len == 1
-      || !(booke_debug_info.features & PPC_DEBUG_FEATURE_DATA_BP_RANGE))
+      || !(hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_RANGE))
     {
       int use_condition;
       CORE_ADDR data_value;
 
       use_condition = (insert? can_use_watchpoint_cond_accel ()
-                       : booke_debug_info.num_condition_regs > 0);
+                       : hwdebug_info.num_condition_regs > 0);
       if (cond && use_condition && check_condition (addr, cond,
                                                    &data_value, &len))
        calculate_dvc (addr, len, data_value, &p->condition_mode,
@@ -2056,25 +2023,26 @@ create_watchpoint_request (struct ppc_hw_breakpoint *p, CORE_ADDR addr,
     }
 
   p->version = PPC_DEBUG_CURRENT_VERSION;
-  p->trigger_type = get_trigger_type (rw);
+  p->trigger_type = get_trigger_type (type);
   p->addr = (uint64_t) addr;
 }
 
 static int
-ppc_linux_insert_watchpoint (CORE_ADDR addr, int len, int rw,
+ppc_linux_insert_watchpoint (struct target_ops *self, CORE_ADDR addr, int len,
+                            enum target_hw_bp_type type,
                             struct expression *cond)
 {
   struct lwp_info *lp;
   int ret = -1;
 
-  if (have_ptrace_booke_interface ())
+  if (have_ptrace_hwdebug_interface ())
     {
       struct ppc_hw_breakpoint p;
 
-      create_watchpoint_request (&p, addr, len, rw, cond, 1);
+      create_watchpoint_request (&p, addr, len, type, cond, 1);
 
       ALL_LWPS (lp)
-       booke_insert_point (&p, TIDGET (lp->ptid));
+       hwdebug_insert_point (&p, ptid_get_lwp (lp->ptid));
 
       ret = 0;
     }
@@ -2099,7 +2067,7 @@ ppc_linux_insert_watchpoint (CORE_ADDR addr, int len, int rw,
        }
 
       dabr_value = addr & ~(read_mode | write_mode);
-      switch (rw)
+      switch (type)
        {
          case hw_read:
            /* Set read and translate bits.  */
@@ -2118,7 +2086,7 @@ ppc_linux_insert_watchpoint (CORE_ADDR addr, int len, int rw,
       saved_dabr_value = dabr_value;
 
       ALL_LWPS (lp)
-       if (ptrace (PTRACE_SET_DEBUGREG, TIDGET (lp->ptid), 0,
+       if (ptrace (PTRACE_SET_DEBUGREG, ptid_get_lwp (lp->ptid), 0,
                    saved_dabr_value) < 0)
          return -1;
 
@@ -2129,20 +2097,21 @@ ppc_linux_insert_watchpoint (CORE_ADDR addr, int len, int rw,
 }
 
 static int
-ppc_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw,
+ppc_linux_remove_watchpoint (struct target_ops *self, CORE_ADDR addr, int len,
+                            enum target_hw_bp_type type,
                             struct expression *cond)
 {
   struct lwp_info *lp;
   int ret = -1;
 
-  if (have_ptrace_booke_interface ())
+  if (have_ptrace_hwdebug_interface ())
     {
       struct ppc_hw_breakpoint p;
 
-      create_watchpoint_request (&p, addr, len, rw, cond, 0);
+      create_watchpoint_request (&p, addr, len, type, cond, 0);
 
       ALL_LWPS (lp)
-       booke_remove_point (&p, TIDGET (lp->ptid));
+       hwdebug_remove_point (&p, ptid_get_lwp (lp->ptid));
 
       ret = 0;
     }
@@ -2150,7 +2119,7 @@ ppc_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw,
     {
       saved_dabr_value = 0;
       ALL_LWPS (lp)
-       if (ptrace (PTRACE_SET_DEBUGREG, TIDGET (lp->ptid), 0,
+       if (ptrace (PTRACE_SET_DEBUGREG, ptid_get_lwp (lp->ptid), 0,
                    saved_dabr_value) < 0)
          return -1;
 
@@ -2163,9 +2132,9 @@ ppc_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw,
 static void
 ppc_linux_new_thread (struct lwp_info *lp)
 {
-  int tid = TIDGET (lp->ptid);
+  int tid = ptid_get_lwp (lp->ptid);
 
-  if (have_ptrace_booke_interface ())
+  if (have_ptrace_hwdebug_interface ())
     {
       int i;
       struct thread_points *p;
@@ -2191,7 +2160,7 @@ ppc_linux_new_thread (struct lwp_info *lp)
               Ask the kernel the deallocate this specific *point's slot.  */
            ptrace (PPC_PTRACE_DELHWDEBUG, tid, 0, hw_breaks[i].slot);
 
-           booke_insert_point (hw_breaks[i].hw_break, tid);
+           hwdebug_insert_point (hw_breaks[i].hw_break, tid);
          }
     }
   else
@@ -2202,11 +2171,11 @@ static void
 ppc_linux_thread_exit (struct thread_info *tp, int silent)
 {
   int i;
-  int tid = TIDGET (tp->ptid);
+  int tid = ptid_get_lwp (tp->ptid);
   struct hw_break_tuple *hw_breaks;
   struct thread_points *t = NULL, *p;
 
-  if (!have_ptrace_booke_interface ())
+  if (!have_ptrace_hwdebug_interface ())
     return;
 
   for (i = 0; VEC_iterate (thread_points_p, ppc_threads, i, p); i++)
@@ -2243,7 +2212,7 @@ ppc_linux_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
       || (siginfo.si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */)
     return 0;
 
-  if (have_ptrace_booke_interface ())
+  if (have_ptrace_hwdebug_interface ())
     {
       int i;
       struct thread_points *t;
@@ -2251,7 +2220,7 @@ ppc_linux_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
       /* The index (or slot) of the *point is passed in the si_errno field.  */
       int slot = siginfo.si_errno;
 
-      t = booke_find_thread_points_by_tid (TIDGET (inferior_ptid), 0);
+      t = hwdebug_find_thread_points_by_tid (ptid_get_lwp (inferior_ptid), 0);
 
       /* Find out if this *point is a hardware breakpoint.
         If so, we should return 0.  */
@@ -2271,10 +2240,10 @@ ppc_linux_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
 }
 
 static int
-ppc_linux_stopped_by_watchpoint (void)
+ppc_linux_stopped_by_watchpoint (struct target_ops *ops)
 {
   CORE_ADDR addr;
-  return ppc_linux_stopped_data_address (&current_target, &addr);
+  return ppc_linux_stopped_data_address (ops, &addr);
 }
 
 static int
@@ -2284,7 +2253,7 @@ ppc_linux_watchpoint_addr_within_range (struct target_ops *target,
 {
   int mask;
 
-  if (have_ptrace_booke_interface ()
+  if (have_ptrace_hwdebug_interface ()
       && ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
     return start <= addr && start + length >= addr;
   else if (ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
@@ -2304,8 +2273,8 @@ static int
 ppc_linux_masked_watch_num_registers (struct target_ops *target,
                                      CORE_ADDR addr, CORE_ADDR mask)
 {
-  if (!have_ptrace_booke_interface ()
-          || (booke_debug_info.features & PPC_DEBUG_FEATURE_DATA_BP_MASK) == 0)
+  if (!have_ptrace_hwdebug_interface ()
+          || (hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_MASK) == 0)
     return -1;
   else if ((mask & 0xC0000000) != 0xC0000000)
     {
@@ -2323,11 +2292,11 @@ ppc_linux_store_inferior_registers (struct target_ops *ops,
                                    struct regcache *regcache, int regno)
 {
   /* Overload thread id onto process id.  */
-  int tid = TIDGET (inferior_ptid);
+  int tid = ptid_get_lwp (inferior_ptid);
 
   /* No thread id, just use process id.  */
   if (tid == 0)
-    tid = PIDGET (inferior_ptid);
+    tid = ptid_get_pid (inferior_ptid);
 
   if (regno >= 0)
     store_register (regcache, tid, regno);
@@ -2389,13 +2358,13 @@ ppc_linux_target_wordsize (void)
 #ifdef __powerpc64__
   long msr;
 
-  int tid = TIDGET (inferior_ptid);
+  int tid = ptid_get_lwp (inferior_ptid);
   if (tid == 0)
-    tid = PIDGET (inferior_ptid);
+    tid = ptid_get_pid (inferior_ptid);
 
   errno = 0;
   msr = (long) ptrace (PTRACE_PEEKUSER, tid, PT_MSR * 8, 0);
-  if (errno == 0 && msr < 0)
+  if (errno == 0 && ppc64_64bit_inferior_p (msr))
     wordsize = 8;
 #endif
 
@@ -2433,9 +2402,9 @@ ppc_linux_read_description (struct target_ops *ops)
   int isa205 = 0;
   int cell = 0;
 
-  int tid = TIDGET (inferior_ptid);
+  int tid = ptid_get_lwp (inferior_ptid);
   if (tid == 0)
-    tid = PIDGET (inferior_ptid);
+    tid = ptid_get_pid (inferior_ptid);
 
   if (have_ptrace_getsetevrregs)
     {
@@ -2450,7 +2419,8 @@ ppc_linux_read_description (struct target_ops *ops)
        perror_with_name (_("Unable to fetch SPE registers"));
     }
 
-  if (have_ptrace_getsetvsxregs)
+  if (have_ptrace_getsetvsxregs
+      && (ppc_linux_get_hwcap () & PPC_FEATURE_HAS_VSX))
     {
       gdb_vsxregset_t vsxregset;
 
@@ -2463,7 +2433,8 @@ ppc_linux_read_description (struct target_ops *ops)
        perror_with_name (_("Unable to fetch VSX registers"));
     }
 
-  if (have_ptrace_getvrregs)
+  if (have_ptrace_getvrregs
+      && (ppc_linux_get_hwcap () & PPC_FEATURE_HAS_ALTIVEC))
     {
       gdb_vrregset_t vrregset;
 
This page took 0.040782 seconds and 4 git commands to generate.