diff options
author | Spencer Oliver <spen@spen-soft.co.uk> | 2012-11-06 15:43:51 +0000 |
---|---|---|
committer | Spencer Oliver <spen@spen-soft.co.uk> | 2012-11-06 16:27:19 +0000 |
commit | 68956e028af684a06d5649691574d6eaac8b6caa (patch) | |
tree | 0d4fb56115d1b7ff808e89697904ff16df263b9f | |
parent | 79fa75e199ae7cafe0be9d71d7246464da34015e (diff) | |
download | riscv-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
-rw-r--r-- | src/target/cortex_m.c | 14 |
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, " |