gdb_server: handle stepi/continue packet while target is running with more grace

Rather than issuing a halt and then stepi/resume, just
wait for target to halt.

Issue a sterner warning via gdb console that any gdb
register changes will be ignored in this case.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
This commit is contained in:
Øyvind Harboe 2010-01-20 23:36:57 +01:00
parent 60cb5bdd30
commit 1350b6aad0
1 changed files with 14 additions and 9 deletions

View File

@ -2212,12 +2212,13 @@ static int gdb_input_inner(struct connection *connection)
log_add_callback(gdb_log_callback, connection); log_add_callback(gdb_log_callback, connection);
bool nostep = false; bool nostep = false;
bool already_running = false;
if (target->state == TARGET_RUNNING) if (target->state == TARGET_RUNNING)
{ {
LOG_WARNING("The target is already running. Halt target before stepi/continue."); LOG_WARNING("WARNING! The target is already running. "
retval = target_halt(target); "All changes GDB did to registers will be discarded! "
if (retval == ERROR_OK) "Waiting for target to halt.");
retval = target_wait_state(target, TARGET_HALTED, 100); already_running = true;
} else if (target->state != TARGET_HALTED) } else if (target->state != TARGET_HALTED)
{ {
LOG_WARNING("The target is not in the halted nor running stated, stepi/continue ignored."); LOG_WARNING("The target is not in the halted nor running stated, stepi/continue ignored.");
@ -2233,7 +2234,7 @@ static int gdb_input_inner(struct connection *connection)
} }
gdb_con->sync = false; gdb_con->sync = false;
if ((retval!=ERROR_OK) || nostep) if ((retval!=ERROR_OK) || (!already_running && nostep))
{ {
/* Either the target isn't in the halted state, then we can't /* Either the target isn't in the halted state, then we can't
* step/continue. This might be early setup, etc. * step/continue. This might be early setup, etc.
@ -2253,6 +2254,9 @@ static int gdb_input_inner(struct connection *connection)
*/ */
gdb_con->frontend_state = TARGET_RUNNING; gdb_con->frontend_state = TARGET_RUNNING;
target_call_event_callbacks(target, TARGET_EVENT_GDB_START); target_call_event_callbacks(target, TARGET_EVENT_GDB_START);
if (!already_running)
{
int retval = gdb_step_continue_packet(connection, target, packet, packet_size); int retval = gdb_step_continue_packet(connection, target, packet, packet_size);
if (retval != ERROR_OK) if (retval != ERROR_OK)
{ {
@ -2261,6 +2265,7 @@ static int gdb_input_inner(struct connection *connection)
} }
} }
} }
}
break; break;
case 'v': case 'v':
retval = gdb_v_packet( retval = gdb_v_packet(