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);
|
retval = target_halt(target);
|
||||||
if (retval != ERROR_OK)
|
if (retval != ERROR_OK)
|
||||||
{
|
{
|
||||||
/* stop this debug session */
|
|
||||||
target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
|
target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
|
||||||
}
|
}
|
||||||
gdb_con->ctrl_c = 0;
|
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 target_poll(struct target_s *target)
|
||||||
{
|
{
|
||||||
|
int retval;
|
||||||
|
|
||||||
/* We can't poll until after examine */
|
/* We can't poll until after examine */
|
||||||
if (!target_was_examined(target))
|
if (!target_was_examined(target))
|
||||||
{
|
{
|
||||||
/* Fail silently lest we pollute the log */
|
/* Fail silently lest we pollute the log */
|
||||||
return ERROR_FAIL;
|
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 target_halt(struct target_s *target)
|
||||||
{
|
{
|
||||||
|
int retval;
|
||||||
/* We can't poll until after examine */
|
/* We can't poll until after examine */
|
||||||
if (!target_was_examined(target))
|
if (!target_was_examined(target))
|
||||||
{
|
{
|
||||||
LOG_ERROR("Target not examined yet");
|
LOG_ERROR("Target not examined yet");
|
||||||
return ERROR_FAIL;
|
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)
|
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->display = 1;
|
||||||
|
|
||||||
|
target->halt_issued = false;
|
||||||
|
|
||||||
/* initialize trace information */
|
/* initialize trace information */
|
||||||
target->trace_info = malloc(sizeof(trace_t));
|
target->trace_info = malloc(sizeof(trace_t));
|
||||||
target->trace_info->num_trace_points = 0;
|
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
|
int display; /* display async info in telnet session. Do not display
|
||||||
* lots of halted/resumed info when stepping in debugger. */
|
* 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;
|
} target_t;
|
||||||
|
|
||||||
enum target_event
|
enum target_event
|
||||||
|
|
Loading…
Reference in New Issue