aboutsummaryrefslogtreecommitdiff
path: root/src/target/cortex_m.c
diff options
context:
space:
mode:
authorSpencer Oliver <spen@spen-soft.co.uk>2013-09-25 14:43:08 +0100
committerSpencer Oliver <spen@spen-soft.co.uk>2013-10-29 22:55:04 +0000
commit3b3e3f67c10cc458321eb9030b671a922eceb149 (patch)
treec4dad9c5c9948f41e620dbed6b879d08f6f01197 /src/target/cortex_m.c
parent0ebf1eb94d06f892d8699bb35a8af65c721b5f5f (diff)
downloadriscv-openocd-3b3e3f67c10cc458321eb9030b671a922eceb149.zip
riscv-openocd-3b3e3f67c10cc458321eb9030b671a922eceb149.tar.gz
riscv-openocd-3b3e3f67c10cc458321eb9030b671a922eceb149.tar.bz2
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/cortex_m.c')
-rw-r--r--src/target/cortex_m.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c
index 3b46297..4476394 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];