summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorØyvind Harboe <oyvind.harboe@zylin.com>2010-01-20 23:36:57 +0100
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-01-21 15:57:30 +0100
commit1350b6aad074c1556604c5969dee43f294371461 (patch)
tree0d2319de980cf5b3d7466b22c7e1932167a8e7fc /src/server
parent60cb5bdd30ec3265cbb5c1c667f5c98cbbb84aab (diff)
downloadopenocd+libswd-1350b6aad074c1556604c5969dee43f294371461.tar.gz
openocd+libswd-1350b6aad074c1556604c5969dee43f294371461.tar.bz2
openocd+libswd-1350b6aad074c1556604c5969dee43f294371461.tar.xz
openocd+libswd-1350b6aad074c1556604c5969dee43f294371461.zip
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>
Diffstat (limited to 'src/server')
-rw-r--r--src/server/gdb_server.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index f3e05759..17ca4398 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -2212,12 +2212,13 @@ static int gdb_input_inner(struct connection *connection)
log_add_callback(gdb_log_callback, connection);
bool nostep = false;
+ bool already_running = false;
if (target->state == TARGET_RUNNING)
{
- LOG_WARNING("The target is already running. Halt target before stepi/continue.");
- retval = target_halt(target);
- if (retval == ERROR_OK)
- retval = target_wait_state(target, TARGET_HALTED, 100);
+ LOG_WARNING("WARNING! The target is already running. "
+ "All changes GDB did to registers will be discarded! "
+ "Waiting for target to halt.");
+ already_running = true;
} else if (target->state != TARGET_HALTED)
{
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;
- 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
* step/continue. This might be early setup, etc.
@@ -2253,11 +2254,15 @@ static int gdb_input_inner(struct connection *connection)
*/
gdb_con->frontend_state = TARGET_RUNNING;
target_call_event_callbacks(target, TARGET_EVENT_GDB_START);
- int retval = gdb_step_continue_packet(connection, target, packet, packet_size);
- if (retval != ERROR_OK)
+
+ if (!already_running)
{
- /* we'll never receive a halted condition... issue a false one.. */
- gdb_frontend_halted(target, connection);
+ int retval = gdb_step_continue_packet(connection, target, packet, packet_size);
+ if (retval != ERROR_OK)
+ {
+ /* we'll never receive a halted condition... issue a false one.. */
+ gdb_frontend_halted(target, connection);
+ }
}
}
}