xref: /qemu/tests/tcg/aarch64/gdbstub/test-sve-ioctl.py (revision 797920b952ea154a73049d171f5d5e3d6fb0bbea)
1f4a23e17SAlex Bennéefrom __future__ import print_function
2f4a23e17SAlex Bennée#
3f4a23e17SAlex Bennée# Test the SVE ZReg reports the right amount of data. It uses the
4f4a23e17SAlex Bennée# sve-ioctl test and examines the register data each time the
5f4a23e17SAlex Bennée# __sve_ld_done breakpoint is hit.
6f4a23e17SAlex Bennée#
7f4a23e17SAlex Bennée# This is launched via tests/guest-debug/run-test.py
8f4a23e17SAlex Bennée#
9f4a23e17SAlex Bennée
10f4a23e17SAlex Bennéeimport gdb
11f4a23e17SAlex Bennéeimport sys
12f4a23e17SAlex Bennée
13f4a23e17SAlex Bennéeinitial_vlen = 0
14f4a23e17SAlex Bennéefailcount = 0
15f4a23e17SAlex Bennée
16f4a23e17SAlex Bennéedef report(cond, msg):
17f4a23e17SAlex Bennée    "Report success/fail of test"
18f4a23e17SAlex Bennée    if cond:
19f4a23e17SAlex Bennée        print ("PASS: %s" % (msg))
20f4a23e17SAlex Bennée    else:
21f4a23e17SAlex Bennée        print ("FAIL: %s" % (msg))
22f4a23e17SAlex Bennée        global failcount
23f4a23e17SAlex Bennée        failcount += 1
24f4a23e17SAlex Bennée
25f4a23e17SAlex Bennéeclass TestBreakpoint(gdb.Breakpoint):
26f4a23e17SAlex Bennée    def __init__(self, sym_name="__sve_ld_done"):
27f4a23e17SAlex Bennée        super(TestBreakpoint, self).__init__(sym_name)
28f4a23e17SAlex Bennée        # self.sym, ok = gdb.lookup_symbol(sym_name)
29f4a23e17SAlex Bennée
30f4a23e17SAlex Bennée    def stop(self):
31f4a23e17SAlex Bennée        val_i = gdb.parse_and_eval('i')
32f4a23e17SAlex Bennée        global initial_vlen
33f4a23e17SAlex Bennée        try:
34f4a23e17SAlex Bennée            for i in range(0, int(val_i)):
35f4a23e17SAlex Bennée                val_z = gdb.parse_and_eval("$z0.b.u[%d]" % i)
36f4a23e17SAlex Bennée                report(int(val_z) == i, "z0.b.u[%d] == %d" % (i, i))
37f4a23e17SAlex Bennée            for i in range(i + 1, initial_vlen):
38f4a23e17SAlex Bennée                val_z = gdb.parse_and_eval("$z0.b.u[%d]" % i)
39f4a23e17SAlex Bennée                report(int(val_z) == 0, "z0.b.u[%d] == 0" % (i))
40f4a23e17SAlex Bennée        except gdb.error:
41f4a23e17SAlex Bennée            report(False, "checking zregs (out of range)")
42f4a23e17SAlex Bennée
43*797920b9SAlex Bennée        # Check the aliased V registers are set and GDB has correctly
44*797920b9SAlex Bennée        # created them for us having recognised and handled SVE.
45*797920b9SAlex Bennée        try:
46*797920b9SAlex Bennée            for i in range(0, 16):
47*797920b9SAlex Bennée                val_z = gdb.parse_and_eval("$z0.b.u[%d]" % i)
48*797920b9SAlex Bennée                val_v = gdb.parse_and_eval("$v0.b.u[%d]" % i)
49*797920b9SAlex Bennée                report(int(val_z) == int(val_v),
50*797920b9SAlex Bennée                       "v0.b.u[%d] == z0.b.u[%d]" % (i, i))
51*797920b9SAlex Bennée        except gdb.error:
52*797920b9SAlex Bennée            report(False, "checking vregs (out of range)")
53*797920b9SAlex Bennée
54f4a23e17SAlex Bennée
55f4a23e17SAlex Bennéedef run_test():
56f4a23e17SAlex Bennée    "Run through the tests one by one"
57f4a23e17SAlex Bennée
58f4a23e17SAlex Bennée    print ("Setup breakpoint")
59f4a23e17SAlex Bennée    bp = TestBreakpoint()
60f4a23e17SAlex Bennée
61f4a23e17SAlex Bennée    global initial_vlen
62f4a23e17SAlex Bennée    vg = gdb.parse_and_eval("$vg")
63f4a23e17SAlex Bennée    initial_vlen = int(vg) * 8
64f4a23e17SAlex Bennée
65f4a23e17SAlex Bennée    gdb.execute("c")
66f4a23e17SAlex Bennée
67f4a23e17SAlex Bennée#
68f4a23e17SAlex Bennée# This runs as the script it sourced (via -x, via run-test.py)
69f4a23e17SAlex Bennée#
70f4a23e17SAlex Bennéetry:
71f4a23e17SAlex Bennée    inferior = gdb.selected_inferior()
72f4a23e17SAlex Bennée    arch = inferior.architecture()
73f4a23e17SAlex Bennée    report(arch.name() == "aarch64", "connected to aarch64")
74f4a23e17SAlex Bennéeexcept (gdb.error, AttributeError):
75f4a23e17SAlex Bennée    print("SKIPPING (not connected)", file=sys.stderr)
76f4a23e17SAlex Bennée    exit(0)
77f4a23e17SAlex Bennée
78f4a23e17SAlex Bennéetry:
79f4a23e17SAlex Bennée    # These are not very useful in scripts
80f4a23e17SAlex Bennée    gdb.execute("set pagination off")
81f4a23e17SAlex Bennée
82f4a23e17SAlex Bennée    # Run the actual tests
83f4a23e17SAlex Bennée    run_test()
84f4a23e17SAlex Bennéeexcept:
85f4a23e17SAlex Bennée    print ("GDB Exception: %s" % (sys.exc_info()[0]))
86f4a23e17SAlex Bennée    failcount += 1
87f4a23e17SAlex Bennée    import code
88f4a23e17SAlex Bennée    code.InteractiveConsole(locals=globals()).interact()
89f4a23e17SAlex Bennée    raise
90f4a23e17SAlex Bennée
91f4a23e17SAlex Bennéeprint("All tests complete: %d failures" % failcount)
92f4a23e17SAlex Bennéeexit(failcount)
93