diff options
author | Matthias Welwarsky <matthias.welwarsky@sysgo.com> | 2016-09-16 15:17:41 +0200 |
---|---|---|
committer | Matthias Welwarsky <matthias.welwarsky@sysgo.com> | 2017-02-10 14:01:38 +0100 |
commit | 667c1d0d16784d77c430f3f2a773ad2da4b72ea0 (patch) | |
tree | 9bc451b675146bf1c64a757e51fd399d8d138eb4 /src | |
parent | 42574b3a10ca8b10e8b84b84c6427a3b9d09fe13 (diff) | |
download | riscv-openocd-667c1d0d16784d77c430f3f2a773ad2da4b72ea0.zip riscv-openocd-667c1d0d16784d77c430f3f2a773ad2da4b72ea0.tar.gz riscv-openocd-667c1d0d16784d77c430f3f2a773ad2da4b72ea0.tar.bz2 |
aarch64: clear breakpoint value register on removal
Not only null control but also value of the breakpoint when it is
removed.
Change-Id: Id99c7e3644729c64e563f1fa8b0577f350be6a98
Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/target/aarch64.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/target/aarch64.c b/src/target/aarch64.c index 4d4b461..68de65d 100644 --- a/src/target/aarch64.c +++ b/src/target/aarch64.c @@ -1571,6 +1571,16 @@ static int aarch64_unset_breakpoint(struct target *target, struct breakpoint *br brp_list[brp_i].control); if (retval != ERROR_OK) return retval; + retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base + + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].BRPn, + (uint32_t)brp_list[brp_i].value); + if (retval != ERROR_OK) + return retval; + retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base + + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_i].BRPn, + (uint32_t)brp_list[brp_i].value); + if (retval != ERROR_OK) + return retval; if ((brp_j < 0) || (brp_j >= aarch64->brp_num)) { LOG_DEBUG("Invalid BRP number in breakpoint"); return ERROR_OK; @@ -1585,6 +1595,17 @@ static int aarch64_unset_breakpoint(struct target *target, struct breakpoint *br brp_list[brp_j].control); if (retval != ERROR_OK) return retval; + retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base + + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_j].BRPn, + (uint32_t)brp_list[brp_j].value); + if (retval != ERROR_OK) + return retval; + retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base + + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_j].BRPn, + (uint32_t)brp_list[brp_j].value); + if (retval != ERROR_OK) + return retval; + breakpoint->linked_BRP = 0; breakpoint->set = 0; return ERROR_OK; @@ -1610,6 +1631,12 @@ static int aarch64_unset_breakpoint(struct target *target, struct breakpoint *br brp_list[brp_i].value); if (retval != ERROR_OK) return retval; + + retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base + + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_i].BRPn, + (uint32_t)brp_list[brp_i].value); + if (retval != ERROR_OK) + return retval; breakpoint->set = 0; return ERROR_OK; } |