Rename common to gdbsupport
[deliverable/binutils-gdb.git] / gdb / nat / aarch64-linux-hw-point.c
index 22b265eaf059204b2d983a25122e0adb67b0e439..9f5a0f045e9c134e4338d3ba4cc88013a43f9334 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2018 Free Software Foundation, Inc.
+/* Copyright (C) 2009-2019 Free Software Foundation, Inc.
    Contributed by ARM Ltd.
 
    This file is part of GDB.
@@ -16,9 +16,9 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#include "common-defs.h"
-#include "break-common.h"
-#include "common-regcache.h"
+#include "gdbsupport/common-defs.h"
+#include "gdbsupport/break-common.h"
+#include "gdbsupport/common-regcache.h"
 #include "nat/linux-nat.h"
 #include "aarch64-linux-hw-point.h"
 
@@ -278,27 +278,17 @@ aarch64_align_watchpoint (CORE_ADDR addr, int len, CORE_ADDR *aligned_addr_p,
     *next_addr_orig_p = align_down (*next_addr_orig_p + alignment, alignment);
 }
 
-struct aarch64_dr_update_callback_param
-{
-  int is_watchpoint;
-  unsigned int idx;
-};
-
-/* Callback for iterate_over_lwps.  Records the
+/* Helper for aarch64_notify_debug_reg_change.  Records the
    information about the change of one hardware breakpoint/watchpoint
    setting for the thread LWP.
-   The information is passed in via PTR.
    N.B.  The actual updating of hardware debug registers is not
    carried out until the moment the thread is resumed.  */
 
 static int
-debug_reg_change_callback (struct lwp_info *lwp, void *ptr)
+debug_reg_change_callback (struct lwp_info *lwp, int is_watchpoint,
+                          unsigned int idx)
 {
-  struct aarch64_dr_update_callback_param *param_p
-    = (struct aarch64_dr_update_callback_param *) ptr;
-  int tid = ptid_get_lwp (ptid_of_lwp (lwp));
-  int idx = param_p->idx;
-  int is_watchpoint = param_p->is_watchpoint;
+  int tid = ptid_of_lwp (lwp).lwp ();
   struct arch_lwp_info *info = lwp_arch_private_info (lwp);
   dr_changed_t *dr_changed_ptr;
   dr_changed_t dr_changed;
@@ -356,13 +346,14 @@ static void
 aarch64_notify_debug_reg_change (const struct aarch64_debug_reg_state *state,
                                 int is_watchpoint, unsigned int idx)
 {
-  struct aarch64_dr_update_callback_param param;
-  ptid_t pid_ptid = ptid_t (ptid_get_pid (current_lwp_ptid ()));
-
-  param.is_watchpoint = is_watchpoint;
-  param.idx = idx;
-
-  iterate_over_lwps (pid_ptid, debug_reg_change_callback, (void *) &param);
+  ptid_t pid_ptid = ptid_t (current_lwp_ptid ().pid ());
+
+  iterate_over_lwps (pid_ptid, [=] (struct lwp_info *info)
+                              {
+                                return debug_reg_change_callback (info,
+                                                                  is_watchpoint,
+                                                                  idx);
+                              });
 }
 
 /* Reconfigure STATE to be compatible with Linux kernels with the PR
@@ -717,6 +708,26 @@ aarch64_linux_set_debug_regs (struct aarch64_debug_reg_state *state,
     }
 }
 
+/* See nat/aarch64-linux-hw-point.h.  */
+
+bool
+aarch64_linux_any_set_debug_regs_state (aarch64_debug_reg_state *state,
+                                       bool watchpoint)
+{
+  int count = watchpoint ? aarch64_num_wp_regs : aarch64_num_bp_regs;
+  if (count == 0)
+    return false;
+
+  const CORE_ADDR *addr = watchpoint ? state->dr_addr_wp : state->dr_addr_bp;
+  const unsigned int *ctrl = watchpoint ? state->dr_ctrl_wp : state->dr_ctrl_bp;
+
+  for (int i = 0; i < count; i++)
+    if (addr[i] != 0 || ctrl[i] != 0)
+      return true;
+
+  return false;
+}
+
 /* Print the values of the cached breakpoint/watchpoint registers.  */
 
 void
This page took 0.02595 seconds and 4 git commands to generate.