From 3b3e3f67c10cc458321eb9030b671a922eceb149 Mon Sep 17 00:00:00 2001 From: Spencer Oliver Date: Wed, 25 Sep 2013 14:43:08 +0100 Subject: [PATCH] cortex_m: set fpb_enabled on enabling fpb 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 Reviewed-on: http://openocd.zylin.com/1634 Tested-by: jenkins --- src/target/cortex_m.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c index 3b462973..44763943 100644 --- a/src/target/cortex_m.c +++ b/src/target/cortex_m.c @@ -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]; -- 2.39.5