diff --git a/src/target/target.c b/src/target/target.c index ea130ce3a..dd16c2bdf 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -266,9 +266,6 @@ 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) @@ -277,24 +274,13 @@ int target_resume(struct target_s *target, int current, u32 address, int handle_ return ERROR_FAIL; } + /* note that resume *must* be asynchronous. The CPU can halt before we poll. The CPU can + * even halt at the current PC as a result of a software breakpoint being inserted by (a bug?) + * the application. + */ 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) - { - target_call_timer_callbacks(); - usleep(10000); - target_poll(target); - if ((timeout_ms -= 10) <= 0) - { - LOG_ERROR("timeout waiting for target resume"); - return ERROR_TARGET_TIMEOUT; - } - } - return retval; }