summaryrefslogtreecommitdiff
path: root/src/target
diff options
context:
space:
mode:
authorntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-07-09 10:33:30 +0000
committerntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-07-09 10:33:30 +0000
commit876297c25c970da58de83245a4c3b3a9e4c1f9ed (patch)
treed3dc28a76dd5e3dd992b6838769e3c3d4c347e41 /src/target
parentf0f5157e0952e5ffeccd681b9617b3a80c388c53 (diff)
downloadopenocd+libswd-876297c25c970da58de83245a4c3b3a9e4c1f9ed.tar.gz
openocd+libswd-876297c25c970da58de83245a4c3b3a9e4c1f9ed.tar.bz2
openocd+libswd-876297c25c970da58de83245a4c3b3a9e4c1f9ed.tar.xz
openocd+libswd-876297c25c970da58de83245a4c3b3a9e4c1f9ed.zip
- target_resume is now synchronous with 5sec timeout
git-svn-id: svn://svn.berlios.de/openocd/trunk@775 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/target')
-rw-r--r--src/target/target.c24
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)