From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LfMZh-00005v-V8 for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:01:57 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LfMZg-00005G-Rz for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:01:57 -0500 Received: from [199.232.76.173] (port=37329 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LfMZg-00005B-Mh for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:01:56 -0500 Received: from savannah.gnu.org ([199.232.41.3]:59828 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LfMZg-0005g9-68 for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:01:56 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1LfMZf-0002dQ-OH for qemu-devel@nongnu.org; Thu, 05 Mar 2009 23:01:55 +0000 Received: from aliguori by cvs.savannah.gnu.org with local (Exim 4.69) (envelope-from ) id 1LfMZf-0002cz-Hc for qemu-devel@nongnu.org; Thu, 05 Mar 2009 23:01:55 +0000 MIME-Version: 1.0 Errors-To: aliguori Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Anthony Liguori Message-Id: Date: Thu, 05 Mar 2009 23:01:55 +0000 Subject: [Qemu-devel] [6718] monitor: Pass-through for gdbstub (Jan Kiszka) 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@nongnu.org Revision: 6718 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6718 Author: aliguori Date: 2009-03-05 23:01:55 +0000 (Thu, 05 Mar 2009) Log Message: ----------- monitor: Pass-through for gdbstub (Jan Kiszka) Create a monitor terminal and pass it through the gdbstub. This allows to use gdb's monitor command to access the QEMU monitor. Works for all commands except for non-detached migration and password retrieval (user will receive error messages instead). Signed-off-by: Jan Kiszka Signed-off-by: Anthony Liguori Modified Paths: -------------- trunk/gdbstub.c Modified: trunk/gdbstub.c =================================================================== --- trunk/gdbstub.c 2009-03-05 23:01:51 UTC (rev 6717) +++ trunk/gdbstub.c 2009-03-05 23:01:55 UTC (rev 6718) @@ -30,6 +30,7 @@ #include "qemu.h" #else +#include "monitor.h" #include "qemu-char.h" #include "sysemu.h" #include "gdbstub.h" @@ -285,6 +286,7 @@ int running_state; #else CharDriverState *chr; + CharDriverState *mon_chr; #endif } GDBState; @@ -1819,7 +1821,22 @@ put_packet(s, buf); break; } -#endif +#else /* !CONFIG_LINUX_USER */ + else if (strncmp(p, "Rcmd,", 5) == 0) { + int len = strlen(p + 5); + + if ((len % 2) != 0) { + put_packet(s, "E01"); + break; + } + hextomem(mem_buf, p + 5, len); + len = len / 2; + mem_buf[len++] = 0; + qemu_chr_read(s->mon_chr, mem_buf, len); + put_packet(s, "OK"); + break; + } +#endif /* !CONFIG_LINUX_USER */ if (strncmp(p, "Supported", 9) == 0) { snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH); #ifdef GDB_CORE_XML @@ -2282,6 +2299,35 @@ } } +static void gdb_monitor_output(GDBState *s, const char *msg, int len) +{ + char buf[MAX_PACKET_LENGTH]; + + buf[0] = 'O'; + if (len > (MAX_PACKET_LENGTH/2) - 1) + len = (MAX_PACKET_LENGTH/2) - 1; + memtohex(buf + 1, (uint8_t *)msg, len); + put_packet(s, buf); +} + +static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len) +{ + const char *p = (const char *)buf; + int max_sz; + + max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2; + for (;;) { + if (len <= max_sz) { + gdb_monitor_output(gdbserver_state, p, len); + break; + } + gdb_monitor_output(gdbserver_state, p, max_sz); + p += max_sz; + len -= max_sz; + } + return len; +} + int gdbserver_start(const char *port) { GDBState *s; @@ -2313,6 +2359,12 @@ 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); + return 0; } #endif