diff options
author | Spencer Oliver <spen@spen-soft.co.uk> | 2013-09-25 14:43:08 +0100 |
---|---|---|
committer | Spencer Oliver <spen@spen-soft.co.uk> | 2013-10-29 22:55:04 +0000 |
commit | 3b3e3f67c10cc458321eb9030b671a922eceb149 (patch) | |
tree | c4dad9c5c9948f41e620dbed6b879d08f6f01197 /src/target | |
parent | 0ebf1eb94d06f892d8699bb35a8af65c721b5f5f (diff) |
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 <spen@spen-soft.co.uk>
Reviewed-on: http://openocd.zylin.com/1634
Tested-by: jenkins
Diffstat (limited to 'src/target')
-rw-r--r-- | src/target/cortex_m.c | 32 |
1 files 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]; |