Commit 36556b20c5c9a02f5e238435cd41bf67740359ee
1 parent
819f56b7
gdbstub: Allow re-instantiation (Jan Kiszka)
[ Note: depends on char closing fixes ] Properly clean up the gdbstub when the user tries to re-open it (possibly under a different address). Moreover, allow to shut it down from the monitor via 'gdbserver none'. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6913 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
38 additions
and
21 deletions
gdbstub.c
... | ... | @@ -265,6 +265,7 @@ typedef struct GDBRegisterState { |
265 | 265 | } GDBRegisterState; |
266 | 266 | |
267 | 267 | enum RSState { |
268 | + RS_INACTIVE, | |
268 | 269 | RS_IDLE, |
269 | 270 | RS_GETLINE, |
270 | 271 | RS_CHKSUM1, |
... | ... | @@ -1924,7 +1925,7 @@ static void gdb_vm_state_change(void *opaque, int running, int reason) |
1924 | 1925 | int ret; |
1925 | 1926 | |
1926 | 1927 | if (running || (reason != EXCP_DEBUG && reason != EXCP_INTERRUPT) || |
1927 | - s->state == RS_SYSCALL) | |
1928 | + s->state == RS_INACTIVE || s->state == RS_SYSCALL) | |
1928 | 1929 | return; |
1929 | 1930 | |
1930 | 1931 | /* disable single step if it was enable */ |
... | ... | @@ -2342,36 +2343,50 @@ int gdbserver_start(const char *port) |
2342 | 2343 | char gdbstub_port_name[128]; |
2343 | 2344 | int port_num; |
2344 | 2345 | char *p; |
2345 | - CharDriverState *chr; | |
2346 | + CharDriverState *chr = NULL; | |
2347 | + CharDriverState *mon_chr; | |
2346 | 2348 | |
2347 | 2349 | if (!port || !*port) |
2348 | 2350 | return -1; |
2351 | + if (strcmp(port, "none") != 0) { | |
2352 | + port_num = strtol(port, &p, 10); | |
2353 | + if (*p == 0) { | |
2354 | + /* A numeric value is interpreted as a port number. */ | |
2355 | + snprintf(gdbstub_port_name, sizeof(gdbstub_port_name), | |
2356 | + "tcp::%d,nowait,nodelay,server", port_num); | |
2357 | + port = gdbstub_port_name; | |
2358 | + } | |
2349 | 2359 | |
2350 | - port_num = strtol(port, &p, 10); | |
2351 | - if (*p == 0) { | |
2352 | - /* A numeric value is interpreted as a port number. */ | |
2353 | - snprintf(gdbstub_port_name, sizeof(gdbstub_port_name), | |
2354 | - "tcp::%d,nowait,nodelay,server", port_num); | |
2355 | - port = gdbstub_port_name; | |
2360 | + chr = qemu_chr_open("gdb", port, NULL); | |
2361 | + if (!chr) | |
2362 | + return -1; | |
2363 | + | |
2364 | + qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive, | |
2365 | + gdb_chr_event, NULL); | |
2356 | 2366 | } |
2357 | 2367 | |
2358 | - chr = qemu_chr_open("gdb", port, NULL); | |
2359 | - if (!chr) | |
2360 | - return -1; | |
2368 | + s = gdbserver_state; | |
2369 | + if (!s) { | |
2370 | + s = qemu_mallocz(sizeof(GDBState)); | |
2371 | + gdbserver_state = s; | |
2361 | 2372 | |
2362 | - s = qemu_mallocz(sizeof(GDBState)); | |
2373 | + qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL); | |
2374 | + | |
2375 | + /* Initialize a monitor terminal for gdb */ | |
2376 | + mon_chr = qemu_mallocz(sizeof(*mon_chr)); | |
2377 | + mon_chr->chr_write = gdb_monitor_write; | |
2378 | + monitor_init(mon_chr, 0); | |
2379 | + } else { | |
2380 | + if (s->chr) | |
2381 | + qemu_chr_close(s->chr); | |
2382 | + mon_chr = s->mon_chr; | |
2383 | + memset(s, 0, sizeof(GDBState)); | |
2384 | + } | |
2363 | 2385 | s->c_cpu = first_cpu; |
2364 | 2386 | s->g_cpu = first_cpu; |
2365 | 2387 | s->chr = chr; |
2366 | - gdbserver_state = s; | |
2367 | - qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive, | |
2368 | - gdb_chr_event, NULL); | |
2369 | - qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL); | |
2370 | - | |
2371 | - /* Initialize a monitor terminal for gdb */ | |
2372 | - s->mon_chr = qemu_mallocz(sizeof(*s->mon_chr)); | |
2373 | - s->mon_chr->chr_write = gdb_monitor_write; | |
2374 | - monitor_init(s->mon_chr, 0); | |
2388 | + s->state = chr ? RS_IDLE : RS_INACTIVE; | |
2389 | + s->mon_chr = mon_chr; | |
2375 | 2390 | |
2376 | 2391 | return 0; |
2377 | 2392 | } | ... | ... |
monitor.c
... | ... | @@ -577,6 +577,8 @@ static void do_gdbserver(Monitor *mon, const char *port) |
577 | 577 | if (gdbserver_start(port) < 0) { |
578 | 578 | monitor_printf(mon, "Could not open gdbserver socket on port '%s'\n", |
579 | 579 | port); |
580 | + } else if (strcmp(port, "none") == 0) { | |
581 | + monitor_printf(mon, "Disabled gdbserver\n"); | |
580 | 582 | } else { |
581 | 583 | monitor_printf(mon, "Waiting gdb connection on port '%s'\n", port); |
582 | 584 | } | ... | ... |