1f3176f5fSMed Ismail Bennanifrom abc import ABCMeta, abstractmethod
2f3176f5fSMed Ismail Bennaniimport six
3f3176f5fSMed Ismail Bennani
4f3176f5fSMed Ismail Bennaniimport lldb
5f3176f5fSMed Ismail Bennani
6f3176f5fSMed Ismail Bennani@six.add_metaclass(ABCMeta)
7f3176f5fSMed Ismail Bennaniclass ScriptedProcess:
8f3176f5fSMed Ismail Bennani
9f3176f5fSMed Ismail Bennani    """
10f3176f5fSMed Ismail Bennani    The base class for a scripted process.
11f3176f5fSMed Ismail Bennani
12f3176f5fSMed Ismail Bennani    Most of the base class methods are `@abstractmethod` that need to be
13f3176f5fSMed Ismail Bennani    overwritten by the inheriting class.
14f3176f5fSMed Ismail Bennani
15f3176f5fSMed Ismail Bennani    DISCLAIMER: THIS INTERFACE IS STILL UNDER DEVELOPMENT AND NOT STABLE.
16f3176f5fSMed Ismail Bennani                THE METHODS EXPOSED MIGHT CHANGE IN THE FUTURE.
17f3176f5fSMed Ismail Bennani    """
18f3176f5fSMed Ismail Bennani
19a758c9f7SMed Ismail Bennani    memory_regions = None
20a758c9f7SMed Ismail Bennani    stack_memory_dump = None
21a758c9f7SMed Ismail Bennani    loaded_images = None
224858fe04SMed Ismail Bennani    threads = {}
23a758c9f7SMed Ismail Bennani
24f3176f5fSMed Ismail Bennani    @abstractmethod
25f3176f5fSMed Ismail Bennani    def __init__(self, target, args):
26f3176f5fSMed Ismail Bennani        """ Construct a scripted process.
27f3176f5fSMed Ismail Bennani
28f3176f5fSMed Ismail Bennani        Args:
29f3176f5fSMed Ismail Bennani            target (lldb.SBTarget): The target launching the scripted process.
30f3176f5fSMed Ismail Bennani            args (lldb.SBStructuredData): A Dictionary holding arbitrary
31f3176f5fSMed Ismail Bennani                key/value pairs used by the scripted process.
32f3176f5fSMed Ismail Bennani        """
33f3176f5fSMed Ismail Bennani        self.target = None
34f3176f5fSMed Ismail Bennani        self.args = None
35*f5e5074cSMed Ismail Bennani        self.arch = None
36f3176f5fSMed Ismail Bennani        if isinstance(target, lldb.SBTarget) and target.IsValid():
37f3176f5fSMed Ismail Bennani            self.target = target
38*f5e5074cSMed Ismail Bennani            triple = self.target.triple
39*f5e5074cSMed Ismail Bennani            if triple:
40*f5e5074cSMed Ismail Bennani                self.arch = triple.split('-')[0]
41f3176f5fSMed Ismail Bennani        if isinstance(args, lldb.SBStructuredData) and args.IsValid():
42f3176f5fSMed Ismail Bennani            self.args = args
43f3176f5fSMed Ismail Bennani
44f3176f5fSMed Ismail Bennani    @abstractmethod
45976867b5SMed Ismail Bennani    def get_memory_region_containing_address(self, addr):
46f3176f5fSMed Ismail Bennani        """ Get the memory region for the scripted process, containing a
47f3176f5fSMed Ismail Bennani            specific address.
48f3176f5fSMed Ismail Bennani
49f3176f5fSMed Ismail Bennani        Args:
50f3176f5fSMed Ismail Bennani            addr (int): Address to look for in the scripted process memory
51f3176f5fSMed Ismail Bennani                regions.
52f3176f5fSMed Ismail Bennani
53f3176f5fSMed Ismail Bennani        Returns:
54f3176f5fSMed Ismail Bennani            lldb.SBMemoryRegionInfo: The memory region containing the address.
55f3176f5fSMed Ismail Bennani                None if out of bounds.
56f3176f5fSMed Ismail Bennani        """
57f3176f5fSMed Ismail Bennani        pass
58f3176f5fSMed Ismail Bennani
594858fe04SMed Ismail Bennani    def get_threads_info(self):
604858fe04SMed Ismail Bennani        """ Get the dictionary describing the process' Scripted Threads.
614858fe04SMed Ismail Bennani
624858fe04SMed Ismail Bennani        Returns:
634858fe04SMed Ismail Bennani            Dict: The dictionary of threads, with the thread ID as the key and
644858fe04SMed Ismail Bennani            a Scripted Thread instance as the value.
654858fe04SMed Ismail Bennani            The dictionary can be empty.
664858fe04SMed Ismail Bennani        """
674858fe04SMed Ismail Bennani        return self.threads
684858fe04SMed Ismail Bennani
69f3176f5fSMed Ismail Bennani    @abstractmethod
70976867b5SMed Ismail Bennani    def get_thread_with_id(self, tid):
71f3176f5fSMed Ismail Bennani        """ Get the scripted process thread with a specific ID.
72f3176f5fSMed Ismail Bennani
73f3176f5fSMed Ismail Bennani        Args:
74f3176f5fSMed Ismail Bennani            tid (int): Thread ID to look for in the scripted process.
75f3176f5fSMed Ismail Bennani
76f3176f5fSMed Ismail Bennani        Returns:
77d3e0f7e1SMed Ismail Bennani            Dict: The thread represented as a dictionary, with the
78f3176f5fSMed Ismail Bennani                tid thread ID. None if tid doesn't match any of the scripted
79f3176f5fSMed Ismail Bennani                process threads.
80f3176f5fSMed Ismail Bennani        """
81f3176f5fSMed Ismail Bennani        pass
82f3176f5fSMed Ismail Bennani
83f3176f5fSMed Ismail Bennani    @abstractmethod
84976867b5SMed Ismail Bennani    def get_registers_for_thread(self, tid):
85f3176f5fSMed Ismail Bennani        """ Get the register context dictionary for a certain thread of
86f3176f5fSMed Ismail Bennani            the scripted process.
87f3176f5fSMed Ismail Bennani
88f3176f5fSMed Ismail Bennani        Args:
89f3176f5fSMed Ismail Bennani            tid (int): Thread ID for the thread's register context.
90f3176f5fSMed Ismail Bennani
91f3176f5fSMed Ismail Bennani        Returns:
92f3176f5fSMed Ismail Bennani            Dict: The register context represented as a dictionary, for the
93f3176f5fSMed Ismail Bennani                tid thread. None if tid doesn't match any of the scripted
94f3176f5fSMed Ismail Bennani                process threads.
95f3176f5fSMed Ismail Bennani        """
96f3176f5fSMed Ismail Bennani        pass
97f3176f5fSMed Ismail Bennani
98f3176f5fSMed Ismail Bennani    @abstractmethod
99976867b5SMed Ismail Bennani    def read_memory_at_address(self, addr, size):
100f3176f5fSMed Ismail Bennani        """ Get a memory buffer from the scripted process at a certain address,
101f3176f5fSMed Ismail Bennani            of a certain size.
102f3176f5fSMed Ismail Bennani
103f3176f5fSMed Ismail Bennani        Args:
104f3176f5fSMed Ismail Bennani            addr (int): Address from which we should start reading.
105f3176f5fSMed Ismail Bennani            size (int): Size of the memory to read.
106f3176f5fSMed Ismail Bennani
107f3176f5fSMed Ismail Bennani        Returns:
108f3176f5fSMed Ismail Bennani            lldb.SBData: An `lldb.SBData` buffer with the target byte size and
109f3176f5fSMed Ismail Bennani                byte order storing the memory read.
110f3176f5fSMed Ismail Bennani        """
111f3176f5fSMed Ismail Bennani        pass
112f3176f5fSMed Ismail Bennani
113f3176f5fSMed Ismail Bennani    def get_loaded_images(self):
114f3176f5fSMed Ismail Bennani        """ Get the list of loaded images for the scripted process.
115f3176f5fSMed Ismail Bennani
116f3176f5fSMed Ismail Bennani        ```
117f3176f5fSMed Ismail Bennani        class ScriptedProcessImage:
118f3176f5fSMed Ismail Bennani            def __init__(name, file_spec, uuid, load_address):
119f3176f5fSMed Ismail Bennani              self.name = name
120f3176f5fSMed Ismail Bennani              self.file_spec = file_spec
121f3176f5fSMed Ismail Bennani              self.uuid = uuid
122f3176f5fSMed Ismail Bennani              self.load_address = load_address
123f3176f5fSMed Ismail Bennani        ```
124f3176f5fSMed Ismail Bennani
125f3176f5fSMed Ismail Bennani        Returns:
126f3176f5fSMed Ismail Bennani            List[ScriptedProcessImage]: A list of `ScriptedProcessImage`
127f3176f5fSMed Ismail Bennani                containing for each entry, the name of the library, a UUID,
128f3176f5fSMed Ismail Bennani                an `lldb.SBFileSpec` and a load address.
129f3176f5fSMed Ismail Bennani                None if the list is empty.
130f3176f5fSMed Ismail Bennani        """
131a758c9f7SMed Ismail Bennani        return self.loaded_images
132f3176f5fSMed Ismail Bennani
133f3176f5fSMed Ismail Bennani    def get_process_id(self):
134f3176f5fSMed Ismail Bennani        """ Get the scripted process identifier.
135f3176f5fSMed Ismail Bennani
136f3176f5fSMed Ismail Bennani        Returns:
137f3176f5fSMed Ismail Bennani            int: The scripted process identifier.
138f3176f5fSMed Ismail Bennani        """
139f3176f5fSMed Ismail Bennani        return 0
140f3176f5fSMed Ismail Bennani
141f3176f5fSMed Ismail Bennani
142f3176f5fSMed Ismail Bennani    def launch(self):
143f3176f5fSMed Ismail Bennani        """ Simulate the scripted process launch.
144f3176f5fSMed Ismail Bennani
145f3176f5fSMed Ismail Bennani        Returns:
146f3176f5fSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
147f3176f5fSMed Ismail Bennani        """
148f3176f5fSMed Ismail Bennani        return lldb.SBError()
149f3176f5fSMed Ismail Bennani
150f3176f5fSMed Ismail Bennani    def resume(self):
151f3176f5fSMed Ismail Bennani        """ Simulate the scripted process resume.
152f3176f5fSMed Ismail Bennani
153f3176f5fSMed Ismail Bennani        Returns:
154f3176f5fSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
155f3176f5fSMed Ismail Bennani        """
156f3176f5fSMed Ismail Bennani        return lldb.SBError()
157f3176f5fSMed Ismail Bennani
158f3176f5fSMed Ismail Bennani    @abstractmethod
159312b43daSMed Ismail Bennani    def should_stop(self):
160312b43daSMed Ismail Bennani        """ Check if the scripted process plugin should produce the stop event.
161312b43daSMed Ismail Bennani
162312b43daSMed Ismail Bennani        Returns:
163312b43daSMed Ismail Bennani            bool: True if scripted process should broadcast a stop event.
164312b43daSMed Ismail Bennani                  False otherwise.
165312b43daSMed Ismail Bennani        """
166312b43daSMed Ismail Bennani        pass
167312b43daSMed Ismail Bennani
168312b43daSMed Ismail Bennani    def stop(self):
169312b43daSMed Ismail Bennani        """ Trigger the scripted process stop.
170312b43daSMed Ismail Bennani
171312b43daSMed Ismail Bennani        Returns:
172312b43daSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
173312b43daSMed Ismail Bennani        """
174312b43daSMed Ismail Bennani        return lldb.SBError()
175312b43daSMed Ismail Bennani
176312b43daSMed Ismail Bennani    @abstractmethod
177f3176f5fSMed Ismail Bennani    def is_alive(self):
178f3176f5fSMed Ismail Bennani        """ Check if the scripted process is alive.
179f3176f5fSMed Ismail Bennani
180f3176f5fSMed Ismail Bennani        Returns:
181f3176f5fSMed Ismail Bennani            bool: True if scripted process is alive. False otherwise.
182f3176f5fSMed Ismail Bennani        """
183f3176f5fSMed Ismail Bennani        pass
18459d8dd79SMed Ismail Bennani
18559d8dd79SMed Ismail Bennani    @abstractmethod
18659d8dd79SMed Ismail Bennani    def get_scripted_thread_plugin(self):
18759d8dd79SMed Ismail Bennani        """ Get scripted thread plugin name.
18859d8dd79SMed Ismail Bennani
18959d8dd79SMed Ismail Bennani        Returns:
19059d8dd79SMed Ismail Bennani            str: Name of the scripted thread plugin.
19159d8dd79SMed Ismail Bennani        """
19259d8dd79SMed Ismail Bennani        return None
19359d8dd79SMed Ismail Bennani
19459d8dd79SMed Ismail Bennani@six.add_metaclass(ABCMeta)
19559d8dd79SMed Ismail Bennaniclass ScriptedThread:
19659d8dd79SMed Ismail Bennani
19759d8dd79SMed Ismail Bennani    """
19859d8dd79SMed Ismail Bennani    The base class for a scripted thread.
19959d8dd79SMed Ismail Bennani
20059d8dd79SMed Ismail Bennani    Most of the base class methods are `@abstractmethod` that need to be
20159d8dd79SMed Ismail Bennani    overwritten by the inheriting class.
20259d8dd79SMed Ismail Bennani
20359d8dd79SMed Ismail Bennani    DISCLAIMER: THIS INTERFACE IS STILL UNDER DEVELOPMENT AND NOT STABLE.
20459d8dd79SMed Ismail Bennani                THE METHODS EXPOSED MIGHT CHANGE IN THE FUTURE.
20559d8dd79SMed Ismail Bennani    """
20659d8dd79SMed Ismail Bennani
20759d8dd79SMed Ismail Bennani    @abstractmethod
208*f5e5074cSMed Ismail Bennani    def __init__(self, scripted_process, args):
20959d8dd79SMed Ismail Bennani        """ Construct a scripted thread.
21059d8dd79SMed Ismail Bennani
21159d8dd79SMed Ismail Bennani        Args:
212*f5e5074cSMed Ismail Bennani            process (ScriptedProcess): The scripted process owning this thread.
21359d8dd79SMed Ismail Bennani            args (lldb.SBStructuredData): A Dictionary holding arbitrary
214738621d0SMed Ismail Bennani                key/value pairs used by the scripted thread.
21559d8dd79SMed Ismail Bennani        """
21659d8dd79SMed Ismail Bennani        self.target = None
217*f5e5074cSMed Ismail Bennani        self.scripted_process = None
218738621d0SMed Ismail Bennani        self.process = None
21959d8dd79SMed Ismail Bennani        self.args = None
220*f5e5074cSMed Ismail Bennani        if isinstance(scripted_process, ScriptedProcess):
221*f5e5074cSMed Ismail Bennani            self.target = scripted_process.target
222*f5e5074cSMed Ismail Bennani            self.scripted_process = scripted_process
223d3e0f7e1SMed Ismail Bennani            self.process = self.target.GetProcess()
22459d8dd79SMed Ismail Bennani
22559d8dd79SMed Ismail Bennani        self.id = None
226d3e0f7e1SMed Ismail Bennani        self.idx = None
22759d8dd79SMed Ismail Bennani        self.name = None
22859d8dd79SMed Ismail Bennani        self.queue = None
22959d8dd79SMed Ismail Bennani        self.state = None
23059d8dd79SMed Ismail Bennani        self.stop_reason = None
23159d8dd79SMed Ismail Bennani        self.register_info = None
232976867b5SMed Ismail Bennani        self.register_ctx = {}
23359d8dd79SMed Ismail Bennani        self.frames = []
23459d8dd79SMed Ismail Bennani
23559d8dd79SMed Ismail Bennani    @abstractmethod
23659d8dd79SMed Ismail Bennani    def get_thread_id(self):
23759d8dd79SMed Ismail Bennani        """ Get the scripted thread identifier.
23859d8dd79SMed Ismail Bennani
23959d8dd79SMed Ismail Bennani        Returns:
24059d8dd79SMed Ismail Bennani            int: The identifier of the scripted thread.
24159d8dd79SMed Ismail Bennani        """
24259d8dd79SMed Ismail Bennani        pass
24359d8dd79SMed Ismail Bennani
24459d8dd79SMed Ismail Bennani    @abstractmethod
24559d8dd79SMed Ismail Bennani    def get_name(self):
24659d8dd79SMed Ismail Bennani        """ Get the scripted thread name.
24759d8dd79SMed Ismail Bennani
24859d8dd79SMed Ismail Bennani        Returns:
24959d8dd79SMed Ismail Bennani            str: The name of the scripted thread.
25059d8dd79SMed Ismail Bennani        """
25159d8dd79SMed Ismail Bennani        pass
25259d8dd79SMed Ismail Bennani
25359d8dd79SMed Ismail Bennani    def get_state(self):
25459d8dd79SMed Ismail Bennani        """ Get the scripted thread state type.
25559d8dd79SMed Ismail Bennani
25659d8dd79SMed Ismail Bennani            eStateStopped,   ///< Process or thread is stopped and can be examined.
25759d8dd79SMed Ismail Bennani            eStateRunning,   ///< Process or thread is running and can't be examined.
25859d8dd79SMed Ismail Bennani            eStateStepping,  ///< Process or thread is in the process of stepping and can
25959d8dd79SMed Ismail Bennani                             /// not be examined.
26059d8dd79SMed Ismail Bennani
26159d8dd79SMed Ismail Bennani        Returns:
26259d8dd79SMed Ismail Bennani            int: The state type of the scripted thread.
26359d8dd79SMed Ismail Bennani                 Returns lldb.eStateStopped by default.
26459d8dd79SMed Ismail Bennani        """
26559d8dd79SMed Ismail Bennani        return lldb.eStateStopped
26659d8dd79SMed Ismail Bennani
26759d8dd79SMed Ismail Bennani    def get_queue(self):
26859d8dd79SMed Ismail Bennani        """ Get the scripted thread associated queue name.
26959d8dd79SMed Ismail Bennani            This method is optional.
27059d8dd79SMed Ismail Bennani
27159d8dd79SMed Ismail Bennani        Returns:
27259d8dd79SMed Ismail Bennani            str: The queue name associated with the scripted thread.
27359d8dd79SMed Ismail Bennani        """
27459d8dd79SMed Ismail Bennani        pass
27559d8dd79SMed Ismail Bennani
27659d8dd79SMed Ismail Bennani    @abstractmethod
27759d8dd79SMed Ismail Bennani    def get_stop_reason(self):
27859d8dd79SMed Ismail Bennani        """ Get the dictionary describing the stop reason type with some data.
27959d8dd79SMed Ismail Bennani            This method is optional.
28059d8dd79SMed Ismail Bennani
28159d8dd79SMed Ismail Bennani        Returns:
28259d8dd79SMed Ismail Bennani            Dict: The dictionary holding the stop reason type and the possibly
28359d8dd79SMed Ismail Bennani            the stop reason data.
28459d8dd79SMed Ismail Bennani        """
28559d8dd79SMed Ismail Bennani        pass
28659d8dd79SMed Ismail Bennani
28759d8dd79SMed Ismail Bennani    def get_stackframes(self):
28859d8dd79SMed Ismail Bennani        """ Get the list of stack frames for the scripted thread.
28959d8dd79SMed Ismail Bennani
29059d8dd79SMed Ismail Bennani        ```
29159d8dd79SMed Ismail Bennani        class ScriptedStackFrame:
29259d8dd79SMed Ismail Bennani            def __init__(idx, cfa, pc, symbol_ctx):
29359d8dd79SMed Ismail Bennani                self.idx = idx
29459d8dd79SMed Ismail Bennani                self.cfa = cfa
29559d8dd79SMed Ismail Bennani                self.pc = pc
29659d8dd79SMed Ismail Bennani                self.symbol_ctx = symbol_ctx
29759d8dd79SMed Ismail Bennani        ```
29859d8dd79SMed Ismail Bennani
29959d8dd79SMed Ismail Bennani        Returns:
30059d8dd79SMed Ismail Bennani            List[ScriptedFrame]: A list of `ScriptedStackFrame`
30159d8dd79SMed Ismail Bennani                containing for each entry, the frame index, the canonical
30259d8dd79SMed Ismail Bennani                frame address, the program counter value for that frame
30359d8dd79SMed Ismail Bennani                and a symbol context.
30459d8dd79SMed Ismail Bennani                None if the list is empty.
30559d8dd79SMed Ismail Bennani        """
30659d8dd79SMed Ismail Bennani        return 0
30759d8dd79SMed Ismail Bennani
30859d8dd79SMed Ismail Bennani    def get_register_info(self):
30959d8dd79SMed Ismail Bennani        if self.register_info is None:
31059d8dd79SMed Ismail Bennani            self.register_info = dict()
311*f5e5074cSMed Ismail Bennani            if self.scripted_process.arch == 'x86_64':
312976867b5SMed Ismail Bennani                self.register_info['sets'] = ['General Purpose Registers']
313*f5e5074cSMed Ismail Bennani                self.register_info['registers'] = INTEL64_GPR
314*f5e5074cSMed Ismail Bennani            elif 'arm64' in self.scripted_process.arch:
315caea440aSMed Ismail Bennani                self.register_info['sets'] = ['General Purpose Registers']
316*f5e5074cSMed Ismail Bennani                self.register_info['registers'] = ARM64_GPR
317*f5e5074cSMed Ismail Bennani            else: raise ValueError('Unknown architecture', self.scripted_process.arch)
318*f5e5074cSMed Ismail Bennani        return self.register_info
319*f5e5074cSMed Ismail Bennani
320*f5e5074cSMed Ismail Bennani    @abstractmethod
321*f5e5074cSMed Ismail Bennani    def get_register_context(self):
322*f5e5074cSMed Ismail Bennani        """ Get the scripted thread register context
323*f5e5074cSMed Ismail Bennani
324*f5e5074cSMed Ismail Bennani        Returns:
325*f5e5074cSMed Ismail Bennani            str: A byte representing all register's value.
326*f5e5074cSMed Ismail Bennani        """
327*f5e5074cSMed Ismail Bennani        pass
328*f5e5074cSMed Ismail Bennani
329*f5e5074cSMed Ismail BennaniARM64_GPR = [ {'name': 'x0',   'bitsize': 64, 'offset': 0,   'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 0,  'dwarf': 0,  'generic': 'arg0', 'alt-name': 'arg0'},
330caea440aSMed Ismail Bennani              {'name': 'x1',   'bitsize': 64, 'offset': 8,   'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 1,  'dwarf': 1,  'generic': 'arg1', 'alt-name': 'arg1'},
331caea440aSMed Ismail Bennani              {'name': 'x2',   'bitsize': 64, 'offset': 16,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 2,  'dwarf': 2,  'generic': 'arg2', 'alt-name': 'arg2'},
332caea440aSMed Ismail Bennani              {'name': 'x3',   'bitsize': 64, 'offset': 24,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 3,  'dwarf': 3,  'generic': 'arg3', 'alt-name': 'arg3'},
333caea440aSMed Ismail Bennani              {'name': 'x4',   'bitsize': 64, 'offset': 32,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 4,  'dwarf': 4,  'generic': 'arg4', 'alt-name': 'arg4'},
334caea440aSMed Ismail Bennani              {'name': 'x5',   'bitsize': 64, 'offset': 40,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 5,  'dwarf': 5,  'generic': 'arg5', 'alt-name': 'arg5'},
335caea440aSMed Ismail Bennani              {'name': 'x6',   'bitsize': 64, 'offset': 48,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 6,  'dwarf': 6,  'generic': 'arg6', 'alt-name': 'arg6'},
336caea440aSMed Ismail Bennani              {'name': 'x7',   'bitsize': 64, 'offset': 56,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 7,  'dwarf': 7,  'generic': 'arg7', 'alt-name': 'arg7'},
337caea440aSMed Ismail Bennani              {'name': 'x8',   'bitsize': 64, 'offset': 64,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 8,  'dwarf': 8 },
338caea440aSMed Ismail Bennani              {'name': 'x9',   'bitsize': 64, 'offset': 72,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 9,  'dwarf': 9 },
339caea440aSMed Ismail Bennani              {'name': 'x10',  'bitsize': 64, 'offset': 80,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 10, 'dwarf': 10},
340caea440aSMed Ismail Bennani              {'name': 'x11',  'bitsize': 64, 'offset': 88,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 11, 'dwarf': 11},
341caea440aSMed Ismail Bennani              {'name': 'x12',  'bitsize': 64, 'offset': 96,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 12, 'dwarf': 12},
342caea440aSMed Ismail Bennani              {'name': 'x13',  'bitsize': 64, 'offset': 104, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 13, 'dwarf': 13},
343caea440aSMed Ismail Bennani              {'name': 'x14',  'bitsize': 64, 'offset': 112, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 14, 'dwarf': 14},
344caea440aSMed Ismail Bennani              {'name': 'x15',  'bitsize': 64, 'offset': 120, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 15, 'dwarf': 15},
345caea440aSMed Ismail Bennani              {'name': 'x16',  'bitsize': 64, 'offset': 128, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 16, 'dwarf': 16},
346caea440aSMed Ismail Bennani              {'name': 'x17',  'bitsize': 64, 'offset': 136, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 17, 'dwarf': 17},
347caea440aSMed Ismail Bennani              {'name': 'x18',  'bitsize': 64, 'offset': 144, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 18, 'dwarf': 18},
348caea440aSMed Ismail Bennani              {'name': 'x19',  'bitsize': 64, 'offset': 152, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 19, 'dwarf': 19},
349caea440aSMed Ismail Bennani              {'name': 'x20',  'bitsize': 64, 'offset': 160, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 20, 'dwarf': 20},
350caea440aSMed Ismail Bennani              {'name': 'x21',  'bitsize': 64, 'offset': 168, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 21, 'dwarf': 21},
351caea440aSMed Ismail Bennani              {'name': 'x22',  'bitsize': 64, 'offset': 176, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 22, 'dwarf': 22},
352caea440aSMed Ismail Bennani              {'name': 'x23',  'bitsize': 64, 'offset': 184, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 23, 'dwarf': 23},
353caea440aSMed Ismail Bennani              {'name': 'x24',  'bitsize': 64, 'offset': 192, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 24, 'dwarf': 24},
354caea440aSMed Ismail Bennani              {'name': 'x25',  'bitsize': 64, 'offset': 200, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 25, 'dwarf': 25},
355caea440aSMed Ismail Bennani              {'name': 'x26',  'bitsize': 64, 'offset': 208, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 26, 'dwarf': 26},
356caea440aSMed Ismail Bennani              {'name': 'x27',  'bitsize': 64, 'offset': 216, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 27, 'dwarf': 27},
357caea440aSMed Ismail Bennani              {'name': 'x28',  'bitsize': 64, 'offset': 224, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 28, 'dwarf': 28},
358caea440aSMed Ismail Bennani              {'name': 'x29',  'bitsize': 64, 'offset': 232, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 29, 'dwarf': 29, 'generic': 'fp', 'alt-name': 'fp'},
359caea440aSMed Ismail Bennani              {'name': 'x30',  'bitsize': 64, 'offset': 240, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 30, 'dwarf': 30, 'generic': 'lr', 'alt-name': 'lr'},
360caea440aSMed Ismail Bennani              {'name': 'sp',   'bitsize': 64, 'offset': 248, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 31, 'dwarf': 31, 'generic': 'sp', 'alt-name': 'sp'},
361caea440aSMed Ismail Bennani              {'name': 'pc',   'bitsize': 64, 'offset': 256, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 32, 'dwarf': 32, 'generic': 'pc', 'alt-name': 'pc'},
362caea440aSMed Ismail Bennani              {'name': 'cpsr', 'bitsize': 32, 'offset': 264, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 33, 'dwarf': 33}
363caea440aSMed Ismail Bennani            ]
36459d8dd79SMed Ismail Bennani
365*f5e5074cSMed Ismail BennaniINTEL64_GPR = [ {'name': 'rax', 'bitsize': 64, 'offset': 0, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 0, 'dwarf': 0},
366*f5e5074cSMed Ismail Bennani                {'name': 'rbx', 'bitsize': 64, 'offset': 8, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 3, 'dwarf': 3},
367*f5e5074cSMed Ismail Bennani                {'name': 'rcx', 'bitsize': 64, 'offset': 16, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 2, 'dwarf': 2, 'generic': 'arg4', 'alt-name': 'arg4'},
368*f5e5074cSMed Ismail Bennani                {'name': 'rdx', 'bitsize': 64, 'offset': 24, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 1, 'dwarf': 1, 'generic': 'arg3', 'alt-name': 'arg3'},
369*f5e5074cSMed Ismail Bennani                {'name': 'rdi', 'bitsize': 64, 'offset': 32, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 5, 'dwarf': 5, 'generic': 'arg1', 'alt-name': 'arg1'},
370*f5e5074cSMed Ismail Bennani                {'name': 'rsi', 'bitsize': 64, 'offset': 40, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 4, 'dwarf': 4, 'generic': 'arg2', 'alt-name': 'arg2'},
371*f5e5074cSMed Ismail Bennani                {'name': 'rbp', 'bitsize': 64, 'offset': 48, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 6, 'dwarf': 6, 'generic': 'fp', 'alt-name': 'fp'},
372*f5e5074cSMed Ismail Bennani                {'name': 'rsp', 'bitsize': 64, 'offset': 56, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 7, 'dwarf': 7, 'generic': 'sp', 'alt-name': 'sp'},
373*f5e5074cSMed Ismail Bennani                {'name': 'r8', 'bitsize': 64, 'offset': 64, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 8, 'dwarf': 8, 'generic': 'arg5', 'alt-name': 'arg5'},
374*f5e5074cSMed Ismail Bennani                {'name': 'r9', 'bitsize': 64, 'offset': 72, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 9, 'dwarf': 9, 'generic': 'arg6', 'alt-name': 'arg6'},
375*f5e5074cSMed Ismail Bennani                {'name': 'r10', 'bitsize': 64, 'offset': 80, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 10, 'dwarf': 10},
376*f5e5074cSMed Ismail Bennani                {'name': 'r11', 'bitsize': 64, 'offset': 88, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 11, 'dwarf': 11},
377*f5e5074cSMed Ismail Bennani                {'name': 'r12', 'bitsize': 64, 'offset': 96, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 12, 'dwarf': 12},
378*f5e5074cSMed Ismail Bennani                {'name': 'r13', 'bitsize': 64, 'offset': 104, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 13, 'dwarf': 13},
379*f5e5074cSMed Ismail Bennani                {'name': 'r14', 'bitsize': 64, 'offset': 112, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 14, 'dwarf': 14},
380*f5e5074cSMed Ismail Bennani                {'name': 'r15', 'bitsize': 64, 'offset': 120, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 15, 'dwarf': 15},
381*f5e5074cSMed Ismail Bennani                {'name': 'rip', 'bitsize': 64, 'offset': 128, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 16, 'dwarf': 16, 'generic': 'pc', 'alt-name': 'pc'},
382*f5e5074cSMed Ismail Bennani                {'name': 'rflags', 'bitsize': 64, 'offset': 136, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'generic': 'flags', 'alt-name': 'flags'},
383*f5e5074cSMed Ismail Bennani                {'name': 'cs', 'bitsize': 64, 'offset': 144, 'encoding': 'uint', 'format': 'hex', 'set': 0},
384*f5e5074cSMed Ismail Bennani                {'name': 'fs', 'bitsize': 64, 'offset': 152, 'encoding': 'uint', 'format': 'hex', 'set': 0},
385*f5e5074cSMed Ismail Bennani                {'name': 'gs', 'bitsize': 64, 'offset': 160, 'encoding': 'uint', 'format': 'hex', 'set': 0}
386*f5e5074cSMed Ismail Bennani              ]
38759d8dd79SMed Ismail Bennani
388*f5e5074cSMed Ismail Bennani
389