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 <dbrownell@users.sourceforge.net>
This commit is contained in:
parent
d44f1aaeff
commit
3172be80a3
|
@ -416,6 +416,21 @@ static int cortex_m3_poll(struct target *target)
|
||||||
return retval;
|
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)
|
if (cortex_m3->dcb_dhcsr & S_RESET_ST)
|
||||||
{
|
{
|
||||||
/* check if still in reset */
|
/* check if still in reset */
|
||||||
|
|
Loading…
Reference in New Issue