From 9bed540624ac45ff334917a51c564caa278d5833 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Wed, 6 Mar 2013 12:52:12 -0500 Subject: [PATCH] Add persistence support to gdb-server When started with -m, or connected with 'target extended-remote', the GDB server will not terminate upon disconnection from GDB, instead it will begin listening for conenctions again. Starting with extended-remote also has the advantage of allowing 'run' to be used to reset the target and begin again. Unfortunately, 'start' is not working properly, as it does not send a reset packet (R), so it complains when it tries to access memory before it is connected to the target. --- gdbserver/gdb-server.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/gdbserver/gdb-server.c b/gdbserver/gdb-server.c index 5f0a43b..414ad8a 100644 --- a/gdbserver/gdb-server.c +++ b/gdbserver/gdb-server.c @@ -40,6 +40,11 @@ static const char hex[] = "0123456789abcdef"; static const char* current_memory_map = NULL; +/* Persistent mode flag. + * In persistent mode, server starts listening again + * on GDB disconnect. */ +int persistent = 0; + typedef struct _st_state_t { // things from command line, bleh int stlink_version; @@ -62,6 +67,7 @@ int parse_options(int argc, char** argv, st_state_t *st) { {"stlink_version", required_argument, NULL, 's'}, {"stlinkv1", no_argument, NULL, '1'}, {"listen_port", required_argument, NULL, 'p'}, + {"multi", optional_argument, NULL, 'm'}, {0, 0, 0, 0}, }; const char * help_str = "%s - usage:\n\n" @@ -76,13 +82,16 @@ int parse_options(int argc, char** argv, st_state_t *st) { " -p 4242, --listen_port=1234\n" "\t\t\tSet the gdb server listen port. " "(default port: " STRINGIFY(DEFAULT_GDB_LISTEN_PORT) ")\n" + " -m, --multi\n" + "\t\t\tSet gdb server to extended mode.\n" + "\t\t\tst-util will continue listening for connections after disconnect.\n" ; int option_index = 0; int c; int q; - while ((c = getopt_long(argc, argv, "hv::d:s:1p:", long_options, &option_index)) != -1) { + while ((c = getopt_long(argc, argv, "hv::d:s:1p:m", long_options, &option_index)) != -1) { switch (c) { case 0: printf("XXXXX Shouldn't really normally come here, only if there's no corresponding option\n"); @@ -129,6 +138,9 @@ int parse_options(int argc, char** argv, st_state_t *st) { } st->listen_port = q; break; + case 'm': + persistent = 1; + break; } } @@ -177,7 +189,9 @@ int main(int argc, char** argv) { } #endif - while(serve(sl, state.listen_port) == 0); + do { + serve(sl, state.listen_port); + } while (persistent); #ifdef __MINGW32__ winsock_error: @@ -1189,6 +1203,12 @@ int serve(stlink_t *sl, int port) { * We do support that always. */ + /* + * Also, set to persistent mode + * to allow GDB disconnect. + */ + persistent = 1; + reply = strdup("OK"); break; @@ -1220,6 +1240,8 @@ int serve(stlink_t *sl, int port) { int result = gdb_send_packet(client, reply); if(result != 0) { fprintf(stderr, "cannot send: %d\n", result); + free(reply); + free(packet); return 1; } -- 2.47.2