Index: gdb/arm-linux-nat.c |
diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c |
index 411f7f46faa90548a2205207e4a3b7fc28fd0a12..bf81c032a9bb38bb1a754e25eefe794e25f38116 100644 |
--- a/gdb/arm-linux-nat.c |
+++ b/gdb/arm-linux-nat.c |
@@ -77,7 +77,7 @@ extern int arm_apcs_32; |
individual thread (process) ID. get_thread_id () is used to get |
the thread id if it's available, and the process id otherwise. */ |
-int |
+static int |
get_thread_id (ptid_t ptid) |
{ |
int tid = TIDGET (ptid); |
@@ -896,11 +896,17 @@ arm_linux_hw_breakpoint_initialize (struct gdbarch *gdbarch, |
/* We have to create a mask for the control register which says which bits |
of the word pointed to by address to break on. */ |
if (arm_pc_is_thumb (gdbarch, address)) |
- mask = 0x3 << (address & 2); |
+ { |
+ mask = 0x3; |
+ address &= ~1; |
+ } |
else |
- mask = 0xf; |
+ { |
+ mask = 0xf; |
+ address &= ~3; |
+ } |
- p->address = (unsigned int) (address & ~3); |
+ p->address = (unsigned int) address; |
p->control = arm_hwbp_control_initialize (mask, arm_hwbp_break, 1); |
} |
@@ -1137,24 +1143,29 @@ arm_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw, |
static int |
arm_linux_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p) |
{ |
- struct siginfo *siginfo_p = linux_nat_get_siginfo (inferior_ptid); |
- int slot = siginfo_p->si_errno; |
+ siginfo_t siginfo; |
+ int slot; |
+ |
+ if (!linux_nat_get_siginfo (inferior_ptid, &siginfo)) |
+ return 0; |
/* This must be a hardware breakpoint. */ |
- if (siginfo_p->si_signo != SIGTRAP |
- || (siginfo_p->si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */) |
+ if (siginfo.si_signo != SIGTRAP |
+ || (siginfo.si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */) |
return 0; |
/* We must be able to set hardware watchpoints. */ |
if (arm_linux_get_hw_watchpoint_count () == 0) |
return 0; |
+ slot = siginfo.si_errno; |
+ |
/* If we are in a positive slot then we're looking at a breakpoint and not |
a watchpoint. */ |
if (slot >= 0) |
return 0; |
- *addr_p = (CORE_ADDR) (uintptr_t) siginfo_p->si_addr; |
+ *addr_p = (CORE_ADDR) (uintptr_t) siginfo.si_addr; |
return 1; |
} |
@@ -1177,9 +1188,9 @@ arm_linux_watchpoint_addr_within_range (struct target_ops *target, |
/* Handle thread creation. We need to copy the breakpoints and watchpoints |
in the parent thread to the child thread. */ |
static void |
-arm_linux_new_thread (ptid_t ptid) |
+arm_linux_new_thread (struct lwp_info *lp) |
{ |
- int tid = TIDGET (ptid); |
+ int tid = TIDGET (lp->ptid); |
const struct arm_linux_hwbp_cap *info = arm_linux_get_hwbp_cap (); |
if (info != NULL) |