127 lines · python
1"""2Test lldb's ability to read and write the AArch64 TLS registers.3"""4 5import lldb6from lldbsuite.test.decorators import *7from lldbsuite.test.lldbtest import *8from lldbsuite.test import lldbutil9 10 11class AArch64LinuxTLSRegisters(TestBase):12 NO_DEBUG_INFO_TESTCASE = True13 14 def setup(self, registers):15 self.build()16 self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)17 18 lldbutil.run_break_set_by_file_and_line(19 self,20 "main.c",21 line_number("main.c", "// Set break point at this line."),22 num_expected_locations=1,23 )24 25 lldbutil.run_break_set_by_file_and_line(26 self,27 "main.c",28 line_number("main.c", "// Set break point 2 at this line."),29 num_expected_locations=1,30 )31 32 if "tpidr2" in registers:33 self.runCmd("settings set target.run-args 1")34 self.runCmd("run", RUN_SUCCEEDED)35 36 if self.process().GetState() == lldb.eStateExited:37 self.fail("Test program failed to run.")38 39 self.expect(40 "thread list",41 STOPPED_DUE_TO_BREAKPOINT,42 substrs=["stopped", "stop reason = breakpoint"],43 )44 45 def check_registers(self, registers, values):46 regs = self.thread().GetSelectedFrame().GetRegisters()47 tls_regs = regs.GetFirstValueByName("Thread Local Storage Registers")48 self.assertTrue(tls_regs.IsValid(), "No TLS registers found.")49 50 for register in registers:51 tls_reg = tls_regs.GetChildMemberWithName(register)52 self.assertTrue(53 tls_reg.IsValid(), "{} register not found.".format(register)54 )55 self.assertEqual(tls_reg.GetValueAsUnsigned(), values[register])56 if register == "tpidr":57 self.expect("reg read tp", substrs=[hex(values[register])])58 59 def check_tls_reg(self, registers):60 self.setup(registers)61 62 # Since we can't predict what the value will be, the program has set63 # a target value for us to find.64 initial_values = {65 "tpidr": 0x1122334455667788,66 "tpidr2": 0x8877665544332211,67 }68 69 self.check_registers(registers, initial_values)70 71 # Their values should be restored if an expression modifies them.72 self.runCmd("expression expr_func()")73 74 self.check_registers(registers, initial_values)75 76 set_values = {77 "tpidr": 0x1111222233334444,78 "tpidr2": 0x4444333322221111,79 }80 81 # Set our own value(s) for the program to find.82 for register in registers:83 self.expect(84 "register write {} 0x{:x}".format(register, set_values[register])85 )86 87 self.expect("continue")88 89 self.expect(90 "thread list",91 STOPPED_DUE_TO_BREAKPOINT,92 substrs=["stopped", "stop reason = breakpoint"],93 )94 95 for register in registers:96 self.expect("p {}_was_set".format(register), substrs=["true"])97 98 @skipUnlessArch("aarch64")99 @skipUnlessPlatform(["linux"])100 def test_tls_no_sme(self):101 if self.isAArch64SME():102 self.skipTest("SME must not be present.")103 104 self.check_tls_reg(["tpidr"])105 106 @skipUnlessArch("aarch64")107 @skipUnlessPlatform(["linux"])108 def test_tls_sme(self):109 if not self.isAArch64SME():110 self.skipTest("SME must be present.")111 112 self.check_tls_reg(["tpidr", "tpidr2"])113 114 @skipUnlessArch("aarch64")115 @skipUnlessPlatform(["linux"])116 def test_tpidr2_no_sme(self):117 if self.isAArch64SME():118 self.skipTest("SME must not be present.")119 120 self.setup("tpidr")121 122 regs = self.thread().GetSelectedFrame().GetRegisters()123 tls_regs = regs.GetFirstValueByName("Thread Local Storage Registers")124 self.assertTrue(tls_regs.IsValid(), "No TLS registers found.")125 tls_reg = tls_regs.GetChildMemberWithName("tpidr2")126 self.assertFalse(tls_reg.IsValid(), "tpdir2 should not be present without SME")127