* [RFC PATCH] testing: probe gdb for supported architectures ahead of time
@ 2023-01-05 18:15 Alex Bennée
2023-01-14 2:34 ` Richard Henderson
0 siblings, 1 reply; 2+ messages in thread
From: Alex Bennée @ 2023-01-05 18:15 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-s390x, Alex Bennée,
Richard Henderson, Paolo Bonzini
Currently when we encounter a gdb that is old or not built with
multiarch in mind we fail rather messily. Try and improve the
situation by probing ahead of time and setting
HOST_GDB_SUPPORTS_ARCH=y in the relevant tcg configs. We can then skip
and give a more meaningful message if we don't run the test.
[AJB: we still miss some arches, for example gdb uses s390 which fails
when we look for s390x. Not sure what the best way to deal with that
is? Maybe define a gdb_arch as we probe each target?]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Cc: Richard Henderson <richard.henderson@linaro.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
---
configure | 8 +++++
scripts/probe-gdb-support.sh | 36 +++++++++++++++++++
tests/tcg/aarch64/Makefile.target | 2 +-
tests/tcg/multiarch/Makefile.target | 5 +++
.../multiarch/system/Makefile.softmmu-target | 6 +++-
tests/tcg/s390x/Makefile.target | 2 +-
6 files changed, 56 insertions(+), 3 deletions(-)
create mode 100755 scripts/probe-gdb-support.sh
diff --git a/configure b/configure
index 9f0bc57546..ed3ace4bc7 100755
--- a/configure
+++ b/configure
@@ -230,6 +230,7 @@ stack_protector=""
safe_stack=""
use_containers="yes"
gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
+gdb_arches=""
if test -e "$source_path/.git"
then
@@ -2396,6 +2397,7 @@ if test -n "$gdb_bin"; then
gdb_version=$($gdb_bin --version | head -n 1)
if version_ge ${gdb_version##* } 9.1; then
echo "HAVE_GDB_BIN=$gdb_bin" >> $config_host_mak
+ gdb_arches=$("$source_path/scripts/probe-gdb-support.sh" $gdb_bin)
else
gdb_bin=""
fi
@@ -2519,6 +2521,12 @@ for target in $target_list; do
write_target_makefile "build-tcg-tests-$target" >> "$config_target_mak"
echo "BUILD_STATIC=$build_static" >> "$config_target_mak"
echo "QEMU=$PWD/$qemu" >> "$config_target_mak"
+
+ # will GDB work with these binaries?
+ if test "${gdb_arches#*$arch}" != "$gdb_arches"; then
+ echo "HOST_GDB_SUPPORTS_ARCH=y" >> "$config_target_mak"
+ fi
+
echo "run-tcg-tests-$target: $qemu\$(EXESUF)" >> Makefile.prereqs
tcg_tests_targets="$tcg_tests_targets $target"
fi
diff --git a/scripts/probe-gdb-support.sh b/scripts/probe-gdb-support.sh
new file mode 100755
index 0000000000..2b09a00a5b
--- /dev/null
+++ b/scripts/probe-gdb-support.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+# Probe gdb for supported architectures.
+#
+# This is required to support testing of the gdbstub as its hard to
+# handle errors gracefully during the test. Instead this script when
+# passed a GDB binary will probe its architecture support and return a
+# string of supported arches, stripped of guff.
+#
+# Copyright 2023 Linaro Ltd
+#
+# Author: Alex Bennée <alex.bennee@linaro.org>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or later.
+# See the COPYING file in the top-level directory.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+if test -z "$1"; then
+ echo "Usage: $0 /path/to/gdb"
+ exit 1
+fi
+
+# Start gdb with a set-architecture and capture the set of valid
+# options.
+
+valid_args=$($1 -ex "set architecture" -ex "quit" 2>&1 >/dev/null)
+
+# Strip off the preamble
+raw_arches=$(echo "${valid_args}" | sed "s/.*Valid arguments are \(.*\)/\1/")
+
+# Split into lines, strip everything after :foo and return final
+# "clean" list of supported arches.
+final_arches=$(echo "${raw_arches}" | tr ', ' '\n' | sed "s/:.*//" | sort | uniq)
+
+echo "$final_arches"
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
index fc8d90ed69..bb8d4f71b2 100644
--- a/tests/tcg/aarch64/Makefile.target
+++ b/tests/tcg/aarch64/Makefile.target
@@ -76,7 +76,7 @@ sha512-vector: sha512.c
TESTS += sha512-vector
-ifneq ($(HAVE_GDB_BIN),)
+ifeq ($(HOST_GDB_SUPPORTS_ARCH),y)
GDB_SCRIPT=$(SRC_PATH)/tests/guest-debug/run-test.py
run-gdbstub-sysregs: sysregs
diff --git a/tests/tcg/multiarch/Makefile.target b/tests/tcg/multiarch/Makefile.target
index 5f0fee1aad..25b15409be 100644
--- a/tests/tcg/multiarch/Makefile.target
+++ b/tests/tcg/multiarch/Makefile.target
@@ -52,6 +52,7 @@ run-test-mmap-%: test-mmap
$(call run-test, test-mmap-$*, $(QEMU) -p $* $<, $< ($* byte pages))
ifneq ($(HAVE_GDB_BIN),)
+ifeq ($(HOST_GDB_SUPPORTS_ARCH),y)
GDB_SCRIPT=$(SRC_PATH)/tests/guest-debug/run-test.py
run-gdbstub-sha1: sha1
@@ -75,6 +76,10 @@ run-gdbstub-thread-breakpoint: testthread
--bin $< --test $(MULTIARCH_SRC)/gdbstub/test-thread-breakpoint.py, \
hitting a breakpoint on non-main thread)
+else
+run-gdbstub-%:
+ $(call skip-test, "gdbstub test $*", "no guest arch support")
+endif
else
run-gdbstub-%:
$(call skip-test, "gdbstub test $*", "need working gdb")
diff --git a/tests/tcg/multiarch/system/Makefile.softmmu-target b/tests/tcg/multiarch/system/Makefile.softmmu-target
index 368b64d531..5f432c95f3 100644
--- a/tests/tcg/multiarch/system/Makefile.softmmu-target
+++ b/tests/tcg/multiarch/system/Makefile.softmmu-target
@@ -15,6 +15,7 @@ MULTIARCH_TEST_SRCS=$(wildcard $(MULTIARCH_SYSTEM_SRC)/*.c)
MULTIARCH_TESTS = $(patsubst $(MULTIARCH_SYSTEM_SRC)/%.c, %, $(MULTIARCH_TEST_SRCS))
ifneq ($(HAVE_GDB_BIN),)
+ifeq ($(HOST_GDB_SUPPORTS_ARCH),y)
GDB_SCRIPT=$(SRC_PATH)/tests/guest-debug/run-test.py
run-gdbstub-memory: memory
@@ -26,7 +27,10 @@ run-gdbstub-memory: memory
"-monitor none -display none -chardev file$(COMMA)path=$<.out$(COMMA)id=output $(QEMU_OPTS)" \
--bin $< --test $(MULTIARCH_SRC)/gdbstub/memory.py, \
softmmu gdbstub support)
-
+else
+run-gdbstub-%:
+ $(call skip-test, "gdbstub test $*", "no guest arch support")
+endif
else
run-gdbstub-%:
$(call skip-test, "gdbstub test $*", "need working gdb")
diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target
index 07fcc6d0ce..8759314d81 100644
--- a/tests/tcg/s390x/Makefile.target
+++ b/tests/tcg/s390x/Makefile.target
@@ -44,7 +44,7 @@ $(Z15_TESTS): CFLAGS+=-march=z15 -O2
TESTS+=$(Z15_TESTS)
endif
-ifneq ($(HAVE_GDB_BIN),)
+ifeq ($(HOST_GDB_SUPPORTS_ARCH),y)
GDB_SCRIPT=$(SRC_PATH)/tests/guest-debug/run-test.py
run-gdbstub-signals-s390x: signals-s390x
--
2.34.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [RFC PATCH] testing: probe gdb for supported architectures ahead of time
2023-01-05 18:15 [RFC PATCH] testing: probe gdb for supported architectures ahead of time Alex Bennée
@ 2023-01-14 2:34 ` Richard Henderson
0 siblings, 0 replies; 2+ messages in thread
From: Richard Henderson @ 2023-01-14 2:34 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-arm, qemu-ppc, qemu-s390x, Paolo Bonzini
On 1/5/23 10:15, Alex Bennée wrote:
> Currently when we encounter a gdb that is old or not built with
> multiarch in mind we fail rather messily. Try and improve the
> situation by probing ahead of time and setting
> HOST_GDB_SUPPORTS_ARCH=y in the relevant tcg configs. We can then skip
> and give a more meaningful message if we don't run the test.
>
> [AJB: we still miss some arches, for example gdb uses s390 which fails
> when we look for s390x. Not sure what the best way to deal with that
> is? Maybe define a gdb_arch as we probe each target?]
>
> Signed-off-by: Alex Bennée<alex.bennee@linaro.org>
> Cc: Richard Henderson<richard.henderson@linaro.org>
> Cc: Paolo Bonzini<pbonzini@redhat.com>
> ---
> configure | 8 +++++
> scripts/probe-gdb-support.sh | 36 +++++++++++++++++++
> tests/tcg/aarch64/Makefile.target | 2 +-
> tests/tcg/multiarch/Makefile.target | 5 +++
> .../multiarch/system/Makefile.softmmu-target | 6 +++-
> tests/tcg/s390x/Makefile.target | 2 +-
> 6 files changed, 56 insertions(+), 3 deletions(-)
> create mode 100755 scripts/probe-gdb-support.sh
Plausible as a mechanism.
I would say that your script would need to actually examine all of the 'set architecture'
output to map gdb arches to qemu arches. In particular, the :foo stuff is important.
E.g. mips:isa64 (amongst others) means mips64.
I can verify that I no longer get the MicroBlaze error with make check-tcg, so that part
of the patch works.
r~
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-01-14 2:35 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-01-05 18:15 [RFC PATCH] testing: probe gdb for supported architectures ahead of time Alex Bennée
2023-01-14 2:34 ` Richard Henderson
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).