xref: /llvm-project/lldb/test/API/macosx/sme-registers/TestSMERegistersDarwin.py (revision 46e782300765eeac8026377bf30d5f08888c2b25)
1*46e78230SJason Molendaimport lldb
2*46e78230SJason Molendafrom lldbsuite.test.lldbtest import *
3*46e78230SJason Molendafrom lldbsuite.test.decorators import *
4*46e78230SJason Molendaimport lldbsuite.test.lldbutil as lldbutil
5*46e78230SJason Molendaimport os
6*46e78230SJason Molenda
7*46e78230SJason Molenda
8*46e78230SJason Molendaclass TestSMERegistersDarwin(TestBase):
9*46e78230SJason Molenda    NO_DEBUG_INFO_TESTCASE = True
10*46e78230SJason Molenda    mydir = TestBase.compute_mydir(__file__)
11*46e78230SJason Molenda
12*46e78230SJason Molenda    @skipIfRemote
13*46e78230SJason Molenda    @skipUnlessDarwin
14*46e78230SJason Molenda    @skipUnlessFeature("hw.optional.arm.FEAT_SME")
15*46e78230SJason Molenda    @skipUnlessFeature("hw.optional.arm.FEAT_SME2")
16*46e78230SJason Molenda    # thread_set_state/thread_get_state only avail in macOS 15.4+
17*46e78230SJason Molenda    @skipIf(macos_version=["<", "15.4"])
18*46e78230SJason Molenda    def test(self):
19*46e78230SJason Molenda        """Test that we can read the contents of the SME/SVE registers on Darwin"""
20*46e78230SJason Molenda        self.build()
21*46e78230SJason Molenda        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
22*46e78230SJason Molenda            self, "break before sme", lldb.SBFileSpec("main.c")
23*46e78230SJason Molenda        )
24*46e78230SJason Molenda        frame = thread.GetFrameAtIndex(0)
25*46e78230SJason Molenda        self.assertTrue(frame.IsValid())
26*46e78230SJason Molenda
27*46e78230SJason Molenda        self.assertTrue(
28*46e78230SJason Molenda            target.BreakpointCreateBySourceRegex(
29*46e78230SJason Molenda                "break while sme", lldb.SBFileSpec("main.c")
30*46e78230SJason Molenda            ).IsValid()
31*46e78230SJason Molenda        )
32*46e78230SJason Molenda        self.assertTrue(
33*46e78230SJason Molenda            target.BreakpointCreateBySourceRegex(
34*46e78230SJason Molenda                "break after sme", lldb.SBFileSpec("main.c")
35*46e78230SJason Molenda            ).IsValid()
36*46e78230SJason Molenda        )
37*46e78230SJason Molenda
38*46e78230SJason Molenda        if self.TraceOn():
39*46e78230SJason Molenda            self.runCmd("reg read -a")
40*46e78230SJason Molenda
41*46e78230SJason Molenda        self.assertTrue(frame.register["svl"].GetError().Fail())
42*46e78230SJason Molenda        self.assertTrue(frame.register["z0"].GetError().Fail())
43*46e78230SJason Molenda        self.assertTrue(frame.register["p0"].GetError().Fail())
44*46e78230SJason Molenda        self.assertTrue(frame.register["za"].GetError().Fail())
45*46e78230SJason Molenda        self.assertTrue(frame.register["zt0"].GetError().Fail())
46*46e78230SJason Molenda
47*46e78230SJason Molenda        process.Continue()
48*46e78230SJason Molenda        frame = thread.GetFrameAtIndex(0)
49*46e78230SJason Molenda        self.assertEqual(thread.GetStopReason(), lldb.eStopReasonBreakpoint)
50*46e78230SJason Molenda
51*46e78230SJason Molenda        # Now in SME enabled mode
52*46e78230SJason Molenda        self.assertTrue(frame.register["svl"].GetError().Success())
53*46e78230SJason Molenda        self.assertTrue(frame.register["z0"].GetError().Success())
54*46e78230SJason Molenda        self.assertTrue(frame.register["p0"].GetError().Success())
55*46e78230SJason Molenda        self.assertTrue(frame.register["za"].GetError().Success())
56*46e78230SJason Molenda        self.assertTrue(frame.register["zt0"].GetError().Success())
57*46e78230SJason Molenda
58*46e78230SJason Molenda        # SSVE and SME modes should be enabled (reflecting PSTATE.SM and PSTATE.ZA)
59*46e78230SJason Molenda        svcr = frame.register["svcr"]
60*46e78230SJason Molenda        self.assertEqual(svcr.GetValueAsUnsigned(), 3)
61*46e78230SJason Molenda
62*46e78230SJason Molenda        svl_reg = frame.register["svl"]
63*46e78230SJason Molenda        svl = svl_reg.GetValueAsUnsigned()
64*46e78230SJason Molenda
65*46e78230SJason Molenda        z0 = frame.register["z0"]
66*46e78230SJason Molenda        self.assertEqual(z0.GetNumChildren(), svl)
67*46e78230SJason Molenda        self.assertEqual(z0.GetChildAtIndex(0).GetValueAsUnsigned(), 0x1)
68*46e78230SJason Molenda        self.assertEqual(z0.GetChildAtIndex(svl - 1).GetValueAsUnsigned(), 0x1)
69*46e78230SJason Molenda
70*46e78230SJason Molenda        z31 = frame.register["z31"]
71*46e78230SJason Molenda        self.assertEqual(z31.GetNumChildren(), svl)
72*46e78230SJason Molenda        self.assertEqual(z31.GetChildAtIndex(0).GetValueAsUnsigned(), 32)
73*46e78230SJason Molenda        self.assertEqual(z31.GetChildAtIndex(svl - 1).GetValueAsUnsigned(), 32)
74*46e78230SJason Molenda
75*46e78230SJason Molenda        p0 = frame.register["p0"]
76*46e78230SJason Molenda        self.assertEqual(p0.GetNumChildren(), svl / 8)
77*46e78230SJason Molenda        self.assertEqual(p0.GetChildAtIndex(0).GetValueAsUnsigned(), 0xFF)
78*46e78230SJason Molenda        self.assertEqual(
79*46e78230SJason Molenda            p0.GetChildAtIndex(p0.GetNumChildren() - 1).GetValueAsUnsigned(), 0xFF
80*46e78230SJason Molenda        )
81*46e78230SJason Molenda
82*46e78230SJason Molenda        p15 = frame.register["p15"]
83*46e78230SJason Molenda        self.assertEqual(p15.GetNumChildren(), svl / 8)
84*46e78230SJason Molenda        self.assertEqual(p15.GetChildAtIndex(0).GetValueAsUnsigned(), 0xFF)
85*46e78230SJason Molenda        self.assertEqual(
86*46e78230SJason Molenda            p15.GetChildAtIndex(p15.GetNumChildren() - 1).GetValueAsUnsigned(), 0xFF
87*46e78230SJason Molenda        )
88*46e78230SJason Molenda
89*46e78230SJason Molenda        za = frame.register["za"]
90*46e78230SJason Molenda        self.assertEqual(za.GetNumChildren(), (svl * svl))
91*46e78230SJason Molenda        za_0 = za.GetChildAtIndex(0)
92*46e78230SJason Molenda        self.assertEqual(za_0.GetValueAsUnsigned(), 4)
93*46e78230SJason Molenda        za_final = za.GetChildAtIndex(za.GetNumChildren() - 1)
94*46e78230SJason Molenda        self.assertEqual(za_final.GetValueAsUnsigned(), 67)
95*46e78230SJason Molenda
96*46e78230SJason Molenda        zt0 = frame.register["zt0"]
97*46e78230SJason Molenda        self.assertEqual(zt0.GetNumChildren(), 64)
98*46e78230SJason Molenda        zt0_0 = zt0.GetChildAtIndex(0)
99*46e78230SJason Molenda        self.assertEqual(zt0_0.GetValueAsUnsigned(), 0)
100*46e78230SJason Molenda        zt0_final = zt0.GetChildAtIndex(63)
101*46e78230SJason Molenda        self.assertEqual(zt0_final.GetValueAsUnsigned(), 63)
102*46e78230SJason Molenda
103*46e78230SJason Molenda        # Modify all of the registers, instruction step, confirm that the
104*46e78230SJason Molenda        # registers have the new values.  Without the instruction step, it's
105*46e78230SJason Molenda        # possible debugserver or lldb could lie about the write succeeding.
106*46e78230SJason Molenda
107*46e78230SJason Molenda        z0_old_values = []
108*46e78230SJason Molenda        z0_new_values = []
109*46e78230SJason Molenda        z0_new_str = '"{'
110*46e78230SJason Molenda        for i in range(svl):
111*46e78230SJason Molenda            z0_old_values.append(z0.GetChildAtIndex(i).GetValueAsUnsigned())
112*46e78230SJason Molenda            z0_new_values.append(z0_old_values[i] + 5)
113*46e78230SJason Molenda            z0_new_str = z0_new_str + ("0x%02x " % z0_new_values[i])
114*46e78230SJason Molenda        z0_new_str = z0_new_str + '}"'
115*46e78230SJason Molenda        self.runCmd("reg write z0 %s" % z0_new_str)
116*46e78230SJason Molenda
117*46e78230SJason Molenda        z31_old_values = []
118*46e78230SJason Molenda        z31_new_values = []
119*46e78230SJason Molenda        z31_new_str = '"{'
120*46e78230SJason Molenda        for i in range(svl):
121*46e78230SJason Molenda            z31_old_values.append(z31.GetChildAtIndex(i).GetValueAsUnsigned())
122*46e78230SJason Molenda            z31_new_values.append(z31_old_values[i] + 3)
123*46e78230SJason Molenda            z31_new_str = z31_new_str + ("0x%02x " % z31_new_values[i])
124*46e78230SJason Molenda        z31_new_str = z31_new_str + '}"'
125*46e78230SJason Molenda        self.runCmd("reg write z31 %s" % z31_new_str)
126*46e78230SJason Molenda
127*46e78230SJason Molenda        p0_old_values = []
128*46e78230SJason Molenda        p0_new_values = []
129*46e78230SJason Molenda        p0_new_str = '"{'
130*46e78230SJason Molenda        for i in range(int(svl / 8)):
131*46e78230SJason Molenda            p0_old_values.append(p0.GetChildAtIndex(i).GetValueAsUnsigned())
132*46e78230SJason Molenda            p0_new_values.append(p0_old_values[i] - 5)
133*46e78230SJason Molenda            p0_new_str = p0_new_str + ("0x%02x " % p0_new_values[i])
134*46e78230SJason Molenda        p0_new_str = p0_new_str + '}"'
135*46e78230SJason Molenda        self.runCmd("reg write p0 %s" % p0_new_str)
136*46e78230SJason Molenda
137*46e78230SJason Molenda        p15_old_values = []
138*46e78230SJason Molenda        p15_new_values = []
139*46e78230SJason Molenda        p15_new_str = '"{'
140*46e78230SJason Molenda        for i in range(int(svl / 8)):
141*46e78230SJason Molenda            p15_old_values.append(p15.GetChildAtIndex(i).GetValueAsUnsigned())
142*46e78230SJason Molenda            p15_new_values.append(p15_old_values[i] - 8)
143*46e78230SJason Molenda            p15_new_str = p15_new_str + ("0x%02x " % p15_new_values[i])
144*46e78230SJason Molenda        p15_new_str = p15_new_str + '}"'
145*46e78230SJason Molenda        self.runCmd("reg write p15 %s" % p15_new_str)
146*46e78230SJason Molenda
147*46e78230SJason Molenda        za_old_values = []
148*46e78230SJason Molenda        za_new_values = []
149*46e78230SJason Molenda        za_new_str = '"{'
150*46e78230SJason Molenda        for i in range(svl * svl):
151*46e78230SJason Molenda            za_old_values.append(za.GetChildAtIndex(i).GetValueAsUnsigned())
152*46e78230SJason Molenda            za_new_values.append(za_old_values[i] + 7)
153*46e78230SJason Molenda            za_new_str = za_new_str + ("0x%02x " % za_new_values[i])
154*46e78230SJason Molenda        za_new_str = za_new_str + '}"'
155*46e78230SJason Molenda        self.runCmd("reg write za %s" % za_new_str)
156*46e78230SJason Molenda
157*46e78230SJason Molenda        zt0_old_values = []
158*46e78230SJason Molenda        zt0_new_values = []
159*46e78230SJason Molenda        zt0_new_str = '"{'
160*46e78230SJason Molenda        for i in range(64):
161*46e78230SJason Molenda            zt0_old_values.append(zt0.GetChildAtIndex(i).GetValueAsUnsigned())
162*46e78230SJason Molenda            zt0_new_values.append(zt0_old_values[i] + 2)
163*46e78230SJason Molenda            zt0_new_str = zt0_new_str + ("0x%02x " % zt0_new_values[i])
164*46e78230SJason Molenda        zt0_new_str = zt0_new_str + '}"'
165*46e78230SJason Molenda        self.runCmd("reg write zt0 %s" % zt0_new_str)
166*46e78230SJason Molenda
167*46e78230SJason Molenda        thread.StepInstruction(False)
168*46e78230SJason Molenda        frame = thread.GetFrameAtIndex(0)
169*46e78230SJason Molenda
170*46e78230SJason Molenda        if self.TraceOn():
171*46e78230SJason Molenda            self.runCmd("reg read -a")
172*46e78230SJason Molenda
173*46e78230SJason Molenda        z0 = frame.register["z0"]
174*46e78230SJason Molenda        for i in range(z0.GetNumChildren()):
175*46e78230SJason Molenda            self.assertEqual(
176*46e78230SJason Molenda                z0_new_values[i], z0.GetChildAtIndex(i).GetValueAsUnsigned()
177*46e78230SJason Molenda            )
178*46e78230SJason Molenda
179*46e78230SJason Molenda        z31 = frame.register["z31"]
180*46e78230SJason Molenda        for i in range(z31.GetNumChildren()):
181*46e78230SJason Molenda            self.assertEqual(
182*46e78230SJason Molenda                z31_new_values[i], z31.GetChildAtIndex(i).GetValueAsUnsigned()
183*46e78230SJason Molenda            )
184*46e78230SJason Molenda
185*46e78230SJason Molenda        p0 = frame.register["p0"]
186*46e78230SJason Molenda        for i in range(p0.GetNumChildren()):
187*46e78230SJason Molenda            self.assertEqual(
188*46e78230SJason Molenda                p0_new_values[i], p0.GetChildAtIndex(i).GetValueAsUnsigned()
189*46e78230SJason Molenda            )
190*46e78230SJason Molenda
191*46e78230SJason Molenda        p15 = frame.register["p15"]
192*46e78230SJason Molenda        for i in range(p15.GetNumChildren()):
193*46e78230SJason Molenda            self.assertEqual(
194*46e78230SJason Molenda                p15_new_values[i], p15.GetChildAtIndex(i).GetValueAsUnsigned()
195*46e78230SJason Molenda            )
196*46e78230SJason Molenda
197*46e78230SJason Molenda        za = frame.register["za"]
198*46e78230SJason Molenda        for i in range(za.GetNumChildren()):
199*46e78230SJason Molenda            self.assertEqual(
200*46e78230SJason Molenda                za_new_values[i], za.GetChildAtIndex(i).GetValueAsUnsigned()
201*46e78230SJason Molenda            )
202*46e78230SJason Molenda
203*46e78230SJason Molenda        zt0 = frame.register["zt0"]
204*46e78230SJason Molenda        for i in range(zt0.GetNumChildren()):
205*46e78230SJason Molenda            self.assertEqual(
206*46e78230SJason Molenda                zt0_new_values[i], zt0.GetChildAtIndex(i).GetValueAsUnsigned()
207*46e78230SJason Molenda            )
208*46e78230SJason Molenda
209*46e78230SJason Molenda        process.Continue()
210*46e78230SJason Molenda        frame = thread.GetFrameAtIndex(0)
211*46e78230SJason Molenda        self.assertEqual(thread.GetStopReason(), lldb.eStopReasonBreakpoint)
212*46e78230SJason Molenda
213*46e78230SJason Molenda        self.assertTrue(frame.register["svl"].GetError().Fail())
214*46e78230SJason Molenda        self.assertTrue(frame.register["z0"].GetError().Fail())
215*46e78230SJason Molenda        self.assertTrue(frame.register["p0"].GetError().Fail())
216*46e78230SJason Molenda        self.assertTrue(frame.register["za"].GetError().Fail())
217*46e78230SJason Molenda        self.assertTrue(frame.register["zt0"].GetError().Fail())
218