qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 2/2] gdbstub: Rework configuration via command line and monitor
@ 2009-03-18 11:10 Jan Kiszka
  2009-03-21  9:48 ` [Qemu-devel] [PATCH 2/2 -v2] " Jan Kiszka
  2009-03-28 18:05 ` [Qemu-devel] [PATCH 2/2] " Anthony Liguori
  0 siblings, 2 replies; 8+ messages in thread
From: Jan Kiszka @ 2009-03-18 11:10 UTC (permalink / raw)
  To: qemu-devel

Introduce a more powerful gdbstub configuration (system emulation olny)
via 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 also remains to listen on port 1234.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---

 gdbstub.c |   25 +++++++++++--------------
 monitor.c |   19 ++++++++++---------
 vl.c      |   33 ++++++++++++---------------------
 3 files changed, 33 insertions(+), 44 deletions(-)

diff --git a/gdbstub.c b/gdbstub.c
index e8ceaae..b6d41bb 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -2395,27 +2395,24 @@ static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
     return len;
 }
 
-int gdbserver_start(const char *port)
+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 = 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;
+    if (!device)
+        return -1;
+    if (strcmp(device, "none") != 0) {
+        if (strstart(device, "tcp:", NULL)) {
+            /* enforce required TCP attributes */
+            snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
+                     "%s,nowait,nodelay,server", device);
+            device = gdbstub_device_name;
         }
 
-        chr = qemu_chr_open("gdb", port, NULL);
+        chr = qemu_chr_open("gdb", device, NULL);
         if (!chr)
             return -1;
 
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, BlockDriverState *bs)
 }
 
 #ifdef CONFIG_GDBSTUB
-static void do_gdbserver(Monitor *mon, const char *port)
-{
-    if (!port)
-        port = 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") == 0) {
+static void do_gdbserver(Monitor *mon, const char *device)
+{
+    if (!device)
+        device = "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") == 0) {
         monitor_printf(mon, "Disabled gdbserver\n");
     } else {
-        monitor_printf(mon, "Waiting gdb connection on port '%s'\n", port);
+        monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
+                       device);
     }
 }
 #endif
diff --git a/vl.c b/vl.c
index b62a2d4..d5c9e02 100644
--- a/vl.c
+++ b/vl.c
@@ -4073,8 +4073,8 @@ static void help(int exitcode)
            "-monitor dev    redirect the monitor to char device 'dev'\n"
            "-pidfile file   write PID to 'file'\n"
            "-S              freeze CPU at startup (use 'c' to start execution)\n"
-           "-s              wait gdb connection to port\n"
-           "-p port         set gdb connection port [default=%s]\n"
+           "-gdb dev        wait for gdb connection on 'dev'\n"
+           "-s              shorthand for -gdb tcp::%s\n"
            "-d item1,...    output log to %s (use -d ? for a list of log items)\n"
            "-hdachs c,h,s[,t]\n"
            "                force hard disk 0 physical geometry and the optional BIOS\n"
@@ -4214,7 +4214,7 @@ enum {
     QEMU_OPTION_pidfile,
     QEMU_OPTION_S,
     QEMU_OPTION_s,
-    QEMU_OPTION_p,
+    QEMU_OPTION_gdb,
     QEMU_OPTION_d,
     QEMU_OPTION_hdachs,
     QEMU_OPTION_L,
@@ -4336,7 +4336,7 @@ static const QEMUOption qemu_options[] = {
     { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
     { "S", 0, QEMU_OPTION_S },
     { "s", 0, QEMU_OPTION_s },
-    { "p", HAS_ARG, QEMU_OPTION_p },
+    { "gdb", HAS_ARG, QEMU_OPTION_gdb },
     { "d", HAS_ARG, QEMU_OPTION_d },
     { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
     { "L", HAS_ARG, QEMU_OPTION_L },
@@ -4607,8 +4607,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 = NULL;
 #endif
     uint32_t boot_devices_bitmap = 0;
     int i;
@@ -4687,10 +4686,6 @@ int main(int argc, char **argv, char **envp)
     initrd_filename = NULL;
     ram_size = 0;
     vga_ram_size = VGA_RAM_SIZE;
-#ifdef CONFIG_GDBSTUB
-    use_gdbstub = 0;
-    gdbstub_port = DEFAULT_GDBSTUB_PORT;
-#endif
     snapshot = 0;
     nographic = 0;
     curses = 0;
@@ -5023,10 +5018,10 @@ int main(int argc, char **argv, char **envp)
                 break;
 #ifdef CONFIG_GDBSTUB
             case QEMU_OPTION_s:
-                use_gdbstub = 1;
+                gdbstub_dev = "tcp::" DEFAULT_GDBSTUB_PORT;
                 break;
-            case QEMU_OPTION_p:
-                gdbstub_port = optarg;
+            case QEMU_OPTION_gdb:
+                gdbstub_dev = optarg;
                 break;
 #endif
             case QEMU_OPTION_L:
@@ -5731,14 +5726,10 @@ int main(int argc, char **argv, char **envp)
     }
 
 #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
 

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 2/2 -v2] gdbstub: Rework configuration via command line and monitor
  2009-03-18 11:10 [Qemu-devel] [PATCH 2/2] gdbstub: Rework configuration via command line and monitor Jan Kiszka
@ 2009-03-21  9:48 ` Jan Kiszka
  2009-03-21 10:36   ` [Qemu-devel] [PATCH 2/2 -v3] " Jan Kiszka
  2009-03-24 13:10   ` [Qemu-devel] [PATCH 2/2 -v2] " Paul Brook
  2009-03-28 18:05 ` [Qemu-devel] [PATCH 2/2] " Anthony Liguori
  1 sibling, 2 replies; 8+ messages in thread
From: Jan Kiszka @ 2009-03-21  9:48 UTC (permalink / raw)
  To: qemu-devel

Introduce a more powerful gdbstub configuration (system emulation olny)
via 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 also remains to listen on port 1234.

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 <jan.kiszka@siemens.com>
---

 gdbstub.c     |   41 +++++++++++++++++++++++++++--------------
 monitor.c     |   19 ++++++++++---------
 qemu-doc.texi |   12 +++++++++++-
 vl.c          |   33 ++++++++++++---------------------
 4 files changed, 60 insertions(+), 45 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;
 }
 
-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 = 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;
+    if (!device)
+        return -1;
+    if (strcmp(device, "none") != 0) {
+        if (strstart(device, "tcp:", NULL)) {
+            /* enforce required TCP attributes */
+            snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
+                     "%s,nowait,nodelay,server", device);
+            device = gdbstub_device_name;
         }
+#ifndef _WIN32
+        else if (strcmp(device, "stdio") == 0) {
+            struct sigaction act;
 
-        chr = qemu_chr_open("gdb", port, NULL);
+            memset(&act, 0, sizeof(act));
+            act.sa_handler = gdb_sigterm_handler;
+            sigaction(SIGINT, &act, NULL);
+        }
+#endif
+        chr = qemu_chr_open("gdb", device, NULL);
         if (!chr)
             return -1;
 
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, BlockDriverState *bs)
 }
 
 #ifdef CONFIG_GDBSTUB
-static void do_gdbserver(Monitor *mon, const char *port)
-{
-    if (!port)
-        port = 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") == 0) {
+static void do_gdbserver(Monitor *mon, const char *device)
+{
+    if (!device)
+        device = "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") == 0) {
         monitor_printf(mon, "Disabled gdbserver\n");
     } else {
-        monitor_printf(mon, "Waiting gdb connection on port '%s'\n", port);
+        monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
+                       device);
     }
 }
 #endif
diff --git a/qemu-doc.texi b/qemu-doc.texi
index 8efc943..d70d7be 100644
--- a/qemu-doc.texi
+++ b/qemu-doc.texi
@@ -1097,8 +1097,18 @@ from a script.
 @item -S
 Do not start CPU at startup (you must type 'c' in the monitor).
 
+@item -gdb @var{dev}
+
+Wait for gdb connection on device @var{dev} (@pxref{gdb_usage}). Typical
+connections will likely be TCP-based, but also unix sockets or even stdio
+are reasonable use case. The latter is allowing to start qemu from within
+gdb and establish the connection via a pipe:
+
+(gdb) target remote | exec qemu -gdb stdio ...
+
 @item -s
-Wait gdb connection to port 1234 (@pxref{gdb_usage}).
+Shorthand for -gdb tcp::1234, i.e. open a gdbserver on TCP port 1234
+(@pxref{gdb_usage}).
 
 @item -p @var{port}
 Change gdb connection port.  @var{port} can be either a decimal number
diff --git a/vl.c b/vl.c
index abc7f5d..6e31a00 100644
--- a/vl.c
+++ b/vl.c
@@ -4073,8 +4073,8 @@ static void help(int exitcode)
            "-monitor dev    redirect the monitor to char device 'dev'\n"
            "-pidfile file   write PID to 'file'\n"
            "-S              freeze CPU at startup (use 'c' to start execution)\n"
-           "-s              wait gdb connection to port\n"
-           "-p port         set gdb connection port [default=%s]\n"
+           "-gdb dev        wait for gdb connection on 'dev'\n"
+           "-s              shorthand for -gdb tcp::%s\n"
            "-d item1,...    output log to %s (use -d ? for a list of log items)\n"
            "-hdachs c,h,s[,t]\n"
            "                force hard disk 0 physical geometry and the optional BIOS\n"
@@ -4214,7 +4214,7 @@ enum {
     QEMU_OPTION_pidfile,
     QEMU_OPTION_S,
     QEMU_OPTION_s,
-    QEMU_OPTION_p,
+    QEMU_OPTION_gdb,
     QEMU_OPTION_d,
     QEMU_OPTION_hdachs,
     QEMU_OPTION_L,
@@ -4336,7 +4336,7 @@ static const QEMUOption qemu_options[] = {
     { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
     { "S", 0, QEMU_OPTION_S },
     { "s", 0, QEMU_OPTION_s },
-    { "p", HAS_ARG, QEMU_OPTION_p },
+    { "gdb", HAS_ARG, QEMU_OPTION_gdb },
     { "d", HAS_ARG, QEMU_OPTION_d },
     { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
     { "L", HAS_ARG, QEMU_OPTION_L },
@@ -4607,8 +4607,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 = NULL;
 #endif
     uint32_t boot_devices_bitmap = 0;
     int i;
@@ -4687,10 +4686,6 @@ int main(int argc, char **argv, char **envp)
     initrd_filename = NULL;
     ram_size = 0;
     vga_ram_size = VGA_RAM_SIZE;
-#ifdef CONFIG_GDBSTUB
-    use_gdbstub = 0;
-    gdbstub_port = DEFAULT_GDBSTUB_PORT;
-#endif
     snapshot = 0;
     nographic = 0;
     curses = 0;
@@ -5023,10 +5018,10 @@ int main(int argc, char **argv, char **envp)
                 break;
 #ifdef CONFIG_GDBSTUB
             case QEMU_OPTION_s:
-                use_gdbstub = 1;
+                gdbstub_dev = "tcp::" DEFAULT_GDBSTUB_PORT;
                 break;
-            case QEMU_OPTION_p:
-                gdbstub_port = optarg;
+            case QEMU_OPTION_gdb:
+                gdbstub_dev = optarg;
                 break;
 #endif
             case QEMU_OPTION_L:
@@ -5732,14 +5727,10 @@ int main(int argc, char **argv, char **envp)
     }
 
 #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
 

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 2/2 -v3] gdbstub: Rework configuration via command line and monitor
  2009-03-21  9:48 ` [Qemu-devel] [PATCH 2/2 -v2] " Jan Kiszka
@ 2009-03-21 10:36   ` Jan Kiszka
  2009-03-24 13:10   ` [Qemu-devel] [PATCH 2/2 -v2] " Paul Brook
  1 sibling, 0 replies; 8+ messages in thread
From: Jan Kiszka @ 2009-03-21 10:36 UTC (permalink / raw)
  To: qemu-devel

Jan Kiszka wrote:
> +@item -gdb @var{dev}
> +
> +Wait for gdb connection on device @var{dev} (@pxref{gdb_usage}). Typical
> +connections will likely be TCP-based, but also unix sockets or even stdio
> +are reasonable use case. The latter is allowing to start qemu from within
> +gdb and establish the connection via a pipe:
> +
> +(gdb) target remote | exec qemu -gdb stdio ...
> +

In fact, unix sockets are not supported by gdb, but udp or /dev/pts/n.

-------->

Introduce a more powerful 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 port 1234.

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 <jan.kiszka@siemens.com>
---

 gdbstub.c     |   41 +++++++++++++++++++++++++++--------------
 monitor.c     |   19 ++++++++++---------
 qemu-doc.texi |   14 ++++++++++++--
 vl.c          |   33 ++++++++++++---------------------
 4 files changed, 61 insertions(+), 46 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;
 }

-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 = 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;
+    if (!device)
+        return -1;
+    if (strcmp(device, "none") != 0) {
+        if (strstart(device, "tcp:", NULL)) {
+            /* enforce required TCP attributes */
+            snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
+                     "%s,nowait,nodelay,server", device);
+            device = gdbstub_device_name;
         }
+#ifndef _WIN32
+        else if (strcmp(device, "stdio") == 0) {
+            struct sigaction act;

-        chr = qemu_chr_open("gdb", port, NULL);
+            memset(&act, 0, sizeof(act));
+            act.sa_handler = gdb_sigterm_handler;
+            sigaction(SIGINT, &act, NULL);
+        }
+#endif
+        chr = qemu_chr_open("gdb", device, NULL);
         if (!chr)
             return -1;

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,
BlockDriverState *bs)
 }

 #ifdef CONFIG_GDBSTUB
-static void do_gdbserver(Monitor *mon, const char *port)
-{
-    if (!port)
-        port = 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") == 0) {
+static void do_gdbserver(Monitor *mon, const char *device)
+{
+    if (!device)
+        device = "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") == 0) {
         monitor_printf(mon, "Disabled gdbserver\n");
     } else {
-        monitor_printf(mon, "Waiting gdb connection on port '%s'\n", port);
+        monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
+                       device);
     }
 }
 #endif
diff --git a/qemu-doc.texi b/qemu-doc.texi
index 8efc943..8049a0d 100644
--- a/qemu-doc.texi
+++ b/qemu-doc.texi
@@ -1097,8 +1097,18 @@ from a script.
 @item -S
 Do not start CPU at startup (you must type 'c' in the monitor).

+@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:
+
+(gdb) target remote | exec qemu -gdb stdio ...
+
 @item -s
-Wait gdb connection to port 1234 (@pxref{gdb_usage}).
+Shorthand for -gdb tcp::1234, i.e. open a gdbserver on TCP port 1234
+(@pxref{gdb_usage}).

 @item -p @var{port}
 Change gdb connection port.  @var{port} can be either a decimal number
@@ -3114,7 +3124,7 @@ MV88W8xx8 Ethernet controller
 @item
 MV88W8618 audio controller, WM8750 CODEC and mixer
 @item
-128??64 display with brightness control
+128x64 display with brightness control
 @item
 2 buttons, 2 navigation wheels with button function
 @end itemize
diff --git a/vl.c b/vl.c
index abc7f5d..6e31a00 100644
--- a/vl.c
+++ b/vl.c
@@ -4073,8 +4073,8 @@ static void help(int exitcode)
            "-monitor dev    redirect the monitor to char device 'dev'\n"
            "-pidfile file   write PID to 'file'\n"
            "-S              freeze CPU at startup (use 'c' to start
execution)\n"
-           "-s              wait gdb connection to port\n"
-           "-p port         set gdb connection port [default=%s]\n"
+           "-gdb dev        wait for gdb connection on 'dev'\n"
+           "-s              shorthand for -gdb tcp::%s\n"
            "-d item1,...    output log to %s (use -d ? for a list of
log items)\n"
            "-hdachs c,h,s[,t]\n"
            "                force hard disk 0 physical geometry and the
optional BIOS\n"
@@ -4214,7 +4214,7 @@ enum {
     QEMU_OPTION_pidfile,
     QEMU_OPTION_S,
     QEMU_OPTION_s,
-    QEMU_OPTION_p,
+    QEMU_OPTION_gdb,
     QEMU_OPTION_d,
     QEMU_OPTION_hdachs,
     QEMU_OPTION_L,
@@ -4336,7 +4336,7 @@ static const QEMUOption qemu_options[] = {
     { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
     { "S", 0, QEMU_OPTION_S },
     { "s", 0, QEMU_OPTION_s },
-    { "p", HAS_ARG, QEMU_OPTION_p },
+    { "gdb", HAS_ARG, QEMU_OPTION_gdb },
     { "d", HAS_ARG, QEMU_OPTION_d },
     { "hdachs", HAS_ARG, QEMU_OPTION_hdachs },
     { "L", HAS_ARG, QEMU_OPTION_L },
@@ -4607,8 +4607,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 = NULL;
 #endif
     uint32_t boot_devices_bitmap = 0;
     int i;
@@ -4687,10 +4686,6 @@ int main(int argc, char **argv, char **envp)
     initrd_filename = NULL;
     ram_size = 0;
     vga_ram_size = VGA_RAM_SIZE;
-#ifdef CONFIG_GDBSTUB
-    use_gdbstub = 0;
-    gdbstub_port = DEFAULT_GDBSTUB_PORT;
-#endif
     snapshot = 0;
     nographic = 0;
     curses = 0;
@@ -5023,10 +5018,10 @@ int main(int argc, char **argv, char **envp)
                 break;
 #ifdef CONFIG_GDBSTUB
             case QEMU_OPTION_s:
-                use_gdbstub = 1;
+                gdbstub_dev = "tcp::" DEFAULT_GDBSTUB_PORT;
                 break;
-            case QEMU_OPTION_p:
-                gdbstub_port = optarg;
+            case QEMU_OPTION_gdb:
+                gdbstub_dev = optarg;
                 break;
 #endif
             case QEMU_OPTION_L:
@@ -5732,14 +5727,10 @@ int main(int argc, char **argv, char **envp)
     }

 #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

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2 -v2] gdbstub: Rework configuration via command line and monitor
  2009-03-21  9:48 ` [Qemu-devel] [PATCH 2/2 -v2] " Jan Kiszka
  2009-03-21 10:36   ` [Qemu-devel] [PATCH 2/2 -v3] " Jan Kiszka
@ 2009-03-24 13:10   ` Paul Brook
  2009-03-24 17:29     ` Jan Kiszka
  1 sibling, 1 reply; 8+ messages in thread
From: Paul Brook @ 2009-03-24 13:10 UTC (permalink / raw)
  To: qemu-devel; +Cc: Jan Kiszka

On Saturday 21 March 2009, Jan Kiszka wrote:
> Introduce a more powerful gdbstub configuration (system emulation olny)
> via 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 also remains to listen on port 1234.

I don't see how this is an improvement. In fact it provides less functionality 
than the current -p, which is also consistent with other similar qemu 
options.

Paul

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2 -v2] gdbstub: Rework configuration via command line and monitor
  2009-03-24 13:10   ` [Qemu-devel] [PATCH 2/2 -v2] " Paul Brook
@ 2009-03-24 17:29     ` Jan Kiszka
  0 siblings, 0 replies; 8+ messages in thread
From: Jan Kiszka @ 2009-03-24 17:29 UTC (permalink / raw)
  To: Paul Brook; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1119 bytes --]

Paul Brook wrote:
> On Saturday 21 March 2009, Jan Kiszka wrote:
>> Introduce a more powerful gdbstub configuration (system emulation olny)
>> via 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 also remains to listen on port 1234.
> 
> I don't see how this is an improvement. In fact it provides less functionality 
> than the current -p, which is also consistent with other similar qemu 
> options.

Hmm, I was not able to find any further examples for this mixture of
standard device syntax and special interpretation of numerical values -
even in the qemu-doc, the only place where the special case of 'port'
was mentioned.

So I still see this as a significant improvements as it
 - aligns -gdb to the standard syntax use in -monitor, -serial or
   -parallel, making the interface more intuitive
 - documents this properly

I will adjust description to clarify that this patch refactors the
existing feature into a canonical form, but does not actually add a new one.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] gdbstub: Rework configuration via command line and monitor
  2009-03-18 11:10 [Qemu-devel] [PATCH 2/2] gdbstub: Rework configuration via command line and monitor Jan Kiszka
  2009-03-21  9:48 ` [Qemu-devel] [PATCH 2/2 -v2] " Jan Kiszka
@ 2009-03-28 18:05 ` Anthony Liguori
  2009-03-30 16:05   ` [Qemu-devel] [PATCH v4] " Jan Kiszka
  1 sibling, 1 reply; 8+ messages in thread
From: Anthony Liguori @ 2009-03-28 18:05 UTC (permalink / raw)
  To: qemu-devel

Jan Kiszka wrote:
> diff --git a/vl.c b/vl.c
> index b62a2d4..d5c9e02 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4073,8 +4073,8 @@ static void help(int exitcode)
>             "-monitor dev    redirect the monitor to char device 'dev'\n"
>             "-pidfile file   write PID to 'file'\n"
>             "-S              freeze CPU at startup (use 'c' to start execution)\n"
> -           "-s              wait gdb connection to port\n"
> -           "-p port         set gdb connection port [default=%s]\n"
> +           "-gdb dev        wait for gdb connection on 'dev'\n"
> +           "-s              shorthand for -gdb tcp::%s\n"
>             "-d item1,...    output log to %s (use -d ? for a list of log items)\n"
>             "-hdachs c,h,s[,t]\n"
>             "                force hard disk 0 physical geometry and the optional BIOS\n"
>   

Can you rebase?  That will also get you the qemu-doc.texi documentation 
for free which was missing in this version of the patch.

Regards,

Anthony Liguori

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH v4] gdbstub: Rework configuration via command line and monitor
  2009-03-28 18:05 ` [Qemu-devel] [PATCH 2/2] " Anthony Liguori
@ 2009-03-30 16:05   ` Jan Kiszka
  2009-04-05 18:44     ` Anthony Liguori
  0 siblings, 1 reply; 8+ messages in thread
From: Jan Kiszka @ 2009-03-30 16:05 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 7059 bytes --]

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 <jan.kiszka@siemens.com>
---

 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;
 }
 
-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 = 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;
+    if (!device)
+        return -1;
+    if (strcmp(device, "none") != 0) {
+        if (strstart(device, "tcp:", NULL)) {
+            /* enforce required TCP attributes */
+            snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
+                     "%s,nowait,nodelay,server", device);
+            device = gdbstub_device_name;
         }
+#ifndef _WIN32
+        else if (strcmp(device, "stdio") == 0) {
+            struct sigaction act;
 
-        chr = qemu_chr_open("gdb", port, NULL);
+            memset(&act, 0, sizeof(act));
+            act.sa_handler = gdb_sigterm_handler;
+            sigaction(SIGINT, &act, NULL);
+        }
+#endif
+        chr = qemu_chr_open("gdb", device, NULL);
         if (!chr)
             return -1;
 
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, BlockDriverState *bs)
 }
 
 #ifdef CONFIG_GDBSTUB
-static void do_gdbserver(Monitor *mon, const char *port)
-{
-    if (!port)
-        port = 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") == 0) {
+static void do_gdbserver(Monitor *mon, const char *device)
+{
+    if (!device)
+        device = "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") == 0) {
         monitor_printf(mon, "Disabled gdbserver\n");
     } else {
-        monitor_printf(mon, "Waiting gdb connection on port '%s'\n", port);
+        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
 
-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
 
-DEF("p", HAS_ARG, QEMU_OPTION_p, \
-    "-p port         set gdb connection port [default=%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
 
 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 = NULL;
 #endif
     uint32_t boot_devices_bitmap = 0;
     int i;
@@ -4310,10 +4309,6 @@ int main(int argc, char **argv, char **envp)
     initrd_filename = NULL;
     ram_size = 0;
     vga_ram_size = VGA_RAM_SIZE;
-#ifdef CONFIG_GDBSTUB
-    use_gdbstub = 0;
-    gdbstub_port = DEFAULT_GDBSTUB_PORT;
-#endif
     snapshot = 0;
     nographic = 0;
     curses = 0;
@@ -4646,10 +4641,10 @@ int main(int argc, char **argv, char **envp)
                 break;
 #ifdef CONFIG_GDBSTUB
             case QEMU_OPTION_s:
-                use_gdbstub = 1;
+                gdbstub_dev = "tcp::" DEFAULT_GDBSTUB_PORT;
                 break;
-            case QEMU_OPTION_p:
-                gdbstub_port = optarg;
+            case QEMU_OPTION_gdb:
+                gdbstub_dev = optarg;
                 break;
 #endif
             case QEMU_OPTION_L:
@@ -5363,14 +5358,10 @@ int main(int argc, char **argv, char **envp)
     }
 
 #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
 


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH v4] gdbstub: Rework configuration via command line and monitor
  2009-03-30 16:05   ` [Qemu-devel] [PATCH v4] " Jan Kiszka
@ 2009-04-05 18:44     ` Anthony Liguori
  0 siblings, 0 replies; 8+ messages in thread
From: Anthony Liguori @ 2009-04-05 18:44 UTC (permalink / raw)
  To: qemu-devel

Jan Kiszka wrote:
> 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 <jan.kiszka@siemens.com>
>
>   
Applied.  Thanks.

-- 
Regards,

Anthony Liguori

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2009-04-05 18:44 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-18 11:10 [Qemu-devel] [PATCH 2/2] gdbstub: Rework configuration via command line and monitor Jan Kiszka
2009-03-21  9:48 ` [Qemu-devel] [PATCH 2/2 -v2] " Jan Kiszka
2009-03-21 10:36   ` [Qemu-devel] [PATCH 2/2 -v3] " Jan Kiszka
2009-03-24 13:10   ` [Qemu-devel] [PATCH 2/2 -v2] " Paul Brook
2009-03-24 17:29     ` Jan Kiszka
2009-03-28 18:05 ` [Qemu-devel] [PATCH 2/2] " Anthony Liguori
2009-03-30 16:05   ` [Qemu-devel] [PATCH v4] " Jan Kiszka
2009-04-05 18:44     ` Anthony Liguori

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).