aboutsummaryrefslogtreecommitdiff
path: root/src/target/cortex_m.c
diff options
context:
space:
mode:
authorSpencer Oliver <spen@spen-soft.co.uk>2012-11-06 15:43:51 +0000
committerSpencer Oliver <spen@spen-soft.co.uk>2012-11-06 16:27:19 +0000
commit68956e028af684a06d5649691574d6eaac8b6caa (patch)
tree0d4fb56115d1b7ff808e89697904ff16df263b9f /src/target/cortex_m.c
parent79fa75e199ae7cafe0be9d71d7246464da34015e (diff)
downloadriscv-openocd-68956e028af684a06d5649691574d6eaac8b6caa.zip
riscv-openocd-68956e028af684a06d5649691574d6eaac8b6caa.tar.gz
riscv-openocd-68956e028af684a06d5649691574d6eaac8b6caa.tar.bz2
cortex: autostep correctly handle user breakpoint
If we halt due to a breakpoint make sure that we do not remove it during a step, only remove breakpoints we have created. Change-Id: I060168e54e53637d4fbf3cbcf62072efdb353807 Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk> Reviewed-on: http://openocd.zylin.com/947 Tested-by: jenkins
Diffstat (limited to 'src/target/cortex_m.c')
-rw-r--r--src/target/cortex_m.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c
index 28824b8..4d9daf5 100644
--- a/src/target/cortex_m.c
+++ b/src/target/cortex_m.c
@@ -879,7 +879,10 @@ static int cortex_m3_step(struct target *target, int current,
else {
/* Set a temporary break point */
- retval = breakpoint_add(target, pc_value, 2, BKPT_TYPE_BY_ADDR(pc_value));
+ if (breakpoint)
+ retval = cortex_m3_set_breakpoint(target, breakpoint);
+ else
+ retval = breakpoint_add(target, pc_value, 2, BKPT_TYPE_BY_ADDR(pc_value));
bool tmp_bp_set = (retval == ERROR_OK);
/* No more breakpoints left, just do a step */
@@ -903,8 +906,13 @@ static int cortex_m3_step(struct target *target, int current,
isr_timed_out = ((timeval_ms() - t_start) > 500);
} while (!((cortex_m3->dcb_dhcsr & S_HALT) || isr_timed_out));
- /* Remove the temporary breakpoint */
- breakpoint_remove(target, pc_value);
+ /* only remove breakpoint if we created it */
+ if (breakpoint)
+ cortex_m3_unset_breakpoint(target, breakpoint);
+ else {
+ /* Remove the temporary breakpoint */
+ breakpoint_remove(target, pc_value);
+ }
if (isr_timed_out) {
LOG_DEBUG("Interrupt handlers didn't complete within time, "