If halt times out, stop GDB. Allows e.g. manual reset via monitor commands.
This commit is contained in:
parent
b23b096c8e
commit
c8d935ab7c
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue