brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · 2fa963e Raw
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