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
This commit is contained in:
Spencer Oliver 2013-09-25 14:43:08 +01:00
parent 0ebf1eb94d
commit 3b3e3f67c1
1 changed files with 29 additions and 3 deletions
src/target

View File

@ -214,6 +214,24 @@ static int cortex_m_single_step_core(struct target *target)
return ERROR_OK; 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) static int cortex_m_endreset_event(struct target *target)
{ {
int i; int i;
@ -265,9 +283,11 @@ static int cortex_m_endreset_event(struct target *target)
*/ */
/* Enable FPB */ /* Enable FPB */
retval = target_write_u32(target, FP_CTRL, 3); retval = cortex_m_enable_fpb(target);
if (retval != ERROR_OK) if (retval != ERROR_OK) {
LOG_ERROR("Failed to enable the FPB");
return retval; return retval;
}
cortex_m->fpb_enabled = 1; 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); comparator_list[fp_num].fpcr_value);
if (!cortex_m->fpb_enabled) { if (!cortex_m->fpb_enabled) {
LOG_DEBUG("FPB wasn't enabled, do it now"); 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) { } else if (breakpoint->type == BKPT_SOFT) {
uint8_t code[4]; uint8_t code[4];