From 3b3e3f67c10cc458321eb9030b671a922eceb149 Mon Sep 17 00:00:00 2001
From: Spencer Oliver <spen@spen-soft.co.uk>
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 <spen@spen-soft.co.uk>
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 3b4629730..44763943f 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];