1*aca3beaaSApple OSS Distributions#!/usr/bin/python 2*aca3beaaSApple OSS Distributions# 3*aca3beaaSApple OSS Distributions 4*aca3beaaSApple OSS Distributions#source of register info is from http://opensource.apple.com/source/gdb/gdb-962/src/gdb/arm-tdep.c 5*aca3beaaSApple OSS Distributionsfrom __future__ import absolute_import, print_function 6*aca3beaaSApple OSS Distributions 7*aca3beaaSApple OSS Distributionsfrom builtins import hex 8*aca3beaaSApple OSS Distributionsfrom builtins import range 9*aca3beaaSApple OSS Distributionsfrom builtins import object 10*aca3beaaSApple OSS Distributions 11*aca3beaaSApple OSS Distributionsimport struct 12*aca3beaaSApple OSS Distributionsimport lldb 13*aca3beaaSApple OSS Distributions 14*aca3beaaSApple OSS Distributions 15*aca3beaaSApple OSS Distributionsosplugin_target_obj = None 16*aca3beaaSApple OSS Distributions 17*aca3beaaSApple OSS Distributionsclass PluginValue(lldb.SBValue): 18*aca3beaaSApple OSS Distributions def GetChildMemberWithName(val, name): 19*aca3beaaSApple OSS Distributions val_type = val.GetType() 20*aca3beaaSApple OSS Distributions if val_type.IsPointerType() == True: 21*aca3beaaSApple OSS Distributions val_type = val_type.GetPointeeType() 22*aca3beaaSApple OSS Distributions for i in range(val_type.GetNumberOfFields()): 23*aca3beaaSApple OSS Distributions if name == val_type.GetFieldAtIndex(i).GetName(): 24*aca3beaaSApple OSS Distributions return PluginValue(val.GetChildAtIndex(i)) 25*aca3beaaSApple OSS Distributions return None 26*aca3beaaSApple OSS Distributions 27*aca3beaaSApple OSS Distributionsclass Armv8_RegisterSet(object): 28*aca3beaaSApple OSS Distributions """ register info set for armv8 64 bit architecture""" 29*aca3beaaSApple OSS Distributions register_info = { 'sets' : ['GPR'], 30*aca3beaaSApple OSS Distributions 'registers': [ 31*aca3beaaSApple OSS Distributions {'name': 'x0' , 'bitsize':64, 'offset': 0, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 0, 'dwarf': 0, 'alt-name':'arg1', 'generic':'arg1'}, 32*aca3beaaSApple OSS Distributions {'name': 'x1' , 'bitsize':64, 'offset': 8, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 1, 'dwarf': 1, 'alt-name':'arg2', 'generic':'arg2'}, 33*aca3beaaSApple OSS Distributions {'name': 'x2' , 'bitsize':64, 'offset': 16, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 2, 'dwarf': 2, 'alt-name':'arg3', 'generic':'arg3'}, 34*aca3beaaSApple OSS Distributions {'name': 'x3' , 'bitsize':64, 'offset': 24, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 3, 'dwarf': 3, 'alt-name':'arg4', 'generic':'arg4'}, 35*aca3beaaSApple OSS Distributions {'name': 'x4' , 'bitsize':64, 'offset': 32, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 4, 'dwarf': 4, 'alt-name':'arg5', 'generic':'arg5'}, 36*aca3beaaSApple OSS Distributions {'name': 'x5' , 'bitsize':64, 'offset': 40, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 5, 'dwarf': 5, 'alt-name':'arg6', 'generic':'arg6'}, 37*aca3beaaSApple OSS Distributions {'name': 'x6' , 'bitsize':64, 'offset': 48, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 6, 'dwarf': 6, 'alt-name':'arg7', 'generic':'arg7'}, 38*aca3beaaSApple OSS Distributions {'name': 'x7' , 'bitsize':64, 'offset': 56, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 7, 'dwarf': 7, 'alt-name':'arg8', 'generic':'arg8'}, 39*aca3beaaSApple OSS Distributions {'name': 'x8' , 'bitsize':64, 'offset': 64, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 8, 'dwarf': 8}, 40*aca3beaaSApple OSS Distributions {'name': 'x9' , 'bitsize':64, 'offset': 72, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 9, 'dwarf': 9}, 41*aca3beaaSApple OSS Distributions {'name': 'x10' , 'bitsize':64, 'offset': 80, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':10, 'dwarf':10}, 42*aca3beaaSApple OSS Distributions {'name': 'x11' , 'bitsize':64, 'offset': 88, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':11, 'dwarf':11}, 43*aca3beaaSApple OSS Distributions {'name': 'x12' , 'bitsize':64, 'offset': 96, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':12, 'dwarf':12}, 44*aca3beaaSApple OSS Distributions {'name': 'x13' , 'bitsize':64, 'offset':104, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':13, 'dwarf':13}, 45*aca3beaaSApple OSS Distributions {'name': 'x14' , 'bitsize':64, 'offset':112, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':14, 'dwarf':14}, 46*aca3beaaSApple OSS Distributions {'name': 'x15' , 'bitsize':64, 'offset':120, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':15, 'dwarf':15}, 47*aca3beaaSApple OSS Distributions {'name': 'x16' , 'bitsize':64, 'offset':128, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':16, 'dwarf':16}, 48*aca3beaaSApple OSS Distributions {'name': 'x17' , 'bitsize':64, 'offset':136, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':17, 'dwarf':17}, 49*aca3beaaSApple OSS Distributions {'name': 'x18' , 'bitsize':64, 'offset':144, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':18, 'dwarf':18}, 50*aca3beaaSApple OSS Distributions {'name': 'x19' , 'bitsize':64, 'offset':152, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':19, 'dwarf':19}, 51*aca3beaaSApple OSS Distributions {'name': 'x20' , 'bitsize':64, 'offset':160, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':20, 'dwarf':20}, 52*aca3beaaSApple OSS Distributions {'name': 'x21' , 'bitsize':64, 'offset':168, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':21, 'dwarf':21}, 53*aca3beaaSApple OSS Distributions {'name': 'x22' , 'bitsize':64, 'offset':176, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':22, 'dwarf':22}, 54*aca3beaaSApple OSS Distributions {'name': 'x23' , 'bitsize':64, 'offset':184, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':23, 'dwarf':23}, 55*aca3beaaSApple OSS Distributions {'name': 'x24' , 'bitsize':64, 'offset':192, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':24, 'dwarf':24}, 56*aca3beaaSApple OSS Distributions {'name': 'x25' , 'bitsize':64, 'offset':200, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':25, 'dwarf':25}, 57*aca3beaaSApple OSS Distributions {'name': 'x26' , 'bitsize':64, 'offset':208, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':26, 'dwarf':26}, 58*aca3beaaSApple OSS Distributions {'name': 'x27' , 'bitsize':64, 'offset':216, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':27, 'dwarf':27}, 59*aca3beaaSApple OSS Distributions {'name': 'x28' , 'bitsize':64, 'offset':224, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':28, 'dwarf':28}, 60*aca3beaaSApple OSS Distributions {'name': 'fp' , 'bitsize':64, 'offset':232, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':29, 'dwarf':29, 'alt-name': 'fp', 'generic':'fp'}, 61*aca3beaaSApple OSS Distributions {'name': 'lr' , 'bitsize':64, 'offset':240, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':30, 'dwarf':30, 'alt-name': 'lr', 'generic':'lr'}, 62*aca3beaaSApple OSS Distributions {'name': 'sp' , 'bitsize':64, 'offset':248, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':31, 'dwarf':31, 'alt-name': 'sp', 'generic':'sp'}, 63*aca3beaaSApple OSS Distributions {'name': 'pc' , 'bitsize':64, 'offset':256, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':32, 'dwarf':32, 'alt-name': 'pc', 'generic':'pc'}, 64*aca3beaaSApple OSS Distributions {'name': 'far' , 'bitsize':64, 'offset':264, 'encoding':'uint', 'format':'hex', 'set':0}, 65*aca3beaaSApple OSS Distributions {'name': 'cpsr', 'bitsize':32, 'offset':272, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':33, 'dwarf':33, 'generic':'flags'}, 66*aca3beaaSApple OSS Distributions {'name': 'esr' , 'bitsize':32, 'offset':276, 'encoding':'uint', 'format':'hex', 'set':0}, 67*aca3beaaSApple OSS Distributions ] 68*aca3beaaSApple OSS Distributions } 69*aca3beaaSApple OSS Distributions 70*aca3beaaSApple OSS Distributions def __init__(self): 71*aca3beaaSApple OSS Distributions self.switch_context_address = osplugin_target_obj.FindSymbols('Switch_context')[0].GetSymbol().GetStartAddress().GetLoadAddress(osplugin_target_obj) 72*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 73*aca3beaaSApple OSS Distributions def ResetRegisterValues(self): 74*aca3beaaSApple OSS Distributions self.x0 = 0 75*aca3beaaSApple OSS Distributions self.x1 = 0 76*aca3beaaSApple OSS Distributions self.x2 = 0 77*aca3beaaSApple OSS Distributions self.x3 = 0 78*aca3beaaSApple OSS Distributions self.x4 = 0 79*aca3beaaSApple OSS Distributions self.x5 = 0 80*aca3beaaSApple OSS Distributions self.x6 = 0 81*aca3beaaSApple OSS Distributions self.x7 = 0 82*aca3beaaSApple OSS Distributions self.x8 = 0 83*aca3beaaSApple OSS Distributions self.x9 = 0 84*aca3beaaSApple OSS Distributions self.x10 = 0 85*aca3beaaSApple OSS Distributions self.x11 = 0 86*aca3beaaSApple OSS Distributions self.x12 = 0 87*aca3beaaSApple OSS Distributions self.x13 = 0 88*aca3beaaSApple OSS Distributions self.x14 = 0 89*aca3beaaSApple OSS Distributions self.x15 = 0 90*aca3beaaSApple OSS Distributions self.x16 = 0 91*aca3beaaSApple OSS Distributions self.x17 = 0 92*aca3beaaSApple OSS Distributions self.x18 = 0 93*aca3beaaSApple OSS Distributions self.x19 = 0 94*aca3beaaSApple OSS Distributions self.x20 = 0 95*aca3beaaSApple OSS Distributions self.x21 = 0 96*aca3beaaSApple OSS Distributions self.x22 = 0 97*aca3beaaSApple OSS Distributions self.x23 = 0 98*aca3beaaSApple OSS Distributions self.x24 = 0 99*aca3beaaSApple OSS Distributions self.x25 = 0 100*aca3beaaSApple OSS Distributions self.x26 = 0 101*aca3beaaSApple OSS Distributions self.x27 = 0 102*aca3beaaSApple OSS Distributions self.x28 = 0 103*aca3beaaSApple OSS Distributions self.fp = 0 104*aca3beaaSApple OSS Distributions self.lr = 0 105*aca3beaaSApple OSS Distributions self.sp = 0 106*aca3beaaSApple OSS Distributions self.pc = 0 107*aca3beaaSApple OSS Distributions self.far = 0 108*aca3beaaSApple OSS Distributions self.cpsr = 0 109*aca3beaaSApple OSS Distributions self.esr = 0 110*aca3beaaSApple OSS Distributions 111*aca3beaaSApple OSS Distributions def __str__(self): 112*aca3beaaSApple OSS Distributions return """ pc = """ 113*aca3beaaSApple OSS Distributions 114*aca3beaaSApple OSS Distributions def GetPackedRegisterState(self): 115*aca3beaaSApple OSS Distributions return struct.pack('34QII', self.x0, self.x1, self.x2, self.x3, self.x4, self.x5, 116*aca3beaaSApple OSS Distributions self.x6, self.x7, self.x8, self.x9, self.x10, self.x11, self.x12, self.x13, 117*aca3beaaSApple OSS Distributions self.x14, self.x15, self.x16, self.x17, self.x18, self.x19, self.x20, self.x21, 118*aca3beaaSApple OSS Distributions self.x22, self.x23, self.x24, self.x25, self.x26, self.x27, self.x28, self.fp, 119*aca3beaaSApple OSS Distributions self.lr, self.sp, self.pc, self.far, self.cpsr, self.esr) 120*aca3beaaSApple OSS Distributions 121*aca3beaaSApple OSS Distributions def ReadRegisterDataFromKDPSavedState(self, kdp_state, kernel_version): 122*aca3beaaSApple OSS Distributions """ Setup register values from KDP saved information. 123*aca3beaaSApple OSS Distributions """ 124*aca3beaaSApple OSS Distributions saved_state = kernel_version.CreateValueFromExpression(None, '(struct arm_saved_state64 *) ' + str(kdp_state.GetValueAsUnsigned())) 125*aca3beaaSApple OSS Distributions saved_state = saved_state.Dereference() 126*aca3beaaSApple OSS Distributions saved_state = PluginValue(saved_state) 127*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 128*aca3beaaSApple OSS Distributions self.x0 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(0).GetValueAsUnsigned() 129*aca3beaaSApple OSS Distributions self.x1 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(1).GetValueAsUnsigned() 130*aca3beaaSApple OSS Distributions self.x2 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(2).GetValueAsUnsigned() 131*aca3beaaSApple OSS Distributions self.x3 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(3).GetValueAsUnsigned() 132*aca3beaaSApple OSS Distributions self.x4 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(4).GetValueAsUnsigned() 133*aca3beaaSApple OSS Distributions self.x5 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(5).GetValueAsUnsigned() 134*aca3beaaSApple OSS Distributions self.x6 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(6).GetValueAsUnsigned() 135*aca3beaaSApple OSS Distributions self.x7 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(7).GetValueAsUnsigned() 136*aca3beaaSApple OSS Distributions self.x8 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(8).GetValueAsUnsigned() 137*aca3beaaSApple OSS Distributions self.x9 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(9).GetValueAsUnsigned() 138*aca3beaaSApple OSS Distributions self.x10 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(10).GetValueAsUnsigned() 139*aca3beaaSApple OSS Distributions self.x11 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(11).GetValueAsUnsigned() 140*aca3beaaSApple OSS Distributions self.x12 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(12).GetValueAsUnsigned() 141*aca3beaaSApple OSS Distributions self.x13 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(13).GetValueAsUnsigned() 142*aca3beaaSApple OSS Distributions self.x14 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(14).GetValueAsUnsigned() 143*aca3beaaSApple OSS Distributions self.x15 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(15).GetValueAsUnsigned() 144*aca3beaaSApple OSS Distributions self.x16 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(16).GetValueAsUnsigned() 145*aca3beaaSApple OSS Distributions self.x17 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(17).GetValueAsUnsigned() 146*aca3beaaSApple OSS Distributions self.x18 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(18).GetValueAsUnsigned() 147*aca3beaaSApple OSS Distributions self.x19 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(19).GetValueAsUnsigned() 148*aca3beaaSApple OSS Distributions self.x20 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(20).GetValueAsUnsigned() 149*aca3beaaSApple OSS Distributions self.x21 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(21).GetValueAsUnsigned() 150*aca3beaaSApple OSS Distributions self.x22 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(22).GetValueAsUnsigned() 151*aca3beaaSApple OSS Distributions self.x23 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(23).GetValueAsUnsigned() 152*aca3beaaSApple OSS Distributions self.x24 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(24).GetValueAsUnsigned() 153*aca3beaaSApple OSS Distributions self.x25 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(25).GetValueAsUnsigned() 154*aca3beaaSApple OSS Distributions self.x26 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(26).GetValueAsUnsigned() 155*aca3beaaSApple OSS Distributions self.x27 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(27).GetValueAsUnsigned() 156*aca3beaaSApple OSS Distributions self.x28 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(28).GetValueAsUnsigned() 157*aca3beaaSApple OSS Distributions self.fp = saved_state.GetChildMemberWithName('fp').GetValueAsUnsigned() 158*aca3beaaSApple OSS Distributions self.lr = saved_state.GetChildMemberWithName('lr').GetValueAsUnsigned() 159*aca3beaaSApple OSS Distributions self.sp = saved_state.GetChildMemberWithName('sp').GetValueAsUnsigned() 160*aca3beaaSApple OSS Distributions self.pc = saved_state.GetChildMemberWithName('pc').GetValueAsUnsigned() 161*aca3beaaSApple OSS Distributions self.far = saved_state.GetChildMemberWithName('far').GetValueAsUnsigned() 162*aca3beaaSApple OSS Distributions self.cpsr = saved_state.GetChildMemberWithName('cpsr').GetValueAsUnsigned() 163*aca3beaaSApple OSS Distributions self.esr = saved_state.GetChildMemberWithName('esr').GetValueAsUnsigned() 164*aca3beaaSApple OSS Distributions return self 165*aca3beaaSApple OSS Distributions 166*aca3beaaSApple OSS Distributions def ReadRegisterDataFromKernelStack(self, kstack_saved_state_addr, kernel_version): 167*aca3beaaSApple OSS Distributions saved_state = kernel_version.CreateValueFromExpression(None, '(arm_kernel_saved_state_t *) '+ str(kstack_saved_state_addr)) 168*aca3beaaSApple OSS Distributions saved_state = saved_state.Dereference() 169*aca3beaaSApple OSS Distributions saved_state = PluginValue(saved_state) 170*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 171*aca3beaaSApple OSS Distributions self.x19 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(0).GetValueAsUnsigned() 172*aca3beaaSApple OSS Distributions self.x20 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(1).GetValueAsUnsigned() 173*aca3beaaSApple OSS Distributions self.x21 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(2).GetValueAsUnsigned() 174*aca3beaaSApple OSS Distributions self.x22 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(3).GetValueAsUnsigned() 175*aca3beaaSApple OSS Distributions self.x23 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(4).GetValueAsUnsigned() 176*aca3beaaSApple OSS Distributions self.x24 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(5).GetValueAsUnsigned() 177*aca3beaaSApple OSS Distributions self.x25 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(6).GetValueAsUnsigned() 178*aca3beaaSApple OSS Distributions self.x26 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(7).GetValueAsUnsigned() 179*aca3beaaSApple OSS Distributions self.x27 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(8).GetValueAsUnsigned() 180*aca3beaaSApple OSS Distributions self.x28 = saved_state.GetChildMemberWithName('x').GetChildAtIndex(9).GetValueAsUnsigned() 181*aca3beaaSApple OSS Distributions self.fp = saved_state.GetChildMemberWithName('fp').GetValueAsUnsigned() 182*aca3beaaSApple OSS Distributions self.lr = saved_state.GetChildMemberWithName('lr').GetValueAsUnsigned() 183*aca3beaaSApple OSS Distributions self.sp = saved_state.GetChildMemberWithName('sp').GetValueAsUnsigned() 184*aca3beaaSApple OSS Distributions # pc for a blocked thread is treated to be the next instruction it would run after thread switch. 185*aca3beaaSApple OSS Distributions self.pc = self.switch_context_address 186*aca3beaaSApple OSS Distributions return self 187*aca3beaaSApple OSS Distributions 188*aca3beaaSApple OSS Distributions def ReadRegisterDataFromContinuation(self, continuation_ptr): 189*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 190*aca3beaaSApple OSS Distributions self.pc = continuation_ptr 191*aca3beaaSApple OSS Distributions return self 192*aca3beaaSApple OSS Distributions 193*aca3beaaSApple OSS Distributions @classmethod 194*aca3beaaSApple OSS Distributions def GetRegisterInfo(cls, regnum): 195*aca3beaaSApple OSS Distributions if regnum < 0 or regnum > len(cls.register_info['registers']): 196*aca3beaaSApple OSS Distributions return '' 197*aca3beaaSApple OSS Distributions 198*aca3beaaSApple OSS Distributions reginfo = cls.register_info['registers'][regnum] 199*aca3beaaSApple OSS Distributions retval = '' 200*aca3beaaSApple OSS Distributions for i in list(reginfo.keys()): 201*aca3beaaSApple OSS Distributions v_str = str(reginfo[i]) 202*aca3beaaSApple OSS Distributions if i == 'set': 203*aca3beaaSApple OSS Distributions v_str = 'General Purpose Registers' 204*aca3beaaSApple OSS Distributions retval += "%s:%s;" % (str(i), v_str) 205*aca3beaaSApple OSS Distributions return retval 206*aca3beaaSApple OSS Distributions 207*aca3beaaSApple OSS Distributions 208*aca3beaaSApple OSS Distributions 209*aca3beaaSApple OSS Distributionsclass Armv7_RegisterSet(object): 210*aca3beaaSApple OSS Distributions """ register info set for armv7 32 bit architecture """ 211*aca3beaaSApple OSS Distributions register_info = { 'sets' : ['GPR'], 212*aca3beaaSApple OSS Distributions 'registers': [ 213*aca3beaaSApple OSS Distributions { 'name':'r0' , 'bitsize' : 32, 'offset' : 0, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 0, 'dwarf' : 0}, 214*aca3beaaSApple OSS Distributions { 'name':'r1' , 'bitsize' : 32, 'offset' : 4, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 1, 'dwarf' : 1}, 215*aca3beaaSApple OSS Distributions { 'name':'r2' , 'bitsize' : 32, 'offset' : 8, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 2, 'dwarf' : 2}, 216*aca3beaaSApple OSS Distributions { 'name':'r3' , 'bitsize' : 32, 'offset' : 12, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 3, 'dwarf' : 3}, 217*aca3beaaSApple OSS Distributions { 'name':'r4' , 'bitsize' : 32, 'offset' : 16, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 4, 'dwarf' : 4}, 218*aca3beaaSApple OSS Distributions { 'name':'r5' , 'bitsize' : 32, 'offset' : 20, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 5, 'dwarf' : 5}, 219*aca3beaaSApple OSS Distributions { 'name':'r6' , 'bitsize' : 32, 'offset' : 24, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 6, 'dwarf' : 6}, 220*aca3beaaSApple OSS Distributions { 'name':'r7' , 'bitsize' : 32, 'offset' : 28, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 7, 'dwarf' : 7}, 221*aca3beaaSApple OSS Distributions { 'name':'r8' , 'bitsize' : 32, 'offset' : 32, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 8, 'dwarf' : 8}, 222*aca3beaaSApple OSS Distributions { 'name':'r9' , 'bitsize' : 32, 'offset' : 36, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc': 9, 'dwarf' : 9}, 223*aca3beaaSApple OSS Distributions { 'name':'r10' , 'bitsize' : 32, 'offset' : 40, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':10, 'dwarf' :10}, 224*aca3beaaSApple OSS Distributions { 'name':'r11' , 'bitsize' : 32, 'offset' : 44, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':11, 'dwarf' :11, 'alt-name': 'fp', 'generic': 'fp'}, 225*aca3beaaSApple OSS Distributions { 'name':'r12' , 'bitsize' : 32, 'offset' : 48, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':12, 'dwarf' :12}, 226*aca3beaaSApple OSS Distributions { 'name':'sp' , 'bitsize' : 32, 'offset' : 52, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':13, 'dwarf' :13, 'generic': 'sp'}, 227*aca3beaaSApple OSS Distributions { 'name':'lr' , 'bitsize' : 32, 'offset' : 56, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':14, 'dwarf' :14, 'generic': 'lr'}, 228*aca3beaaSApple OSS Distributions { 'name':'pc' , 'bitsize' : 32, 'offset' : 60, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':15, 'dwarf' :15, 'generic': 'pc'}, 229*aca3beaaSApple OSS Distributions { 'name':'cpsr' , 'bitsize' : 32, 'offset' : 64, 'encoding':'uint', 'format':'hex', 'set':0, 'gcc':16, 'dwarf' :16, 'generic':'flags'}, 230*aca3beaaSApple OSS Distributions { 'name':'fsr' , 'bitsize' : 32, 'offset' : 68, 'encoding':'uint', 'format':'hex', 'set':0}, 231*aca3beaaSApple OSS Distributions { 'name':'far' , 'bitsize' : 32, 'offset' : 72, 'encoding':'uint', 'format':'hex', 'set':0} 232*aca3beaaSApple OSS Distributions ] 233*aca3beaaSApple OSS Distributions } 234*aca3beaaSApple OSS Distributions 235*aca3beaaSApple OSS Distributions def __init__(self): 236*aca3beaaSApple OSS Distributions self.switch_context_address = osplugin_target_obj.FindSymbols('load_reg')[0].GetSymbol().GetStartAddress().GetLoadAddress(osplugin_target_obj) + 8 237*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 238*aca3beaaSApple OSS Distributions 239*aca3beaaSApple OSS Distributions @classmethod 240*aca3beaaSApple OSS Distributions def GetRegisterInfo(cls, regnum): 241*aca3beaaSApple OSS Distributions if regnum < 0 or regnum > len(cls.register_info['registers']): 242*aca3beaaSApple OSS Distributions return '' 243*aca3beaaSApple OSS Distributions 244*aca3beaaSApple OSS Distributions reginfo = cls.register_info['registers'][regnum] 245*aca3beaaSApple OSS Distributions retval = '' 246*aca3beaaSApple OSS Distributions for i in list(reginfo.keys()): 247*aca3beaaSApple OSS Distributions v_str = str(reginfo[i]) 248*aca3beaaSApple OSS Distributions if i == 'set': 249*aca3beaaSApple OSS Distributions v_str = 'General Purpose Registers' 250*aca3beaaSApple OSS Distributions retval += "%s:%s;" % (str(i), v_str) 251*aca3beaaSApple OSS Distributions return retval 252*aca3beaaSApple OSS Distributions 253*aca3beaaSApple OSS Distributions def ResetRegisterValues(self): 254*aca3beaaSApple OSS Distributions self.r0 = 0 255*aca3beaaSApple OSS Distributions self.r1 = 0 256*aca3beaaSApple OSS Distributions self.r2 = 0 257*aca3beaaSApple OSS Distributions self.r3 = 0 258*aca3beaaSApple OSS Distributions self.r4 = 0 259*aca3beaaSApple OSS Distributions self.r5 = 0 260*aca3beaaSApple OSS Distributions self.r6 = 0 261*aca3beaaSApple OSS Distributions self.r7 = 0 262*aca3beaaSApple OSS Distributions self.r8 = 0 263*aca3beaaSApple OSS Distributions self.r9 = 0 264*aca3beaaSApple OSS Distributions self.r10 = 0 265*aca3beaaSApple OSS Distributions self.r11 = 0 266*aca3beaaSApple OSS Distributions self.r12 = 0 267*aca3beaaSApple OSS Distributions self.sp = 0 268*aca3beaaSApple OSS Distributions self.lr = 0 269*aca3beaaSApple OSS Distributions self.pc = 0 270*aca3beaaSApple OSS Distributions self.cpsr = 0 271*aca3beaaSApple OSS Distributions self.fsr = 0 272*aca3beaaSApple OSS Distributions self.far = 0 273*aca3beaaSApple OSS Distributions 274*aca3beaaSApple OSS Distributions def __str__(self): 275*aca3beaaSApple OSS Distributions return """ 276*aca3beaaSApple OSS Distributions r0 = {o.r0: <#010x} 277*aca3beaaSApple OSS Distributions r1 = {o.r1: <#010x} 278*aca3beaaSApple OSS Distributions r2 = {o.r2: <#010x} 279*aca3beaaSApple OSS Distributions r3 = {o.r3: <#010x} 280*aca3beaaSApple OSS Distributions r4 = {o.r4: <#010x} 281*aca3beaaSApple OSS Distributions r5 = {o.r5: <#010x} 282*aca3beaaSApple OSS Distributions r6 = {o.r6: <#010x} 283*aca3beaaSApple OSS Distributions r7 = {o.r7: <#010x} 284*aca3beaaSApple OSS Distributions r8 = {o.r8: <#010x} 285*aca3beaaSApple OSS Distributions r9 = {o.r9: <#010x} 286*aca3beaaSApple OSS Distributions r10 = {o.r10: <#010x} 287*aca3beaaSApple OSS Distributions r11 = {o.r11: <#010x} 288*aca3beaaSApple OSS Distributions r12 = {o.r12: <#010x} 289*aca3beaaSApple OSS Distributions sp = {o.sp: <#010x} 290*aca3beaaSApple OSS Distributions lr = {o.lr: <#010x} 291*aca3beaaSApple OSS Distributions pc = {o.pc: <#010x} 292*aca3beaaSApple OSS Distributions cpsr = {o.cpsr: <#010x} 293*aca3beaaSApple OSS Distributions fsr = {o.fsr : <#010x} 294*aca3beaaSApple OSS Distributions far = {o.far : <#010x} 295*aca3beaaSApple OSS Distributions """.format(o=self) 296*aca3beaaSApple OSS Distributions 297*aca3beaaSApple OSS Distributions def GetPackedRegisterState(self): 298*aca3beaaSApple OSS Distributions return struct.pack('19I', self.r0, self.r1, self.r2, self.r3, 299*aca3beaaSApple OSS Distributions self.r4, self.r5, self.r6, self.r7, 300*aca3beaaSApple OSS Distributions self.r8, self.r9, self.r10, self.r11, 301*aca3beaaSApple OSS Distributions self.r12, self.sp, self.lr, self.pc, 302*aca3beaaSApple OSS Distributions self.cpsr, self.fsr, self.far) 303*aca3beaaSApple OSS Distributions 304*aca3beaaSApple OSS Distributions def ReadRegisterDataFromKDPSavedState(self, kdp_state, kernel_version): 305*aca3beaaSApple OSS Distributions saved_state = kernel_version.CreateValueFromExpression(None, '(struct arm_saved_state *) ' + str(kdp_state.GetValueAsUnsigned())) 306*aca3beaaSApple OSS Distributions saved_state = saved_state.Dereference() 307*aca3beaaSApple OSS Distributions saved_state = PluginValue(saved_state) 308*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 309*aca3beaaSApple OSS Distributions self.r0 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(0).GetValueAsUnsigned() 310*aca3beaaSApple OSS Distributions self.r1 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(1).GetValueAsUnsigned() 311*aca3beaaSApple OSS Distributions self.r2 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(2).GetValueAsUnsigned() 312*aca3beaaSApple OSS Distributions self.r3 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(3).GetValueAsUnsigned() 313*aca3beaaSApple OSS Distributions self.r4 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(4).GetValueAsUnsigned() 314*aca3beaaSApple OSS Distributions self.r5 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(5).GetValueAsUnsigned() 315*aca3beaaSApple OSS Distributions self.r6 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(6).GetValueAsUnsigned() 316*aca3beaaSApple OSS Distributions self.r7 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(7).GetValueAsUnsigned() 317*aca3beaaSApple OSS Distributions self.r8 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(8).GetValueAsUnsigned() 318*aca3beaaSApple OSS Distributions self.r9 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(9).GetValueAsUnsigned() 319*aca3beaaSApple OSS Distributions self.r10 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(10).GetValueAsUnsigned() 320*aca3beaaSApple OSS Distributions self.r11 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(11).GetValueAsUnsigned() 321*aca3beaaSApple OSS Distributions self.r12 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(12).GetValueAsUnsigned() 322*aca3beaaSApple OSS Distributions self.sp = saved_state.GetChildMemberWithName('sp').GetValueAsUnsigned() 323*aca3beaaSApple OSS Distributions self.lr = saved_state.GetChildMemberWithName('lr').GetValueAsUnsigned() 324*aca3beaaSApple OSS Distributions self.pc = saved_state.GetChildMemberWithName('pc').GetValueAsUnsigned() 325*aca3beaaSApple OSS Distributions self.cpsr = saved_state.GetChildMemberWithName('cpsr').GetValueAsUnsigned() 326*aca3beaaSApple OSS Distributions self.fsr = saved_state.GetChildMemberWithName('fsr').GetValueAsUnsigned() 327*aca3beaaSApple OSS Distributions self.far = saved_state.GetChildMemberWithName('far').GetValueAsUnsigned() 328*aca3beaaSApple OSS Distributions return self 329*aca3beaaSApple OSS Distributions 330*aca3beaaSApple OSS Distributions def ReadRegisterDataFromKernelStack(self, kstack_saved_state_addr, kernel_version): 331*aca3beaaSApple OSS Distributions saved_state = kernel_version.CreateValueFromExpression(None, '(struct arm_saved_state *) '+ str(kstack_saved_state_addr)) 332*aca3beaaSApple OSS Distributions saved_state = saved_state.Dereference() 333*aca3beaaSApple OSS Distributions saved_state = PluginValue(saved_state) 334*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 335*aca3beaaSApple OSS Distributions self.r0 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(0).GetValueAsUnsigned() 336*aca3beaaSApple OSS Distributions self.r1 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(1).GetValueAsUnsigned() 337*aca3beaaSApple OSS Distributions self.r2 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(2).GetValueAsUnsigned() 338*aca3beaaSApple OSS Distributions self.r3 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(3).GetValueAsUnsigned() 339*aca3beaaSApple OSS Distributions self.r4 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(4).GetValueAsUnsigned() 340*aca3beaaSApple OSS Distributions self.r5 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(5).GetValueAsUnsigned() 341*aca3beaaSApple OSS Distributions self.r6 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(6).GetValueAsUnsigned() 342*aca3beaaSApple OSS Distributions self.r7 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(7).GetValueAsUnsigned() 343*aca3beaaSApple OSS Distributions self.r8 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(8).GetValueAsUnsigned() 344*aca3beaaSApple OSS Distributions self.r9 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(9).GetValueAsUnsigned() 345*aca3beaaSApple OSS Distributions self.r10 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(10).GetValueAsUnsigned() 346*aca3beaaSApple OSS Distributions self.r11 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(11).GetValueAsUnsigned() 347*aca3beaaSApple OSS Distributions self.r12 = saved_state.GetChildMemberWithName('r').GetChildAtIndex(12).GetValueAsUnsigned() 348*aca3beaaSApple OSS Distributions self.sp = saved_state.GetChildMemberWithName('sp').GetValueAsUnsigned() 349*aca3beaaSApple OSS Distributions self.lr = saved_state.GetChildMemberWithName('lr').GetValueAsUnsigned() 350*aca3beaaSApple OSS Distributions # pc for a blocked thread is treated to be the next instruction it would run after thread switch. 351*aca3beaaSApple OSS Distributions self.pc = self.switch_context_address 352*aca3beaaSApple OSS Distributions self.cpsr = saved_state.GetChildMemberWithName('cpsr').GetValueAsUnsigned() 353*aca3beaaSApple OSS Distributions self.fsr = saved_state.GetChildMemberWithName('fsr').GetValueAsUnsigned() 354*aca3beaaSApple OSS Distributions self.far = saved_state.GetChildMemberWithName('far').GetValueAsUnsigned() 355*aca3beaaSApple OSS Distributions return self 356*aca3beaaSApple OSS Distributions 357*aca3beaaSApple OSS Distributions def ReadRegisterDataFromContinuation(self, continuation_ptr): 358*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 359*aca3beaaSApple OSS Distributions self.pc = continuation_ptr 360*aca3beaaSApple OSS Distributions return self 361*aca3beaaSApple OSS Distributions 362*aca3beaaSApple OSS Distributions 363*aca3beaaSApple OSS Distributionsclass I386_RegisterSet(object): 364*aca3beaaSApple OSS Distributions """ register info set for i386 architecture 365*aca3beaaSApple OSS Distributions """ 366*aca3beaaSApple OSS Distributions register_info = { 'sets' : ['GPR'], 367*aca3beaaSApple OSS Distributions 'registers': [ 368*aca3beaaSApple OSS Distributions { 'name': 'eax' , 'bitsize': 32, 'offset' : 0, 'encoding': 'uint' , 'format':'hex' , 'set': 0, 'gcc' : 0, 'dwarf': 0}, 369*aca3beaaSApple OSS Distributions { 'name': 'ebx' , 'bitsize': 32, 'offset' : 4, 'encoding': 'uint' , 'format':'hex' , 'set': 0, 'gcc' : 3, 'dwarf': 3}, 370*aca3beaaSApple OSS Distributions { 'name': 'ecx' , 'bitsize': 32, 'offset' : 8, 'encoding': 'uint' , 'format':'hex' , 'set': 0, 'gcc' : 1, 'dwarf': 1}, 371*aca3beaaSApple OSS Distributions { 'name': 'edx' , 'bitsize': 32, 'offset' :12, 'encoding': 'uint' , 'format':'hex' , 'set': 0, 'gcc' : 2, 'dwarf': 2}, 372*aca3beaaSApple OSS Distributions { 'name': 'edi' , 'bitsize': 32, 'offset' :16, 'encoding': 'uint' , 'format':'hex' , 'set': 0, 'gcc' : 7, 'dwarf': 7}, 373*aca3beaaSApple OSS Distributions { 'name': 'esi' , 'bitsize': 32, 'offset' :20, 'encoding': 'uint' , 'format':'hex' , 'set': 0, 'gcc' : 6, 'dwarf': 6}, 374*aca3beaaSApple OSS Distributions { 'name': 'ebp' , 'bitsize': 32, 'offset' :24, 'encoding': 'uint' , 'format':'hex' , 'set': 0, 'gcc' : 4, 'dwarf': 5, 'generic': 'fp', 'alt-name': 'fp'}, 375*aca3beaaSApple OSS Distributions { 'name': 'esp' , 'bitsize': 32, 'offset' :28, 'encoding': 'uint' , 'format':'hex' , 'set': 0, 'gcc' : 5, 'dwarf': 4, 'generic': 'sp', 'alt-name': 'sp'}, 376*aca3beaaSApple OSS Distributions { 'name': 'ss' , 'bitsize': 32, 'offset' :32, 'encoding': 'uint' , 'format':'hex' , 'set': 0}, 377*aca3beaaSApple OSS Distributions { 'name': 'eflags', 'bitsize': 32, 'offset' :36, 'encoding': 'uint' , 'format':'hex' , 'set': 0, 'gcc' : 9, 'dwarf': 9, 'generic': 'flags'}, 378*aca3beaaSApple OSS Distributions { 'name': 'eip' , 'bitsize': 32, 'offset' :40, 'encoding': 'uint' , 'format':'hex' , 'set': 0, 'gcc' :8, 'dwarf':8, 'generic': 'pc', 'alt-name': 'pc'}, 379*aca3beaaSApple OSS Distributions { 'name': 'cs' , 'bitsize': 32, 'offset' :44, 'encoding': 'uint' , 'format':'hex' , 'set': 0}, 380*aca3beaaSApple OSS Distributions { 'name': 'ds' , 'bitsize': 32, 'offset' :48, 'encoding': 'uint' , 'format':'hex' , 'set': 0}, 381*aca3beaaSApple OSS Distributions { 'name': 'es' , 'bitsize': 32, 'offset' :52, 'encoding': 'uint' , 'format':'hex' , 'set': 0}, 382*aca3beaaSApple OSS Distributions { 'name': 'fs' , 'bitsize': 32, 'offset' :56, 'encoding': 'uint' , 'format':'hex' , 'set': 0}, 383*aca3beaaSApple OSS Distributions { 'name': 'gs' , 'bitsize': 32, 'offset' :60, 'encoding': 'uint' , 'format':'hex' , 'set': 0}, 384*aca3beaaSApple OSS Distributions ] 385*aca3beaaSApple OSS Distributions } 386*aca3beaaSApple OSS Distributions 387*aca3beaaSApple OSS Distributions def __init__(self): 388*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 389*aca3beaaSApple OSS Distributions 390*aca3beaaSApple OSS Distributions @classmethod 391*aca3beaaSApple OSS Distributions def GetRegisterInfo(cls, regnum): 392*aca3beaaSApple OSS Distributions if regnum < 0 or regnum > len(cls.register_info['registers']): 393*aca3beaaSApple OSS Distributions return '' 394*aca3beaaSApple OSS Distributions 395*aca3beaaSApple OSS Distributions reginfo = cls.register_info['registers'][regnum] 396*aca3beaaSApple OSS Distributions retval = '' 397*aca3beaaSApple OSS Distributions for i in list(reginfo.keys()): 398*aca3beaaSApple OSS Distributions v_str = str(reginfo[i]) 399*aca3beaaSApple OSS Distributions if i == 'set': 400*aca3beaaSApple OSS Distributions v_str = 'General Purpose Registers' 401*aca3beaaSApple OSS Distributions retval += "%s:%s;" % (str(i), v_str) 402*aca3beaaSApple OSS Distributions return retval 403*aca3beaaSApple OSS Distributions 404*aca3beaaSApple OSS Distributions def ResetRegisterValues(self): 405*aca3beaaSApple OSS Distributions """ set all registers to zero """ 406*aca3beaaSApple OSS Distributions self.eax = 0 407*aca3beaaSApple OSS Distributions self.ebx = 0 408*aca3beaaSApple OSS Distributions self.ecx = 0 409*aca3beaaSApple OSS Distributions self.edx = 0 410*aca3beaaSApple OSS Distributions self.edi = 0 411*aca3beaaSApple OSS Distributions self.esi = 0 412*aca3beaaSApple OSS Distributions self.ebp = 0 413*aca3beaaSApple OSS Distributions self.esp = 0 414*aca3beaaSApple OSS Distributions self.ss = 0 415*aca3beaaSApple OSS Distributions self.eflags = 0 416*aca3beaaSApple OSS Distributions self.eip = 0 417*aca3beaaSApple OSS Distributions self.cs = 0 418*aca3beaaSApple OSS Distributions self.ds = 0 419*aca3beaaSApple OSS Distributions self.es = 0 420*aca3beaaSApple OSS Distributions self.fs = 0 421*aca3beaaSApple OSS Distributions self.gs = 0 422*aca3beaaSApple OSS Distributions 423*aca3beaaSApple OSS Distributions def __str__(self): 424*aca3beaaSApple OSS Distributions return """ 425*aca3beaaSApple OSS Distributions eax = {o.eax: #010x} 426*aca3beaaSApple OSS Distributions ebx = {o.ebx: #010x} 427*aca3beaaSApple OSS Distributions ecx = {o.ecx: #010x} 428*aca3beaaSApple OSS Distributions edx = {o.edx: #010x} 429*aca3beaaSApple OSS Distributions edi = {o.edi: #010x} 430*aca3beaaSApple OSS Distributions esi = {o.esi: #010x} 431*aca3beaaSApple OSS Distributions ebp = {o.ebp: #010x} 432*aca3beaaSApple OSS Distributions esp = {o.esp: #010x} 433*aca3beaaSApple OSS Distributions ss = {o.ss: #010x} 434*aca3beaaSApple OSS Distributions eflags = {o.eflags: #010x} 435*aca3beaaSApple OSS Distributions eip = {o.eip: #010x} 436*aca3beaaSApple OSS Distributions cs = {o.cs: #010x} 437*aca3beaaSApple OSS Distributions ds = {o.ds: #010x} 438*aca3beaaSApple OSS Distributions es = {o.es: #010x} 439*aca3beaaSApple OSS Distributions fs = {o.fs: #010x} 440*aca3beaaSApple OSS Distributions gs = {o.gs: #010x} 441*aca3beaaSApple OSS Distributions """.format(o=self) 442*aca3beaaSApple OSS Distributions 443*aca3beaaSApple OSS Distributions def GetPackedRegisterState(self): 444*aca3beaaSApple OSS Distributions """ get a struct.pack register data """ 445*aca3beaaSApple OSS Distributions return struct.pack('16I', self.eax, self.ebx, self.ecx, 446*aca3beaaSApple OSS Distributions self.edx, self.edi, self.esi, 447*aca3beaaSApple OSS Distributions self.ebp, self.esp, self.ss, 448*aca3beaaSApple OSS Distributions self.eflags, self.eip, self.cs, 449*aca3beaaSApple OSS Distributions self.ds, self.es, self.fs, self.gs 450*aca3beaaSApple OSS Distributions ) 451*aca3beaaSApple OSS Distributions 452*aca3beaaSApple OSS Distributions def ReadRegisterDataFromKDPSavedState(self, kdp_state, kernel_version): 453*aca3beaaSApple OSS Distributions """ to be implemented""" 454*aca3beaaSApple OSS Distributions return None 455*aca3beaaSApple OSS Distributions 456*aca3beaaSApple OSS Distributions def ReadRegisterDataFromKernelStack(self, kstack_saved_state_addr, kernel_version): 457*aca3beaaSApple OSS Distributions """ to be implemented """ 458*aca3beaaSApple OSS Distributions return None 459*aca3beaaSApple OSS Distributions 460*aca3beaaSApple OSS Distributions def ReadRegisterDataFromContinuation(self, continuation_ptr): 461*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 462*aca3beaaSApple OSS Distributions self.eip = continuation_ptr 463*aca3beaaSApple OSS Distributions return self 464*aca3beaaSApple OSS Distributions 465*aca3beaaSApple OSS Distributions 466*aca3beaaSApple OSS Distributionsclass X86_64RegisterSet(object): 467*aca3beaaSApple OSS Distributions """ register info set for x86_64 architecture """ 468*aca3beaaSApple OSS Distributions register_info = { 'sets' : ['GPR'], 469*aca3beaaSApple OSS Distributions 'registers': [ 470*aca3beaaSApple OSS Distributions { 'name':'rax' , 'bitsize' : 64, 'offset' : 0, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 0, 'dwarf' : 0}, 471*aca3beaaSApple OSS Distributions { 'name':'rbx' , 'bitsize' : 64, 'offset' : 8, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 3, 'dwarf' : 3}, 472*aca3beaaSApple OSS Distributions { 'name':'rcx' , 'bitsize' : 64, 'offset' : 16, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 2, 'dwarf' : 2, 'generic':'arg4', 'alt-name':'arg4', }, 473*aca3beaaSApple OSS Distributions { 'name':'rdx' , 'bitsize' : 64, 'offset' : 24, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 1, 'dwarf' : 1, 'generic':'arg3', 'alt-name':'arg3', }, 474*aca3beaaSApple OSS Distributions { 'name':'rdi' , 'bitsize' : 64, 'offset' : 32, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 5, 'dwarf' : 5, 'generic':'arg1', 'alt-name':'arg1', }, 475*aca3beaaSApple OSS Distributions { 'name':'rsi' , 'bitsize' : 64, 'offset' : 40, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 4, 'dwarf' : 4, 'generic':'arg2', 'alt-name':'arg2', }, 476*aca3beaaSApple OSS Distributions { 'name':'rbp' , 'bitsize' : 64, 'offset' : 48, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 6, 'dwarf' : 6, 'generic':'fp' , 'alt-name':'fp', }, 477*aca3beaaSApple OSS Distributions { 'name':'rsp' , 'bitsize' : 64, 'offset' : 56, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 7, 'dwarf' : 7, 'generic':'sp' , 'alt-name':'sp', }, 478*aca3beaaSApple OSS Distributions { 'name':'r8' , 'bitsize' : 64, 'offset' : 64, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 8, 'dwarf' : 8, 'generic':'arg5', 'alt-name':'arg5', }, 479*aca3beaaSApple OSS Distributions { 'name':'r9' , 'bitsize' : 64, 'offset' : 72, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 9, 'dwarf' : 9, 'generic':'arg6', 'alt-name':'arg6', }, 480*aca3beaaSApple OSS Distributions { 'name':'r10' , 'bitsize' : 64, 'offset' : 80, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 10, 'dwarf' : 10}, 481*aca3beaaSApple OSS Distributions { 'name':'r11' , 'bitsize' : 64, 'offset' : 88, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 11, 'dwarf' : 11}, 482*aca3beaaSApple OSS Distributions { 'name':'r12' , 'bitsize' : 64, 'offset' : 96, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 12, 'dwarf' : 12}, 483*aca3beaaSApple OSS Distributions { 'name':'r13' , 'bitsize' : 64, 'offset' : 104, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 13, 'dwarf' : 13}, 484*aca3beaaSApple OSS Distributions { 'name':'r14' , 'bitsize' : 64, 'offset' : 112, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 14, 'dwarf' : 14}, 485*aca3beaaSApple OSS Distributions { 'name':'r15' , 'bitsize' : 64, 'offset' : 120, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 15, 'dwarf' : 15}, 486*aca3beaaSApple OSS Distributions { 'name':'rip' , 'bitsize' : 64, 'offset' : 128, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'gcc' : 16, 'dwarf' : 16, 'generic':'pc', 'alt-name':'pc' }, 487*aca3beaaSApple OSS Distributions { 'name':'rflags' , 'bitsize' : 64, 'offset' : 136, 'encoding':'uint' , 'format':'hex' , 'set': 0, 'generic':'flags', 'alt-name':'flags' }, 488*aca3beaaSApple OSS Distributions { 'name':'cs' , 'bitsize' : 64, 'offset' : 144, 'encoding':'uint' , 'format':'hex' , 'set': 0 }, 489*aca3beaaSApple OSS Distributions { 'name':'fs' , 'bitsize' : 64, 'offset' : 152, 'encoding':'uint' , 'format':'hex' , 'set': 0 }, 490*aca3beaaSApple OSS Distributions { 'name':'gs' , 'bitsize' : 64, 'offset' : 160, 'encoding':'uint' , 'format':'hex' , 'set': 0 }, 491*aca3beaaSApple OSS Distributions ] 492*aca3beaaSApple OSS Distributions } 493*aca3beaaSApple OSS Distributions def __init__(self): 494*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 495*aca3beaaSApple OSS Distributions 496*aca3beaaSApple OSS Distributions @classmethod 497*aca3beaaSApple OSS Distributions def GetRegisterInfo(cls, regnum): 498*aca3beaaSApple OSS Distributions if regnum < 0 or regnum > len(cls.register_info['registers']): 499*aca3beaaSApple OSS Distributions return '' 500*aca3beaaSApple OSS Distributions 501*aca3beaaSApple OSS Distributions reginfo = cls.register_info['registers'][regnum] 502*aca3beaaSApple OSS Distributions retval = '' 503*aca3beaaSApple OSS Distributions for i in list(reginfo.keys()): 504*aca3beaaSApple OSS Distributions v_str = str(reginfo[i]) 505*aca3beaaSApple OSS Distributions if i == 'set': 506*aca3beaaSApple OSS Distributions v_str = 'General Purpose Registers' 507*aca3beaaSApple OSS Distributions retval += "%s:%s;" % (str(i), v_str) 508*aca3beaaSApple OSS Distributions return retval 509*aca3beaaSApple OSS Distributions 510*aca3beaaSApple OSS Distributions 511*aca3beaaSApple OSS Distributions def ResetRegisterValues(self): 512*aca3beaaSApple OSS Distributions """ set all the registers to zero. """ 513*aca3beaaSApple OSS Distributions self.rax = 0 514*aca3beaaSApple OSS Distributions self.rbx = 0 515*aca3beaaSApple OSS Distributions self.rcx = 0 516*aca3beaaSApple OSS Distributions self.rdx = 0 517*aca3beaaSApple OSS Distributions self.rdi = 0 518*aca3beaaSApple OSS Distributions self.rsi = 0 519*aca3beaaSApple OSS Distributions self.rbp = 0 520*aca3beaaSApple OSS Distributions self.rsp = 0 521*aca3beaaSApple OSS Distributions self.r8 = 0 522*aca3beaaSApple OSS Distributions self.r9 = 0 523*aca3beaaSApple OSS Distributions self.r10 = 0 524*aca3beaaSApple OSS Distributions self.r11 = 0 525*aca3beaaSApple OSS Distributions self.r12 = 0 526*aca3beaaSApple OSS Distributions self.r13 = 0 527*aca3beaaSApple OSS Distributions self.r14 = 0 528*aca3beaaSApple OSS Distributions self.r15 = 0 529*aca3beaaSApple OSS Distributions self.rip = 0 530*aca3beaaSApple OSS Distributions self.rflags = 0 531*aca3beaaSApple OSS Distributions self.cs = 0 532*aca3beaaSApple OSS Distributions self.fs = 0 533*aca3beaaSApple OSS Distributions self.gs = 0 534*aca3beaaSApple OSS Distributions 535*aca3beaaSApple OSS Distributions def __str__(self): 536*aca3beaaSApple OSS Distributions return """ 537*aca3beaaSApple OSS Distributions rax = {o.rax: <#018x} 538*aca3beaaSApple OSS Distributions rbx = {o.rbx: <#018x} 539*aca3beaaSApple OSS Distributions rcx = {o.rcx: <#018x} 540*aca3beaaSApple OSS Distributions rdx = {o.rdx: <#018x} 541*aca3beaaSApple OSS Distributions rdi = {o.rdi: <#018x} 542*aca3beaaSApple OSS Distributions rsi = {o.rsi: <#018x} 543*aca3beaaSApple OSS Distributions rbp = {o.rbp: <#018x} 544*aca3beaaSApple OSS Distributions rsp = {o.rsp: <#018x} 545*aca3beaaSApple OSS Distributions r8 = {o.r8: <#018x} 546*aca3beaaSApple OSS Distributions r9 = {o.r9: <#018x} 547*aca3beaaSApple OSS Distributions r10 = {o.r10: <#018x} 548*aca3beaaSApple OSS Distributions r11 = {o.r11: <#018x} 549*aca3beaaSApple OSS Distributions r12 = {o.r12: <#018x} 550*aca3beaaSApple OSS Distributions r13 = {o.r13: <#018x} 551*aca3beaaSApple OSS Distributions r14 = {o.r14: <#018x} 552*aca3beaaSApple OSS Distributions r15 = {o.r15: <#018x} 553*aca3beaaSApple OSS Distributions rip = {o.rip: <#018x} 554*aca3beaaSApple OSS Distributions rflags = {o.rflags: <#018x} 555*aca3beaaSApple OSS Distributions cs = {o.cs: <#018x} 556*aca3beaaSApple OSS Distributions fs = {o.fs: <#018x} 557*aca3beaaSApple OSS Distributions gs = {o.gs: <#018x} 558*aca3beaaSApple OSS Distributions """.format(o=self) 559*aca3beaaSApple OSS Distributions 560*aca3beaaSApple OSS Distributions def GetPackedRegisterState(self): 561*aca3beaaSApple OSS Distributions """ get a struct.pack register data for passing to C constructs """ 562*aca3beaaSApple OSS Distributions return struct.pack('21Q', self.rax, self.rbx, self.rcx, self.rdx, self.rdi, 563*aca3beaaSApple OSS Distributions self.rsi, self.rbp, self.rsp, self.r8, self.r9, 564*aca3beaaSApple OSS Distributions self.r10, self.r11, self.r12, self.r13, self.r14, 565*aca3beaaSApple OSS Distributions self.r15, self.rip, self.rflags, self.cs, self.fs, self.gs) 566*aca3beaaSApple OSS Distributions 567*aca3beaaSApple OSS Distributions def ReadRegisterDataFromKDPSavedState(self, kdp_state, kernel_version): 568*aca3beaaSApple OSS Distributions saved_state = kernel_version.CreateValueFromExpression(None, '(struct x86_saved_state64 *) '+ str(kdp_state.GetValueAsUnsigned())) 569*aca3beaaSApple OSS Distributions saved_state = saved_state.Dereference() 570*aca3beaaSApple OSS Distributions saved_state = PluginValue(saved_state) 571*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 572*aca3beaaSApple OSS Distributions self.rdi = saved_state.GetChildMemberWithName('rdi').GetValueAsUnsigned() 573*aca3beaaSApple OSS Distributions self.rsi = saved_state.GetChildMemberWithName('rsi').GetValueAsUnsigned() 574*aca3beaaSApple OSS Distributions self.rdx = saved_state.GetChildMemberWithName('rdx').GetValueAsUnsigned() 575*aca3beaaSApple OSS Distributions self.r10 = saved_state.GetChildMemberWithName('r10').GetValueAsUnsigned() 576*aca3beaaSApple OSS Distributions self.r8 = saved_state.GetChildMemberWithName('r8').GetValueAsUnsigned() 577*aca3beaaSApple OSS Distributions self.r9 = saved_state.GetChildMemberWithName('r9').GetValueAsUnsigned() 578*aca3beaaSApple OSS Distributions self.r15 = saved_state.GetChildMemberWithName('r15').GetValueAsUnsigned() 579*aca3beaaSApple OSS Distributions self.r14 = saved_state.GetChildMemberWithName('r14').GetValueAsUnsigned() 580*aca3beaaSApple OSS Distributions self.r13 = saved_state.GetChildMemberWithName('r13').GetValueAsUnsigned() 581*aca3beaaSApple OSS Distributions self.r12 = saved_state.GetChildMemberWithName('r12').GetValueAsUnsigned() 582*aca3beaaSApple OSS Distributions self.r11 = saved_state.GetChildMemberWithName('r11').GetValueAsUnsigned() 583*aca3beaaSApple OSS Distributions self.rbp = saved_state.GetChildMemberWithName('rbp').GetValueAsUnsigned() 584*aca3beaaSApple OSS Distributions self.rbx = saved_state.GetChildMemberWithName('rbx').GetValueAsUnsigned() 585*aca3beaaSApple OSS Distributions self.rcx = saved_state.GetChildMemberWithName('rcx').GetValueAsUnsigned() 586*aca3beaaSApple OSS Distributions self.rax = saved_state.GetChildMemberWithName('rax').GetValueAsUnsigned() 587*aca3beaaSApple OSS Distributions self.rip = saved_state.GetChildMemberWithName('isf').GetChildMemberWithName('rip').GetValueAsUnsigned() 588*aca3beaaSApple OSS Distributions self.rflags = saved_state.GetChildMemberWithName('isf').GetChildMemberWithName('rflags').GetValueAsUnsigned() 589*aca3beaaSApple OSS Distributions self.rsp = saved_state.GetChildMemberWithName('isf').GetChildMemberWithName('rsp').GetValueAsUnsigned() 590*aca3beaaSApple OSS Distributions return self 591*aca3beaaSApple OSS Distributions 592*aca3beaaSApple OSS Distributions def ReadRegisterDataFromKernelStack(self, kstack_saved_state_addr, kernel_version): 593*aca3beaaSApple OSS Distributions saved_state = kernel_version.CreateValueFromExpression(None, '(struct x86_kernel_state *) '+ str(kstack_saved_state_addr)) 594*aca3beaaSApple OSS Distributions saved_state = saved_state.Dereference() 595*aca3beaaSApple OSS Distributions saved_state = PluginValue(saved_state) 596*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 597*aca3beaaSApple OSS Distributions self.rbx = saved_state.GetChildMemberWithName('k_rbx').GetValueAsUnsigned() 598*aca3beaaSApple OSS Distributions self.rsp = saved_state.GetChildMemberWithName('k_rsp').GetValueAsUnsigned() 599*aca3beaaSApple OSS Distributions self.rbp = saved_state.GetChildMemberWithName('k_rbp').GetValueAsUnsigned() 600*aca3beaaSApple OSS Distributions self.r12 = saved_state.GetChildMemberWithName('k_r12').GetValueAsUnsigned() 601*aca3beaaSApple OSS Distributions self.r13 = saved_state.GetChildMemberWithName('k_r13').GetValueAsUnsigned() 602*aca3beaaSApple OSS Distributions self.r14 = saved_state.GetChildMemberWithName('k_r14').GetValueAsUnsigned() 603*aca3beaaSApple OSS Distributions self.r15 = saved_state.GetChildMemberWithName('k_r15').GetValueAsUnsigned() 604*aca3beaaSApple OSS Distributions self.rip = saved_state.GetChildMemberWithName('k_rip').GetValueAsUnsigned() 605*aca3beaaSApple OSS Distributions return self 606*aca3beaaSApple OSS Distributions 607*aca3beaaSApple OSS Distributions def ReadRegisterDataFromContinuation(self, continuation_ptr): 608*aca3beaaSApple OSS Distributions self.ResetRegisterValues() 609*aca3beaaSApple OSS Distributions self.rip = continuation_ptr 610*aca3beaaSApple OSS Distributions return self 611*aca3beaaSApple OSS Distributions 612*aca3beaaSApple OSS Distributions 613*aca3beaaSApple OSS Distributions 614*aca3beaaSApple OSS Distributions 615*aca3beaaSApple OSS Distributionsdef IterateQueue(queue_head, element_ptr_type, element_field_name): 616*aca3beaaSApple OSS Distributions """ iterate over a queue in kernel of type queue_head_t. refer to osfmk/kern/queue.h 617*aca3beaaSApple OSS Distributions params: 618*aca3beaaSApple OSS Distributions queue_head - lldb.SBValue : Value object for queue_head. 619*aca3beaaSApple OSS Distributions element_type - lldb.SBType : a pointer type of the element 'next' points to. Typically its structs like thread, task etc.. 620*aca3beaaSApple OSS Distributions element_field_name - str : name of the field in target struct. 621*aca3beaaSApple OSS Distributions returns: 622*aca3beaaSApple OSS Distributions A generator does not return. It is used for iterating. 623*aca3beaaSApple OSS Distributions SBValue : an object thats of type (element_type) queue_head->next. Always a pointer object 624*aca3beaaSApple OSS Distributions """ 625*aca3beaaSApple OSS Distributions queue_head_addr = 0x0 626*aca3beaaSApple OSS Distributions if queue_head.TypeIsPointerType(): 627*aca3beaaSApple OSS Distributions queue_head_addr = queue_head.GetValueAsUnsigned() 628*aca3beaaSApple OSS Distributions else: 629*aca3beaaSApple OSS Distributions queue_head_addr = queue_head.GetAddress().GetLoadAddress(osplugin_target_obj) 630*aca3beaaSApple OSS Distributions cur_elt = queue_head.GetChildMemberWithName('next') 631*aca3beaaSApple OSS Distributions while True: 632*aca3beaaSApple OSS Distributions if not cur_elt.IsValid() or cur_elt.GetValueAsUnsigned() == 0 or cur_elt.GetValueAsUnsigned() == queue_head_addr: 633*aca3beaaSApple OSS Distributions break 634*aca3beaaSApple OSS Distributions elt = cur_elt.Cast(element_ptr_type) 635*aca3beaaSApple OSS Distributions yield elt 636*aca3beaaSApple OSS Distributions cur_elt = elt.GetChildMemberWithName(element_field_name).GetChildMemberWithName('next') 637*aca3beaaSApple OSS Distributions 638*aca3beaaSApple OSS Distributionsdef GetUniqueSessionID(process_obj): 639*aca3beaaSApple OSS Distributions """ Create a unique session identifier. 640*aca3beaaSApple OSS Distributions params: 641*aca3beaaSApple OSS Distributions process_obj: lldb.SBProcess object refering to connected process. 642*aca3beaaSApple OSS Distributions returns: 643*aca3beaaSApple OSS Distributions int - a unique number identified by processid and stopid. 644*aca3beaaSApple OSS Distributions """ 645*aca3beaaSApple OSS Distributions session_key_str = "" 646*aca3beaaSApple OSS Distributions if hasattr(process_obj, "GetUniqueID"): 647*aca3beaaSApple OSS Distributions session_key_str += str(process_obj.GetUniqueID()) + ":" 648*aca3beaaSApple OSS Distributions else: 649*aca3beaaSApple OSS Distributions session_key_str += "0:" 650*aca3beaaSApple OSS Distributions 651*aca3beaaSApple OSS Distributions if hasattr(process_obj, "GetStopID"): 652*aca3beaaSApple OSS Distributions session_key_str += str(process_obj.GetStopID()) 653*aca3beaaSApple OSS Distributions else: 654*aca3beaaSApple OSS Distributions session_key_str +="1" 655*aca3beaaSApple OSS Distributions 656*aca3beaaSApple OSS Distributions return hash(session_key_str) 657*aca3beaaSApple OSS Distributions 658*aca3beaaSApple OSS Distributions 659*aca3beaaSApple OSS Distributions(archX86_64, archARMv7, archI386, archARMv8) = ("x86_64", "armv7", "i386", "arm64") 660*aca3beaaSApple OSS Distributions 661*aca3beaaSApple OSS Distributionsclass OperatingSystemPlugIn(object): 662*aca3beaaSApple OSS Distributions """Class that provides data for an instance of a LLDB 'OperatingSystemPython' plug-in class""" 663*aca3beaaSApple OSS Distributions 664*aca3beaaSApple OSS Distributions def __init__(self, process): 665*aca3beaaSApple OSS Distributions '''Initialization needs a valid.SBProcess object''' 666*aca3beaaSApple OSS Distributions self.process = None 667*aca3beaaSApple OSS Distributions self.registers = None 668*aca3beaaSApple OSS Distributions self.threads = None 669*aca3beaaSApple OSS Distributions self.thread_cache = {} 670*aca3beaaSApple OSS Distributions self.current_session_id = 0 671*aca3beaaSApple OSS Distributions self.kdp_thread = None 672*aca3beaaSApple OSS Distributions if type(process) is lldb.SBProcess and process.IsValid(): 673*aca3beaaSApple OSS Distributions global osplugin_target_obj 674*aca3beaaSApple OSS Distributions self.process = process 675*aca3beaaSApple OSS Distributions self._target = process.target 676*aca3beaaSApple OSS Distributions osplugin_target_obj = self._target 677*aca3beaaSApple OSS Distributions self.current_session_id = GetUniqueSessionID(self.process) 678*aca3beaaSApple OSS Distributions self.version = self._target.FindGlobalVariables('version', 1).GetValueAtIndex(0) 679*aca3beaaSApple OSS Distributions self.kasan_tbi = self._target.FindGlobalVariables('kasan_tbi_enabled', 1).GetValueAtIndex(0) 680*aca3beaaSApple OSS Distributions self.kernel_stack_size = self._target.FindGlobalVariables('kernel_stack_size', 1).GetValueAtIndex(0).GetValueAsUnsigned() 681*aca3beaaSApple OSS Distributions self.kernel_context_size = 0 682*aca3beaaSApple OSS Distributions self.connected_over_kdp = False 683*aca3beaaSApple OSS Distributions # connected_to_debugserver signifies if we are connected to astris or other gdbserver instance 684*aca3beaaSApple OSS Distributions # that has the correct thread state for on core threads. For kdp and coredumps we rely on in memory 685*aca3beaaSApple OSS Distributions # state of threads. 686*aca3beaaSApple OSS Distributions self.connected_to_debugserver = True 687*aca3beaaSApple OSS Distributions plugin_string = self.process.GetPluginName().lower() 688*aca3beaaSApple OSS Distributions if plugin_string.find("kdp") >=0: 689*aca3beaaSApple OSS Distributions self.connected_over_kdp = True 690*aca3beaaSApple OSS Distributions self.connected_to_debugserver = False 691*aca3beaaSApple OSS Distributions #print "version", self.version, "kernel_stack_size", self.kernel_stack_size, "context_size", self.kernel_context_size 692*aca3beaaSApple OSS Distributions self.threads = None # Will be an dictionary containing info for each thread 693*aca3beaaSApple OSS Distributions triple = self.process.target.triple 694*aca3beaaSApple OSS Distributions arch = triple.split('-')[0].lower() 695*aca3beaaSApple OSS Distributions self.target_arch = "" 696*aca3beaaSApple OSS Distributions self.kernel_context_size = 0 697*aca3beaaSApple OSS Distributions if arch == archX86_64 : 698*aca3beaaSApple OSS Distributions self.target_arch = archX86_64 699*aca3beaaSApple OSS Distributions print("Target arch: x86_64") 700*aca3beaaSApple OSS Distributions self.register_set = X86_64RegisterSet() 701*aca3beaaSApple OSS Distributions self.kernel_context_size = self._target.FindFirstType('x86_kernel_state').GetByteSize() 702*aca3beaaSApple OSS Distributions self.kernel_thread_state_size = self._target.FindFirstType('struct thread_kernel_state').GetByteSize() 703*aca3beaaSApple OSS Distributions elif arch.startswith(archARMv7) : 704*aca3beaaSApple OSS Distributions self.target_arch = arch 705*aca3beaaSApple OSS Distributions print("Target arch: " + self.target_arch) 706*aca3beaaSApple OSS Distributions self.register_set = Armv7_RegisterSet() 707*aca3beaaSApple OSS Distributions elif arch.startswith(archARMv8): 708*aca3beaaSApple OSS Distributions self.target_arch = arch 709*aca3beaaSApple OSS Distributions print("Target arch: " + self.target_arch) 710*aca3beaaSApple OSS Distributions self.register_set = Armv8_RegisterSet() 711*aca3beaaSApple OSS Distributions # connection intel arm 712*aca3beaaSApple OSS Distributions # kdp Memory Memory 713*aca3beaaSApple OSS Distributions # gdb Server Server 714*aca3beaaSApple OSS Distributions # coredump Memory Server 715*aca3beaaSApple OSS Distributions if not self.connected_over_kdp : 716*aca3beaaSApple OSS Distributions if plugin_string.find('core') >= 0 and self.target_arch == archX86_64: 717*aca3beaaSApple OSS Distributions self.connected_to_debugserver = False 718*aca3beaaSApple OSS Distributions self.registers = self.register_set.register_info 719*aca3beaaSApple OSS Distributions if self.connected_to_debugserver: 720*aca3beaaSApple OSS Distributions print("Connected to live debugserver or arm core. Will associate on-core threads to registers reported by server.") 721*aca3beaaSApple OSS Distributions else: 722*aca3beaaSApple OSS Distributions print("Instantiating threads completely from saved state in memory.") 723*aca3beaaSApple OSS Distributions 724*aca3beaaSApple OSS Distributions def create_thread(self, tid, context): 725*aca3beaaSApple OSS Distributions def strip_tbi(v): 726*aca3beaaSApple OSS Distributions if self.kasan_tbi and v != 0: 727*aca3beaaSApple OSS Distributions v |= (0xFF << 56) 728*aca3beaaSApple OSS Distributions return v 729*aca3beaaSApple OSS Distributions 730*aca3beaaSApple OSS Distributions # Strip TBI explicitly in case create_thread() is called externally. 731*aca3beaaSApple OSS Distributions context = strip_tbi(context) 732*aca3beaaSApple OSS Distributions 733*aca3beaaSApple OSS Distributions # tid == deadbeef means its a custom thread which kernel does not know of. 734*aca3beaaSApple OSS Distributions if tid == 0xdeadbeef : 735*aca3beaaSApple OSS Distributions # tid manipulation should be the same as in "switchtoregs" code in lldbmacros/process.py . 736*aca3beaaSApple OSS Distributions tid = 0xdead0000 | (context & ~0xffff0000) 737*aca3beaaSApple OSS Distributions tid = tid & 0xdeadffff 738*aca3beaaSApple OSS Distributions thread_obj = { 'tid' : tid, 739*aca3beaaSApple OSS Distributions 'ptr' : context, 740*aca3beaaSApple OSS Distributions 'name' : 'switchtoregs' + hex(context), 741*aca3beaaSApple OSS Distributions 'queue' : 'None', 742*aca3beaaSApple OSS Distributions 'state' : 'stopped', 743*aca3beaaSApple OSS Distributions 'stop_reason' : 'none' 744*aca3beaaSApple OSS Distributions } 745*aca3beaaSApple OSS Distributions self.thread_cache[tid] = thread_obj 746*aca3beaaSApple OSS Distributions return thread_obj 747*aca3beaaSApple OSS Distributions 748*aca3beaaSApple OSS Distributions th_ptr = context 749*aca3beaaSApple OSS Distributions th = self.version.CreateValueFromExpression(str(th_ptr), '(struct thread *)' + str(th_ptr)) 750*aca3beaaSApple OSS Distributions thread_id = th.GetChildMemberWithName('thread_id').GetValueAsUnsigned() 751*aca3beaaSApple OSS Distributions if tid != thread_id: 752*aca3beaaSApple OSS Distributions print("FATAL ERROR: Creating thread from memory 0x%x with tid in mem=%d when requested tid = %d " % (context, thread_id, tid)) 753*aca3beaaSApple OSS Distributions return None 754*aca3beaaSApple OSS Distributions 755*aca3beaaSApple OSS Distributions wait_queue = strip_tbi(th.GetChildMemberWithName('wait_queue').GetValueAsUnsigned()) 756*aca3beaaSApple OSS Distributions thread_obj = { 'tid' : thread_id, 757*aca3beaaSApple OSS Distributions 'ptr' : th.GetValueAsUnsigned(), 758*aca3beaaSApple OSS Distributions 'name' : hex(th.GetValueAsUnsigned()).rstrip('L'), 759*aca3beaaSApple OSS Distributions 'queue' : hex(wait_queue).rstrip('L'), 760*aca3beaaSApple OSS Distributions 'state' : 'stopped', 761*aca3beaaSApple OSS Distributions 'stop_reason' : 'none' 762*aca3beaaSApple OSS Distributions } 763*aca3beaaSApple OSS Distributions 764*aca3beaaSApple OSS Distributions if self.current_session_id != GetUniqueSessionID(self.process): 765*aca3beaaSApple OSS Distributions self.thread_cache = {} 766*aca3beaaSApple OSS Distributions self.current_session_id = GetUniqueSessionID(self.process) 767*aca3beaaSApple OSS Distributions 768*aca3beaaSApple OSS Distributions self.thread_cache[tid] = thread_obj 769*aca3beaaSApple OSS Distributions return thread_obj 770*aca3beaaSApple OSS Distributions 771*aca3beaaSApple OSS Distributions def get_thread_info(self): 772*aca3beaaSApple OSS Distributions self.kdp_thread = None 773*aca3beaaSApple OSS Distributions self.kdp_state = None 774*aca3beaaSApple OSS Distributions if self.connected_over_kdp : 775*aca3beaaSApple OSS Distributions kdp = self._target.FindGlobalVariables('kdp',1).GetValueAtIndex(0) 776*aca3beaaSApple OSS Distributions kdp_state = kdp.GetChildMemberWithName('saved_state') 777*aca3beaaSApple OSS Distributions kdp_thread = self._strip_thread_tbi(kdp.GetChildMemberWithName('kdp_thread')) 778*aca3beaaSApple OSS Distributions if kdp_thread and kdp_thread.GetValueAsUnsigned() != 0: 779*aca3beaaSApple OSS Distributions self.kdp_thread = kdp_thread 780*aca3beaaSApple OSS Distributions self.kdp_state = kdp_state 781*aca3beaaSApple OSS Distributions kdp_thid = kdp_thread.GetChildMemberWithName('thread_id').GetValueAsUnsigned() 782*aca3beaaSApple OSS Distributions self.create_thread(kdp_thid, kdp_thread.GetValueAsUnsigned()) 783*aca3beaaSApple OSS Distributions self.thread_cache[kdp_thid]['core']=0 784*aca3beaaSApple OSS Distributions retval = [self.thread_cache[kdp_thid]] 785*aca3beaaSApple OSS Distributions return retval 786*aca3beaaSApple OSS Distributions else: 787*aca3beaaSApple OSS Distributions print("FATAL FAILURE: Unable to find kdp_thread state for this connection.") 788*aca3beaaSApple OSS Distributions return [] 789*aca3beaaSApple OSS Distributions 790*aca3beaaSApple OSS Distributions num_threads = self._target.FindGlobalVariables('threads_count',1).GetValueAtIndex(0).GetValueAsUnsigned() 791*aca3beaaSApple OSS Distributions #In case we are caught before threads are initialized. Fallback to threads known by astris/gdb server. 792*aca3beaaSApple OSS Distributions if num_threads <=0 : 793*aca3beaaSApple OSS Distributions return [] 794*aca3beaaSApple OSS Distributions 795*aca3beaaSApple OSS Distributions self.current_session_id = GetUniqueSessionID(self.process) 796*aca3beaaSApple OSS Distributions self.threads = [] 797*aca3beaaSApple OSS Distributions self.thread_cache = {} 798*aca3beaaSApple OSS Distributions self.processors = [] 799*aca3beaaSApple OSS Distributions try: 800*aca3beaaSApple OSS Distributions processor_list_val = PluginValue(self._target.FindGlobalVariables('processor_list',1).GetValueAtIndex(0)) 801*aca3beaaSApple OSS Distributions while processor_list_val.IsValid() and processor_list_val.GetValueAsUnsigned() !=0 : 802*aca3beaaSApple OSS Distributions th = self._strip_thread_tbi(processor_list_val.GetChildMemberWithName('active_thread')) 803*aca3beaaSApple OSS Distributions th_id = th.GetChildMemberWithName('thread_id').GetValueAsUnsigned() 804*aca3beaaSApple OSS Distributions cpu_id = processor_list_val.GetChildMemberWithName('cpu_id').GetValueAsUnsigned() 805*aca3beaaSApple OSS Distributions self.processors.append({'active_thread': th.GetValueAsUnsigned(), 'cpu_id': cpu_id}) 806*aca3beaaSApple OSS Distributions self.create_thread(th_id, th.GetValueAsUnsigned()) 807*aca3beaaSApple OSS Distributions if self.connected_to_debugserver: 808*aca3beaaSApple OSS Distributions self.thread_cache[th_id]['core'] = cpu_id 809*aca3beaaSApple OSS Distributions self.thread_cache[th_id]['queue'] = "cpu-%d" % int(cpu_id) 810*aca3beaaSApple OSS Distributions nth = self.thread_cache[th_id] 811*aca3beaaSApple OSS Distributions self.threads.append(nth) 812*aca3beaaSApple OSS Distributions self.thread_cache[nth['tid']] = nth 813*aca3beaaSApple OSS Distributions processor_list_val = processor_list_val.GetChildMemberWithName('processor_list') 814*aca3beaaSApple OSS Distributions except KeyboardInterrupt as ke: 815*aca3beaaSApple OSS Distributions print("OS Plugin Interrupted during thread loading process. \nWARNING:Thread registers and backtraces may not be accurate.") 816*aca3beaaSApple OSS Distributions return self.threads 817*aca3beaaSApple OSS Distributions 818*aca3beaaSApple OSS Distributions if hasattr(self.process, 'CreateOSPluginThread'): 819*aca3beaaSApple OSS Distributions return self.threads 820*aca3beaaSApple OSS Distributions 821*aca3beaaSApple OSS Distributions # FIXME remove legacy code 822*aca3beaaSApple OSS Distributions try: 823*aca3beaaSApple OSS Distributions thread_q_head = self._target.FindGlobalVariables('threads', 1).GetValueAtIndex(0) 824*aca3beaaSApple OSS Distributions thread_type = self._target.FindFirstType('thread') 825*aca3beaaSApple OSS Distributions thread_ptr_type = thread_type.GetPointerType() 826*aca3beaaSApple OSS Distributions for th in IterateQueue(thread_q_head, thread_ptr_type, 'threads'): 827*aca3beaaSApple OSS Distributions th = self._strip_thread_tbi(th) 828*aca3beaaSApple OSS Distributions th_id = th.GetChildMemberWithName('thread_id').GetValueAsUnsigned() 829*aca3beaaSApple OSS Distributions self.create_thread(th_id, th.GetValueAsUnsigned()) 830*aca3beaaSApple OSS Distributions nth = self.thread_cache[th_id] 831*aca3beaaSApple OSS Distributions for cputhread in self.processors: 832*aca3beaaSApple OSS Distributions if cputhread['active_thread'] == nth['ptr']: 833*aca3beaaSApple OSS Distributions nth['core'] = cputhread['cpu_id'] 834*aca3beaaSApple OSS Distributions self.threads.append( nth ) 835*aca3beaaSApple OSS Distributions except KeyboardInterrupt as ke: 836*aca3beaaSApple OSS Distributions print("OS Plugin Interrupted during thread loading process. \nWARNING:Thread registers and backtraces may not be accurate.") 837*aca3beaaSApple OSS Distributions return self.threads 838*aca3beaaSApple OSS Distributions # end legacy code 839*aca3beaaSApple OSS Distributions return self.threads 840*aca3beaaSApple OSS Distributions 841*aca3beaaSApple OSS Distributions def get_register_info(self): 842*aca3beaaSApple OSS Distributions if self.registers == None: 843*aca3beaaSApple OSS Distributions print("Register Information not found ") 844*aca3beaaSApple OSS Distributions return self.register_set.register_info 845*aca3beaaSApple OSS Distributions 846*aca3beaaSApple OSS Distributions def get_register_data(self, tid): 847*aca3beaaSApple OSS Distributions thobj = None 848*aca3beaaSApple OSS Distributions try: 849*aca3beaaSApple OSS Distributions regs = self.register_set 850*aca3beaaSApple OSS Distributions if self.current_session_id != GetUniqueSessionID(self.process): 851*aca3beaaSApple OSS Distributions self.thread_cache = {} 852*aca3beaaSApple OSS Distributions self.current_session_id = GetUniqueSessionID(self.process) 853*aca3beaaSApple OSS Distributions if tid in self.thread_cache: 854*aca3beaaSApple OSS Distributions 855*aca3beaaSApple OSS Distributions #Check if the thread is a fake one. Then create and return registers directly 856*aca3beaaSApple OSS Distributions if self.thread_cache[tid]['name'].find('switchtoregs') == 0: 857*aca3beaaSApple OSS Distributions savedstateobj = self.version.CreateValueFromExpression(None, '(uintptr_t *) ' + str(self.thread_cache[tid]['ptr'])) 858*aca3beaaSApple OSS Distributions regs.ReadRegisterDataFromKDPSavedState(savedstateobj, self.version) 859*aca3beaaSApple OSS Distributions return regs.GetPackedRegisterState() 860*aca3beaaSApple OSS Distributions 861*aca3beaaSApple OSS Distributions thobj = self.version.CreateValueFromExpression(self.thread_cache[tid]['name'], '(struct thread *)' + str(self.thread_cache[tid]['ptr'])) 862*aca3beaaSApple OSS Distributions 863*aca3beaaSApple OSS Distributions if thobj == None : 864*aca3beaaSApple OSS Distributions print("FATAL ERROR: Could not find thread with id %d" % tid) 865*aca3beaaSApple OSS Distributions regs.ResetRegisterValues() 866*aca3beaaSApple OSS Distributions return regs.GetPackedRegisterState() 867*aca3beaaSApple OSS Distributions 868*aca3beaaSApple OSS Distributions if self.kdp_thread and self.kdp_thread.GetValueAsUnsigned() == thobj.GetValueAsUnsigned(): 869*aca3beaaSApple OSS Distributions regs.ReadRegisterDataFromKDPSavedState(self.kdp_state, self.version) 870*aca3beaaSApple OSS Distributions return regs.GetPackedRegisterState() 871*aca3beaaSApple OSS Distributions if int(PluginValue(thobj).GetChildMemberWithName('kernel_stack').GetValueAsUnsigned()) != 0 : 872*aca3beaaSApple OSS Distributions if self.target_arch == archX86_64 : 873*aca3beaaSApple OSS Distributions # we do have a stack so lets get register information 874*aca3beaaSApple OSS Distributions saved_state_addr = PluginValue(thobj).GetChildMemberWithName('kernel_stack').GetValueAsUnsigned() + self.kernel_stack_size - self.kernel_thread_state_size 875*aca3beaaSApple OSS Distributions regs.ReadRegisterDataFromKernelStack(saved_state_addr, self.version) 876*aca3beaaSApple OSS Distributions return regs.GetPackedRegisterState() 877*aca3beaaSApple OSS Distributions elif self.target_arch.startswith(archARMv7) and int(PluginValue(thobj).GetChildMemberWithName('machine').GetChildMemberWithName('kstackptr').GetValueAsUnsigned()) != 0: 878*aca3beaaSApple OSS Distributions #we have stack on the machine.kstackptr. 879*aca3beaaSApple OSS Distributions saved_state_addr = PluginValue(thobj).GetChildMemberWithName('machine').GetChildMemberWithName('kstackptr').GetValueAsUnsigned() 880*aca3beaaSApple OSS Distributions regs.ReadRegisterDataFromKernelStack(saved_state_addr, self.version) 881*aca3beaaSApple OSS Distributions return regs.GetPackedRegisterState() 882*aca3beaaSApple OSS Distributions elif self.target_arch.startswith(archARMv8) and int(PluginValue(thobj).GetChildMemberWithName('machine').GetChildMemberWithName('kstackptr').GetValueAsUnsigned()) != 0: 883*aca3beaaSApple OSS Distributions saved_state_addr = PluginValue(thobj).GetChildMemberWithName('machine').GetChildMemberWithName('kstackptr').GetValueAsUnsigned() 884*aca3beaaSApple OSS Distributions arm_ctx = PluginValue(self.version.CreateValueFromExpression(None, '(struct arm_kernel_context *) ' + str(saved_state_addr))) 885*aca3beaaSApple OSS Distributions arm_ss_addr = arm_ctx.GetChildMemberWithName('ss').GetLoadAddress() 886*aca3beaaSApple OSS Distributions regs.ReadRegisterDataFromKernelStack(arm_ss_addr, self.version) 887*aca3beaaSApple OSS Distributions return regs.GetPackedRegisterState() 888*aca3beaaSApple OSS Distributions elif self.target_arch == archX86_64 or self.target_arch.startswith(archARMv7) or self.target_arch.startswith(archARMv8): 889*aca3beaaSApple OSS Distributions regs.ReadRegisterDataFromContinuation( PluginValue(thobj).GetChildMemberWithName('continuation').GetValueAsAddress()) 890*aca3beaaSApple OSS Distributions return regs.GetPackedRegisterState() 891*aca3beaaSApple OSS Distributions #incase we failed very miserably 892*aca3beaaSApple OSS Distributions except KeyboardInterrupt as ke: 893*aca3beaaSApple OSS Distributions print("OS Plugin Interrupted during thread register load. \nWARNING:Thread registers and backtraces may not be accurate. for tid = %d" % tid) 894*aca3beaaSApple OSS Distributions regs.ResetRegisterValues() 895*aca3beaaSApple OSS Distributions print("FATAL ERROR: Failed to get register state for thread id 0x%x " % tid) 896*aca3beaaSApple OSS Distributions print(thobj) 897*aca3beaaSApple OSS Distributions return regs.GetPackedRegisterState() 898*aca3beaaSApple OSS Distributions 899*aca3beaaSApple OSS Distributions def _strip_thread_tbi(self, th): 900*aca3beaaSApple OSS Distributions if not self.kasan_tbi: 901*aca3beaaSApple OSS Distributions return th 902*aca3beaaSApple OSS Distributions addr = th.GetValueAsAddress() 903*aca3beaaSApple OSS Distributions return self.version.CreateValueFromExpression(str(addr), '(struct thread *)' + str(addr))