[PATCH] gdbstub: Implement qGDBServerVersion packet

Dominik 'Disconnect3d' Czarnota posted 1 patch 7 months, 2 weeks ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20250403191340.53343-1-dominik.b.czarnota@gmail.com
Maintainers: "Alex Bennée" <alex.bennee@linaro.org>, "Philippe Mathieu-Daudé" <philmd@linaro.org>
gdbstub/gdbstub.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
[PATCH] gdbstub: Implement qGDBServerVersion packet
Posted by Dominik 'Disconnect3d' Czarnota 7 months, 2 weeks ago
This commit adds support for the `qGDBServerVersion` packet to the qemu
gdbstub  which could be used by clients to detect the QEMU version
(and, e.g., use a workaround for known bugs).

This packet is not documented/standarized by GDB but it was implemented
by LLDB gdbstub [0] and is helpful for projects like Pwndbg [1].

This has been implemented by Patryk, who I included in Co-authored-by
and who asked me to send the patch.

[0] https://lldb.llvm.org/resources/lldbgdbremote.html#qgdbserverversion
[1] https://github.com/pwndbg/pwndbg/issues/2648

Co-authored-by: Patryk 'patryk4815' Sondej <patryk.sondej@gmail.com>
Signed-off-by: Dominik 'Disconnect3d' Czarnota <dominik.b.czarnota@gmail.com>
---
 gdbstub/gdbstub.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
index 282e13e163..8d616a7f52 100644
--- a/gdbstub/gdbstub.c
+++ b/gdbstub/gdbstub.c
@@ -1582,6 +1582,16 @@ static void handle_query_threads(GArray *params, void *user_ctx)
     gdbserver_state.query_cpu = gdb_next_attached_cpu(gdbserver_state.query_cpu);
 }
 
+static void handle_query_gdb_server_version(GArray *params, void *user_ctx)
+{
+#if defined(CONFIG_USER_ONLY)
+    g_string_printf(gdbserver_state.str_buf, "name:qemu-%s;version:%s;", target_name(), QEMU_VERSION);
+#else
+    g_string_printf(gdbserver_state.str_buf, "name:qemu-system-%s;version:%s;", target_name(), QEMU_VERSION);
+#endif
+    gdb_put_strbuf();
+}
+
 static void handle_query_first_threads(GArray *params, void *user_ctx)
 {
     gdbserver_state.query_cpu = gdb_first_attached_cpu();
@@ -1827,6 +1837,10 @@ static const GdbCmdParseEntry gdb_gen_query_table[] = {
         .handler = handle_query_threads,
         .cmd = "sThreadInfo",
     },
+    {
+        .handler = handle_query_gdb_server_version,
+        .cmd = "GDBServerVersion",
+    },
     {
         .handler = handle_query_first_threads,
         .cmd = "fThreadInfo",
-- 
2.30.2
Re: [PATCH] gdbstub: Implement qGDBServerVersion packet
Posted by Alex Bennée 6 months, 2 weeks ago
Dominik 'Disconnect3d' Czarnota <dominik.b.czarnota@gmail.com> writes:

> This commit adds support for the `qGDBServerVersion` packet to the qemu
> gdbstub  which could be used by clients to detect the QEMU version
> (and, e.g., use a workaround for known bugs).
>
> This packet is not documented/standarized by GDB but it was implemented
> by LLDB gdbstub [0] and is helpful for projects like Pwndbg [1].
>
> This has been implemented by Patryk, who I included in Co-authored-by
> and who asked me to send the patch.
>
> [0] https://lldb.llvm.org/resources/lldbgdbremote.html#qgdbserverversion
> [1] https://github.com/pwndbg/pwndbg/issues/2648
>
> Co-authored-by: Patryk 'patryk4815' Sondej <patryk.sondej@gmail.com>
> Signed-off-by: Dominik 'Disconnect3d' Czarnota
> <dominik.b.czarnota@gmail.com>

Hmm:

cc -m64 -Ilibuser.a.p -I. -I../.. -Iqapi -Itrace -Iui -Iui/shader -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -fdiagnostics-color=auto -Wall -Winvalid-pch -Werror -std=gnu11 -O2 -g -fstack-protector-strong -Wempty-body -Wendif-labels -Wexpansion-to-defined -Wformat-security -Wformat-y2k -Wignored-qualifiers -Wimplicit-fallthrough=2 -Winit-self -Wmissing-format-attribute -Wmissing-prototypes -Wnested-externs -Wold-style-declaration -Wold-style-definition -Wredundant-decls -Wshadow=local -Wstrict-prototypes -Wtype-limits -Wundef -Wvla -Wwrite-strings -Wno-missing-include-dirs -Wno-psabi -Wno-shift-negative-value -isystem /home/alex/lsrc/qemu.git/linux-headers -isystem linux-headers -iquote . -iquote /home/alex/lsrc/qemu.git -iquote /home/alex/lsrc/qemu.git/include -iquote /home/alex/lsrc/qemu.git/host/include/x86_64 -iquote /home/alex/lsrc/qemu.git/host/include/generic -iquote /home/alex/lsrc/qemu.git/tcg/i386 -pthread -mcx16 -msse2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fno-common -fwrapv -ftrivial-auto-var-init=zero -fzero-call-used-regs=used-gpr -fPIE -DCONFIG_USER_ONLY -DCOMPILING_SYSTEM_VS_USER -MD -MQ libuser.a.p/gdbstub_gdbstub.c.o -MF libuser.a.p/gdbstub_gdbstub.c.o.d -o libuser.a.p/gdbstub_gdbstub.c.o -c ../../gdbstub/gdbstub.c
../../gdbstub/gdbstub.c: In function ‘handle_query_gdb_server_version’:
../../gdbstub/gdbstub.c:1603:74: error: implicit declaration of function ‘target_name’ [-Werror=implicit-function-declaration]
 1603 |     g_string_printf(gdbserver_state.str_buf, "name:qemu-%s;version:%s;", target_name(), QEMU_VERSION);
      |                                                                          ^~~~~~~~~~~
../../gdbstub/gdbstub.c:1603:74: error: nested extern declaration of ‘target_name’ [-Werror=nested-externs]
../../gdbstub/gdbstub.c:1603:46: error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=]
 1603 |     g_string_printf(gdbserver_state.str_buf, "name:qemu-%s;version:%s;", target_name(), QEMU_VERSION);
      |                                              ^~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~
      |                                                                          |
      |                                                                          int
cc1: all warnings being treated as errors

where did target_name() come from and/or go to?

> ---
>  gdbstub/gdbstub.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
>
> diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
> index 282e13e163..8d616a7f52 100644
> --- a/gdbstub/gdbstub.c
> +++ b/gdbstub/gdbstub.c
> @@ -1582,6 +1582,16 @@ static void handle_query_threads(GArray *params, void *user_ctx)
>      gdbserver_state.query_cpu = gdb_next_attached_cpu(gdbserver_state.query_cpu);
>  }
>  
> +static void handle_query_gdb_server_version(GArray *params, void *user_ctx)
> +{
> +#if defined(CONFIG_USER_ONLY)
> +    g_string_printf(gdbserver_state.str_buf, "name:qemu-%s;version:%s;", target_name(), QEMU_VERSION);
> +#else
> +    g_string_printf(gdbserver_state.str_buf, "name:qemu-system-%s;version:%s;", target_name(), QEMU_VERSION);
> +#endif
> +    gdb_put_strbuf();
> +}
> +
>  static void handle_query_first_threads(GArray *params, void *user_ctx)
>  {
>      gdbserver_state.query_cpu = gdb_first_attached_cpu();
> @@ -1827,6 +1837,10 @@ static const GdbCmdParseEntry gdb_gen_query_table[] = {
>          .handler = handle_query_threads,
>          .cmd = "sThreadInfo",
>      },
> +    {
> +        .handler = handle_query_gdb_server_version,
> +        .cmd = "GDBServerVersion",
> +    },
>      {
>          .handler = handle_query_first_threads,
>          .cmd = "fThreadInfo",

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro
Re: [PATCH] gdbstub: Implement qGDBServerVersion packet
Posted by Alex Bennée 6 months ago
Alex Bennée <alex.bennee@linaro.org> writes:

> Dominik 'Disconnect3d' Czarnota <dominik.b.czarnota@gmail.com> writes:
>
>> This commit adds support for the `qGDBServerVersion` packet to the qemu
>> gdbstub  which could be used by clients to detect the QEMU version
>> (and, e.g., use a workaround for known bugs).
>>
>> This packet is not documented/standarized by GDB but it was implemented
>> by LLDB gdbstub [0] and is helpful for projects like Pwndbg [1].
>>
>> This has been implemented by Patryk, who I included in Co-authored-by
>> and who asked me to send the patch.
>>
>> [0] https://lldb.llvm.org/resources/lldbgdbremote.html#qgdbserverversion
>> [1] https://github.com/pwndbg/pwndbg/issues/2648
>>
>> Co-authored-by: Patryk 'patryk4815' Sondej <patryk.sondej@gmail.com>
>> Signed-off-by: Dominik 'Disconnect3d' Czarnota
>> <dominik.b.czarnota@gmail.com>
>
> Hmm:
>
> cc -m64 -Ilibuser.a.p -I. -I../.. -Iqapi -Itrace -Iui -Iui/shader
> -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
> -fdiagnostics-color=auto -Wall -Winvalid-pch -Werror -std=gnu11 -O2 -g
> -fstack-protector-strong -Wempty-body -Wendif-labels
> -Wexpansion-to-defined -Wformat-security -Wformat-y2k
> -Wignored-qualifiers -Wimplicit-fallthrough=2 -Winit-self
> -Wmissing-format-attribute -Wmissing-prototypes -Wnested-externs
> -Wold-style-declaration -Wold-style-definition -Wredundant-decls
> -Wshadow=local -Wstrict-prototypes -Wtype-limits -Wundef -Wvla
> -Wwrite-strings -Wno-missing-include-dirs -Wno-psabi
> -Wno-shift-negative-value -isystem
> /home/alex/lsrc/qemu.git/linux-headers -isystem linux-headers -iquote
> . -iquote /home/alex/lsrc/qemu.git -iquote
> /home/alex/lsrc/qemu.git/include -iquote
> /home/alex/lsrc/qemu.git/host/include/x86_64 -iquote
> /home/alex/lsrc/qemu.git/host/include/generic -iquote
> /home/alex/lsrc/qemu.git/tcg/i386 -pthread -mcx16 -msse2 -D_GNU_SOURCE
> -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing
> -fno-common -fwrapv -ftrivial-auto-var-init=zero
> -fzero-call-used-regs=used-gpr -fPIE -DCONFIG_USER_ONLY
> -DCOMPILING_SYSTEM_VS_USER -MD -MQ libuser.a.p/gdbstub_gdbstub.c.o -MF
> libuser.a.p/gdbstub_gdbstub.c.o.d -o libuser.a.p/gdbstub_gdbstub.c.o
> -c ../../gdbstub/gdbstub.c
> ../../gdbstub/gdbstub.c: In function ‘handle_query_gdb_server_version’:
> ../../gdbstub/gdbstub.c:1603:74: error: implicit declaration of function ‘target_name’ [-Werror=implicit-function-declaration]
>  1603 |     g_string_printf(gdbserver_state.str_buf, "name:qemu-%s;version:%s;", target_name(), QEMU_VERSION);
>       |                                                                          ^~~~~~~~~~~
> ../../gdbstub/gdbstub.c:1603:74: error: nested extern declaration of ‘target_name’ [-Werror=nested-externs]
> ../../gdbstub/gdbstub.c:1603:46: error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=]
>  1603 |     g_string_printf(gdbserver_state.str_buf, "name:qemu-%s;version:%s;", target_name(), QEMU_VERSION);
>       |                                              ^~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~
>       |                                                                          |
>       |                                                                          int
> cc1: all warnings being treated as errors
>
> where did target_name() come from and/or go to?

I fixed the include so queued to gdbstub/next, thanks.

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro
Re: [PATCH] gdbstub: Implement qGDBServerVersion packet
Posted by Dominik Czarnota 6 months ago
Thanks!

On Mon, 19 May 2025 at 14:59, Alex Bennée <alex.bennee@linaro.org> wrote:

> Alex Bennée <alex.bennee@linaro.org> writes:
>
> > Dominik 'Disconnect3d' Czarnota <dominik.b.czarnota@gmail.com> writes:
> >
> >> This commit adds support for the `qGDBServerVersion` packet to the qemu
> >> gdbstub  which could be used by clients to detect the QEMU version
> >> (and, e.g., use a workaround for known bugs).
> >>
> >> This packet is not documented/standarized by GDB but it was implemented
> >> by LLDB gdbstub [0] and is helpful for projects like Pwndbg [1].
> >>
> >> This has been implemented by Patryk, who I included in Co-authored-by
> >> and who asked me to send the patch.
> >>
> >> [0]
> https://lldb.llvm.org/resources/lldbgdbremote.html#qgdbserverversion
> >> [1] https://github.com/pwndbg/pwndbg/issues/2648
> >>
> >> Co-authored-by: Patryk 'patryk4815' Sondej <patryk.sondej@gmail.com>
> >> Signed-off-by: Dominik 'Disconnect3d' Czarnota
> >> <dominik.b.czarnota@gmail.com>
> >
> > Hmm:
> >
> > cc -m64 -Ilibuser.a.p -I. -I../.. -Iqapi -Itrace -Iui -Iui/shader
> > -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
> > -fdiagnostics-color=auto -Wall -Winvalid-pch -Werror -std=gnu11 -O2 -g
> > -fstack-protector-strong -Wempty-body -Wendif-labels
> > -Wexpansion-to-defined -Wformat-security -Wformat-y2k
> > -Wignored-qualifiers -Wimplicit-fallthrough=2 -Winit-self
> > -Wmissing-format-attribute -Wmissing-prototypes -Wnested-externs
> > -Wold-style-declaration -Wold-style-definition -Wredundant-decls
> > -Wshadow=local -Wstrict-prototypes -Wtype-limits -Wundef -Wvla
> > -Wwrite-strings -Wno-missing-include-dirs -Wno-psabi
> > -Wno-shift-negative-value -isystem
> > /home/alex/lsrc/qemu.git/linux-headers -isystem linux-headers -iquote
> > . -iquote /home/alex/lsrc/qemu.git -iquote
> > /home/alex/lsrc/qemu.git/include -iquote
> > /home/alex/lsrc/qemu.git/host/include/x86_64 -iquote
> > /home/alex/lsrc/qemu.git/host/include/generic -iquote
> > /home/alex/lsrc/qemu.git/tcg/i386 -pthread -mcx16 -msse2 -D_GNU_SOURCE
> > -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing
> > -fno-common -fwrapv -ftrivial-auto-var-init=zero
> > -fzero-call-used-regs=used-gpr -fPIE -DCONFIG_USER_ONLY
> > -DCOMPILING_SYSTEM_VS_USER -MD -MQ libuser.a.p/gdbstub_gdbstub.c.o -MF
> > libuser.a.p/gdbstub_gdbstub.c.o.d -o libuser.a.p/gdbstub_gdbstub.c.o
> > -c ../../gdbstub/gdbstub.c
> > ../../gdbstub/gdbstub.c: In function ‘handle_query_gdb_server_version’:
> > ../../gdbstub/gdbstub.c:1603:74: error: implicit declaration of function
> ‘target_name’ [-Werror=implicit-function-declaration]
> >  1603 |     g_string_printf(gdbserver_state.str_buf,
> "name:qemu-%s;version:%s;", target_name(), QEMU_VERSION);
> >       |
>         ^~~~~~~~~~~
> > ../../gdbstub/gdbstub.c:1603:74: error: nested extern declaration of
> ‘target_name’ [-Werror=nested-externs]
> > ../../gdbstub/gdbstub.c:1603:46: error: format ‘%s’ expects argument of
> type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=]
> >  1603 |     g_string_printf(gdbserver_state.str_buf,
> "name:qemu-%s;version:%s;", target_name(), QEMU_VERSION);
> >       |
> ^~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~
> >       |
>         |
> >       |
>         int
> > cc1: all warnings being treated as errors
> >
> > where did target_name() come from and/or go to?
>
> I fixed the include so queued to gdbstub/next, thanks.
>
> --
> Alex Bennée
> Virtualisation Tech Lead @ Linaro
>