Message ID | 20230606132743.1386003-9-iii@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | gdbstub: Add support for info proc mappings | expand |
Ilya Leoshkevich <iii@linux.ibm.com> writes: > Add a small test to prevent regressions. > Since there are issues with how GDB interprets QEMU's target.xml, > enable the test only on aarch64 and s390x for now. > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > tests/tcg/aarch64/Makefile.target | 3 +- > tests/tcg/multiarch/Makefile.target | 7 +++ > .../multiarch/gdbstub/test-proc-mappings.py | 55 +++++++++++++++++++ > tests/tcg/s390x/Makefile.target | 2 +- > 4 files changed, 65 insertions(+), 2 deletions(-) > create mode 100644 tests/tcg/multiarch/gdbstub/test-proc-mappings.py > > diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target > index 03157954871..38402b0ba1f 100644 > --- a/tests/tcg/aarch64/Makefile.target > +++ b/tests/tcg/aarch64/Makefile.target > @@ -97,7 +97,8 @@ run-gdbstub-sve-ioctls: sve-ioctls > --bin $< --test $(AARCH64_SRC)/gdbstub/test-sve-ioctl.py, \ > basic gdbstub SVE ZLEN support) > > -EXTRA_RUNS += run-gdbstub-sysregs run-gdbstub-sve-ioctls > +EXTRA_RUNS += run-gdbstub-sysregs run-gdbstub-sve-ioctls \ > + run-gdbstub-proc-mappings > endif > endif > > diff --git a/tests/tcg/multiarch/Makefile.target b/tests/tcg/multiarch/Makefile.target > index 373db696481..cbc0b75787a 100644 > --- a/tests/tcg/multiarch/Makefile.target > +++ b/tests/tcg/multiarch/Makefile.target > @@ -81,6 +81,13 @@ run-gdbstub-qxfer-auxv-read: sha1 > --bin $< --test $(MULTIARCH_SRC)/gdbstub/test-qxfer-auxv-read.py, \ > basic gdbstub qXfer:auxv:read support) > > +run-gdbstub-proc-mappings: sha1 > + $(call run-test, $@, $(GDB_SCRIPT) \ > + --gdb $(HAVE_GDB_BIN) \ > + --qemu $(QEMU) --qargs "$(QEMU_OPTS)" \ > + --bin $< --test $(MULTIARCH_SRC)/gdbstub/test-proc-mappings.py, \ > + proc mappings support) > + I wondered if it makes more sense to keep the extra test configuration logic in multiarch: run-gdbstub-proc-mappings: sha1 $(call run-test, $@, $(GDB_SCRIPT) \ --gdb $(HAVE_GDB_BIN) \ --qemu $(QEMU) --qargs "$(QEMU_OPTS)" \ --bin $< --test $(MULTIARCH_SRC)/gdbstub/test-proc-mappings.py, \ proc mappings support) # only enable for s390x and aarch64 for now ifneq (,$(findstring aarch64,$(TARGET_NAME))) EXTRA_RUNS += run-gdbstub-proc-mappings else ifneq (,$(findstring s390x,$(TARGET_NAME))) EXTRA_RUNS += run-gdbstub-proc-mappings endif but it still ends up pretty ugly. Is the gdb handling fixed for other arches in other versions. Maybe we could probe gdb for support and wrap the whole stanza in something like: ifeq ($(HOST_GDB_SUPPORTS_PROC_MAPPING),y) ... endif ?
On Wed, 2023-06-21 at 11:21 +0100, Alex Bennée wrote: > > Ilya Leoshkevich <iii@linux.ibm.com> writes: > > > Add a small test to prevent regressions. > > Since there are issues with how GDB interprets QEMU's target.xml, > > enable the test only on aarch64 and s390x for now. > > > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > > --- > > tests/tcg/aarch64/Makefile.target | 3 +- > > tests/tcg/multiarch/Makefile.target | 7 +++ > > .../multiarch/gdbstub/test-proc-mappings.py | 55 > > +++++++++++++++++++ > > tests/tcg/s390x/Makefile.target | 2 +- > > 4 files changed, 65 insertions(+), 2 deletions(-) > > create mode 100644 tests/tcg/multiarch/gdbstub/test-proc- > > mappings.py > > > > diff --git a/tests/tcg/aarch64/Makefile.target > > b/tests/tcg/aarch64/Makefile.target > > index 03157954871..38402b0ba1f 100644 > > --- a/tests/tcg/aarch64/Makefile.target > > +++ b/tests/tcg/aarch64/Makefile.target > > @@ -97,7 +97,8 @@ run-gdbstub-sve-ioctls: sve-ioctls > > --bin $< --test $(AARCH64_SRC)/gdbstub/test-sve- > > ioctl.py, \ > > basic gdbstub SVE ZLEN support) > > > > -EXTRA_RUNS += run-gdbstub-sysregs run-gdbstub-sve-ioctls > > +EXTRA_RUNS += run-gdbstub-sysregs run-gdbstub-sve-ioctls \ > > + run-gdbstub-proc-mappings > > endif > > endif > > > > diff --git a/tests/tcg/multiarch/Makefile.target > > b/tests/tcg/multiarch/Makefile.target > > index 373db696481..cbc0b75787a 100644 > > --- a/tests/tcg/multiarch/Makefile.target > > +++ b/tests/tcg/multiarch/Makefile.target > > @@ -81,6 +81,13 @@ run-gdbstub-qxfer-auxv-read: sha1 > > --bin $< --test $(MULTIARCH_SRC)/gdbstub/test- > > qxfer-auxv-read.py, \ > > basic gdbstub qXfer:auxv:read support) > > > > +run-gdbstub-proc-mappings: sha1 > > + $(call run-test, $@, $(GDB_SCRIPT) \ > > + --gdb $(HAVE_GDB_BIN) \ > > + --qemu $(QEMU) --qargs "$(QEMU_OPTS)" \ > > + --bin $< --test $(MULTIARCH_SRC)/gdbstub/test-proc- > > mappings.py, \ > > + proc mappings support) > > + > > I wondered if it makes more sense to keep the extra test > configuration > logic in multiarch: > > run-gdbstub-proc-mappings: sha1 > $(call run-test, $@, $(GDB_SCRIPT) \ > --gdb $(HAVE_GDB_BIN) \ > --qemu $(QEMU) --qargs "$(QEMU_OPTS)" \ > --bin $< --test $(MULTIARCH_SRC)/gdbstub/test-proc- > mappings.py, \ > proc mappings support) > > # only enable for s390x and aarch64 for now > ifneq (,$(findstring aarch64,$(TARGET_NAME))) > EXTRA_RUNS += run-gdbstub-proc-mappings > else ifneq (,$(findstring s390x,$(TARGET_NAME))) > EXTRA_RUNS += run-gdbstub-proc-mappings > endif > > but it still ends up pretty ugly. Is the gdb handling fixed for other > arches in other versions. Maybe we could probe gdb for support and > wrap > the whole stanza in something like: > > ifeq ($(HOST_GDB_SUPPORTS_PROC_MAPPING),y) > ... > endif > > ? I think I better add the check to the test itself, because otherwise we have to probe GDB against QEMU binary we just built, which sounds unnecessarily complicated. The error message on all arches without this series is: warning: unable to open /proc file '/proc/1/maps' The error message on x86_64 (expected) with this series is: Not supported on this target. So we can simply exit(0) from the test if we see this.
Ilya Leoshkevich <iii@linux.ibm.com> writes: > On Wed, 2023-06-21 at 11:21 +0100, Alex Bennée wrote: >> >> Ilya Leoshkevich <iii@linux.ibm.com> writes: >> >> > Add a small test to prevent regressions. >> > Since there are issues with how GDB interprets QEMU's target.xml, >> > enable the test only on aarch64 and s390x for now. >> > >> > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> >> > --- >> > tests/tcg/aarch64/Makefile.target | 3 +- >> > tests/tcg/multiarch/Makefile.target | 7 +++ >> > .../multiarch/gdbstub/test-proc-mappings.py | 55 >> > +++++++++++++++++++ >> > tests/tcg/s390x/Makefile.target | 2 +- >> > 4 files changed, 65 insertions(+), 2 deletions(-) >> > create mode 100644 tests/tcg/multiarch/gdbstub/test-proc- >> > mappings.py >> > >> > diff --git a/tests/tcg/aarch64/Makefile.target >> > b/tests/tcg/aarch64/Makefile.target >> > index 03157954871..38402b0ba1f 100644 >> > --- a/tests/tcg/aarch64/Makefile.target >> > +++ b/tests/tcg/aarch64/Makefile.target >> > @@ -97,7 +97,8 @@ run-gdbstub-sve-ioctls: sve-ioctls >> > --bin $< --test $(AARCH64_SRC)/gdbstub/test-sve- >> > ioctl.py, \ >> > basic gdbstub SVE ZLEN support) >> > >> > -EXTRA_RUNS += run-gdbstub-sysregs run-gdbstub-sve-ioctls >> > +EXTRA_RUNS += run-gdbstub-sysregs run-gdbstub-sve-ioctls \ >> > + run-gdbstub-proc-mappings >> > endif >> > endif >> > >> > diff --git a/tests/tcg/multiarch/Makefile.target >> > b/tests/tcg/multiarch/Makefile.target >> > index 373db696481..cbc0b75787a 100644 >> > --- a/tests/tcg/multiarch/Makefile.target >> > +++ b/tests/tcg/multiarch/Makefile.target >> > @@ -81,6 +81,13 @@ run-gdbstub-qxfer-auxv-read: sha1 >> > --bin $< --test $(MULTIARCH_SRC)/gdbstub/test- >> > qxfer-auxv-read.py, \ >> > basic gdbstub qXfer:auxv:read support) >> > >> > +run-gdbstub-proc-mappings: sha1 >> > + $(call run-test, $@, $(GDB_SCRIPT) \ >> > + --gdb $(HAVE_GDB_BIN) \ >> > + --qemu $(QEMU) --qargs "$(QEMU_OPTS)" \ >> > + --bin $< --test $(MULTIARCH_SRC)/gdbstub/test-proc- >> > mappings.py, \ >> > + proc mappings support) >> > + >> >> I wondered if it makes more sense to keep the extra test >> configuration >> logic in multiarch: >> >> run-gdbstub-proc-mappings: sha1 >> $(call run-test, $@, $(GDB_SCRIPT) \ >> --gdb $(HAVE_GDB_BIN) \ >> --qemu $(QEMU) --qargs "$(QEMU_OPTS)" \ >> --bin $< --test $(MULTIARCH_SRC)/gdbstub/test-proc- >> mappings.py, \ >> proc mappings support) >> >> # only enable for s390x and aarch64 for now >> ifneq (,$(findstring aarch64,$(TARGET_NAME))) >> EXTRA_RUNS += run-gdbstub-proc-mappings >> else ifneq (,$(findstring s390x,$(TARGET_NAME))) >> EXTRA_RUNS += run-gdbstub-proc-mappings >> endif >> >> but it still ends up pretty ugly. Is the gdb handling fixed for other >> arches in other versions. Maybe we could probe gdb for support and >> wrap >> the whole stanza in something like: >> >> ifeq ($(HOST_GDB_SUPPORTS_PROC_MAPPING),y) >> ... >> endif >> >> ? > > I think I better add the check to the test itself, because otherwise we > have to probe GDB against QEMU binary we just built, which sounds > unnecessarily complicated. > > The error message on all arches without this series is: > > warning: unable to open /proc file '/proc/1/maps' > > The error message on x86_64 (expected) with this series is: > > Not supported on this target. > > So we can simply exit(0) from the test if we see this. That seems a simpler solution, lets do that.
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target index 03157954871..38402b0ba1f 100644 --- a/tests/tcg/aarch64/Makefile.target +++ b/tests/tcg/aarch64/Makefile.target @@ -97,7 +97,8 @@ run-gdbstub-sve-ioctls: sve-ioctls --bin $< --test $(AARCH64_SRC)/gdbstub/test-sve-ioctl.py, \ basic gdbstub SVE ZLEN support) -EXTRA_RUNS += run-gdbstub-sysregs run-gdbstub-sve-ioctls +EXTRA_RUNS += run-gdbstub-sysregs run-gdbstub-sve-ioctls \ + run-gdbstub-proc-mappings endif endif diff --git a/tests/tcg/multiarch/Makefile.target b/tests/tcg/multiarch/Makefile.target index 373db696481..cbc0b75787a 100644 --- a/tests/tcg/multiarch/Makefile.target +++ b/tests/tcg/multiarch/Makefile.target @@ -81,6 +81,13 @@ run-gdbstub-qxfer-auxv-read: sha1 --bin $< --test $(MULTIARCH_SRC)/gdbstub/test-qxfer-auxv-read.py, \ basic gdbstub qXfer:auxv:read support) +run-gdbstub-proc-mappings: sha1 + $(call run-test, $@, $(GDB_SCRIPT) \ + --gdb $(HAVE_GDB_BIN) \ + --qemu $(QEMU) --qargs "$(QEMU_OPTS)" \ + --bin $< --test $(MULTIARCH_SRC)/gdbstub/test-proc-mappings.py, \ + proc mappings support) + run-gdbstub-thread-breakpoint: testthread $(call run-test, $@, $(GDB_SCRIPT) \ --gdb $(HAVE_GDB_BIN) \ diff --git a/tests/tcg/multiarch/gdbstub/test-proc-mappings.py b/tests/tcg/multiarch/gdbstub/test-proc-mappings.py new file mode 100644 index 00000000000..657e36a2fc7 --- /dev/null +++ b/tests/tcg/multiarch/gdbstub/test-proc-mappings.py @@ -0,0 +1,55 @@ +"""Test that gdbstub has access to proc mappings. + +This runs as a sourced script (via -x, via run-test.py).""" +from __future__ import print_function +import gdb +import sys + + +n_failures = 0 + + +def report(cond, msg): + """Report success/fail of a test""" + if cond: + print("PASS: {}".format(msg)) + else: + print("FAIL: {}".format(msg)) + global n_failures + n_failures += 1 + + +def run_test(): + """Run through the tests one by one""" + mappings = gdb.execute("info proc mappings", False, True) + report(isinstance(mappings, str), "Fetched the mappings from the inferior") + report("/sha1" in mappings, "Found the test binary name in the mappings") + + +def main(): + """Prepare the environment and run through the tests""" + try: + inferior = gdb.selected_inferior() + print("ATTACHED: {}".format(inferior.architecture().name())) + except (gdb.error, AttributeError): + print("SKIPPING (not connected)") + exit(0) + + if gdb.parse_and_eval('$pc') == 0: + print("SKIP: PC not set") + exit(0) + + try: + # These are not very useful in scripts + gdb.execute("set pagination off") + gdb.execute("set confirm off") + + # Run the actual tests + run_test() + except gdb.error: + report(False, "GDB Exception: {}".format(sys.exc_info()[0])) + print("All tests complete: %d failures" % n_failures) + exit(n_failures) + + +main() diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target index 4899503e1db..d33960caa0a 100644 --- a/tests/tcg/s390x/Makefile.target +++ b/tests/tcg/s390x/Makefile.target @@ -78,7 +78,7 @@ run-gdbstub-signals-s390x: signals-s390x --bin $< --test $(S390X_SRC)/gdbstub/test-signals-s390x.py, \ mixing signals and debugging) -EXTRA_RUNS += run-gdbstub-signals-s390x +EXTRA_RUNS += run-gdbstub-signals-s390x run-gdbstub-proc-mappings endif # MVX versions of sha512
Add a small test to prevent regressions. Since there are issues with how GDB interprets QEMU's target.xml, enable the test only on aarch64 and s390x for now. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- tests/tcg/aarch64/Makefile.target | 3 +- tests/tcg/multiarch/Makefile.target | 7 +++ .../multiarch/gdbstub/test-proc-mappings.py | 55 +++++++++++++++++++ tests/tcg/s390x/Makefile.target | 2 +- 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 tests/tcg/multiarch/gdbstub/test-proc-mappings.py