|
| 1 | +""" |
| 2 | +Test AArch64 dynamic register sets |
| 3 | +""" |
| 4 | + |
| 5 | +import lldb |
| 6 | +from lldbsuite.test.decorators import * |
| 7 | +from lldbsuite.test.lldbtest import * |
| 8 | +from lldbsuite.test import lldbutil |
| 9 | + |
| 10 | + |
| 11 | +class RegisterCommandsTestCase(TestBase): |
| 12 | + |
| 13 | + def check_sve_register_size(self, set, name, expected): |
| 14 | + reg_value = set.GetChildMemberWithName(name) |
| 15 | + self.assertTrue(reg_value.IsValid(), |
| 16 | + 'Expected a register named %s' % (name)) |
| 17 | + self.assertEqual(reg_value.GetByteSize(), expected, |
| 18 | + 'Expected a register %s size == %i bytes' % (name, expected)) |
| 19 | + |
| 20 | + def sve_regs_read_dynamic(self, sve_registers): |
| 21 | + vg_reg = sve_registers.GetChildMemberWithName("vg") |
| 22 | + vg_reg_value = sve_registers.GetChildMemberWithName( |
| 23 | + "vg").GetValueAsUnsigned() |
| 24 | + |
| 25 | + z_reg_size = vg_reg_value * 8 |
| 26 | + p_reg_size = int(z_reg_size / 8) |
| 27 | + |
| 28 | + for i in range(32): |
| 29 | + z_regs_value = '{' + \ |
| 30 | + ' '.join('0x{:02x}'.format(i + 1) |
| 31 | + for _ in range(z_reg_size)) + '}' |
| 32 | + self.expect('register read z%i' % |
| 33 | + (i), substrs=[z_regs_value]) |
| 34 | + |
| 35 | + # Set P registers with random test values. The P registers are predicate |
| 36 | + # registers, which hold one bit for each byte available in a Z register. |
| 37 | + # For below mentioned values of P registers, P(0,5,10,15) will have all |
| 38 | + # Z register lanes set while P(4,9,14) will have no lanes set. |
| 39 | + p_value_bytes = ['0xff', '0x55', '0x11', '0x01', '0x00'] |
| 40 | + for i in range(16): |
| 41 | + p_regs_value = '{' + \ |
| 42 | + ' '.join(p_value_bytes[i % 5] for _ in range(p_reg_size)) + '}' |
| 43 | + self.expect('register read p%i' % (i), substrs=[p_regs_value]) |
| 44 | + |
| 45 | + self.expect("register read ffr", substrs=[p_regs_value]) |
| 46 | + |
| 47 | + for i in range(32): |
| 48 | + z_regs_value = '{' + \ |
| 49 | + ' '.join('0x{:02x}'.format(32 - i) |
| 50 | + for _ in range(z_reg_size)) + '}' |
| 51 | + self.runCmd("register write z%i '%s'" % (i, z_regs_value)) |
| 52 | + self.expect('register read z%i' % (i), substrs=[z_regs_value]) |
| 53 | + |
| 54 | + for i in range(16): |
| 55 | + p_regs_value = '{' + \ |
| 56 | + ' '.join('0x{:02x}'.format(16 - i) |
| 57 | + for _ in range(p_reg_size)) + '}' |
| 58 | + self.runCmd("register write p%i '%s'" % (i, p_regs_value)) |
| 59 | + self.expect('register read p%i' % (i), substrs=[p_regs_value]) |
| 60 | + |
| 61 | + p_regs_value = '{' + \ |
| 62 | + ' '.join('0x{:02x}'.format(8) |
| 63 | + for _ in range(p_reg_size)) + '}' |
| 64 | + self.runCmd('register write ffr ' + "'" + p_regs_value + "'") |
| 65 | + self.expect('register read ffr', substrs=[p_regs_value]) |
| 66 | + |
| 67 | + mydir = TestBase.compute_mydir(__file__) |
| 68 | + |
| 69 | + @no_debug_info_test |
| 70 | + @skipIf(archs=no_match(["aarch64"])) |
| 71 | + @skipIf(oslist=no_match(['linux'])) |
| 72 | + def test_aarch64_dynamic_regset_config(self): |
| 73 | + """Test AArch64 Dynamic Register sets configuration.""" |
| 74 | + self.build() |
| 75 | + self.line = line_number('main.c', '// Set a break point here.') |
| 76 | + |
| 77 | + exe = self.getBuildArtifact("a.out") |
| 78 | + self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) |
| 79 | + |
| 80 | + lldbutil.run_break_set_by_file_and_line( |
| 81 | + self, "main.c", self.line, num_expected_locations=1) |
| 82 | + self.runCmd("run", RUN_SUCCEEDED) |
| 83 | + |
| 84 | + self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT, |
| 85 | + substrs=["stop reason = breakpoint 1."]) |
| 86 | + |
| 87 | + target = self.dbg.GetSelectedTarget() |
| 88 | + process = target.GetProcess() |
| 89 | + thread = process.GetThreadAtIndex(0) |
| 90 | + currentFrame = thread.GetFrameAtIndex(0) |
| 91 | + |
| 92 | + for registerSet in currentFrame.GetRegisters(): |
| 93 | + if 'Scalable Vector Extension Registers' in registerSet.GetName(): |
| 94 | + self.assertTrue(self.isAArch64SVE(), |
| 95 | + 'LLDB enabled AArch64 SVE register set when it was disabled by target.') |
| 96 | + self.sve_regs_read_dynamic(registerSet) |
| 97 | + if 'MTE Control Register' in registerSet.GetName(): |
| 98 | + self.assertTrue(self.isAArch64MTE(), |
| 99 | + 'LLDB enabled AArch64 MTE register set when it was disabled by target.') |
| 100 | + self.runCmd("register write mte_ctrl 0x7fff9") |
| 101 | + self.expect("register read mte_ctrl", |
| 102 | + substrs=['mte_ctrl = 0x000000000007fff9']) |
| 103 | + if 'Pointer Authentication Registers' in registerSet.GetName(): |
| 104 | + self.assertTrue(self.isAArch64PAuth(), |
| 105 | + 'LLDB enabled AArch64 Pointer Authentication register set when it was disabled by target.') |
| 106 | + self.expect("register read data_mask", |
| 107 | + substrs=['data_mask = 0x']) |
| 108 | + self.expect("register read code_mask", |
| 109 | + substrs=['code_mask = 0x']) |
0 commit comments