xref: /openbsd-src/gnu/llvm/lldb/examples/python/scripted_process/scripted_process.py (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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