From 68956e028af684a06d5649691574d6eaac8b6caa Mon Sep 17 00:00:00 2001 From: Spencer Oliver Date: Tue, 6 Nov 2012 15:43:51 +0000 Subject: [PATCH] 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 Reviewed-on: http://openocd.zylin.com/947 Tested-by: jenkins --- src/target/cortex_m.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c index 28824b8a..4d9daf5c 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, " -- 2.39.5