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