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