Message ID | 20200316172155.971-24-alex.bennee@linaro.org |
---|---|
State | New |
Headers | show |
Series | testing and gdbstub | expand |
On 3/16/20 6:21 PM, Alex Bennée wrote: > A very simple test case which sets and reads SVE registers while > running a test case. We don't really need to compile a SVE binary for > this case but we will later so keep it simple for now. > > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> > > --- > v5 > - properly plumb in > - skip if fails to connect > --- > tests/.gitignore | 1 + > tests/tcg/aarch64/Makefile.target | 15 +++++ > tests/tcg/aarch64/gdbstub/test-sve.py | 81 +++++++++++++++++++++++++++ > 3 files changed, 97 insertions(+) > create mode 100644 tests/tcg/aarch64/gdbstub/test-sve.py > > diff --git a/tests/.gitignore b/tests/.gitignore > index 7306866f216..d03c037d772 100644 > --- a/tests/.gitignore > +++ b/tests/.gitignore > @@ -10,6 +10,7 @@ qht-bench > rcutorture > test-* > !test-*.c > +!test-*.py > !docker/test-* > test-qapi-commands.[ch] > test-qapi-init-commands.[ch] > diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target > index a25afc071cc..b61b53e4dd1 100644 > --- a/tests/tcg/aarch64/Makefile.target > +++ b/tests/tcg/aarch64/Makefile.target > @@ -46,6 +46,21 @@ ifneq ($(DOCKER_IMAGE)$(CROSS_CC_HAS_SVE),) > # System Registers Tests > AARCH64_TESTS += sysregs > sysregs: CFLAGS+=-march=armv8.1-a+sve > + > +ifneq ($(HAVE_GDB_BIN),) > +GDB_SCRIPT=$(SRC_PATH)/tests/guest-debug/run-test.py > + > +AARCH64_TESTS += gdbstub-sysregs > + > +.PHONY: gdbstub-sysregs > +run-gdbstub-sysregs: sysregs > + $(call run-test, $@, $(GDB_SCRIPT) \ > + --gdb $(HAVE_GDB_BIN) \ > + --qemu $(QEMU) --qargs "$(QEMU_OPTS)" \ > + --bin $< --test $(AARCH64_SRC)/gdbstub/test-sve.py, \ > + "basic gdbstub SVE support") > +endif > + > endif > > TESTS += $(AARCH64_TESTS) > diff --git a/tests/tcg/aarch64/gdbstub/test-sve.py b/tests/tcg/aarch64/gdbstub/test-sve.py > new file mode 100644 > index 00000000000..90201d80094 > --- /dev/null > +++ b/tests/tcg/aarch64/gdbstub/test-sve.py > @@ -0,0 +1,81 @@ > +from __future__ import print_function > +# > +# Test the SVE registers are visable and changeable via gdbstub > +# > +# This is launched via tests/guest-debug/run-test.py > +# > + > +import gdb > +import sys > + > +MAGIC = 0xDEADBEEF > + > +failcount = 0 > + > +def report(cond, msg): > + "Report success/fail of test" > + if cond: > + print ("PASS: %s" % (msg)) > + else: > + print ("FAIL: %s" % (msg)) > + global failcount > + failcount += 1 > + > +def run_test(): > + "Run through the tests one by one" > + > + gdb.execute("info registers") > + report(True, "info registers") > + > + gdb.execute("info registers vector") > + report(True, "info registers vector") > + > + # Now all the zregs > + frame = gdb.selected_frame() > + for i in range(0, 32): > + rname = "z%d" % (i) > + zreg = frame.read_register(rname) > + report(True, "Reading %s" % rname) > + for j in range(0, 4): > + cmd = "set $%s.q.u[%d] = 0x%x" % (rname, j, MAGIC) > + gdb.execute(cmd) > + report(True, "%s" % cmd) > + for j in range(0, 4): > + reg = "$%s.q.u[%d]" % (rname, j) > + v = gdb.parse_and_eval(reg) > + report(str(v.type) == "uint128_t", "size of %s" % (reg)) > + for j in range(0, 8): > + cmd = "set $%s.d.u[%d] = 0x%x" % (rname, j, MAGIC) > + gdb.execute(cmd) > + report(True, "%s" % cmd) > + for j in range(0, 8): > + reg = "$%s.d.u[%d]" % (rname, j) > + v = gdb.parse_and_eval(reg) > + report(str(v.type) == "uint64_t", "size of %s" % (reg)) > + report(int(v) == MAGIC, "%s is 0x%x" % (reg, MAGIC)) > + > +# > +# This runs as the script it sourced (via -x, via run-test.py) > +# > +try: > + inferior = gdb.selected_inferior() > + arch = inferior.architecture() > + report(arch.name() == "aarch64", "connected to aarch64") > +except (gdb.error, AttributeError): > + print("SKIPPING (not connected)", file=sys.stderr) > + 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: > + print ("GDB Exception: %s" % (sys.exc_info()[0])) > + failcount += 1 > + > +print("All tests complete: %d failures" % failcount) > + > +exit(failcount) >
diff --git a/tests/.gitignore b/tests/.gitignore index 7306866f216..d03c037d772 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -10,6 +10,7 @@ qht-bench rcutorture test-* !test-*.c +!test-*.py !docker/test-* test-qapi-commands.[ch] test-qapi-init-commands.[ch] diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target index a25afc071cc..b61b53e4dd1 100644 --- a/tests/tcg/aarch64/Makefile.target +++ b/tests/tcg/aarch64/Makefile.target @@ -46,6 +46,21 @@ ifneq ($(DOCKER_IMAGE)$(CROSS_CC_HAS_SVE),) # System Registers Tests AARCH64_TESTS += sysregs sysregs: CFLAGS+=-march=armv8.1-a+sve + +ifneq ($(HAVE_GDB_BIN),) +GDB_SCRIPT=$(SRC_PATH)/tests/guest-debug/run-test.py + +AARCH64_TESTS += gdbstub-sysregs + +.PHONY: gdbstub-sysregs +run-gdbstub-sysregs: sysregs + $(call run-test, $@, $(GDB_SCRIPT) \ + --gdb $(HAVE_GDB_BIN) \ + --qemu $(QEMU) --qargs "$(QEMU_OPTS)" \ + --bin $< --test $(AARCH64_SRC)/gdbstub/test-sve.py, \ + "basic gdbstub SVE support") +endif + endif TESTS += $(AARCH64_TESTS) diff --git a/tests/tcg/aarch64/gdbstub/test-sve.py b/tests/tcg/aarch64/gdbstub/test-sve.py new file mode 100644 index 00000000000..90201d80094 --- /dev/null +++ b/tests/tcg/aarch64/gdbstub/test-sve.py @@ -0,0 +1,81 @@ +from __future__ import print_function +# +# Test the SVE registers are visable and changeable via gdbstub +# +# This is launched via tests/guest-debug/run-test.py +# + +import gdb +import sys + +MAGIC = 0xDEADBEEF + +failcount = 0 + +def report(cond, msg): + "Report success/fail of test" + if cond: + print ("PASS: %s" % (msg)) + else: + print ("FAIL: %s" % (msg)) + global failcount + failcount += 1 + +def run_test(): + "Run through the tests one by one" + + gdb.execute("info registers") + report(True, "info registers") + + gdb.execute("info registers vector") + report(True, "info registers vector") + + # Now all the zregs + frame = gdb.selected_frame() + for i in range(0, 32): + rname = "z%d" % (i) + zreg = frame.read_register(rname) + report(True, "Reading %s" % rname) + for j in range(0, 4): + cmd = "set $%s.q.u[%d] = 0x%x" % (rname, j, MAGIC) + gdb.execute(cmd) + report(True, "%s" % cmd) + for j in range(0, 4): + reg = "$%s.q.u[%d]" % (rname, j) + v = gdb.parse_and_eval(reg) + report(str(v.type) == "uint128_t", "size of %s" % (reg)) + for j in range(0, 8): + cmd = "set $%s.d.u[%d] = 0x%x" % (rname, j, MAGIC) + gdb.execute(cmd) + report(True, "%s" % cmd) + for j in range(0, 8): + reg = "$%s.d.u[%d]" % (rname, j) + v = gdb.parse_and_eval(reg) + report(str(v.type) == "uint64_t", "size of %s" % (reg)) + report(int(v) == MAGIC, "%s is 0x%x" % (reg, MAGIC)) + +# +# This runs as the script it sourced (via -x, via run-test.py) +# +try: + inferior = gdb.selected_inferior() + arch = inferior.architecture() + report(arch.name() == "aarch64", "connected to aarch64") +except (gdb.error, AttributeError): + print("SKIPPING (not connected)", file=sys.stderr) + 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: + print ("GDB Exception: %s" % (sys.exc_info()[0])) + failcount += 1 + +print("All tests complete: %d failures" % failcount) + +exit(failcount)
A very simple test case which sets and reads SVE registers while running a test case. We don't really need to compile a SVE binary for this case but we will later so keep it simple for now. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> --- v5 - properly plumb in - skip if fails to connect --- tests/.gitignore | 1 + tests/tcg/aarch64/Makefile.target | 15 +++++ tests/tcg/aarch64/gdbstub/test-sve.py | 81 +++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 tests/tcg/aarch64/gdbstub/test-sve.py