cortex_m: set fpb_enabled on enabling fpb
authorSpencer Oliver <spen@spen-soft.co.uk>
Wed, 25 Sep 2013 13:43:08 +0000 (14:43 +0100)
committerSpencer Oliver <spen@spen-soft.co.uk>
Tue, 29 Oct 2013 22:55:04 +0000 (22:55 +0000)
If the fpb_enabled is not set then as part of cortex_m3_set_breakpoint we
enable the fpb, however we do not signal the fpb as being enabled.

This issue only effects the hla target as the current cortex_m code enables
the fpb during cortex_m3_endreset_event.

Change-Id: I44d3fc65916c131b7a226869dd16aed5afb441b4
Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-on: http://openocd.zylin.com/1634
Tested-by: jenkins
src/target/cortex_m.c

index 3b4629730f27d3535a4da800bcfd45c32f70f5a9..44763943fb958a2c4f52e60575978a63c4c59851 100644 (file)
@@ -214,6 +214,24 @@ static int cortex_m_single_step_core(struct target *target)
        return ERROR_OK;
 }
 
+static int cortex_m_enable_fpb(struct target *target)
+{
+       int retval = target_write_u32(target, FP_CTRL, 3);
+       if (retval != ERROR_OK)
+               return retval;
+
+       /* check the fpb is actually enabled */
+       uint32_t fpctrl;
+       retval = target_read_u32(target, FP_CTRL, &fpctrl);
+       if (retval != ERROR_OK)
+               return retval;
+
+       if (fpctrl & 1)
+               return ERROR_OK;
+
+       return ERROR_FAIL;
+}
+
 static int cortex_m_endreset_event(struct target *target)
 {
        int i;
@@ -265,9 +283,11 @@ static int cortex_m_endreset_event(struct target *target)
         */
 
        /* Enable FPB */
-       retval = target_write_u32(target, FP_CTRL, 3);
-       if (retval != ERROR_OK)
+       retval = cortex_m_enable_fpb(target);
+       if (retval != ERROR_OK) {
+               LOG_ERROR("Failed to enable the FPB");
                return retval;
+       }
 
        cortex_m->fpb_enabled = 1;
 
@@ -1134,7 +1154,13 @@ int cortex_m_set_breakpoint(struct target *target, struct breakpoint *breakpoint
                        comparator_list[fp_num].fpcr_value);
                if (!cortex_m->fpb_enabled) {
                        LOG_DEBUG("FPB wasn't enabled, do it now");
-                       target_write_u32(target, FP_CTRL, 3);
+                       retval = cortex_m_enable_fpb(target);
+                       if (retval != ERROR_OK) {
+                               LOG_ERROR("Failed to enable the FPB");
+                               return retval;
+                       }
+
+                       cortex_m->fpb_enabled = 1;
                }
        } else if (breakpoint->type == BKPT_SOFT) {
                uint8_t code[4];