xref: /xnu-8796.101.5/tools/lldbmacros/core/operating_system.py (revision aca3beaa3dfbd42498b42c5e5ce20a938e6554e5)
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))