If halt times out, stop GDB. Allows e.g. manual reset via monitor commands.

This commit is contained in:
Øyvind Harboe 2009-10-12 09:27:27 +02:00
parent b23b096c8e
commit c8d935ab7c
3 changed files with 43 additions and 3 deletions

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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