From: David Brownell Date: Wed, 27 Jan 2010 21:47:48 +0000 (-0800) Subject: Cortex-M3: report lockup, and recover X-Git-Tag: v0.4.0-rc2~41 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=3172be80a3e14f4c8c3628a37db348c04fd60fc4;p=openocd Cortex-M3: report lockup, and recover ARMv7-M defines a "lockup" state that's entered in certain double fault sequences which can't be recovered from without external help. OpenOCD has previously ignored this. Issue a diagnostic saying the chip has locked up, and force exit from this state by halting the core. It's not clear this is the best way to handle lockup; but there should now be less confusion. Signed-off-by: David Brownell --- diff --git a/src/target/cortex_m3.c b/src/target/cortex_m3.c index adce4d9c..3bbe42c9 100644 --- a/src/target/cortex_m3.c +++ b/src/target/cortex_m3.c @@ -416,6 +416,21 @@ static int cortex_m3_poll(struct target *target) return retval; } + /* 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", + target_name(target)); + cortex_m3_write_debug_halt_mask(target, C_HALT, 0); + target->debug_reason = DBG_REASON_DBGRQ; + + /* refresh status bits */ + mem_ap_read_atomic_u32(swjdp, DCB_DHCSR, &cortex_m3->dcb_dhcsr); + } + if (cortex_m3->dcb_dhcsr & S_RESET_ST) { /* check if still in reset */