summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/gdb_server.c5
-rw-r--r--src/target/target.c39
-rw-r--r--src/target/target.h2
3 files changed, 43 insertions, 3 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index 00de5fc6..ad09a0e7 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -2194,10 +2194,13 @@ int gdb_input_inner(connection_t *connection)
retval = target_halt(target);
if (retval != ERROR_OK)
{
- /* stop this debug session */
target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
}
gdb_con->ctrl_c = 0;
+ } else
+ {
+ LOG_INFO("The target is not running when halt was requested, stopping GDB.");
+ target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
}
}
diff --git a/src/target/target.c b/src/target/target.c
index ced09e90..8bb9371f 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -378,24 +378,57 @@ target_t* get_current_target(command_context_t *cmd_ctx)
int target_poll(struct target_s *target)
{
+ int retval;
+
/* We can't poll until after examine */
if (!target_was_examined(target))
{
/* Fail silently lest we pollute the log */
return ERROR_FAIL;
}
- return target->type->poll(target);
+
+ retval = target->type->poll(target);
+ if (retval != ERROR_OK)
+ return retval;
+
+ if (target->halt_issued)
+ {
+ if (target->state == TARGET_HALTED)
+ {
+ target->halt_issued = false;
+ } else
+ {
+ long long t = timeval_ms() - target->halt_issued_time;
+ if (t>1000)
+ {
+ target->halt_issued = false;
+ LOG_INFO("Halt timed out, wake up GDB.");
+ target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
+ }
+ }
+ }
+
+ return ERROR_OK;
}
int target_halt(struct target_s *target)
{
+ int retval;
/* We can't poll until after examine */
if (!target_was_examined(target))
{
LOG_ERROR("Target not examined yet");
return ERROR_FAIL;
}
- return target->type->halt(target);
+
+ retval = target->type->halt(target);
+ if (retval != ERROR_OK)
+ return retval;
+
+ target->halt_issued = true;
+ target->halt_issued_time = timeval_ms();
+
+ return ERROR_OK;
}
int target_resume(struct target_s *target, int current, uint32_t address, int handle_breakpoints, int debug_execution)
@@ -4236,6 +4269,8 @@ static int target_create(Jim_GetOptInfo *goi)
target->display = 1;
+ target->halt_issued = false;
+
/* initialize trace information */
target->trace_info = malloc(sizeof(trace_t));
target->trace_info->num_trace_points = 0;
diff --git a/src/target/target.h b/src/target/target.h
index 6547d4d7..0f8be6f2 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -148,6 +148,8 @@ typedef struct target_s
int display; /* display async info in telnet session. Do not display
* lots of halted/resumed info when stepping in debugger. */
+ bool halt_issued; /* did we transition to halted state? */
+ long long halt_issued_time; /* Note time when halt was issued */
} target_t;
enum target_event