1a758c9f7SMed Ismail Bennaniimport os,struct, signal
2a758c9f7SMed Ismail Bennani
3a758c9f7SMed Ismail Bennanifrom typing import Any, Dict
4a758c9f7SMed Ismail Bennani
5a758c9f7SMed Ismail Bennaniimport lldb
6a758c9f7SMed Ismail Bennanifrom lldb.plugins.scripted_process import ScriptedProcess
7a758c9f7SMed Ismail Bennanifrom lldb.plugins.scripted_process import ScriptedThread
8a758c9f7SMed Ismail Bennani
9a758c9f7SMed Ismail Bennaniclass DummyScriptedProcess(ScriptedProcess):
10a758c9f7SMed Ismail Bennani    def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData):
11a758c9f7SMed Ismail Bennani        super().__init__(target, args)
12c3ca2c6bSMed Ismail Bennani        self.threads[0] = DummyScriptedThread(self, None)
13a758c9f7SMed Ismail Bennani
14a758c9f7SMed Ismail Bennani    def get_memory_region_containing_address(self, addr: int) -> lldb.SBMemoryRegionInfo:
15a758c9f7SMed Ismail Bennani        return None
16a758c9f7SMed Ismail Bennani
17a758c9f7SMed Ismail Bennani    def get_thread_with_id(self, tid: int):
18a758c9f7SMed Ismail Bennani        return {}
19a758c9f7SMed Ismail Bennani
20a758c9f7SMed Ismail Bennani    def get_registers_for_thread(self, tid: int):
21a758c9f7SMed Ismail Bennani        return {}
22a758c9f7SMed Ismail Bennani
23a758c9f7SMed Ismail Bennani    def read_memory_at_address(self, addr: int, size: int) -> lldb.SBData:
24a758c9f7SMed Ismail Bennani        data = lldb.SBData().CreateDataFromCString(
25a758c9f7SMed Ismail Bennani                                    self.target.GetByteOrder(),
26a758c9f7SMed Ismail Bennani                                    self.target.GetCodeByteSize(),
27a758c9f7SMed Ismail Bennani                                    "Hello, world!")
28a758c9f7SMed Ismail Bennani        return data
29a758c9f7SMed Ismail Bennani
30a758c9f7SMed Ismail Bennani    def get_loaded_images(self):
31a758c9f7SMed Ismail Bennani        return self.loaded_images
32a758c9f7SMed Ismail Bennani
33a758c9f7SMed Ismail Bennani    def get_process_id(self) -> int:
34a758c9f7SMed Ismail Bennani        return 42
35a758c9f7SMed Ismail Bennani
36a758c9f7SMed Ismail Bennani    def should_stop(self) -> bool:
37a758c9f7SMed Ismail Bennani        return True
38a758c9f7SMed Ismail Bennani
39a758c9f7SMed Ismail Bennani    def is_alive(self) -> bool:
40a758c9f7SMed Ismail Bennani        return True
41a758c9f7SMed Ismail Bennani
42a758c9f7SMed Ismail Bennani    def get_scripted_thread_plugin(self):
43a758c9f7SMed Ismail Bennani        return DummyScriptedThread.__module__ + "." + DummyScriptedThread.__name__
44a758c9f7SMed Ismail Bennani
45a758c9f7SMed Ismail Bennani
46a758c9f7SMed Ismail Bennaniclass DummyScriptedThread(ScriptedThread):
47738621d0SMed Ismail Bennani    def __init__(self, process, args):
48738621d0SMed Ismail Bennani        super().__init__(process, args)
49*70665844SMed Ismail Bennani        self.frames.append({"pc": 0x0100001b00 })
50a758c9f7SMed Ismail Bennani
51a758c9f7SMed Ismail Bennani    def get_thread_id(self) -> int:
52a758c9f7SMed Ismail Bennani        return 0x19
53a758c9f7SMed Ismail Bennani
54a758c9f7SMed Ismail Bennani    def get_name(self) -> str:
55a758c9f7SMed Ismail Bennani        return DummyScriptedThread.__name__ + ".thread-1"
56a758c9f7SMed Ismail Bennani
57a758c9f7SMed Ismail Bennani    def get_state(self) -> int:
58a758c9f7SMed Ismail Bennani        return lldb.eStateStopped
59a758c9f7SMed Ismail Bennani
60a758c9f7SMed Ismail Bennani    def get_stop_reason(self) -> Dict[str, Any]:
61a758c9f7SMed Ismail Bennani        return { "type": lldb.eStopReasonSignal, "data": {
62a758c9f7SMed Ismail Bennani            "signal": signal.SIGINT
63a758c9f7SMed Ismail Bennani        } }
64a758c9f7SMed Ismail Bennani
65a758c9f7SMed Ismail Bennani    def get_register_context(self) -> str:
66a758c9f7SMed Ismail Bennani        return struct.pack(
67a758c9f7SMed Ismail Bennani                '21Q', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)
68a758c9f7SMed Ismail Bennani
69a758c9f7SMed Ismail Bennani
70a758c9f7SMed Ismail Bennanidef __lldb_init_module(debugger, dict):
71a758c9f7SMed Ismail Bennani    if not 'SKIP_SCRIPTED_PROCESS_LAUNCH' in os.environ:
72a758c9f7SMed Ismail Bennani        debugger.HandleCommand(
73a758c9f7SMed Ismail Bennani            "process launch -C %s.%s" % (__name__,
74a758c9f7SMed Ismail Bennani                                     DummyScriptedProcess.__name__))
75a758c9f7SMed Ismail Bennani    else:
76a758c9f7SMed Ismail Bennani        print("Name of the class that will manage the scripted process: '%s.%s'"
77a758c9f7SMed Ismail Bennani                % (__name__, DummyScriptedProcess.__name__))
78