X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=gdbserver%2Fgdb-server.c;h=414ad8a7b477016ddf46a845042ab96c1d1b1a97;hb=7adf723a44bb69abc34e799d59673b63b48e2fe5;hp=1b5fc84012d576eade99505a3610266657d5a197;hpb=1c2828cc914260a57299461373bf835f90043863;p=fw%2Fstlink diff --git a/gdbserver/gdb-server.c b/gdbserver/gdb-server.c index 1b5fc84..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: @@ -650,8 +664,7 @@ int serve(stlink_t *sl, int port) { perror("listen"); return 1; } - -start_again: + stlink_force_debug(sl); stlink_reset(sl); init_code_breakpoints(sl); @@ -682,7 +695,7 @@ start_again: int status = gdb_recv_packet(client, &packet); if(status < 0) { fprintf(stderr, "cannot recv: %d\n", status); - goto start_again; + return 1; } #ifdef DEBUG @@ -1056,9 +1069,9 @@ start_again: unsigned count = strtoul(s_count, NULL, 16); unsigned adj_start = start % 4; + unsigned count_rnd = (count + adj_start + 4 - 1) / 4 * 4; - stlink_read_mem32(sl, start - adj_start, (count % 4 == 0) ? - count : count + 4 - (count % 4)); + stlink_read_mem32(sl, start - adj_start, count_rnd); reply = calloc(count * 2 + 1, 1); for(unsigned int i = 0; i < count; i++) { @@ -1190,6 +1203,12 @@ start_again: * We do support that always. */ + /* + * Also, set to persistent mode + * to allow GDB disconnect. + */ + persistent = 1; + reply = strdup("OK"); break; @@ -1223,7 +1242,7 @@ start_again: fprintf(stderr, "cannot send: %d\n", result); free(reply); free(packet); - goto start_again; + return 1; } free(reply);