summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorØyvind Harboe <oyvind.harboe@zylin.com>2010-11-09 09:14:21 +0100
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-11-09 13:03:22 +0100
commitaa4c140a1214f2b75e43d8d3580a5d06083f46a2 (patch)
treec201c006ef03558a4df1012e0008ec02b134d423 /src
parent6c04f1e440be1451b1d7599910e377b90b7dc569 (diff)
downloadopenocd+libswd-aa4c140a1214f2b75e43d8d3580a5d06083f46a2.tar.gz
openocd+libswd-aa4c140a1214f2b75e43d8d3580a5d06083f46a2.tar.bz2
openocd+libswd-aa4c140a1214f2b75e43d8d3580a5d06083f46a2.tar.xz
openocd+libswd-aa4c140a1214f2b75e43d8d3580a5d06083f46a2.zip
cortex_m3: report detected error condition in poll
If the CPU crashed at some point, poll will discover this. Previously the poll fn would clear the error and print a warning, rather than propagating the error. The new behavior is to report the error back up, but still clear the error. Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Diffstat (limited to 'src')
-rw-r--r--src/target/cortex_m3.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/target/cortex_m3.c b/src/target/cortex_m3.c
index 3f080f13..f2947ad1 100644
--- a/src/target/cortex_m3.c
+++ b/src/target/cortex_m3.c
@@ -520,7 +520,8 @@ static int cortex_m3_debug_entry(struct target *target)
static int cortex_m3_poll(struct target *target)
{
- int retval;
+ int detected_failure = ERROR_OK;
+ int retval = ERROR_OK;
enum target_state prev_target_state = target->state;
struct cortex_m3_common *cortex_m3 = target_to_cm3(target);
struct adiv5_dap *swjdp = &cortex_m3->armv7m.dap;
@@ -535,15 +536,18 @@ static int cortex_m3_poll(struct target *target)
/* Recover from lockup. See ARMv7-M architecture spec,
* section B1.5.15 "Unrecoverable exception cases".
- *
- * REVISIT Is there a better way to report and handle this?
*/
if (cortex_m3->dcb_dhcsr & S_LOCKUP) {
- LOG_WARNING("%s -- clearing lockup after double fault",
+ LOG_ERROR("%s -- clearing lockup after double fault",
target_name(target));
cortex_m3_write_debug_halt_mask(target, C_HALT, 0);
target->debug_reason = DBG_REASON_DBGRQ;
+ /* We have to execute the rest (the "finally" equivalent, but
+ * still throw this exception again).
+ */
+ detected_failure = ERROR_FAIL;
+
/* refresh status bits */
retval = mem_ap_read_atomic_u32(swjdp, DCB_DHCSR, &cortex_m3->dcb_dhcsr);
if (retval != ERROR_OK)
@@ -610,11 +614,14 @@ static int cortex_m3_poll(struct target *target)
if (cortex_m3->dcb_dhcsr & S_RETIRE_ST)
{
target->state = TARGET_RUNNING;
- return ERROR_OK;
+ retval = ERROR_OK;
}
}
- return ERROR_OK;
+ /* Did we detect a failure condition that we cleared? */
+ if (detected_failure != ERROR_OK)
+ retval = detected_failure;
+ return retval;
}
static int cortex_m3_halt(struct target *target)