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
22a758c9f7SMed Ismail Bennani
23f3176f5fSMed Ismail Bennani    @abstractmethod
24f3176f5fSMed Ismail Bennani    def __init__(self, target, args):
25f3176f5fSMed Ismail Bennani        """ Construct a scripted process.
26f3176f5fSMed Ismail Bennani
27f3176f5fSMed Ismail Bennani        Args:
28f3176f5fSMed Ismail Bennani            target (lldb.SBTarget): The target launching the scripted process.
29f3176f5fSMed Ismail Bennani            args (lldb.SBStructuredData): A Dictionary holding arbitrary
30f3176f5fSMed Ismail Bennani                key/value pairs used by the scripted process.
31f3176f5fSMed Ismail Bennani        """
32f3176f5fSMed Ismail Bennani        self.target = None
33f3176f5fSMed Ismail Bennani        self.args = None
34f3176f5fSMed Ismail Bennani        if isinstance(target, lldb.SBTarget) and target.IsValid():
35f3176f5fSMed Ismail Bennani            self.target = target
36f3176f5fSMed Ismail Bennani        if isinstance(args, lldb.SBStructuredData) and args.IsValid():
37f3176f5fSMed Ismail Bennani            self.args = args
38f3176f5fSMed Ismail Bennani
39f3176f5fSMed Ismail Bennani    @abstractmethod
40*976867b5SMed Ismail Bennani    def get_memory_region_containing_address(self, addr):
41f3176f5fSMed Ismail Bennani        """ Get the memory region for the scripted process, containing a
42f3176f5fSMed Ismail Bennani            specific address.
43f3176f5fSMed Ismail Bennani
44f3176f5fSMed Ismail Bennani        Args:
45f3176f5fSMed Ismail Bennani            addr (int): Address to look for in the scripted process memory
46f3176f5fSMed Ismail Bennani                regions.
47f3176f5fSMed Ismail Bennani
48f3176f5fSMed Ismail Bennani        Returns:
49f3176f5fSMed Ismail Bennani            lldb.SBMemoryRegionInfo: The memory region containing the address.
50f3176f5fSMed Ismail Bennani                None if out of bounds.
51f3176f5fSMed Ismail Bennani        """
52f3176f5fSMed Ismail Bennani        pass
53f3176f5fSMed Ismail Bennani
54f3176f5fSMed Ismail Bennani    @abstractmethod
55*976867b5SMed Ismail Bennani    def get_thread_with_id(self, tid):
56f3176f5fSMed Ismail Bennani        """ Get the scripted process thread with a specific ID.
57f3176f5fSMed Ismail Bennani
58f3176f5fSMed Ismail Bennani        Args:
59f3176f5fSMed Ismail Bennani            tid (int): Thread ID to look for in the scripted process.
60f3176f5fSMed Ismail Bennani
61f3176f5fSMed Ismail Bennani        Returns:
62f3176f5fSMed Ismail Bennani            Dict: The thread represented as a dictionary, withr the
63f3176f5fSMed Ismail Bennani                tid thread ID. None if tid doesn't match any of the scripted
64f3176f5fSMed Ismail Bennani                process threads.
65f3176f5fSMed Ismail Bennani        """
66f3176f5fSMed Ismail Bennani        pass
67f3176f5fSMed Ismail Bennani
68f3176f5fSMed Ismail Bennani    @abstractmethod
69*976867b5SMed Ismail Bennani    def get_registers_for_thread(self, tid):
70f3176f5fSMed Ismail Bennani        """ Get the register context dictionary for a certain thread of
71f3176f5fSMed Ismail Bennani            the scripted process.
72f3176f5fSMed Ismail Bennani
73f3176f5fSMed Ismail Bennani        Args:
74f3176f5fSMed Ismail Bennani            tid (int): Thread ID for the thread's register context.
75f3176f5fSMed Ismail Bennani
76f3176f5fSMed Ismail Bennani        Returns:
77f3176f5fSMed Ismail Bennani            Dict: The register context represented as a dictionary, for the
78f3176f5fSMed Ismail Bennani                tid thread. 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
84*976867b5SMed Ismail Bennani    def read_memory_at_address(self, addr, size):
85f3176f5fSMed Ismail Bennani        """ Get a memory buffer from the scripted process at a certain address,
86f3176f5fSMed Ismail Bennani            of a certain size.
87f3176f5fSMed Ismail Bennani
88f3176f5fSMed Ismail Bennani        Args:
89f3176f5fSMed Ismail Bennani            addr (int): Address from which we should start reading.
90f3176f5fSMed Ismail Bennani            size (int): Size of the memory to read.
91f3176f5fSMed Ismail Bennani
92f3176f5fSMed Ismail Bennani        Returns:
93f3176f5fSMed Ismail Bennani            lldb.SBData: An `lldb.SBData` buffer with the target byte size and
94f3176f5fSMed Ismail Bennani                byte order storing the memory read.
95f3176f5fSMed Ismail Bennani        """
96f3176f5fSMed Ismail Bennani        pass
97f3176f5fSMed Ismail Bennani
98f3176f5fSMed Ismail Bennani    def get_loaded_images(self):
99f3176f5fSMed Ismail Bennani        """ Get the list of loaded images for the scripted process.
100f3176f5fSMed Ismail Bennani
101f3176f5fSMed Ismail Bennani        ```
102f3176f5fSMed Ismail Bennani        class ScriptedProcessImage:
103f3176f5fSMed Ismail Bennani            def __init__(name, file_spec, uuid, load_address):
104f3176f5fSMed Ismail Bennani              self.name = name
105f3176f5fSMed Ismail Bennani              self.file_spec = file_spec
106f3176f5fSMed Ismail Bennani              self.uuid = uuid
107f3176f5fSMed Ismail Bennani              self.load_address = load_address
108f3176f5fSMed Ismail Bennani        ```
109f3176f5fSMed Ismail Bennani
110f3176f5fSMed Ismail Bennani        Returns:
111f3176f5fSMed Ismail Bennani            List[ScriptedProcessImage]: A list of `ScriptedProcessImage`
112f3176f5fSMed Ismail Bennani                containing for each entry, the name of the library, a UUID,
113f3176f5fSMed Ismail Bennani                an `lldb.SBFileSpec` and a load address.
114f3176f5fSMed Ismail Bennani                None if the list is empty.
115f3176f5fSMed Ismail Bennani        """
116a758c9f7SMed Ismail Bennani        return self.loaded_images
117f3176f5fSMed Ismail Bennani
118f3176f5fSMed Ismail Bennani    def get_process_id(self):
119f3176f5fSMed Ismail Bennani        """ Get the scripted process identifier.
120f3176f5fSMed Ismail Bennani
121f3176f5fSMed Ismail Bennani        Returns:
122f3176f5fSMed Ismail Bennani            int: The scripted process identifier.
123f3176f5fSMed Ismail Bennani        """
124f3176f5fSMed Ismail Bennani        return 0
125f3176f5fSMed Ismail Bennani
126f3176f5fSMed Ismail Bennani
127f3176f5fSMed Ismail Bennani    def launch(self):
128f3176f5fSMed Ismail Bennani        """ Simulate the scripted process launch.
129f3176f5fSMed Ismail Bennani
130f3176f5fSMed Ismail Bennani        Returns:
131f3176f5fSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
132f3176f5fSMed Ismail Bennani        """
133f3176f5fSMed Ismail Bennani        return lldb.SBError()
134f3176f5fSMed Ismail Bennani
135f3176f5fSMed Ismail Bennani    def resume(self):
136f3176f5fSMed Ismail Bennani        """ Simulate the scripted process resume.
137f3176f5fSMed Ismail Bennani
138f3176f5fSMed Ismail Bennani        Returns:
139f3176f5fSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
140f3176f5fSMed Ismail Bennani        """
141f3176f5fSMed Ismail Bennani        return lldb.SBError()
142f3176f5fSMed Ismail Bennani
143f3176f5fSMed Ismail Bennani    @abstractmethod
144312b43daSMed Ismail Bennani    def should_stop(self):
145312b43daSMed Ismail Bennani        """ Check if the scripted process plugin should produce the stop event.
146312b43daSMed Ismail Bennani
147312b43daSMed Ismail Bennani        Returns:
148312b43daSMed Ismail Bennani            bool: True if scripted process should broadcast a stop event.
149312b43daSMed Ismail Bennani                  False otherwise.
150312b43daSMed Ismail Bennani        """
151312b43daSMed Ismail Bennani        pass
152312b43daSMed Ismail Bennani
153312b43daSMed Ismail Bennani    def stop(self):
154312b43daSMed Ismail Bennani        """ Trigger the scripted process stop.
155312b43daSMed Ismail Bennani
156312b43daSMed Ismail Bennani        Returns:
157312b43daSMed Ismail Bennani            lldb.SBError: An `lldb.SBError` with error code 0.
158312b43daSMed Ismail Bennani        """
159312b43daSMed Ismail Bennani        return lldb.SBError()
160312b43daSMed Ismail Bennani
161312b43daSMed Ismail Bennani    @abstractmethod
162f3176f5fSMed Ismail Bennani    def is_alive(self):
163f3176f5fSMed Ismail Bennani        """ Check if the scripted process is alive.
164f3176f5fSMed Ismail Bennani
165f3176f5fSMed Ismail Bennani        Returns:
166f3176f5fSMed Ismail Bennani            bool: True if scripted process is alive. False otherwise.
167f3176f5fSMed Ismail Bennani        """
168f3176f5fSMed Ismail Bennani        pass
16959d8dd79SMed Ismail Bennani
17059d8dd79SMed Ismail Bennani    @abstractmethod
17159d8dd79SMed Ismail Bennani    def get_scripted_thread_plugin(self):
17259d8dd79SMed Ismail Bennani        """ Get scripted thread plugin name.
17359d8dd79SMed Ismail Bennani
17459d8dd79SMed Ismail Bennani        Returns:
17559d8dd79SMed Ismail Bennani            str: Name of the scripted thread plugin.
17659d8dd79SMed Ismail Bennani        """
17759d8dd79SMed Ismail Bennani        return None
17859d8dd79SMed Ismail Bennani
17959d8dd79SMed Ismail Bennani@six.add_metaclass(ABCMeta)
18059d8dd79SMed Ismail Bennaniclass ScriptedThread:
18159d8dd79SMed Ismail Bennani
18259d8dd79SMed Ismail Bennani    """
18359d8dd79SMed Ismail Bennani    The base class for a scripted thread.
18459d8dd79SMed Ismail Bennani
18559d8dd79SMed Ismail Bennani    Most of the base class methods are `@abstractmethod` that need to be
18659d8dd79SMed Ismail Bennani    overwritten by the inheriting class.
18759d8dd79SMed Ismail Bennani
18859d8dd79SMed Ismail Bennani    DISCLAIMER: THIS INTERFACE IS STILL UNDER DEVELOPMENT AND NOT STABLE.
18959d8dd79SMed Ismail Bennani                THE METHODS EXPOSED MIGHT CHANGE IN THE FUTURE.
19059d8dd79SMed Ismail Bennani    """
19159d8dd79SMed Ismail Bennani
19259d8dd79SMed Ismail Bennani    @abstractmethod
193738621d0SMed Ismail Bennani    def __init__(self, process, args):
19459d8dd79SMed Ismail Bennani        """ Construct a scripted thread.
19559d8dd79SMed Ismail Bennani
19659d8dd79SMed Ismail Bennani        Args:
197738621d0SMed Ismail Bennani            process (lldb.SBProcess): The scripted process owning this thread.
19859d8dd79SMed Ismail Bennani            args (lldb.SBStructuredData): A Dictionary holding arbitrary
199738621d0SMed Ismail Bennani                key/value pairs used by the scripted thread.
20059d8dd79SMed Ismail Bennani        """
20159d8dd79SMed Ismail Bennani        self.target = None
202738621d0SMed Ismail Bennani        self.process = None
20359d8dd79SMed Ismail Bennani        self.args = None
204738621d0SMed Ismail Bennani        if isinstance(process, lldb.SBProcess) and process.IsValid():
205738621d0SMed Ismail Bennani            self.process = process
206738621d0SMed Ismail Bennani            self.target = process.GetTarget()
20759d8dd79SMed Ismail Bennani
20859d8dd79SMed Ismail Bennani        self.id = None
20959d8dd79SMed Ismail Bennani        self.name = None
21059d8dd79SMed Ismail Bennani        self.queue = None
21159d8dd79SMed Ismail Bennani        self.state = None
21259d8dd79SMed Ismail Bennani        self.stop_reason = None
21359d8dd79SMed Ismail Bennani        self.register_info = None
214*976867b5SMed Ismail Bennani        self.register_ctx = {}
21559d8dd79SMed Ismail Bennani        self.frames = []
21659d8dd79SMed Ismail Bennani
21759d8dd79SMed Ismail Bennani    @abstractmethod
21859d8dd79SMed Ismail Bennani    def get_thread_id(self):
21959d8dd79SMed Ismail Bennani        """ Get the scripted thread identifier.
22059d8dd79SMed Ismail Bennani
22159d8dd79SMed Ismail Bennani        Returns:
22259d8dd79SMed Ismail Bennani            int: The identifier of the scripted thread.
22359d8dd79SMed Ismail Bennani        """
22459d8dd79SMed Ismail Bennani        pass
22559d8dd79SMed Ismail Bennani
22659d8dd79SMed Ismail Bennani    @abstractmethod
22759d8dd79SMed Ismail Bennani    def get_name(self):
22859d8dd79SMed Ismail Bennani        """ Get the scripted thread name.
22959d8dd79SMed Ismail Bennani
23059d8dd79SMed Ismail Bennani        Returns:
23159d8dd79SMed Ismail Bennani            str: The name of the scripted thread.
23259d8dd79SMed Ismail Bennani        """
23359d8dd79SMed Ismail Bennani        pass
23459d8dd79SMed Ismail Bennani
23559d8dd79SMed Ismail Bennani    def get_state(self):
23659d8dd79SMed Ismail Bennani        """ Get the scripted thread state type.
23759d8dd79SMed Ismail Bennani
23859d8dd79SMed Ismail Bennani            eStateStopped,   ///< Process or thread is stopped and can be examined.
23959d8dd79SMed Ismail Bennani            eStateRunning,   ///< Process or thread is running and can't be examined.
24059d8dd79SMed Ismail Bennani            eStateStepping,  ///< Process or thread is in the process of stepping and can
24159d8dd79SMed Ismail Bennani                             /// not be examined.
24259d8dd79SMed Ismail Bennani
24359d8dd79SMed Ismail Bennani        Returns:
24459d8dd79SMed Ismail Bennani            int: The state type of the scripted thread.
24559d8dd79SMed Ismail Bennani                 Returns lldb.eStateStopped by default.
24659d8dd79SMed Ismail Bennani        """
24759d8dd79SMed Ismail Bennani        return lldb.eStateStopped
24859d8dd79SMed Ismail Bennani
24959d8dd79SMed Ismail Bennani    def get_queue(self):
25059d8dd79SMed Ismail Bennani        """ Get the scripted thread associated queue name.
25159d8dd79SMed Ismail Bennani            This method is optional.
25259d8dd79SMed Ismail Bennani
25359d8dd79SMed Ismail Bennani        Returns:
25459d8dd79SMed Ismail Bennani            str: The queue name associated with the scripted thread.
25559d8dd79SMed Ismail Bennani        """
25659d8dd79SMed Ismail Bennani        pass
25759d8dd79SMed Ismail Bennani
25859d8dd79SMed Ismail Bennani    @abstractmethod
25959d8dd79SMed Ismail Bennani    def get_stop_reason(self):
26059d8dd79SMed Ismail Bennani        """ Get the dictionary describing the stop reason type with some data.
26159d8dd79SMed Ismail Bennani            This method is optional.
26259d8dd79SMed Ismail Bennani
26359d8dd79SMed Ismail Bennani        Returns:
26459d8dd79SMed Ismail Bennani            Dict: The dictionary holding the stop reason type and the possibly
26559d8dd79SMed Ismail Bennani            the stop reason data.
26659d8dd79SMed Ismail Bennani        """
26759d8dd79SMed Ismail Bennani        pass
26859d8dd79SMed Ismail Bennani
26959d8dd79SMed Ismail Bennani    def get_stackframes(self):
27059d8dd79SMed Ismail Bennani        """ Get the list of stack frames for the scripted thread.
27159d8dd79SMed Ismail Bennani
27259d8dd79SMed Ismail Bennani        ```
27359d8dd79SMed Ismail Bennani        class ScriptedStackFrame:
27459d8dd79SMed Ismail Bennani            def __init__(idx, cfa, pc, symbol_ctx):
27559d8dd79SMed Ismail Bennani                self.idx = idx
27659d8dd79SMed Ismail Bennani                self.cfa = cfa
27759d8dd79SMed Ismail Bennani                self.pc = pc
27859d8dd79SMed Ismail Bennani                self.symbol_ctx = symbol_ctx
27959d8dd79SMed Ismail Bennani        ```
28059d8dd79SMed Ismail Bennani
28159d8dd79SMed Ismail Bennani        Returns:
28259d8dd79SMed Ismail Bennani            List[ScriptedFrame]: A list of `ScriptedStackFrame`
28359d8dd79SMed Ismail Bennani                containing for each entry, the frame index, the canonical
28459d8dd79SMed Ismail Bennani                frame address, the program counter value for that frame
28559d8dd79SMed Ismail Bennani                and a symbol context.
28659d8dd79SMed Ismail Bennani                None if the list is empty.
28759d8dd79SMed Ismail Bennani        """
28859d8dd79SMed Ismail Bennani        return 0
28959d8dd79SMed Ismail Bennani
29059d8dd79SMed Ismail Bennani    def get_register_info(self):
29159d8dd79SMed Ismail Bennani        if self.register_info is None:
29259d8dd79SMed Ismail Bennani            self.register_info = dict()
29359d8dd79SMed Ismail Bennani            triple = self.target.triple
29459d8dd79SMed Ismail Bennani            if triple:
29559d8dd79SMed Ismail Bennani                arch = triple.split('-')[0]
29659d8dd79SMed Ismail Bennani                if arch == 'x86_64':
297*976867b5SMed Ismail Bennani                    self.register_info['sets'] = ['General Purpose Registers']
29859d8dd79SMed Ismail Bennani                    self.register_info['registers'] = [
29959d8dd79SMed Ismail Bennani                        {'name': 'rax', 'bitsize': 64, 'offset': 0, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 0, 'dwarf': 0},
30059d8dd79SMed Ismail Bennani                        {'name': 'rbx', 'bitsize': 64, 'offset': 8, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 3, 'dwarf': 3},
30159d8dd79SMed Ismail Bennani                        {'name': 'rcx', 'bitsize': 64, 'offset': 16, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 2, 'dwarf': 2, 'generic': 'arg4', 'alt-name': 'arg4', },
30259d8dd79SMed Ismail Bennani                        {'name': 'rdx', 'bitsize': 64, 'offset': 24, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 1, 'dwarf': 1, 'generic': 'arg3', 'alt-name': 'arg3', },
30359d8dd79SMed Ismail Bennani                        {'name': 'rdi', 'bitsize': 64, 'offset': 32, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 5, 'dwarf': 5, 'generic': 'arg1', 'alt-name': 'arg1', },
30459d8dd79SMed Ismail Bennani                        {'name': 'rsi', 'bitsize': 64, 'offset': 40, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 4, 'dwarf': 4, 'generic': 'arg2', 'alt-name': 'arg2', },
30559d8dd79SMed Ismail Bennani                        {'name': 'rbp', 'bitsize': 64, 'offset': 48, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 6, 'dwarf': 6, 'generic': 'fp', 'alt-name': 'fp', },
30659d8dd79SMed Ismail Bennani                        {'name': 'rsp', 'bitsize': 64, 'offset': 56, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 7, 'dwarf': 7, 'generic': 'sp', 'alt-name': 'sp', },
30759d8dd79SMed Ismail Bennani                        {'name': 'r8', 'bitsize': 64, 'offset': 64, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 8, 'dwarf': 8, 'generic': 'arg5', 'alt-name': 'arg5', },
30859d8dd79SMed Ismail Bennani                        {'name': 'r9', 'bitsize': 64, 'offset': 72, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 9, 'dwarf': 9, 'generic': 'arg6', 'alt-name': 'arg6', },
30959d8dd79SMed Ismail Bennani                        {'name': 'r10', 'bitsize': 64, 'offset': 80, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 10, 'dwarf': 10},
31059d8dd79SMed Ismail Bennani                        {'name': 'r11', 'bitsize': 64, 'offset': 88, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 11, 'dwarf': 11},
31159d8dd79SMed Ismail Bennani                        {'name': 'r12', 'bitsize': 64, 'offset': 96, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 12, 'dwarf': 12},
31259d8dd79SMed Ismail Bennani                        {'name': 'r13', 'bitsize': 64, 'offset': 104, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 13, 'dwarf': 13},
31359d8dd79SMed Ismail Bennani                        {'name': 'r14', 'bitsize': 64, 'offset': 112, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 14, 'dwarf': 14},
31459d8dd79SMed Ismail Bennani                        {'name': 'r15', 'bitsize': 64, 'offset': 120, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 15, 'dwarf': 15},
31559d8dd79SMed Ismail Bennani                        {'name': 'rip', 'bitsize': 64, 'offset': 128, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'gcc': 16, 'dwarf': 16, 'generic': 'pc', 'alt-name': 'pc'},
31659d8dd79SMed Ismail Bennani                        {'name': 'rflags', 'bitsize': 64, 'offset': 136, 'encoding': 'uint', 'format': 'hex', 'set': 0, 'generic': 'flags', 'alt-name': 'flags'},
31759d8dd79SMed Ismail Bennani                        {'name': 'cs', 'bitsize': 64, 'offset': 144, 'encoding': 'uint', 'format': 'hex', 'set': 0},
31859d8dd79SMed Ismail Bennani                        {'name': 'fs', 'bitsize': 64, 'offset': 152, 'encoding': 'uint', 'format': 'hex', 'set': 0},
31959d8dd79SMed Ismail Bennani                        {'name': 'gs', 'bitsize': 64, 'offset': 160, 'encoding': 'uint', 'format': 'hex', 'set': 0},
32059d8dd79SMed Ismail Bennani                    ]
32159d8dd79SMed Ismail Bennani        return self.register_info
32259d8dd79SMed Ismail Bennani
32359d8dd79SMed Ismail Bennani    @abstractmethod
32459d8dd79SMed Ismail Bennani    def get_register_context(self):
32559d8dd79SMed Ismail Bennani        """ Get the scripted thread register context
32659d8dd79SMed Ismail Bennani
32759d8dd79SMed Ismail Bennani        Returns:
32859d8dd79SMed Ismail Bennani            str: A byte representing all register's value.
32959d8dd79SMed Ismail Bennani        """
33059d8dd79SMed Ismail Bennani        pass
331