From: OpenOCD-Gerrit <ope...@us...> - 2022-10-08 08:46:49
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Main OpenOCD repository". The branch, master has been updated via b991c416b7e1a070604be919d8762ffe0a930a3f (commit) from 978c115dac5a2f420b9ef70207f384f09e380e35 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b991c416b7e1a070604be919d8762ffe0a930a3f Author: Tomas Vanek <va...@fb...> Date: Tue Nov 23 10:06:51 2021 +0100 target/cortex_m: make reset robust again After merging [1] 'reset halt' does not work on not responding Cortex-M. Relax the examined tests and try to set vector catch VC_CORERESET if debug_ap is available. While on it add an info about examination state to debug logs. Fixes: [1] commit 98d9f1168cbd ("target: reset target examined flag if target::examine() fails") Change-Id: Ie2e018610026180af5997d70231061a275f05c76 Signed-off-by: Tomas Vanek <va...@fb...> Reviewed-on: https://review.openocd.org/c/openocd/+/6745 Tested-by: jenkins Reviewed-by: Antonio Borneo <bor...@gm...> diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c index 23d9065e2..94c75a1d4 100644 --- a/src/target/cortex_m.c +++ b/src/target/cortex_m.c @@ -1408,8 +1408,9 @@ static int cortex_m_assert_reset(struct target *target) struct armv7m_common *armv7m = &cortex_m->armv7m; enum cortex_m_soft_reset_config reset_config = cortex_m->soft_reset_config; - LOG_TARGET_DEBUG(target, "target->state: %s", - target_state_name(target)); + LOG_TARGET_DEBUG(target, "target->state: %s,%s examined", + target_state_name(target), + target_was_examined(target) ? "" : " not"); enum reset_types jtag_reset_config = jtag_get_reset_config(); @@ -1428,24 +1429,32 @@ static int cortex_m_assert_reset(struct target *target) bool srst_asserted = false; - if (!target_was_examined(target)) { - if (jtag_reset_config & RESET_HAS_SRST) { - adapter_assert_reset(); + if ((jtag_reset_config & RESET_HAS_SRST) && + ((jtag_reset_config & RESET_SRST_NO_GATING) || !armv7m->debug_ap)) { + /* If we have no debug_ap, asserting SRST is the only thing + * we can do now */ + adapter_assert_reset(); + srst_asserted = true; + } + + /* We need at least debug_ap to go further. + * Inform user and bail out if we don't have one. */ + if (!armv7m->debug_ap) { + if (srst_asserted) { if (target->reset_halt) - LOG_TARGET_ERROR(target, "Target not examined, will not halt after reset!"); + LOG_TARGET_ERROR(target, "Debug AP not available, will not halt after reset!"); + + /* Do not propagate error: reset was asserted, proceed to deassert! */ + target->state = TARGET_RESET; + register_cache_invalidate(cortex_m->armv7m.arm.core_cache); return ERROR_OK; + } else { - LOG_TARGET_ERROR(target, "Target not examined, reset NOT asserted!"); + LOG_TARGET_ERROR(target, "Debug AP not available, reset NOT asserted!"); return ERROR_FAIL; } } - if ((jtag_reset_config & RESET_HAS_SRST) && - (jtag_reset_config & RESET_SRST_NO_GATING)) { - adapter_assert_reset(); - srst_asserted = true; - } - /* Enable debug requests */ int retval = cortex_m_read_dhcsr_atomic_sticky(target); @@ -1546,7 +1555,7 @@ static int cortex_m_assert_reset(struct target *target) if (retval != ERROR_OK) return retval; - if (target->reset_halt) { + if (target->reset_halt && target_was_examined(target)) { retval = target_halt(target); if (retval != ERROR_OK) return retval; @@ -1559,8 +1568,9 @@ static int cortex_m_deassert_reset(struct target *target) { struct armv7m_common *armv7m = &target_to_cm(target)->armv7m; - LOG_TARGET_DEBUG(target, "target->state: %s", - target_state_name(target)); + LOG_TARGET_DEBUG(target, "target->state: %s,%s examined", + target_state_name(target), + target_was_examined(target) ? "" : " not"); /* deassert reset lines */ adapter_deassert_reset(); @@ -1569,7 +1579,7 @@ static int cortex_m_deassert_reset(struct target *target) if ((jtag_reset_config & RESET_HAS_SRST) && !(jtag_reset_config & RESET_SRST_NO_GATING) && - target_was_examined(target)) { + armv7m->debug_ap) { int retval = dap_dp_init_or_reconnect(armv7m->debug_ap->dap); if (retval != ERROR_OK) { ----------------------------------------------------------------------- Summary of changes: src/target/cortex_m.c | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) hooks/post-receive -- Main OpenOCD repository |