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