From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LoJzw-0001WW-It for qemu-devel@nongnu.org; Mon, 30 Mar 2009 12:06:04 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LoJzr-0001Pg-Ms for qemu-devel@nongnu.org; Mon, 30 Mar 2009 12:06:04 -0400 Received: from [199.232.76.173] (port=56524 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LoJzr-0001PP-6u for qemu-devel@nongnu.org; Mon, 30 Mar 2009 12:05:59 -0400 Received: from mx20.gnu.org ([199.232.41.8]:5030) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LoJzq-0000vr-J4 for qemu-devel@nongnu.org; Mon, 30 Mar 2009 12:05:58 -0400 Received: from fmmailgate01.web.de ([217.72.192.221]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LoJzp-0002WE-KT for qemu-devel@nongnu.org; Mon, 30 Mar 2009 12:05:58 -0400 Received: from smtp07.web.de (fmsmtp07.dlan.cinetic.de [172.20.5.215]) by fmmailgate01.web.de (Postfix) with ESMTP id A4A9CFF2A60B for ; Mon, 30 Mar 2009 18:05:07 +0200 (CEST) Received: from [82.82.218.64] (helo=[192.168.2.102]) by smtp07.web.de with asmtp (TLSv1:AES256-SHA:256) (WEB.DE 4.110 #277) id 1LoJz1-0005Dx-00 for qemu-devel@nongnu.org; Mon, 30 Mar 2009 18:05:07 +0200 Message-ID: <49D0EDB1.60503@web.de> Date: Mon, 30 Mar 2009 18:05:05 +0200 From: Jan Kiszka MIME-Version: 1.0 References: <49C0D693.2030301@siemens.com> <49CE66CD.2010202@us.ibm.com> In-Reply-To: <49CE66CD.2010202@us.ibm.com> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigFD41DEED8923F75592598AA4" Sender: jan.kiszka@web.de Subject: [Qemu-devel] [PATCH v4] gdbstub: Rework configuration via command line and monitor 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 This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigFD41DEED8923F75592598AA4 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable Introduce a more canonical gdbstub configuration (system emulation only) via the new switch '-gdb dev'. Keep '-s' as shorthand for '-gdb tcp::1234'. Use the same syntax also for the corresponding monitor command 'gdbserver'. Its default remains to listen on TCP port 1234. Changes in v4: - Rebased over new command line switches meta file Changes in v3: - Fix documentation Changes in v2: - Support for pipe-based like to gdb (target remote | qemu -gdb stdio) - Properly update the qemu-doc Signed-off-by: Jan Kiszka --- gdbstub.c | 41 +++++++++++++++++++++++++++-------------- monitor.c | 19 ++++++++++--------- qemu-options.hx | 26 ++++++++++++++++---------- vl.c | 25 ++++++++----------------- 4 files changed, 61 insertions(+), 50 deletions(-) diff --git a/gdbstub.c b/gdbstub.c index e8ceaae..cea375f 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -2395,27 +2395,40 @@ static int gdb_monitor_write(CharDriverState *chr= , const uint8_t *buf, int len) return len; } =20 -int gdbserver_start(const char *port) +#ifndef _WIN32 +static void gdb_sigterm_handler(int signal) +{ + if (vm_running) + vm_stop(EXCP_INTERRUPT); +} +#endif + +int gdbserver_start(const char *device) { GDBState *s; - char gdbstub_port_name[128]; - int port_num; - char *p; + char gdbstub_device_name[128]; CharDriverState *chr =3D NULL; CharDriverState *mon_chr; =20 - if (!port || !*port) - return -1; - if (strcmp(port, "none") !=3D 0) { - port_num =3D strtol(port, &p, 10); - if (*p =3D=3D 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 =3D gdbstub_port_name; + if (!device) + return -1; + if (strcmp(device, "none") !=3D 0) { + if (strstart(device, "tcp:", NULL)) { + /* enforce required TCP attributes */ + snprintf(gdbstub_device_name, sizeof(gdbstub_device_name), + "%s,nowait,nodelay,server", device); + device =3D gdbstub_device_name; } +#ifndef _WIN32 + else if (strcmp(device, "stdio") =3D=3D 0) { + struct sigaction act; =20 - chr =3D qemu_chr_open("gdb", port, NULL); + memset(&act, 0, sizeof(act)); + act.sa_handler =3D gdb_sigterm_handler; + sigaction(SIGINT, &act, NULL); + } +#endif + chr =3D qemu_chr_open("gdb", device, NULL); if (!chr) return -1; =20 diff --git a/monitor.c b/monitor.c index c6fe968..75c8663 100644 --- a/monitor.c +++ b/monitor.c @@ -570,17 +570,18 @@ static void encrypted_bdrv_it(void *opaque, BlockDr= iverState *bs) } =20 #ifdef CONFIG_GDBSTUB -static void do_gdbserver(Monitor *mon, const char *port) -{ - if (!port) - port =3D DEFAULT_GDBSTUB_PORT; - if (gdbserver_start(port) < 0) { - monitor_printf(mon, "Could not open gdbserver socket on port '%s= '\n", - port); - } else if (strcmp(port, "none") =3D=3D 0) { +static void do_gdbserver(Monitor *mon, const char *device) +{ + if (!device) + device =3D "tcp::" DEFAULT_GDBSTUB_PORT; + if (gdbserver_start(device) < 0) { + monitor_printf(mon, "Could not open gdbserver on device '%s'\n",= + device); + } else if (strcmp(device, "none") =3D=3D 0) { monitor_printf(mon, "Disabled gdbserver\n"); } else { - monitor_printf(mon, "Waiting gdb connection on port '%s'\n", por= t); + monitor_printf(mon, "Waiting for gdb connection on device '%s'\n= ", + device); } } #endif diff --git a/qemu-options.hx b/qemu-options.hx index 6c58e2a..8a8c938 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1216,19 +1216,25 @@ STEXI Do not start CPU at startup (you must type 'c' in the monitor). ETEXI =20 -DEF("s", 0, QEMU_OPTION_s, \ - "-s wait gdb connection to port\n") -STEXI -@item -s -Wait gdb connection to port 1234 (@pxref{gdb_usage}). +DEF("gdb", HAS_ARG, QEMU_OPTION_gdb, \ + "-gdb dev wait for gdb connection on 'dev'\n") +STEXI +@item -gdb @var{dev} +Wait for gdb connection on device @var{dev} (@pxref{gdb_usage}). Typical= +connections will likely be TCP-based, but also UDP, pseudo TTY, or even +stdio are reasonable use case. The latter is allowing to start qemu from= +within gdb and establish the connection via a pipe: +@example +(gdb) target remote | exec qemu -gdb stdio ... +@end example ETEXI =20 -DEF("p", HAS_ARG, QEMU_OPTION_p, \ - "-p port set gdb connection port [default=3D%s]\n") +DEF("s", 0, QEMU_OPTION_s, \ + "-s shorthand for -gdb tcp::%s\n") STEXI -@item -p @var{port} -Change gdb connection port. @var{port} can be either a decimal number -to specify a TCP port, or a host device (same devices as the serial port= ). +@item -s +Shorthand for -gdb tcp::1234, i.e. open a gdbserver on TCP port 1234 +(@pxref{gdb_usage}). ETEXI =20 DEF("d", HAS_ARG, QEMU_OPTION_d, \ diff --git a/vl.c b/vl.c index 5e6c621..8cb358f 100644 --- a/vl.c +++ b/vl.c @@ -4230,8 +4230,7 @@ static void termsig_setup(void) int main(int argc, char **argv, char **envp) { #ifdef CONFIG_GDBSTUB - int use_gdbstub; - const char *gdbstub_port; + const char *gdbstub_dev =3D NULL; #endif uint32_t boot_devices_bitmap =3D 0; int i; @@ -4310,10 +4309,6 @@ int main(int argc, char **argv, char **envp) initrd_filename =3D NULL; ram_size =3D 0; vga_ram_size =3D VGA_RAM_SIZE; -#ifdef CONFIG_GDBSTUB - use_gdbstub =3D 0; - gdbstub_port =3D DEFAULT_GDBSTUB_PORT; -#endif snapshot =3D 0; nographic =3D 0; curses =3D 0; @@ -4646,10 +4641,10 @@ int main(int argc, char **argv, char **envp) break; #ifdef CONFIG_GDBSTUB case QEMU_OPTION_s: - use_gdbstub =3D 1; + gdbstub_dev =3D "tcp::" DEFAULT_GDBSTUB_PORT; break; - case QEMU_OPTION_p: - gdbstub_port =3D optarg; + case QEMU_OPTION_gdb: + gdbstub_dev =3D optarg; break; #endif case QEMU_OPTION_L: @@ -5363,14 +5358,10 @@ int main(int argc, char **argv, char **envp) } =20 #ifdef CONFIG_GDBSTUB - if (use_gdbstub) { - /* XXX: use standard host:port notation and modify options - accordingly. */ - if (gdbserver_start(gdbstub_port) < 0) { - fprintf(stderr, "qemu: could not open gdbstub device on port= '%s'\n", - gdbstub_port); - exit(1); - } + if (gdbstub_dev && gdbserver_start(gdbstub_dev) < 0) { + fprintf(stderr, "qemu: could not open gdbserver on device '%s'\n= ", + gdbstub_dev); + exit(1); } #endif =20 --------------enigFD41DEED8923F75592598AA4 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org iEYEARECAAYFAknQ7bEACgkQniDOoMHTA+kU6QCeLjeXolv1MkJEAe7X7ng9I8iN eJIAn3Mtbd6Ih/AVUAhnwVzRKUt02M2X =FIzD -----END PGP SIGNATURE----- --------------enigFD41DEED8923F75592598AA4--