From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LjtfA-0007YM-4l for qemu-devel@nongnu.org; Wed, 18 Mar 2009 07:10:20 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Ljtf4-0007Sv-Ve for qemu-devel@nongnu.org; Wed, 18 Mar 2009 07:10:19 -0400 Received: from [199.232.76.173] (port=36752 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Ljtf4-0007S6-5d for qemu-devel@nongnu.org; Wed, 18 Mar 2009 07:10:14 -0400 Received: from gecko.sbs.de ([194.138.37.40]:20141) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Ljtf2-0005va-9O for qemu-devel@nongnu.org; Wed, 18 Mar 2009 07:10:12 -0400 Received: from mail2.sbs.de (localhost [127.0.0.1]) by gecko.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id n2IBAAQP002107 for ; Wed, 18 Mar 2009 12:10:10 +0100 Received: from [139.25.109.167] (mchn012c.ww002.siemens.net [139.25.109.167] (may be forged)) by mail2.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id n2IBAA48002633 for ; Wed, 18 Mar 2009 12:10:10 +0100 Message-ID: <49C0D692.6030106@siemens.com> Date: Wed, 18 Mar 2009 12:10:10 +0100 From: Jan Kiszka MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH 1/2] gdbstub: Allow re-instantiation Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel [ 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 --- gdbstub.c | 57 ++++++++++++++++++++++++++++++++++++--------------------- monitor.c | 2 ++ 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/gdbstub.c b/gdbstub.c index 935d864..e8ceaae 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -265,6 +265,7 @@ typedef struct GDBRegisterState { } GDBRegisterState; enum RSState { + RS_INACTIVE, RS_IDLE, RS_GETLINE, RS_CHKSUM1, @@ -1982,7 +1983,7 @@ static void gdb_vm_state_change(void *opaque, int running, int reason) int ret; if (running || (reason != EXCP_DEBUG && reason != EXCP_INTERRUPT) || - s->state == RS_SYSCALL) + s->state == RS_INACTIVE || s->state == RS_SYSCALL) return; /* disable single step if it was enable */ @@ -2400,36 +2401,50 @@ int gdbserver_start(const char *port) char gdbstub_port_name[128]; int port_num; char *p; - CharDriverState *chr; + CharDriverState *chr = NULL; + CharDriverState *mon_chr; if (!port || !*port) return -1; + if (strcmp(port, "none") != 0) { + port_num = strtol(port, &p, 10); + if (*p == 0) { + /* A numeric value is interpreted as a port number. */ + snprintf(gdbstub_port_name, sizeof(gdbstub_port_name), + "tcp::%d,nowait,nodelay,server", port_num); + port = gdbstub_port_name; + } - port_num = strtol(port, &p, 10); - if (*p == 0) { - /* A numeric value is interpreted as a port number. */ - snprintf(gdbstub_port_name, sizeof(gdbstub_port_name), - "tcp::%d,nowait,nodelay,server", port_num); - port = gdbstub_port_name; + chr = qemu_chr_open("gdb", port, NULL); + if (!chr) + return -1; + + qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive, + gdb_chr_event, NULL); } - chr = qemu_chr_open("gdb", port, NULL); - if (!chr) - return -1; + s = gdbserver_state; + if (!s) { + s = qemu_mallocz(sizeof(GDBState)); + gdbserver_state = s; - s = qemu_mallocz(sizeof(GDBState)); + qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL); + + /* Initialize a monitor terminal for gdb */ + mon_chr = qemu_mallocz(sizeof(*mon_chr)); + mon_chr->chr_write = gdb_monitor_write; + monitor_init(mon_chr, 0); + } else { + if (s->chr) + qemu_chr_close(s->chr); + mon_chr = s->mon_chr; + memset(s, 0, sizeof(GDBState)); + } s->c_cpu = first_cpu; s->g_cpu = first_cpu; s->chr = chr; - gdbserver_state = s; - qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive, - gdb_chr_event, NULL); - qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL); - - /* Initialize a monitor terminal for gdb */ - s->mon_chr = qemu_mallocz(sizeof(*s->mon_chr)); - s->mon_chr->chr_write = gdb_monitor_write; - monitor_init(s->mon_chr, 0); + s->state = chr ? RS_IDLE : RS_INACTIVE; + s->mon_chr = mon_chr; return 0; } diff --git a/monitor.c b/monitor.c index da106d8..c6fe968 100644 --- a/monitor.c +++ b/monitor.c @@ -577,6 +577,8 @@ static void do_gdbserver(Monitor *mon, const char *port) if (gdbserver_start(port) < 0) { monitor_printf(mon, "Could not open gdbserver socket on port '%s'\n", port); + } else if (strcmp(port, "none") == 0) { + monitor_printf(mon, "Disabled gdbserver\n"); } else { monitor_printf(mon, "Waiting gdb connection on port '%s'\n", port); }