Michael Pratt 2013-03-06 10:01:38 -08:00
commit 042130923d
1 zmienionych plików z 25 dodań i 6 usunięć

Wyświetl plik

@ -40,6 +40,11 @@ static const char hex[] = "0123456789abcdef";
static const char* current_memory_map = NULL; 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 { typedef struct _st_state_t {
// things from command line, bleh // things from command line, bleh
int stlink_version; int stlink_version;
@ -62,6 +67,7 @@ int parse_options(int argc, char** argv, st_state_t *st) {
{"stlink_version", required_argument, NULL, 's'}, {"stlink_version", required_argument, NULL, 's'},
{"stlinkv1", no_argument, NULL, '1'}, {"stlinkv1", no_argument, NULL, '1'},
{"listen_port", required_argument, NULL, 'p'}, {"listen_port", required_argument, NULL, 'p'},
{"multi", optional_argument, NULL, 'm'},
{0, 0, 0, 0}, {0, 0, 0, 0},
}; };
const char * help_str = "%s - usage:\n\n" 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" " -p 4242, --listen_port=1234\n"
"\t\t\tSet the gdb server listen port. " "\t\t\tSet the gdb server listen port. "
"(default port: " STRINGIFY(DEFAULT_GDB_LISTEN_PORT) ")\n" "(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 option_index = 0;
int c; int c;
int q; 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) { switch (c) {
case 0: case 0:
printf("XXXXX Shouldn't really normally come here, only if there's no corresponding option\n"); 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; st->listen_port = q;
break; break;
case 'm':
persistent = 1;
break;
} }
} }
@ -177,7 +189,9 @@ int main(int argc, char** argv) {
} }
#endif #endif
while(serve(sl, state.listen_port) == 0); do {
serve(sl, state.listen_port);
} while (persistent);
#ifdef __MINGW32__ #ifdef __MINGW32__
winsock_error: winsock_error:
@ -650,8 +664,7 @@ int serve(stlink_t *sl, int port) {
perror("listen"); perror("listen");
return 1; return 1;
} }
start_again:
stlink_force_debug(sl); stlink_force_debug(sl);
stlink_reset(sl); stlink_reset(sl);
init_code_breakpoints(sl); init_code_breakpoints(sl);
@ -682,7 +695,7 @@ start_again:
int status = gdb_recv_packet(client, &packet); int status = gdb_recv_packet(client, &packet);
if(status < 0) { if(status < 0) {
fprintf(stderr, "cannot recv: %d\n", status); fprintf(stderr, "cannot recv: %d\n", status);
goto start_again; return 1;
} }
#ifdef DEBUG #ifdef DEBUG
@ -1190,6 +1203,12 @@ start_again:
* We do support that always. * We do support that always.
*/ */
/*
* Also, set to persistent mode
* to allow GDB disconnect.
*/
persistent = 1;
reply = strdup("OK"); reply = strdup("OK");
break; break;
@ -1223,7 +1242,7 @@ start_again:
fprintf(stderr, "cannot send: %d\n", result); fprintf(stderr, "cannot send: %d\n", result);
free(reply); free(reply);
free(packet); free(packet);
goto start_again; return 1;
} }
free(reply); free(reply);