diff options
author | Tomas Vanek <vanekt@fbl.cz> | 2019-10-20 15:03:44 +0200 |
---|---|---|
committer | Tomas Vanek <vanekt@fbl.cz> | 2020-04-21 16:49:02 +0100 |
commit | ff9ee132e52cf90275cfd9debee4c8d73412418e (patch) | |
tree | 5c0b55232ab404a0bcda7d3fe879c6e77ec9fdf2 | |
parent | 6e86ad6166407ca993a8fd37e05269297d470796 (diff) | |
download | riscv-openocd-ff9ee132e52cf90275cfd9debee4c8d73412418e.zip riscv-openocd-ff9ee132e52cf90275cfd9debee4c8d73412418e.tar.gz riscv-openocd-ff9ee132e52cf90275cfd9debee4c8d73412418e.tar.bz2 |
target/armv7m: minor fixes of target algo exit point check
Introduce a new ERROR_TARGET_ALGO_EXIT as currently used
ERROR_TARGET_TIMEOUT should be reserved for the timeout only.
Do not load PC directly from CPU HW as the register value
has already been cached.
Change-Id: I0d3630da41fd021676789dc12b52545cc0432ba8
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: http://openocd.zylin.com/5329
Tested-by: jenkins
Reviewed-by: Christopher Head <chead@zaber.com>
Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
-rw-r--r-- | src/target/armv7m.c | 15 | ||||
-rw-r--r-- | src/target/target.h | 1 |
2 files changed, 9 insertions, 7 deletions
diff --git a/src/target/armv7m.c b/src/target/armv7m.c index 82d6e63..837ccc9 100644 --- a/src/target/armv7m.c +++ b/src/target/armv7m.c @@ -462,7 +462,6 @@ int armv7m_wait_algorithm(struct target *target, struct armv7m_common *armv7m = target_to_armv7m(target); struct armv7m_algorithm *armv7m_algorithm_info = arch_info; int retval = ERROR_OK; - uint32_t pc; /* NOTE: armv7m_run_algorithm requires that each algorithm uses a software breakpoint * at the exit point */ @@ -484,12 +483,14 @@ int armv7m_wait_algorithm(struct target *target, return ERROR_TARGET_TIMEOUT; } - armv7m->load_core_reg_u32(target, 15, &pc); - if (exit_point && (pc != exit_point)) { - LOG_DEBUG("failed algorithm halted at 0x%" PRIx32 ", expected 0x%" TARGET_PRIxADDR, - pc, - exit_point); - return ERROR_TARGET_TIMEOUT; + if (exit_point) { + /* PC value has been cached in cortex_m_debug_entry() */ + uint32_t pc = buf_get_u32(armv7m->arm.pc->value, 0, 32); + if (pc != exit_point) { + LOG_DEBUG("failed algorithm halted at 0x%" PRIx32 ", expected 0x%" TARGET_PRIxADDR, + pc, exit_point); + return ERROR_TARGET_ALGO_EXIT; + } } /* Read memory values to mem_params[] */ diff --git a/src/target/target.h b/src/target/target.h index ddeb00b..fc15044 100644 --- a/src/target/target.h +++ b/src/target/target.h @@ -759,6 +759,7 @@ void target_handle_md_output(struct command_invocation *cmd, #define ERROR_TARGET_NOT_RUNNING (-310) #define ERROR_TARGET_NOT_EXAMINED (-311) #define ERROR_TARGET_DUPLICATE_BREAKPOINT (-312) +#define ERROR_TARGET_ALGO_EXIT (-313) extern bool get_target_reset_nag(void); |