diff options
-rw-r--r-- | src/target/target.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/target/target.c b/src/target/target.c index 082b5cb5..1d6c4d36 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -264,6 +264,11 @@ int target_halt(struct target_s *target) int target_resume(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution) { + int retval; + int timeout_ms = 5000; + + enum target_state resume_state = debug_execution ? TARGET_DEBUG_RUNNING : TARGET_RUNNING; + /* We can't poll until after examine */ if (!target->type->examined) { @@ -271,7 +276,24 @@ int target_resume(struct target_s *target, int current, u32 address, int handle_ return ERROR_FAIL; } - return target->type->resume(target, current, address, handle_breakpoints, debug_execution); + if ((retval = target->type->resume(target, current, address, handle_breakpoints, debug_execution)) != ERROR_OK) + return retval; + + /* wait for target to exit halted mode */ + target_poll(target); + + while (target->state != resume_state) + { + usleep(10000); + target_poll(target); + if ((timeout_ms -= 10) <= 0) + { + LOG_ERROR("timeout waiting for target resume"); + return ERROR_TARGET_TIMEOUT; + } + } + + return retval; } int target_process_reset(struct command_context_s *cmd_ctx) |