diff options
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 |
commit | aa4c140a1214f2b75e43d8d3580a5d06083f46a2 (patch) | |
tree | c201c006ef03558a4df1012e0008ec02b134d423 /src/target | |
parent | 6c04f1e440be1451b1d7599910e377b90b7dc569 (diff) | |
download | openocd+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/target')
-rw-r--r-- | src/target/cortex_m3.c | 19 |
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) |