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