diff options
author | Yao Qi <yao.qi@linaro.org> | 2015-08-25 11:38:29 +0100 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2015-08-25 11:39:13 +0100 |
commit | 5e35436ed12617494d2a2d190e0faca5613a2e9f (patch) | |
tree | 72ec89a970b9c8c66baeb2c9754a61c4a59ba2bb /gdb/nat | |
parent | Make debug_reg_change_callback the same on GDB and GDBserver (diff) | |
download | binutils-gdb-5e35436ed12617494d2a2d190e0faca5613a2e9f.tar.gz binutils-gdb-5e35436ed12617494d2a2d190e0faca5613a2e9f.tar.bz2 binutils-gdb-5e35436ed12617494d2a2d190e0faca5613a2e9f.zip |
Move debug_reg_change_callback and aarch64_notify_debug_reg_change to nat/aarch64-linux-hw-point.c
gdb:
2015-08-25 Yao Qi <yao.qi@linaro.org>
* aarch64-linux-nat.c (struct arch64_dr_update_callback_param):
Move it to nat/aarch64-linux-hw-point.c.
(debug_reg_change_callback): Likewise.
(aarch64_notify_debug_reg_change): :Likewise.
* nat/aarch64-linux-hw-point.c: Include nat/linux-nat.h.
(aarch64_dr_update_callback_param): New.
(debug_reg_change_callback): New function.
(aarch64_notify_debug_reg_change): Likewise.
* nat/aarch64-linux-hw-point.h (aarch64_notify_debug_reg_change):
Remove the declaration.
gdb/gdbserver:
2015-08-25 Yao Qi <yao.qi@linaro.org>
* linux-aarch64-low.c (struct arch64_dr_update_callback_param):
Remove.
(debug_reg_change_callback): Remove.
(aarch64_notify_debug_reg_change): Remove.
Diffstat (limited to 'gdb/nat')
-rw-r--r-- | gdb/nat/aarch64-linux-hw-point.c | 88 | ||||
-rw-r--r-- | gdb/nat/aarch64-linux-hw-point.h | 3 |
2 files changed, 88 insertions, 3 deletions
diff --git a/gdb/nat/aarch64-linux-hw-point.c b/gdb/nat/aarch64-linux-hw-point.c index 1d9664ea1c0..ba235e54c78 100644 --- a/gdb/nat/aarch64-linux-hw-point.c +++ b/gdb/nat/aarch64-linux-hw-point.c @@ -18,6 +18,7 @@ #include "common-defs.h" #include "break-common.h" +#include "nat/linux-nat.h" #include "aarch64-linux-hw-point.h" #include <sys/uio.h> @@ -220,6 +221,93 @@ aarch64_align_watchpoint (CORE_ADDR addr, int len, CORE_ADDR *aligned_addr_p, *next_len_p = len; } +struct aarch64_dr_update_callback_param +{ + int is_watchpoint; + unsigned int idx; +}; + +/* Callback for iterate_over_lwps. 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) +{ + struct aarch64_dr_update_callback_param *param_p + = (struct aarch64_dr_update_callback_param *) ptr; + int pid = ptid_get_pid (ptid_of_lwp (lwp)); + int idx = param_p->idx; + int is_watchpoint = param_p->is_watchpoint; + struct arch_lwp_info *info = lwp_arch_private_info (lwp); + dr_changed_t *dr_changed_ptr; + dr_changed_t dr_changed; + + if (info == NULL) + { + info = XCNEW (struct arch_lwp_info); + lwp_set_arch_private_info (lwp, info); + } + + if (show_debug_regs) + { + debug_printf ("debug_reg_change_callback: \n\tOn entry:\n"); + debug_printf ("\tpid%d, dr_changed_bp=0x%s, " + "dr_changed_wp=0x%s\n", pid, + phex (info->dr_changed_bp, 8), + phex (info->dr_changed_wp, 8)); + } + + dr_changed_ptr = is_watchpoint ? &info->dr_changed_wp + : &info->dr_changed_bp; + dr_changed = *dr_changed_ptr; + + gdb_assert (idx >= 0 + && (idx <= (is_watchpoint ? aarch64_num_wp_regs + : aarch64_num_bp_regs))); + + /* The actual update is done later just before resuming the lwp, + we just mark that one register pair needs updating. */ + DR_MARK_N_CHANGED (dr_changed, idx); + *dr_changed_ptr = dr_changed; + + /* If the lwp isn't stopped, force it to momentarily pause, so + we can update its debug registers. */ + if (!lwp_is_stopped (lwp)) + linux_stop_lwp (lwp); + + if (show_debug_regs) + { + debug_printf ("\tOn exit:\n\tpid%d, dr_changed_bp=0x%s, " + "dr_changed_wp=0x%s\n", pid, + phex (info->dr_changed_bp, 8), + phex (info->dr_changed_wp, 8)); + } + + return 0; +} + +/* Notify each thread that their IDXth breakpoint/watchpoint register + pair needs to be updated. The message will be recorded in each + thread's arch-specific data area, the actual updating will be done + when the thread is resumed. */ + +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 = pid_to_ptid (ptid_get_pid (current_lwp_ptid ())); + + param.is_watchpoint = is_watchpoint; + param.idx = idx; + + iterate_over_lwps (pid_ptid, debug_reg_change_callback, (void *) ¶m); +} + /* Record the insertion of one breakpoint/watchpoint, as represented by ADDR and CTRL, in the process' arch-specific data area *STATE. */ diff --git a/gdb/nat/aarch64-linux-hw-point.h b/gdb/nat/aarch64-linux-hw-point.h index a430a8fcb8d..17cc42058e2 100644 --- a/gdb/nat/aarch64-linux-hw-point.h +++ b/gdb/nat/aarch64-linux-hw-point.h @@ -171,9 +171,6 @@ int aarch64_handle_watchpoint (enum target_hw_bp_type type, CORE_ADDR addr, int len, int is_insert, struct aarch64_debug_reg_state *state); -void aarch64_notify_debug_reg_change (const struct aarch64_debug_reg_state *state, - int is_watchpoint, unsigned int idx); - void aarch64_linux_set_debug_regs (const struct aarch64_debug_reg_state *state, int tid, int watchpoint); |