1be691f3bSpatrickfrom abc import ABCMeta, abstractmethod 2be691f3bSpatrick 3be691f3bSpatrickimport lldb 4be691f3bSpatrick 5*f6aab3d8Srobertclass ScriptedProcess(metaclass=ABCMeta): 6be691f3bSpatrick 7be691f3bSpatrick """ 8be691f3bSpatrick The base class for a scripted process. 9be691f3bSpatrick 10be691f3bSpatrick Most of the base class methods are `@abstractmethod` that need to be 11be691f3bSpatrick overwritten by the inheriting class. 12be691f3bSpatrick 13be691f3bSpatrick DISCLAIMER: THIS INTERFACE IS STILL UNDER DEVELOPMENT AND NOT STABLE. 14be691f3bSpatrick THE METHODS EXPOSED MIGHT CHANGE IN THE FUTURE. 15be691f3bSpatrick """ 16be691f3bSpatrick 17*f6aab3d8Srobert memory_regions = None 18*f6aab3d8Srobert loaded_images = None 19*f6aab3d8Srobert threads = None 20*f6aab3d8Srobert metadata = None 21*f6aab3d8Srobert 22be691f3bSpatrick @abstractmethod 23*f6aab3d8Srobert def __init__(self, exe_ctx, args): 24be691f3bSpatrick """ Construct a scripted process. 25be691f3bSpatrick 26be691f3bSpatrick Args: 27*f6aab3d8Srobert exe_ctx (lldb.SBExecutionContext): The execution context for the scripted process. 28be691f3bSpatrick args (lldb.SBStructuredData): A Dictionary holding arbitrary 29be691f3bSpatrick key/value pairs used by the scripted process. 30be691f3bSpatrick """ 31*f6aab3d8Srobert target = None 32be691f3bSpatrick self.target = None 33be691f3bSpatrick self.args = None 34*f6aab3d8Srobert self.arch = None 35*f6aab3d8Srobert if isinstance(exe_ctx, lldb.SBExecutionContext): 36*f6aab3d8Srobert target = exe_ctx.target 37be691f3bSpatrick if isinstance(target, lldb.SBTarget) and target.IsValid(): 38be691f3bSpatrick self.target = target 39*f6aab3d8Srobert triple = self.target.triple 40*f6aab3d8Srobert if triple: 41*f6aab3d8Srobert self.arch = triple.split('-')[0] 42*f6aab3d8Srobert self.dbg = target.GetDebugger() 43be691f3bSpatrick if isinstance(args, lldb.SBStructuredData) and args.IsValid(): 44be691f3bSpatrick self.args = args 45*f6aab3d8Srobert self.threads = {} 46*f6aab3d8Srobert self.loaded_images = [] 47*f6aab3d8Srobert self.metadata = {} 48be691f3bSpatrick 49be691f3bSpatrick @abstractmethod 50*f6aab3d8Srobert def get_memory_region_containing_address(self, addr): 51be691f3bSpatrick """ Get the memory region for the scripted process, containing a 52be691f3bSpatrick specific address. 53be691f3bSpatrick 54be691f3bSpatrick Args: 55be691f3bSpatrick addr (int): Address to look for in the scripted process memory 56be691f3bSpatrick regions. 57be691f3bSpatrick 58be691f3bSpatrick Returns: 59be691f3bSpatrick lldb.SBMemoryRegionInfo: The memory region containing the address. 60be691f3bSpatrick None if out of bounds. 61be691f3bSpatrick """ 62be691f3bSpatrick pass 63be691f3bSpatrick 64*f6aab3d8Srobert def get_threads_info(self): 65*f6aab3d8Srobert """ Get the dictionary describing the process' Scripted Threads. 66*f6aab3d8Srobert 67*f6aab3d8Srobert Returns: 68*f6aab3d8Srobert Dict: The dictionary of threads, with the thread ID as the key and 69*f6aab3d8Srobert a Scripted Thread instance as the value. 70*f6aab3d8Srobert The dictionary can be empty. 71*f6aab3d8Srobert """ 72*f6aab3d8Srobert return self.threads 73*f6aab3d8Srobert 74be691f3bSpatrick @abstractmethod 75*f6aab3d8Srobert def get_thread_with_id(self, tid): 76be691f3bSpatrick """ Get the scripted process thread with a specific ID. 77be691f3bSpatrick 78be691f3bSpatrick Args: 79be691f3bSpatrick tid (int): Thread ID to look for in the scripted process. 80be691f3bSpatrick 81be691f3bSpatrick Returns: 82*f6aab3d8Srobert Dict: The thread represented as a dictionary, with the 83be691f3bSpatrick tid thread ID. None if tid doesn't match any of the scripted 84be691f3bSpatrick process threads. 85be691f3bSpatrick """ 86be691f3bSpatrick pass 87be691f3bSpatrick 88be691f3bSpatrick @abstractmethod 89*f6aab3d8Srobert def get_registers_for_thread(self, tid): 90be691f3bSpatrick """ Get the register context dictionary for a certain thread of 91be691f3bSpatrick the scripted process. 92be691f3bSpatrick 93be691f3bSpatrick Args: 94be691f3bSpatrick tid (int): Thread ID for the thread's register context. 95be691f3bSpatrick 96be691f3bSpatrick Returns: 97be691f3bSpatrick Dict: The register context represented as a dictionary, for the 98be691f3bSpatrick tid thread. None if tid doesn't match any of the scripted 99be691f3bSpatrick process threads. 100be691f3bSpatrick """ 101be691f3bSpatrick pass 102be691f3bSpatrick 103be691f3bSpatrick @abstractmethod 104*f6aab3d8Srobert def read_memory_at_address(self, addr, size, error): 105be691f3bSpatrick """ Get a memory buffer from the scripted process at a certain address, 106be691f3bSpatrick of a certain size. 107be691f3bSpatrick 108be691f3bSpatrick Args: 109be691f3bSpatrick addr (int): Address from which we should start reading. 110be691f3bSpatrick size (int): Size of the memory to read. 111*f6aab3d8Srobert error (lldb.SBError): Error object. 112be691f3bSpatrick 113be691f3bSpatrick Returns: 114be691f3bSpatrick lldb.SBData: An `lldb.SBData` buffer with the target byte size and 115be691f3bSpatrick byte order storing the memory read. 116be691f3bSpatrick """ 117be691f3bSpatrick pass 118be691f3bSpatrick 119be691f3bSpatrick def get_loaded_images(self): 120be691f3bSpatrick """ Get the list of loaded images for the scripted process. 121be691f3bSpatrick 122be691f3bSpatrick ``` 123*f6aab3d8Srobert scripted_image = { 124*f6aab3d8Srobert uuid = "c6ea2b64-f77c-3d27-9528-74f507b9078b", 125*f6aab3d8Srobert path = "/usr/lib/dyld" 126*f6aab3d8Srobert load_addr = 0xbadc0ffee 127*f6aab3d8Srobert } 128be691f3bSpatrick ``` 129be691f3bSpatrick 130be691f3bSpatrick Returns: 131*f6aab3d8Srobert List[scripted_image]: A list of `scripted_image` dictionaries 132*f6aab3d8Srobert containing for each entry the library UUID or its file path 133*f6aab3d8Srobert and its load address. 134be691f3bSpatrick None if the list is empty. 135be691f3bSpatrick """ 136*f6aab3d8Srobert return self.loaded_images 137be691f3bSpatrick 138be691f3bSpatrick def get_process_id(self): 139be691f3bSpatrick """ Get the scripted process identifier. 140be691f3bSpatrick 141be691f3bSpatrick Returns: 142be691f3bSpatrick int: The scripted process identifier. 143be691f3bSpatrick """ 144be691f3bSpatrick return 0 145be691f3bSpatrick 146be691f3bSpatrick def launch(self): 147be691f3bSpatrick """ Simulate the scripted process launch. 148be691f3bSpatrick 149be691f3bSpatrick Returns: 150be691f3bSpatrick lldb.SBError: An `lldb.SBError` with error code 0. 151be691f3bSpatrick """ 152be691f3bSpatrick return lldb.SBError() 153be691f3bSpatrick 154be691f3bSpatrick def resume(self): 155be691f3bSpatrick """ Simulate the scripted process resume. 156be691f3bSpatrick 157be691f3bSpatrick Returns: 158be691f3bSpatrick lldb.SBError: An `lldb.SBError` with error code 0. 159be691f3bSpatrick """ 160be691f3bSpatrick return lldb.SBError() 161be691f3bSpatrick 162be691f3bSpatrick @abstractmethod 163be691f3bSpatrick def should_stop(self): 164be691f3bSpatrick """ Check if the scripted process plugin should produce the stop event. 165be691f3bSpatrick 166be691f3bSpatrick Returns: 167be691f3bSpatrick bool: True if scripted process should broadcast a stop event. 168be691f3bSpatrick False otherwise. 169be691f3bSpatrick """ 170be691f3bSpatrick pass 171be691f3bSpatrick 172be691f3bSpatrick def stop(self): 173be691f3bSpatrick """ Trigger the scripted process stop. 174be691f3bSpatrick 175be691f3bSpatrick Returns: 176be691f3bSpatrick lldb.SBError: An `lldb.SBError` with error code 0. 177be691f3bSpatrick """ 178be691f3bSpatrick return lldb.SBError() 179be691f3bSpatrick 180be691f3bSpatrick @abstractmethod 181be691f3bSpatrick def is_alive(self): 182be691f3bSpatrick """ Check if the scripted process is alive. 183be691f3bSpatrick 184be691f3bSpatrick Returns: 185be691f3bSpatrick bool: True if scripted process is alive. False otherwise. 186be691f3bSpatrick """ 187be691f3bSpatrick pass 188*f6aab3d8Srobert 189*f6aab3d8Srobert @abstractmethod 190*f6aab3d8Srobert def get_scripted_thread_plugin(self): 191*f6aab3d8Srobert """ Get scripted thread plugin name. 192*f6aab3d8Srobert 193*f6aab3d8Srobert Returns: 194*f6aab3d8Srobert str: Name of the scripted thread plugin. 195*f6aab3d8Srobert """ 196*f6aab3d8Srobert return None 197*f6aab3d8Srobert 198*f6aab3d8Srobert def get_process_metadata(self): 199*f6aab3d8Srobert """ Get some metadata for the scripted process. 200*f6aab3d8Srobert 201*f6aab3d8Srobert Returns: 202*f6aab3d8Srobert Dict: A dictionary containing metadata for the scripted process. 203*f6aab3d8Srobert None is the process as no metadata. 204*f6aab3d8Srobert """ 205*f6aab3d8Srobert return self.metadata 206*f6aab3d8Srobert 207*f6aab3d8Srobertclass ScriptedThread(metaclass=ABCMeta): 208*f6aab3d8Srobert 209*f6aab3d8Srobert """ 210*f6aab3d8Srobert The base class for a scripted thread. 211*f6aab3d8Srobert 212*f6aab3d8Srobert Most of the base class methods are `@abstractmethod` that need to be 213*f6aab3d8Srobert overwritten by the inheriting class. 214*f6aab3d8Srobert 215*f6aab3d8Srobert DISCLAIMER: THIS INTERFACE IS STILL UNDER DEVELOPMENT AND NOT STABLE. 216*f6aab3d8Srobert THE METHODS EXPOSED MIGHT CHANGE IN THE FUTURE. 217*f6aab3d8Srobert """ 218*f6aab3d8Srobert 219*f6aab3d8Srobert @abstractmethod 220*f6aab3d8Srobert def __init__(self, scripted_process, args): 221*f6aab3d8Srobert """ Construct a scripted thread. 222*f6aab3d8Srobert 223*f6aab3d8Srobert Args: 224*f6aab3d8Srobert process (ScriptedProcess): The scripted process owning this thread. 225*f6aab3d8Srobert args (lldb.SBStructuredData): A Dictionary holding arbitrary 226*f6aab3d8Srobert key/value pairs used by the scripted thread. 227*f6aab3d8Srobert """ 228*f6aab3d8Srobert self.target = None 229*f6aab3d8Srobert self.scripted_process = None 230*f6aab3d8Srobert self.process = None 231*f6aab3d8Srobert self.args = None 232*f6aab3d8Srobert self.idx = 0 233*f6aab3d8Srobert self.tid = 0 234*f6aab3d8Srobert self.idx = None 235*f6aab3d8Srobert self.name = None 236*f6aab3d8Srobert self.queue = None 237*f6aab3d8Srobert self.state = None 238*f6aab3d8Srobert self.stop_reason = None 239*f6aab3d8Srobert self.register_info = None 240*f6aab3d8Srobert self.register_ctx = {} 241*f6aab3d8Srobert self.frames = [] 242*f6aab3d8Srobert self.extended_info = [] 243*f6aab3d8Srobert 244*f6aab3d8Srobert if isinstance(scripted_process, ScriptedProcess): 245*f6aab3d8Srobert self.target = scripted_process.target 246*f6aab3d8Srobert self.scripted_process = scripted_process 247*f6aab3d8Srobert self.process = self.target.GetProcess() 248*f6aab3d8Srobert self.get_register_info() 249*f6aab3d8Srobert 250*f6aab3d8Srobert def get_thread_idx(self): 251*f6aab3d8Srobert """ Get the scripted thread index. 252*f6aab3d8Srobert 253*f6aab3d8Srobert Returns: 254*f6aab3d8Srobert int: The index of the scripted thread in the scripted process. 255*f6aab3d8Srobert """ 256*f6aab3d8Srobert return self.idx 257*f6aab3d8Srobert 258*f6aab3d8Srobert def get_thread_id(self): 259*f6aab3d8Srobert """ Get the scripted thread identifier. 260*f6aab3d8Srobert 261*f6aab3d8Srobert Returns: 262*f6aab3d8Srobert int: The identifier of the scripted thread. 263*f6aab3d8Srobert """ 264*f6aab3d8Srobert return self.tid 265*f6aab3d8Srobert 266*f6aab3d8Srobert def get_name(self): 267*f6aab3d8Srobert """ Get the scripted thread name. 268*f6aab3d8Srobert 269*f6aab3d8Srobert Returns: 270*f6aab3d8Srobert str: The name of the scripted thread. 271*f6aab3d8Srobert """ 272*f6aab3d8Srobert return self.name 273*f6aab3d8Srobert 274*f6aab3d8Srobert def get_state(self): 275*f6aab3d8Srobert """ Get the scripted thread state type. 276*f6aab3d8Srobert 277*f6aab3d8Srobert eStateStopped, ///< Process or thread is stopped and can be examined. 278*f6aab3d8Srobert eStateRunning, ///< Process or thread is running and can't be examined. 279*f6aab3d8Srobert eStateStepping, ///< Process or thread is in the process of stepping and can 280*f6aab3d8Srobert /// not be examined. 281*f6aab3d8Srobert eStateCrashed, ///< Process or thread has crashed and can be examined. 282*f6aab3d8Srobert 283*f6aab3d8Srobert Returns: 284*f6aab3d8Srobert int: The state type of the scripted thread. 285*f6aab3d8Srobert Returns lldb.eStateStopped by default. 286*f6aab3d8Srobert """ 287*f6aab3d8Srobert return lldb.eStateStopped 288*f6aab3d8Srobert 289*f6aab3d8Srobert def get_queue(self): 290*f6aab3d8Srobert """ Get the scripted thread associated queue name. 291*f6aab3d8Srobert This method is optional. 292*f6aab3d8Srobert 293*f6aab3d8Srobert Returns: 294*f6aab3d8Srobert str: The queue name associated with the scripted thread. 295*f6aab3d8Srobert """ 296*f6aab3d8Srobert return self.queue 297*f6aab3d8Srobert 298*f6aab3d8Srobert @abstractmethod 299*f6aab3d8Srobert def get_stop_reason(self): 300*f6aab3d8Srobert """ Get the dictionary describing the stop reason type with some data. 301*f6aab3d8Srobert This method is optional. 302*f6aab3d8Srobert 303*f6aab3d8Srobert Returns: 304*f6aab3d8Srobert Dict: The dictionary holding the stop reason type and the possibly 305*f6aab3d8Srobert the stop reason data. 306*f6aab3d8Srobert """ 307*f6aab3d8Srobert pass 308*f6aab3d8Srobert 309*f6aab3d8Srobert def get_stackframes(self): 310*f6aab3d8Srobert """ Get the list of stack frames for the scripted thread. 311*f6aab3d8Srobert 312*f6aab3d8Srobert ``` 313*f6aab3d8Srobert scripted_frame = { 314*f6aab3d8Srobert idx = 0, 315*f6aab3d8Srobert pc = 0xbadc0ffee 316*f6aab3d8Srobert } 317*f6aab3d8Srobert ``` 318*f6aab3d8Srobert 319*f6aab3d8Srobert Returns: 320*f6aab3d8Srobert List[scripted_frame]: A list of `scripted_frame` dictionaries 321*f6aab3d8Srobert containing at least for each entry, the frame index and 322*f6aab3d8Srobert the program counter value for that frame. 323*f6aab3d8Srobert The list can be empty. 324*f6aab3d8Srobert """ 325*f6aab3d8Srobert return self.frames 326*f6aab3d8Srobert 327*f6aab3d8Srobert def get_register_info(self): 328*f6aab3d8Srobert if self.register_info is None: 329*f6aab3d8Srobert self.register_info = dict() 330*f6aab3d8Srobert if self.scripted_process.arch == 'x86_64': 331*f6aab3d8Srobert self.register_info['sets'] = ['General Purpose Registers'] 332*f6aab3d8Srobert self.register_info['registers'] = INTEL64_GPR 333*f6aab3d8Srobert elif 'arm64' in self.scripted_process.arch: 334*f6aab3d8Srobert self.register_info['sets'] = ['General Purpose Registers'] 335*f6aab3d8Srobert self.register_info['registers'] = ARM64_GPR 336*f6aab3d8Srobert else: raise ValueError('Unknown architecture', self.scripted_process.arch) 337*f6aab3d8Srobert return self.register_info 338*f6aab3d8Srobert 339*f6aab3d8Srobert @abstractmethod 340*f6aab3d8Srobert def get_register_context(self): 341*f6aab3d8Srobert """ Get the scripted thread register context 342*f6aab3d8Srobert 343*f6aab3d8Srobert Returns: 344*f6aab3d8Srobert str: A byte representing all register's value. 345*f6aab3d8Srobert """ 346*f6aab3d8Srobert pass 347*f6aab3d8Srobert 348*f6aab3d8Srobert def get_extended_info(self): 349*f6aab3d8Srobert """ Get scripted thread extended information. 350*f6aab3d8Srobert 351*f6aab3d8Srobert Returns: 352*f6aab3d8Srobert List: A list containing the extended information for the scripted process. 353*f6aab3d8Srobert None is the thread as no extended information. 354*f6aab3d8Srobert """ 355*f6aab3d8Srobert return self.extended_info 356*f6aab3d8Srobert 357*f6aab3d8SrobertARM64_GPR = [ {'name': 'x0', 'bitsize': 64, 'offset': 0, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 0, 'dwarf': 0, 'generic': 'arg0', 'alt-name': 'arg0'}, 358*f6aab3d8Srobert {'name': 'x1', 'bitsize': 64, 'offset': 8, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 1, 'dwarf': 1, 'generic': 'arg1', 'alt-name': 'arg1'}, 359*f6aab3d8Srobert {'name': 'x2', 'bitsize': 64, 'offset': 16, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 2, 'dwarf': 2, 'generic': 'arg2', 'alt-name': 'arg2'}, 360*f6aab3d8Srobert {'name': 'x3', 'bitsize': 64, 'offset': 24, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 3, 'dwarf': 3, 'generic': 'arg3', 'alt-name': 'arg3'}, 361*f6aab3d8Srobert {'name': 'x4', 'bitsize': 64, 'offset': 32, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 4, 'dwarf': 4, 'generic': 'arg4', 'alt-name': 'arg4'}, 362*f6aab3d8Srobert {'name': 'x5', 'bitsize': 64, 'offset': 40, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 5, 'dwarf': 5, 'generic': 'arg5', 'alt-name': 'arg5'}, 363*f6aab3d8Srobert {'name': 'x6', 'bitsize': 64, 'offset': 48, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 6, 'dwarf': 6, 'generic': 'arg6', 'alt-name': 'arg6'}, 364*f6aab3d8Srobert {'name': 'x7', 'bitsize': 64, 'offset': 56, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 7, 'dwarf': 7, 'generic': 'arg7', 'alt-name': 'arg7'}, 365*f6aab3d8Srobert {'name': 'x8', 'bitsize': 64, 'offset': 64, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 8, 'dwarf': 8 }, 366*f6aab3d8Srobert {'name': 'x9', 'bitsize': 64, 'offset': 72, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 9, 'dwarf': 9 }, 367*f6aab3d8Srobert {'name': 'x10', 'bitsize': 64, 'offset': 80, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 10, 'dwarf': 10}, 368*f6aab3d8Srobert {'name': 'x11', 'bitsize': 64, 'offset': 88, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 11, 'dwarf': 11}, 369*f6aab3d8Srobert {'name': 'x12', 'bitsize': 64, 'offset': 96, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 12, 'dwarf': 12}, 370*f6aab3d8Srobert {'name': 'x13', 'bitsize': 64, 'offset': 104, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 13, 'dwarf': 13}, 371*f6aab3d8Srobert {'name': 'x14', 'bitsize': 64, 'offset': 112, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 14, 'dwarf': 14}, 372*f6aab3d8Srobert {'name': 'x15', 'bitsize': 64, 'offset': 120, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 15, 'dwarf': 15}, 373*f6aab3d8Srobert {'name': 'x16', 'bitsize': 64, 'offset': 128, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 16, 'dwarf': 16}, 374*f6aab3d8Srobert {'name': 'x17', 'bitsize': 64, 'offset': 136, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 17, 'dwarf': 17}, 375*f6aab3d8Srobert {'name': 'x18', 'bitsize': 64, 'offset': 144, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 18, 'dwarf': 18}, 376*f6aab3d8Srobert {'name': 'x19', 'bitsize': 64, 'offset': 152, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 19, 'dwarf': 19}, 377*f6aab3d8Srobert {'name': 'x20', 'bitsize': 64, 'offset': 160, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 20, 'dwarf': 20}, 378*f6aab3d8Srobert {'name': 'x21', 'bitsize': 64, 'offset': 168, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 21, 'dwarf': 21}, 379*f6aab3d8Srobert {'name': 'x22', 'bitsize': 64, 'offset': 176, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 22, 'dwarf': 22}, 380*f6aab3d8Srobert {'name': 'x23', 'bitsize': 64, 'offset': 184, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 23, 'dwarf': 23}, 381*f6aab3d8Srobert {'name': 'x24', 'bitsize': 64, 'offset': 192, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 24, 'dwarf': 24}, 382*f6aab3d8Srobert {'name': 'x25', 'bitsize': 64, 'offset': 200, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 25, 'dwarf': 25}, 383*f6aab3d8Srobert {'name': 'x26', 'bitsize': 64, 'offset': 208, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 26, 'dwarf': 26}, 384*f6aab3d8Srobert {'name': 'x27', 'bitsize': 64, 'offset': 216, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 27, 'dwarf': 27}, 385*f6aab3d8Srobert {'name': 'x28', 'bitsize': 64, 'offset': 224, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 28, 'dwarf': 28}, 386*f6aab3d8Srobert {'name': 'x29', 'bitsize': 64, 'offset': 232, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 29, 'dwarf': 29, 'generic': 'fp', 'alt-name': 'fp'}, 387*f6aab3d8Srobert {'name': 'x30', 'bitsize': 64, 'offset': 240, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 30, 'dwarf': 30, 'generic': 'lr', 'alt-name': 'lr'}, 388*f6aab3d8Srobert {'name': 'sp', 'bitsize': 64, 'offset': 248, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 31, 'dwarf': 31, 'generic': 'sp', 'alt-name': 'sp'}, 389*f6aab3d8Srobert {'name': 'pc', 'bitsize': 64, 'offset': 256, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 32, 'dwarf': 32, 'generic': 'pc', 'alt-name': 'pc'}, 390*f6aab3d8Srobert {'name': 'cpsr', 'bitsize': 32, 'offset': 264, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 33, 'dwarf': 33} 391*f6aab3d8Srobert ] 392*f6aab3d8Srobert 393*f6aab3d8SrobertINTEL64_GPR = [ {'name': 'rax', 'bitsize': 64, 'offset': 0, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 0, 'dwarf': 0}, 394*f6aab3d8Srobert {'name': 'rbx', 'bitsize': 64, 'offset': 8, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 3, 'dwarf': 3}, 395*f6aab3d8Srobert {'name': 'rcx', 'bitsize': 64, 'offset': 16, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 2, 'dwarf': 2, 'generic': 'arg4', 'alt-name': 'arg4'}, 396*f6aab3d8Srobert {'name': 'rdx', 'bitsize': 64, 'offset': 24, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 1, 'dwarf': 1, 'generic': 'arg3', 'alt-name': 'arg3'}, 397*f6aab3d8Srobert {'name': 'rdi', 'bitsize': 64, 'offset': 32, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 5, 'dwarf': 5, 'generic': 'arg1', 'alt-name': 'arg1'}, 398*f6aab3d8Srobert {'name': 'rsi', 'bitsize': 64, 'offset': 40, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 4, 'dwarf': 4, 'generic': 'arg2', 'alt-name': 'arg2'}, 399*f6aab3d8Srobert {'name': 'rbp', 'bitsize': 64, 'offset': 48, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 6, 'dwarf': 6, 'generic': 'fp', 'alt-name': 'fp'}, 400*f6aab3d8Srobert {'name': 'rsp', 'bitsize': 64, 'offset': 56, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 7, 'dwarf': 7, 'generic': 'sp', 'alt-name': 'sp'}, 401*f6aab3d8Srobert {'name': 'r8', 'bitsize': 64, 'offset': 64, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 8, 'dwarf': 8, 'generic': 'arg5', 'alt-name': 'arg5'}, 402*f6aab3d8Srobert {'name': 'r9', 'bitsize': 64, 'offset': 72, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 9, 'dwarf': 9, 'generic': 'arg6', 'alt-name': 'arg6'}, 403*f6aab3d8Srobert {'name': 'r10', 'bitsize': 64, 'offset': 80, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 10, 'dwarf': 10}, 404*f6aab3d8Srobert {'name': 'r11', 'bitsize': 64, 'offset': 88, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 11, 'dwarf': 11}, 405*f6aab3d8Srobert {'name': 'r12', 'bitsize': 64, 'offset': 96, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 12, 'dwarf': 12}, 406*f6aab3d8Srobert {'name': 'r13', 'bitsize': 64, 'offset': 104, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 13, 'dwarf': 13}, 407*f6aab3d8Srobert {'name': 'r14', 'bitsize': 64, 'offset': 112, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 14, 'dwarf': 14}, 408*f6aab3d8Srobert {'name': 'r15', 'bitsize': 64, 'offset': 120, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 15, 'dwarf': 15}, 409*f6aab3d8Srobert {'name': 'rip', 'bitsize': 64, 'offset': 128, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 16, 'dwarf': 16, 'generic': 'pc', 'alt-name': 'pc'}, 410*f6aab3d8Srobert {'name': 'rflags', 'bitsize': 64, 'offset': 136, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'generic': 'flags', 'alt-name': 'flags'}, 411*f6aab3d8Srobert {'name': 'cs', 'bitsize': 64, 'offset': 144, 'encoding': 'uint', 'format': 'hex', 'set': 0}, 412*f6aab3d8Srobert {'name': 'fs', 'bitsize': 64, 'offset': 152, 'encoding': 'uint', 'format': 'hex', 'set': 0}, 413*f6aab3d8Srobert {'name': 'gs', 'bitsize': 64, 'offset': 160, 'encoding': 'uint', 'format': 'hex', 'set': 0} 414*f6aab3d8Srobert ] 415*f6aab3d8Srobert 416*f6aab3d8Srobert 417