cortex: autostep correctly handle user breakpoint
[fw/openocd] / 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, "