19#include "gdbsupport/common-defs.h"
20#include "gdbsupport/break-common.h"
21#include "gdbsupport/common-regcache.h"
32#include <sys/ptrace.h>
33#include <asm/ptrace.h>
64 debug_printf (
"debug_reg_change_callback: \n\tOn entry:\n");
65 debug_printf (
"\ttid%d, dr_changed_bp=0x%s, "
66 "dr_changed_wp=0x%s\n", tid,
67 phex (info->dr_changed_bp, 8),
68 phex (info->dr_changed_wp, 8));
72 : &info->dr_changed_bp;
73 dr_changed = *dr_changed_ptr;
82 *dr_changed_ptr = dr_changed;
91 debug_printf (
"\tOn exit:\n\ttid%d, dr_changed_bp=0x%s, "
92 "dr_changed_wp=0x%s\n", tid,
93 phex (info->dr_changed_bp, 8),
94 phex (info->dr_changed_wp, 8));
109 ptid_t pid_ptid = ptid_t (ptid.pid ());
136 uint8_t mask_orig = (state->
dr_ctrl_wp[i] >> 5) & 0xff;
137 gdb_assert (mask_orig != 0);
138 static const uint8_t old_valid[] = { 0x01, 0x03, 0x0f, 0xff };
140 for (
const uint8_t old_mask : old_valid)
141 if (mask_orig <= old_mask)
146 gdb_assert (mask != 0);
149 if (mask == mask_orig)
156 for (
int j = 0; j < i; ++j)
184 struct user_hwdebug_state regs;
185 const CORE_ADDR *addr;
186 const unsigned int *ctrl;
188 memset (®s, 0,
sizeof (regs));
189 iov.iov_base = ®s;
195 iov.iov_len = (offsetof (
struct user_hwdebug_state, dbg_regs)
196 + count *
sizeof (regs.dbg_regs[0]));
198 for (i = 0; i < count; i++)
200 regs.dbg_regs[i].addr = addr[i];
201 regs.dbg_regs[i].ctrl = ctrl[i];
205 watchpoint ? NT_ARM_HW_WATCH : NT_ARM_HW_BREAK,
217 error (_(
"Unexpected error setting hardware debug registers"));
250 struct user_hwdebug_state dreg_state;
252 iov.iov_base = &dreg_state;
253 iov.iov_len =
sizeof (dreg_state);
262 warning (_(
"Unexpected number of hardware watchpoint registers"
263 " reported by ptrace, got %d, expected %d."),
270 warning (_(
"Unable to determine the number of hardware watchpoints"
282 warning (_(
"Unexpected number of hardware breakpoint registers"
283 " reported by ptrace, got %d, expected %d."),
290 warning (_(
"Unable to determine the number of hardware breakpoints"
#define AARCH64_HBP_MAX_NUM
#define AARCH64_DEBUG_ARCH_V8_1
#define AARCH64_DEBUG_ARCH_V8_4
#define AARCH64_DEBUG_ARCH_V8
#define AARCH64_HWP_MAX_NUM
#define AARCH64_HWP_ALIGNMENT
#define AARCH64_DEBUG_ARCH_V8_9
#define AARCH64_DEBUG_ARCH_V8_2
#define AARCH64_DEBUG_ARCH_V8_8
void aarch64_linux_get_debug_reg_capacity(int tid)
static bool compatible_debug_arch(unsigned int debug_arch)
static void aarch64_downgrade_regs(struct aarch64_debug_reg_state *state)
void aarch64_linux_set_debug_regs(struct aarch64_debug_reg_state *state, int tid, int watchpoint)
static int debug_reg_change_callback(struct lwp_info *lwp, int is_watchpoint, unsigned int idx)
void aarch64_notify_debug_reg_change(ptid_t ptid, int is_watchpoint, unsigned int idx)
bool kernel_supports_any_contiguous_range
#define AARCH64_DEBUG_ARCH(x)
#define AARCH64_DEBUG_NUM_SLOTS(x)
#define DR_MARK_N_CHANGED(x, n)
bool is_watchpoint(const struct breakpoint *bpt)
#define ptrace(request, pid, addr, data)
ptid_t ptid_of_lwp(struct lwp_info *lwp)
void linux_stop_lwp(struct lwp_info *lwp)
ptid_t current_lwp_ptid(void)
void lwp_set_arch_private_info(struct lwp_info *lwp, struct arch_lwp_info *info)
struct arch_lwp_info * lwp_arch_private_info(struct lwp_info *lwp)
struct lwp_info * iterate_over_lwps(ptid_t filter, gdb::function_view< iterate_over_lwps_ftype > callback)
int lwp_is_stopped(struct lwp_info *lwp)
unsigned int dr_ref_count_wp[AARCH64_HWP_MAX_NUM]
CORE_ADDR dr_addr_bp[AARCH64_HBP_MAX_NUM]
unsigned int dr_ctrl_wp[AARCH64_HWP_MAX_NUM]
CORE_ADDR dr_addr_wp[AARCH64_HWP_MAX_NUM]
unsigned int dr_ctrl_bp[AARCH64_HBP_MAX_NUM]
CORE_ADDR dr_addr_orig_wp[AARCH64_HWP_MAX_NUM]