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
22*4858fe04SMed 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
35f3176f5fSMed Ismail Bennani        if isinstance(target, lldb.SBTarget) and target.IsValid():
36f3176f5fSMed Ismail Bennani            self.target = target
37f3176f5fSMed Ismail Bennani        if isinstance(args, lldb.SBStructuredData) and args.IsValid():
38f3176f5fSMed Ismail Bennani            self.args = args
39f3176f5fSMed Ismail Bennani
40f3176f5fSMed Ismail Bennani    @abstractmethod
41976867b5SMed Ismail Bennani    def get_memory_region_containing_address(self, addr):
42f3176f5fSMed Ismail Bennani        """ Get the memory region for the scripted process, containing a
43f3176f5fSMed Ismail Bennani            specific address.
44f3176f5fSMed Ismail Bennani
45f3176f5fSMed Ismail Bennani        Args:
46f3176f5fSMed Ismail Bennani            addr (int): Address to look for in the scripted process memory
47f3176f5fSMed Ismail Bennani                regions.
48f3176f5fSMed Ismail Bennani
49f3176f5fSMed Ismail Bennani        Returns:
50f3176f5fSMed Ismail Bennani            lldb.SBMemoryRegionInfo: The memory region containing the address.
51f3176f5fSMed Ismail Bennani                None if out of bounds.
52f3176f5fSMed Ismail Bennani        """
53f3176f5fSMed Ismail Bennani        pass
54f3176f5fSMed Ismail Bennani
55*4858fe04SMed Ismail Bennani    def get_threads_info(self):
56*4858fe04SMed Ismail Bennani        """ Get the dictionary describing the process' Scripted Threads.
57*4858fe04SMed Ismail Bennani
58*4858fe04SMed Ismail Bennani        Returns:
59*4858fe04SMed Ismail Bennani            Dict: The dictionary of threads, with the thread ID as the key and
60*4858fe04SMed Ismail Bennani            a Scripted Thread instance as the value.
61*4858fe04SMed Ismail Bennani            The dictionary can be empty.
62*4858fe04SMed Ismail Bennani        """
63*4858fe04SMed Ismail Bennani        return self.threads
64*4858fe04SMed Ismail Bennani
65f3176f5fSMed Ismail Bennani    @abstractmethod
66976867b5SMed Ismail Bennani    def get_thread_with_id(self, tid):
67f3176f5fSMed Ismail Bennani        """ Get the scripted process thread with a specific ID.
68f3176f5fSMed Ismail Bennani
69f3176f5fSMed Ismail Bennani        Args:
70f3176f5fSMed Ismail Bennani            tid (int): Thread ID to look for in the scripted process.
71f3176f5fSMed Ismail Bennani
72f3176f5fSMed Ismail Bennani        Returns:
73f3176f5fSMed Ismail Bennani            Dict: The thread represented as a dictionary, withr the
74f3176f5fSMed Ismail Bennani                tid thread ID. None if tid doesn't match any of the scripted
75f3176f5fSMed Ismail Bennani                process threads.
76f3176f5fSMed Ismail Bennani        """
77f3176f5fSMed Ismail Bennani        pass
78f3176f5fSMed Ismail Bennani
79f3176f5fSMed Ismail Bennani    @abstractmethod
80976867b5SMed Ismail Bennani    def get_registers_for_thread(self, tid):
81f3176f5fSMed Ismail Bennani        """ Get the register context dictionary for a certain thread of
82f3176f5fSMed Ismail Bennani            the scripted process.
83f3176f5fSMed Ismail Bennani
84f3176f5fSMed Ismail Bennani        Args:
85f3176f5fSMed Ismail Bennani            tid (int): Thread ID for the thread's register context.
86f3176f5fSMed Ismail Bennani
87f3176f5fSMed Ismail Bennani        Returns:
88f3176f5fSMed Ismail Bennani            Dict: The register context represented as a dictionary, for the
89f3176f5fSMed Ismail Bennani                tid thread. None if tid doesn't match any of the scripted
90f3176f5fSMed Ismail Bennani                process threads.
91f3176f5fSMed Ismail Bennani        """
92f3176f5fSMed Ismail Bennani        pass
93f3176f5fSMed Ismail Bennani
94f3176f5fSMed Ismail Bennani    @abstractmethod
95976867b5SMed Ismail Bennani    def read_memory_at_address(self, addr, size):
96f3176f5fSMed Ismail Bennani        """ Get a memory buffer from the scripted process at a certain address,
97f3176f5fSMed Ismail Bennani            of a certain size.
98f3176f5fSMed Ismail Bennani
99f3176f5fSMed Ismail Bennani        Args:
100f3176f5fSMed Ismail Bennani            addr (int): Address from which we should start reading.
101f3176f5fSMed Ismail Bennani            size (int): Size of the memory to read.
102f3176f5fSMed Ismail Bennani
103f3176f5fSMed Ismail Bennani        Returns:
104f3176f5fSMed Ismail Bennani            lldb.SBData: An `lldb.SBData` buffer with the target byte size and
105f3176f5fSMed Ismail Bennani                byte order storing the memory read.
106f3176f5fSMed Ismail Bennani        """
107f3176f5fSMed Ismail Bennani        pass
108f3176f5fSMed Ismail Bennani
109f3176f5fSMed Ismail Bennani    def get_loaded_images(self):
110f3176f5fSMed Ismail Bennani        """ Get the list of loaded images for the scripted process.
111f3176f5fSMed Ismail Bennani
112f3176f5fSMed Ismail Bennani        ```
113f3176f5fSMed Ismail Bennani        class ScriptedProcessImage:
114f3176f5fSMed Ismail Bennani            def __init__(name, file_spec, uuid, load_address):
115f3176f5fSMed Ismail Bennani              self.name = name
116f3176f5fSMed Ismail Bennani              self.file_spec = file_spec
117f3176f5fSMed Ismail Bennani              self.uuid = uuid
118f3176f5fSMed Ismail Bennani              self.load_address = load_address
119f3176f5fSMed Ismail Bennani        ```
120f3176f5fSMed Ismail Bennani
121f3176f5fSMed Ismail Bennani        Returns:
122f3176f5fSMed Ismail Bennani            List[ScriptedProcessImage]: A list of `ScriptedProcessImage`
123f3176f5fSMed Ismail Bennani                containing for each entry, the name of the library, a UUID,
124f3176f5fSMed Ismail Bennani                an `lldb.SBFileSpec` and a load address.
125f3176f5fSMed Ismail Bennani                None if the list is empty.
126f3176f5fSMed Ismail Bennani        """
127a758c9f7SMed Ismail Bennani        return self.loaded_images
128f3176f5fSMed Ismail Bennani
129f3176f5fSMed Ismail Bennani    def get_process_id(self):
130f3176f5fSMed Ismail Bennani        """ Get the scripted process identifier.
131f3176f5fSMed Ismail Bennani
132f3176f5fSMed Ismail Bennani        Returns:
133f3176f5fSMed Ismail Bennani            int: The scripted process identifier.
134f3176f5fSMed Ismail Bennani        """
135f3176f5fSMed Ismail Bennani        return 0
136f3176f5fSMed Ismail Bennani
137f3176f5fSMed Ismail Bennani
138f3176f5fSMed Ismail Bennani    def launch(self):
139f3176f5fSMed Ismail Bennani        """ Simulate the scripted process launch.
140f3176f5fSMed Ismail Bennani
141f3176f5fSMed Ismail Bennani        Returns:
142f3176f5fSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
143f3176f5fSMed Ismail Bennani        """
144f3176f5fSMed Ismail Bennani        return lldb.SBError()
145f3176f5fSMed Ismail Bennani
146f3176f5fSMed Ismail Bennani    def resume(self):
147f3176f5fSMed Ismail Bennani        """ Simulate the scripted process resume.
148f3176f5fSMed Ismail Bennani
149f3176f5fSMed Ismail Bennani        Returns:
150f3176f5fSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
151f3176f5fSMed Ismail Bennani        """
152f3176f5fSMed Ismail Bennani        return lldb.SBError()
153f3176f5fSMed Ismail Bennani
154f3176f5fSMed Ismail Bennani    @abstractmethod
155312b43daSMed Ismail Bennani    def should_stop(self):
156312b43daSMed Ismail Bennani        """ Check if the scripted process plugin should produce the stop event.
157312b43daSMed Ismail Bennani
158312b43daSMed Ismail Bennani        Returns:
159312b43daSMed Ismail Bennani            bool: True if scripted process should broadcast a stop event.
160312b43daSMed Ismail Bennani                  False otherwise.
161312b43daSMed Ismail Bennani        """
162312b43daSMed Ismail Bennani        pass
163312b43daSMed Ismail Bennani
164312b43daSMed Ismail Bennani    def stop(self):
165312b43daSMed Ismail Bennani        """ Trigger the scripted process stop.
166312b43daSMed Ismail Bennani
167312b43daSMed Ismail Bennani        Returns:
168312b43daSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
169312b43daSMed Ismail Bennani        """
170312b43daSMed Ismail Bennani        return lldb.SBError()
171312b43daSMed Ismail Bennani
172312b43daSMed Ismail Bennani    @abstractmethod
173f3176f5fSMed Ismail Bennani    def is_alive(self):
174f3176f5fSMed Ismail Bennani        """ Check if the scripted process is alive.
175f3176f5fSMed Ismail Bennani
176f3176f5fSMed Ismail Bennani        Returns:
177f3176f5fSMed Ismail Bennani            bool: True if scripted process is alive. False otherwise.
178f3176f5fSMed Ismail Bennani        """
179f3176f5fSMed Ismail Bennani        pass
18059d8dd79SMed Ismail Bennani
18159d8dd79SMed Ismail Bennani    @abstractmethod
18259d8dd79SMed Ismail Bennani    def get_scripted_thread_plugin(self):
18359d8dd79SMed Ismail Bennani        """ Get scripted thread plugin name.
18459d8dd79SMed Ismail Bennani
18559d8dd79SMed Ismail Bennani        Returns:
18659d8dd79SMed Ismail Bennani            str: Name of the scripted thread plugin.
18759d8dd79SMed Ismail Bennani        """
18859d8dd79SMed Ismail Bennani        return None
18959d8dd79SMed Ismail Bennani
19059d8dd79SMed Ismail Bennani@six.add_metaclass(ABCMeta)
19159d8dd79SMed Ismail Bennaniclass ScriptedThread:
19259d8dd79SMed Ismail Bennani
19359d8dd79SMed Ismail Bennani    """
19459d8dd79SMed Ismail Bennani    The base class for a scripted thread.
19559d8dd79SMed Ismail Bennani
19659d8dd79SMed Ismail Bennani    Most of the base class methods are `@abstractmethod` that need to be
19759d8dd79SMed Ismail Bennani    overwritten by the inheriting class.
19859d8dd79SMed Ismail Bennani
19959d8dd79SMed Ismail Bennani    DISCLAIMER: THIS INTERFACE IS STILL UNDER DEVELOPMENT AND NOT STABLE.
20059d8dd79SMed Ismail Bennani                THE METHODS EXPOSED MIGHT CHANGE IN THE FUTURE.
20159d8dd79SMed Ismail Bennani    """
20259d8dd79SMed Ismail Bennani
20359d8dd79SMed Ismail Bennani    @abstractmethod
204738621d0SMed Ismail Bennani    def __init__(self, process, args):
20559d8dd79SMed Ismail Bennani        """ Construct a scripted thread.
20659d8dd79SMed Ismail Bennani
20759d8dd79SMed Ismail Bennani        Args:
208738621d0SMed Ismail Bennani            process (lldb.SBProcess): The scripted process owning this thread.
20959d8dd79SMed Ismail Bennani            args (lldb.SBStructuredData): A Dictionary holding arbitrary
210738621d0SMed Ismail Bennani                key/value pairs used by the scripted thread.
21159d8dd79SMed Ismail Bennani        """
21259d8dd79SMed Ismail Bennani        self.target = None
213738621d0SMed Ismail Bennani        self.process = None
21459d8dd79SMed Ismail Bennani        self.args = None
215738621d0SMed Ismail Bennani        if isinstance(process, lldb.SBProcess) and process.IsValid():
216738621d0SMed Ismail Bennani            self.process = process
217738621d0SMed Ismail Bennani            self.target = process.GetTarget()
21859d8dd79SMed Ismail Bennani
21959d8dd79SMed Ismail Bennani        self.id = None
22059d8dd79SMed Ismail Bennani        self.name = None
22159d8dd79SMed Ismail Bennani        self.queue = None
22259d8dd79SMed Ismail Bennani        self.state = None
22359d8dd79SMed Ismail Bennani        self.stop_reason = None
22459d8dd79SMed Ismail Bennani        self.register_info = None
225976867b5SMed Ismail Bennani        self.register_ctx = {}
22659d8dd79SMed Ismail Bennani        self.frames = []
22759d8dd79SMed Ismail Bennani
22859d8dd79SMed Ismail Bennani    @abstractmethod
22959d8dd79SMed Ismail Bennani    def get_thread_id(self):
23059d8dd79SMed Ismail Bennani        """ Get the scripted thread identifier.
23159d8dd79SMed Ismail Bennani
23259d8dd79SMed Ismail Bennani        Returns:
23359d8dd79SMed Ismail Bennani            int: The identifier of the scripted thread.
23459d8dd79SMed Ismail Bennani        """
23559d8dd79SMed Ismail Bennani        pass
23659d8dd79SMed Ismail Bennani
23759d8dd79SMed Ismail Bennani    @abstractmethod
23859d8dd79SMed Ismail Bennani    def get_name(self):
23959d8dd79SMed Ismail Bennani        """ Get the scripted thread name.
24059d8dd79SMed Ismail Bennani
24159d8dd79SMed Ismail Bennani        Returns:
24259d8dd79SMed Ismail Bennani            str: The name of the scripted thread.
24359d8dd79SMed Ismail Bennani        """
24459d8dd79SMed Ismail Bennani        pass
24559d8dd79SMed Ismail Bennani
24659d8dd79SMed Ismail Bennani    def get_state(self):
24759d8dd79SMed Ismail Bennani        """ Get the scripted thread state type.
24859d8dd79SMed Ismail Bennani
24959d8dd79SMed Ismail Bennani            eStateStopped,   ///< Process or thread is stopped and can be examined.
25059d8dd79SMed Ismail Bennani            eStateRunning,   ///< Process or thread is running and can't be examined.
25159d8dd79SMed Ismail Bennani            eStateStepping,  ///< Process or thread is in the process of stepping and can
25259d8dd79SMed Ismail Bennani                             /// not be examined.
25359d8dd79SMed Ismail Bennani
25459d8dd79SMed Ismail Bennani        Returns:
25559d8dd79SMed Ismail Bennani            int: The state type of the scripted thread.
25659d8dd79SMed Ismail Bennani                 Returns lldb.eStateStopped by default.
25759d8dd79SMed Ismail Bennani        """
25859d8dd79SMed Ismail Bennani        return lldb.eStateStopped
25959d8dd79SMed Ismail Bennani
26059d8dd79SMed Ismail Bennani    def get_queue(self):
26159d8dd79SMed Ismail Bennani        """ Get the scripted thread associated queue name.
26259d8dd79SMed Ismail Bennani            This method is optional.
26359d8dd79SMed Ismail Bennani
26459d8dd79SMed Ismail Bennani        Returns:
26559d8dd79SMed Ismail Bennani            str: The queue name associated with the scripted thread.
26659d8dd79SMed Ismail Bennani        """
26759d8dd79SMed Ismail Bennani        pass
26859d8dd79SMed Ismail Bennani
26959d8dd79SMed Ismail Bennani    @abstractmethod
27059d8dd79SMed Ismail Bennani    def get_stop_reason(self):
27159d8dd79SMed Ismail Bennani        """ Get the dictionary describing the stop reason type with some data.
27259d8dd79SMed Ismail Bennani            This method is optional.
27359d8dd79SMed Ismail Bennani
27459d8dd79SMed Ismail Bennani        Returns:
27559d8dd79SMed Ismail Bennani            Dict: The dictionary holding the stop reason type and the possibly
27659d8dd79SMed Ismail Bennani            the stop reason data.
27759d8dd79SMed Ismail Bennani        """
27859d8dd79SMed Ismail Bennani        pass
27959d8dd79SMed Ismail Bennani
28059d8dd79SMed Ismail Bennani    def get_stackframes(self):
28159d8dd79SMed Ismail Bennani        """ Get the list of stack frames for the scripted thread.
28259d8dd79SMed Ismail Bennani
28359d8dd79SMed Ismail Bennani        ```
28459d8dd79SMed Ismail Bennani        class ScriptedStackFrame:
28559d8dd79SMed Ismail Bennani            def __init__(idx, cfa, pc, symbol_ctx):
28659d8dd79SMed Ismail Bennani                self.idx = idx
28759d8dd79SMed Ismail Bennani                self.cfa = cfa
28859d8dd79SMed Ismail Bennani                self.pc = pc
28959d8dd79SMed Ismail Bennani                self.symbol_ctx = symbol_ctx
29059d8dd79SMed Ismail Bennani        ```
29159d8dd79SMed Ismail Bennani
29259d8dd79SMed Ismail Bennani        Returns:
29359d8dd79SMed Ismail Bennani            List[ScriptedFrame]: A list of `ScriptedStackFrame`
29459d8dd79SMed Ismail Bennani                containing for each entry, the frame index, the canonical
29559d8dd79SMed Ismail Bennani                frame address, the program counter value for that frame
29659d8dd79SMed Ismail Bennani                and a symbol context.
29759d8dd79SMed Ismail Bennani                None if the list is empty.
29859d8dd79SMed Ismail Bennani        """
29959d8dd79SMed Ismail Bennani        return 0
30059d8dd79SMed Ismail Bennani
30159d8dd79SMed Ismail Bennani    def get_register_info(self):
30259d8dd79SMed Ismail Bennani        if self.register_info is None:
30359d8dd79SMed Ismail Bennani            self.register_info = dict()
30459d8dd79SMed Ismail Bennani            triple = self.target.triple
30559d8dd79SMed Ismail Bennani            if triple:
30659d8dd79SMed Ismail Bennani                arch = triple.split('-')[0]
30759d8dd79SMed Ismail Bennani                if arch == 'x86_64':
308976867b5SMed Ismail Bennani                    self.register_info['sets'] = ['General Purpose Registers']
30959d8dd79SMed Ismail Bennani                    self.register_info['registers'] = [
31059d8dd79SMed Ismail Bennani                        {'name': 'rax', 'bitsize': 64, 'offset': 0, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 0, 'dwarf': 0},
31159d8dd79SMed Ismail Bennani                        {'name': 'rbx', 'bitsize': 64, 'offset': 8, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 3, 'dwarf': 3},
312caea440aSMed Ismail Bennani                        {'name': 'rcx', 'bitsize': 64, 'offset': 16, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 2, 'dwarf': 2, 'generic': 'arg4', 'alt-name': 'arg4'},
313caea440aSMed Ismail Bennani                        {'name': 'rdx', 'bitsize': 64, 'offset': 24, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 1, 'dwarf': 1, 'generic': 'arg3', 'alt-name': 'arg3'},
314caea440aSMed Ismail Bennani                        {'name': 'rdi', 'bitsize': 64, 'offset': 32, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 5, 'dwarf': 5, 'generic': 'arg1', 'alt-name': 'arg1'},
315caea440aSMed Ismail Bennani                        {'name': 'rsi', 'bitsize': 64, 'offset': 40, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 4, 'dwarf': 4, 'generic': 'arg2', 'alt-name': 'arg2'},
316caea440aSMed Ismail Bennani                        {'name': 'rbp', 'bitsize': 64, 'offset': 48, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 6, 'dwarf': 6, 'generic': 'fp', 'alt-name': 'fp'},
317caea440aSMed Ismail Bennani                        {'name': 'rsp', 'bitsize': 64, 'offset': 56, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 7, 'dwarf': 7, 'generic': 'sp', 'alt-name': 'sp'},
318caea440aSMed Ismail Bennani                        {'name': 'r8', 'bitsize': 64, 'offset': 64, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 8, 'dwarf': 8, 'generic': 'arg5', 'alt-name': 'arg5'},
319caea440aSMed Ismail Bennani                        {'name': 'r9', 'bitsize': 64, 'offset': 72, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 9, 'dwarf': 9, 'generic': 'arg6', 'alt-name': 'arg6'},
32059d8dd79SMed Ismail Bennani                        {'name': 'r10', 'bitsize': 64, 'offset': 80, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 10, 'dwarf': 10},
32159d8dd79SMed Ismail Bennani                        {'name': 'r11', 'bitsize': 64, 'offset': 88, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 11, 'dwarf': 11},
32259d8dd79SMed Ismail Bennani                        {'name': 'r12', 'bitsize': 64, 'offset': 96, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 12, 'dwarf': 12},
32359d8dd79SMed Ismail Bennani                        {'name': 'r13', 'bitsize': 64, 'offset': 104, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 13, 'dwarf': 13},
32459d8dd79SMed Ismail Bennani                        {'name': 'r14', 'bitsize': 64, 'offset': 112, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 14, 'dwarf': 14},
32559d8dd79SMed Ismail Bennani                        {'name': 'r15', 'bitsize': 64, 'offset': 120, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 15, 'dwarf': 15},
32659d8dd79SMed Ismail Bennani                        {'name': 'rip', 'bitsize': 64, 'offset': 128, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 16, 'dwarf': 16, 'generic': 'pc', 'alt-name': 'pc'},
32759d8dd79SMed Ismail Bennani                        {'name': 'rflags', 'bitsize': 64, 'offset': 136, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'generic': 'flags', 'alt-name': 'flags'},
32859d8dd79SMed Ismail Bennani                        {'name': 'cs', 'bitsize': 64, 'offset': 144, 'encoding': 'uint', 'format': 'hex', 'set': 0},
32959d8dd79SMed Ismail Bennani                        {'name': 'fs', 'bitsize': 64, 'offset': 152, 'encoding': 'uint', 'format': 'hex', 'set': 0},
330caea440aSMed Ismail Bennani                        {'name': 'gs', 'bitsize': 64, 'offset': 160, 'encoding': 'uint', 'format': 'hex', 'set': 0}
33159d8dd79SMed Ismail Bennani                    ]
332caea440aSMed Ismail Bennani                elif 'arm64' in arch:
333caea440aSMed Ismail Bennani                    self.register_info['sets'] = ['General Purpose Registers']
334caea440aSMed Ismail Bennani                    self.register_info['registers'] = [
335caea440aSMed Ismail Bennani                        {'name': 'x0',   'bitsize': 64, 'offset': 0,   'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 0,  'dwarf': 0,  'generic': 'arg0', 'alt-name': 'arg0'},
336caea440aSMed Ismail Bennani                        {'name': 'x1',   'bitsize': 64, 'offset': 8,   'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 1,  'dwarf': 1,  'generic': 'arg1', 'alt-name': 'arg1'},
337caea440aSMed Ismail Bennani                        {'name': 'x2',   'bitsize': 64, 'offset': 16,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 2,  'dwarf': 2,  'generic': 'arg2', 'alt-name': 'arg2'},
338caea440aSMed Ismail Bennani                        {'name': 'x3',   'bitsize': 64, 'offset': 24,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 3,  'dwarf': 3,  'generic': 'arg3', 'alt-name': 'arg3'},
339caea440aSMed Ismail Bennani                        {'name': 'x4',   'bitsize': 64, 'offset': 32,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 4,  'dwarf': 4,  'generic': 'arg4', 'alt-name': 'arg4'},
340caea440aSMed Ismail Bennani                        {'name': 'x5',   'bitsize': 64, 'offset': 40,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 5,  'dwarf': 5,  'generic': 'arg5', 'alt-name': 'arg5'},
341caea440aSMed Ismail Bennani                        {'name': 'x6',   'bitsize': 64, 'offset': 48,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 6,  'dwarf': 6,  'generic': 'arg6', 'alt-name': 'arg6'},
342caea440aSMed Ismail Bennani                        {'name': 'x7',   'bitsize': 64, 'offset': 56,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 7,  'dwarf': 7,  'generic': 'arg7', 'alt-name': 'arg7'},
343caea440aSMed Ismail Bennani                        {'name': 'x8',   'bitsize': 64, 'offset': 64,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 8,  'dwarf': 8 },
344caea440aSMed Ismail Bennani                        {'name': 'x9',   'bitsize': 64, 'offset': 72,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 9,  'dwarf': 9 },
345caea440aSMed Ismail Bennani                        {'name': 'x10',  'bitsize': 64, 'offset': 80,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 10, 'dwarf': 10},
346caea440aSMed Ismail Bennani                        {'name': 'x11',  'bitsize': 64, 'offset': 88,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 11, 'dwarf': 11},
347caea440aSMed Ismail Bennani                        {'name': 'x12',  'bitsize': 64, 'offset': 96,  'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 12, 'dwarf': 12},
348caea440aSMed Ismail Bennani                        {'name': 'x13',  'bitsize': 64, 'offset': 104, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 13, 'dwarf': 13},
349caea440aSMed Ismail Bennani                        {'name': 'x14',  'bitsize': 64, 'offset': 112, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 14, 'dwarf': 14},
350caea440aSMed Ismail Bennani                        {'name': 'x15',  'bitsize': 64, 'offset': 120, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 15, 'dwarf': 15},
351caea440aSMed Ismail Bennani                        {'name': 'x16',  'bitsize': 64, 'offset': 128, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 16, 'dwarf': 16},
352caea440aSMed Ismail Bennani                        {'name': 'x17',  'bitsize': 64, 'offset': 136, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 17, 'dwarf': 17},
353caea440aSMed Ismail Bennani                        {'name': 'x18',  'bitsize': 64, 'offset': 144, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 18, 'dwarf': 18},
354caea440aSMed Ismail Bennani                        {'name': 'x19',  'bitsize': 64, 'offset': 152, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 19, 'dwarf': 19},
355caea440aSMed Ismail Bennani                        {'name': 'x20',  'bitsize': 64, 'offset': 160, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 20, 'dwarf': 20},
356caea440aSMed Ismail Bennani                        {'name': 'x21',  'bitsize': 64, 'offset': 168, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 21, 'dwarf': 21},
357caea440aSMed Ismail Bennani                        {'name': 'x22',  'bitsize': 64, 'offset': 176, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 22, 'dwarf': 22},
358caea440aSMed Ismail Bennani                        {'name': 'x23',  'bitsize': 64, 'offset': 184, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 23, 'dwarf': 23},
359caea440aSMed Ismail Bennani                        {'name': 'x24',  'bitsize': 64, 'offset': 192, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 24, 'dwarf': 24},
360caea440aSMed Ismail Bennani                        {'name': 'x25',  'bitsize': 64, 'offset': 200, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 25, 'dwarf': 25},
361caea440aSMed Ismail Bennani                        {'name': 'x26',  'bitsize': 64, 'offset': 208, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 26, 'dwarf': 26},
362caea440aSMed Ismail Bennani                        {'name': 'x27',  'bitsize': 64, 'offset': 216, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 27, 'dwarf': 27},
363caea440aSMed Ismail Bennani                        {'name': 'x28',  'bitsize': 64, 'offset': 224, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 28, 'dwarf': 28},
364caea440aSMed Ismail Bennani                        {'name': 'x29',  'bitsize': 64, 'offset': 232, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 29, 'dwarf': 29, 'generic': 'fp', 'alt-name': 'fp'},
365caea440aSMed Ismail Bennani                        {'name': 'x30',  'bitsize': 64, 'offset': 240, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 30, 'dwarf': 30, 'generic': 'lr', 'alt-name': 'lr'},
366caea440aSMed Ismail Bennani                        {'name': 'sp',   'bitsize': 64, 'offset': 248, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 31, 'dwarf': 31, 'generic': 'sp', 'alt-name': 'sp'},
367caea440aSMed Ismail Bennani                        {'name': 'pc',   'bitsize': 64, 'offset': 256, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 32, 'dwarf': 32, 'generic': 'pc', 'alt-name': 'pc'},
368caea440aSMed Ismail Bennani                        {'name': 'cpsr', 'bitsize': 32, 'offset': 264, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 33, 'dwarf': 33}
369caea440aSMed Ismail Bennani                    ]
370caea440aSMed Ismail Bennani                else: raise ValueError('Unknown architecture', arch)
37159d8dd79SMed Ismail Bennani        return self.register_info
37259d8dd79SMed Ismail Bennani
37359d8dd79SMed Ismail Bennani    @abstractmethod
37459d8dd79SMed Ismail Bennani    def get_register_context(self):
37559d8dd79SMed Ismail Bennani        """ Get the scripted thread register context
37659d8dd79SMed Ismail Bennani
37759d8dd79SMed Ismail Bennani        Returns:
37859d8dd79SMed Ismail Bennani            str: A byte representing all register's value.
37959d8dd79SMed Ismail Bennani        """
38059d8dd79SMed Ismail Bennani        pass
381