aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/gdbserver/ChangeLog4
-rw-r--r--gdb/gdbserver/linux-low.c4
-rw-r--r--gdb/nat/aarch64-linux-hw-point.c20
-rw-r--r--gdb/nat/aarch64-linux-hw-point.h5
-rw-r--r--gdb/nat/aarch64-linux.c15
6 files changed, 50 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 83eabc4..d1f583d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+2018-12-05 Alan Hayward <alan.hayward@arm.com>
+
+ * nat/aarch64-linux-hw-point.c
+ (aarch64_linux_any_set_debug_regs_state): New function.
+ * nat/aarch64-linux-hw-point.h
+ (aarch64_linux_any_set_debug_regs_state): New declaration.
+ * nat/aarch64-linux.c (aarch64_linux_new_thread): Check if any
+ BPs or WPs are set.
+
2018-11-30 John Baldwin <jhb@FreeBSD.org>
* common/filestuff.c [HAVE_KINFO_GETFILE]: Include headers.
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index ec4d72f..1e28ed3 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,7 @@
+2018-12-05 Alan Hayward <alan.hayward@arm.com>
+
+ * linux-low.c (add_lwp): Switch ordering.
+
2018-11-29 Tom Tromey <tom@tromey.com>
* win32-low.c (win32_join): Take pid, not process.
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 4d84927..9e1faf3 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -951,11 +951,11 @@ add_lwp (ptid_t ptid)
lwp->waitstatus.kind = TARGET_WAITKIND_IGNORE;
+ lwp->thread = add_thread (ptid, lwp);
+
if (the_low_target.new_thread != NULL)
the_low_target.new_thread (lwp);
- lwp->thread = add_thread (ptid, lwp);
-
return lwp;
}
diff --git a/gdb/nat/aarch64-linux-hw-point.c b/gdb/nat/aarch64-linux-hw-point.c
index 18b5af2..b446e19 100644
--- a/gdb/nat/aarch64-linux-hw-point.c
+++ b/gdb/nat/aarch64-linux-hw-point.c
@@ -717,6 +717,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
diff --git a/gdb/nat/aarch64-linux-hw-point.h b/gdb/nat/aarch64-linux-hw-point.h
index 1940b06..c6fdf78 100644
--- a/gdb/nat/aarch64-linux-hw-point.h
+++ b/gdb/nat/aarch64-linux-hw-point.h
@@ -182,6 +182,11 @@ int aarch64_handle_watchpoint (enum target_hw_bp_type type, CORE_ADDR addr,
void aarch64_linux_set_debug_regs (struct aarch64_debug_reg_state *state,
int tid, int watchpoint);
+/* Return TRUE if there are any hardware breakpoints. If WATCHPOINT is TRUE,
+ check hardware watchpoints instead. */
+bool aarch64_linux_any_set_debug_regs_state (aarch64_debug_reg_state *state,
+ bool watchpoint);
+
void aarch64_show_debug_reg_state (struct aarch64_debug_reg_state *state,
const char *func, CORE_ADDR addr,
int len, enum target_hw_bp_type type);
diff --git a/gdb/nat/aarch64-linux.c b/gdb/nat/aarch64-linux.c
index 0f2c801..48c59f6 100644
--- a/gdb/nat/aarch64-linux.c
+++ b/gdb/nat/aarch64-linux.c
@@ -73,13 +73,18 @@ aarch64_linux_prepare_to_resume (struct lwp_info *lwp)
void
aarch64_linux_new_thread (struct lwp_info *lwp)
{
+ ptid_t ptid = ptid_of_lwp (lwp);
+ struct aarch64_debug_reg_state *state
+ = aarch64_get_debug_reg_state (ptid.pid ());
struct arch_lwp_info *info = XNEW (struct arch_lwp_info);
- /* Mark that all the hardware breakpoint/watchpoint register pairs
- for this thread need to be initialized (with data from
- aarch_process_info.debug_reg_state). */
- DR_MARK_ALL_CHANGED (info->dr_changed_bp, aarch64_num_bp_regs);
- DR_MARK_ALL_CHANGED (info->dr_changed_wp, aarch64_num_wp_regs);
+ /* If there are hardware breakpoints/watchpoints in the process then mark that
+ all the hardware breakpoint/watchpoint register pairs for this thread need
+ to be initialized (with data from aarch_process_info.debug_reg_state). */
+ if (aarch64_linux_any_set_debug_regs_state (state, false))
+ DR_MARK_ALL_CHANGED (info->dr_changed_bp, aarch64_num_bp_regs);
+ if (aarch64_linux_any_set_debug_regs_state (state, true))
+ DR_MARK_ALL_CHANGED (info->dr_changed_wp, aarch64_num_wp_regs);
lwp_set_arch_private_info (lwp, info);
}