26 #include <asm/ptrace.h> 27 #include <sys/ptrace.h> 69 unsigned int ctrl, ttype;
93 ctrl |= ((1 << len) - 1) << 5;
116 unsigned int alignment = 0;
134 if (addr & (alignment - 1))
137 if (len != 8 && len != 4 && len != 2 && len != 1)
184 int *aligned_len_p,
CORE_ADDR *next_addr_p,
201 offset = addr & (alignment - 1);
202 aligned_addr = addr -
offset;
205 gdb_assert (aligned_addr >= 0 && aligned_addr <= addr);
208 if (
offset + len >= max_wp_len)
212 aligned_len = max_wp_len;
213 len -= (max_wp_len -
offset);
214 addr += (max_wp_len -
offset);
221 static const unsigned char 223 { 1, 2, 4, 4, 8, 8, 8, 8 };
225 aligned_len = aligned_len_array[
offset + len - 1];
231 *aligned_addr_p = aligned_addr;
233 *aligned_len_p = aligned_len;
273 debug_printf (
"debug_reg_change_callback: \n\tOn entry:\n");
275 "dr_changed_wp=0x%s\n", tid,
282 dr_changed = *dr_changed_ptr;
291 *dr_changed_ptr = dr_changed;
300 debug_printf (
"\tOn exit:\n\ttid%d, dr_changed_bp=0x%s, " 301 "dr_changed_wp=0x%s\n", tid,
316 int is_watchpoint,
unsigned int idx)
336 unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
361 for (i = 0; i < num_regs; ++i)
363 if ((dr_ctrl_p[i] & 1) == 0)
369 else if (dr_addr_p[i] == addr && dr_ctrl_p[i] == ctrl)
382 if ((dr_ctrl_p[
idx] & 1) == 0)
385 dr_addr_p[
idx] = addr;
386 dr_ctrl_p[
idx] = ctrl;
387 dr_ref_count[
idx] = 1;
409 unsigned int ctrl, *dr_ctrl_p, *dr_ref_count;
432 for (i = 0; i < num_regs; ++i)
433 if (dr_addr_p[i] == addr && dr_ctrl_p[i] == ctrl)
444 if (--dr_ref_count[i] == 0)
459 int len,
int is_insert,
510 int aligned_len, ret;
523 debug_printf (
"handle_unaligned_watchpoint: is_insert: %d\n" 525 "aligned_addr: %s, aligned_len: %d\n" 527 "next_addr: %s, next_len: %d\n",
540 int len,
int is_insert,
556 int tid,
int watchpoint)
560 struct user_hwdebug_state regs;
562 const unsigned int *ctrl;
564 memset (®s, 0,
sizeof (regs));
565 iov.iov_base = ®s;
571 iov.iov_len = (offsetof (
struct user_hwdebug_state, dbg_regs)
572 + count *
sizeof (regs.dbg_regs[0]));
574 for (i = 0; i < count; i++)
576 regs.dbg_regs[i].addr = addr[i];
577 regs.dbg_regs[i].ctrl = ctrl[i];
581 watchpoint ? NT_ARM_HW_WATCH : NT_ARM_HW_BREAK,
583 error (
_(
"Unexpected error setting hardware debug registers"));
598 (
unsigned long) addr, len,
599 type ==
hw_write ?
"hw-write-watchpoint" 600 : (type ==
hw_read ?
"hw-read-watchpoint" 601 : (type ==
hw_access ?
"hw-access-watchpoint" 608 debug_printf (
"\tBP%d: addr=%s, ctrl=0x%08x, ref.count=%d\n",
614 debug_printf (
"\tWP%d: addr=%s, ctrl=0x%08x, ref.count=%d\n",
626 struct user_hwdebug_state dreg_state;
628 iov.iov_base = &dreg_state;
629 iov.iov_len =
sizeof (dreg_state);
640 warning (
_(
"Unexpected number of hardware watchpoint registers" 641 " reported by ptrace, got %d, expected %d."),
648 warning (
_(
"Unable to determine the number of hardware watchpoints" 662 warning (
_(
"Unexpected number of hardware breakpoint registers" 663 " reported by ptrace, got %d, expected %d."),
670 warning (
_(
"Unable to determine the number of hardware breakpoints" ptid_t ptid_of_lwp(struct lwp_info *lwp)
#define AARCH64_HWP_MAX_NUM
#define AARCH64_HBP_MAX_NUM
int aarch64_handle_breakpoint(enum target_hw_bp_type type, CORE_ADDR addr, int len, int is_insert, struct aarch64_debug_reg_state *state)
int ptid_get_pid(const ptid_t &ptid)
void warning(const char *fmt,...)
int aarch64_handle_watchpoint(enum target_hw_bp_type type, CORE_ADDR addr, int len, int is_insert, struct aarch64_debug_reg_state *state)
static void aarch64_align_watchpoint(CORE_ADDR addr, int len, CORE_ADDR *aligned_addr_p, int *aligned_len_p, CORE_ADDR *next_addr_p, int *next_len_p)
unsigned int dr_ref_count_wp[AARCH64_HWP_MAX_NUM]
void aarch64_linux_set_debug_regs(const struct aarch64_debug_reg_state *state, int tid, int watchpoint)
#define AARCH64_DEBUG_ARCH(x)
char * phex(ULONGEST l, int sizeof_l)
void * memset(T *s, int c, size_t n)=delete
#define AARCH64_HWP_ALIGNMENT
#define AARCH64_DEBUG_NUM_SLOTS(x)
int regcache_register_size(const struct regcache *regcache, int n)
#define AARCH64_DEBUG_ARCH_V8
int lwp_is_stopped(struct lwp_info *lwp)
#define DR_CONTROL_LENGTH(ctrl)
unsigned int aarch64_watchpoint_length(unsigned int ctrl)
static int aarch64_dr_state_remove_one_point(struct aarch64_debug_reg_state *state, enum target_hw_bp_type type, CORE_ADDR addr, int len)
static int aarch64_handle_unaligned_watchpoint(enum target_hw_bp_type type, CORE_ADDR addr, int len, int is_insert, struct aarch64_debug_reg_state *state)
void aarch64_linux_get_debug_reg_capacity(int tid)
static int aarch64_handle_aligned_watchpoint(enum target_hw_bp_type type, CORE_ADDR addr, int len, int is_insert, struct aarch64_debug_reg_state *state)
#define AARCH64_DEBUG_ARCH_V8_2
#define AARCH64_HBP_ALIGNMENT
ptid_t pid_to_ptid(int pid)
#define AARCH64_HWP_MAX_LEN_PER_REG
static int aarch64_point_is_aligned(int is_watchpoint, CORE_ADDR addr, int len)
static unsigned int aarch64_point_encode_ctrl_reg(enum target_hw_bp_type type, int len)
#define AARCH64_DEBUG_ARCH_V8_1
CORE_ADDR dr_addr_bp[AARCH64_HBP_MAX_NUM]
long ptid_get_lwp(const ptid_t &ptid)
#define DR_MARK_N_CHANGED(x, n)
ptid_t current_lwp_ptid(void)
static int aarch64_dr_state_insert_one_point(struct aarch64_debug_reg_state *state, enum target_hw_bp_type type, CORE_ADDR addr, int len)
static int debug_reg_change_callback(struct lwp_info *lwp, void *ptr)
dr_changed_t dr_changed_wp
int aarch64_linux_region_ok_for_watchpoint(CORE_ADDR addr, int len)
void perror_with_name(const char *string)
unsigned int dr_ref_count_bp[AARCH64_HBP_MAX_NUM]
unsigned int dr_ctrl_wp[AARCH64_HWP_MAX_NUM]
struct lwp_info * iterate_over_lwps(ptid_t filter, iterate_over_lwps_ftype callback, void *data)
void lwp_set_arch_private_info(struct lwp_info *lwp, struct arch_lwp_info *info)
void debug_printf(const char *fmt,...)
void linux_stop_lwp(struct lwp_info *lwp)
dr_changed_t dr_changed_bp
static void aarch64_notify_debug_reg_change(const struct aarch64_debug_reg_state *state, int is_watchpoint, unsigned int idx)
struct regcache * get_thread_regcache_for_ptid(ptid_t ptid)
const char * core_addr_to_string_nz(const CORE_ADDR addr)
struct arch_lwp_info * lwp_arch_private_info(struct lwp_info *lwp)
void error(const char *fmt,...)
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)
unsigned int dr_ctrl_bp[AARCH64_HBP_MAX_NUM]
CORE_ADDR dr_addr_wp[AARCH64_HWP_MAX_NUM]