cortex: autostep correctly handle user breakpoint
authorSpencer Oliver <spen@spen-soft.co.uk>
Tue, 6 Nov 2012 15:43:51 +0000 (15:43 +0000)
committerSpencer Oliver <spen@spen-soft.co.uk>
Tue, 6 Nov 2012 16:27:19 +0000 (16:27 +0000)
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
src/target/cortex_m.c

index 28824b8a36822ff7a5b7ae1f6a29cc86617935be..4d9daf5ca09e48de924fda94476f4b207655107d 100644 (file)
@@ -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, "