xref: /llvm-project/lldb/test/API/functionalities/plugins/python_os_plugin/operating_system.py (revision ec456ba9ca0a097da63daafbb031cb2024f5513a)
1import lldb
2import struct
3
4from lldb.plugins.operating_system import OperatingSystem
5
6
7class OperatingSystemPlugIn(OperatingSystem):
8    """Class that provides data for an instance of a LLDB 'OperatingSystemPython' plug-in class"""
9
10    def __init__(self, process):
11        super().__init__(process)
12
13    def create_thread(self, tid, context):
14        if tid == 0x444444444:
15            thread_info = {
16                "tid": tid,
17                "name": "four",
18                "queue": "queue4",
19                "state": "stopped",
20                "stop_reason": "none",
21            }
22            self.threads.append(thread_info)
23            return thread_info
24        return None
25
26    def get_thread_info(self):
27        if not self.threads:
28            self.threads = [
29                {
30                    "tid": 0x111111111,
31                    "name": "one",
32                    "queue": "queue1",
33                    "state": "stopped",
34                    "stop_reason": "breakpoint",
35                },
36                {
37                    "tid": 0x222222222,
38                    "name": "two",
39                    "queue": "queue2",
40                    "state": "stopped",
41                    "stop_reason": "none",
42                },
43                {
44                    "tid": 0x333333333,
45                    "name": "three",
46                    "queue": "queue3",
47                    "state": "stopped",
48                    "stop_reason": "trace",
49                },
50            ]
51        return self.threads
52
53    def get_register_info(self):
54        if self.registers is None:
55            self.registers = dict()
56            self.registers["sets"] = ["GPR"]
57            self.registers["registers"] = [
58                {
59                    "name": "rax",
60                    "bitsize": 64,
61                    "offset": 0,
62                    "encoding": "uint",
63                    "format": "hex",
64                    "set": 0,
65                    "gcc": 0,
66                    "dwarf": 0,
67                },
68                {
69                    "name": "rbx",
70                    "bitsize": 64,
71                    "offset": 8,
72                    "encoding": "uint",
73                    "format": "hex",
74                    "set": 0,
75                    "gcc": 3,
76                    "dwarf": 3,
77                },
78                {
79                    "name": "rcx",
80                    "bitsize": 64,
81                    "offset": 16,
82                    "encoding": "uint",
83                    "format": "hex",
84                    "set": 0,
85                    "gcc": 2,
86                    "dwarf": 2,
87                    "generic": "arg4",
88                    "alt-name": "arg4",
89                },
90                {
91                    "name": "rdx",
92                    "bitsize": 64,
93                    "offset": 24,
94                    "encoding": "uint",
95                    "format": "hex",
96                    "set": 0,
97                    "gcc": 1,
98                    "dwarf": 1,
99                    "generic": "arg3",
100                    "alt-name": "arg3",
101                },
102                {
103                    "name": "rdi",
104                    "bitsize": 64,
105                    "offset": 32,
106                    "encoding": "uint",
107                    "format": "hex",
108                    "set": 0,
109                    "gcc": 5,
110                    "dwarf": 5,
111                    "generic": "arg1",
112                    "alt-name": "arg1",
113                },
114                {
115                    "name": "rsi",
116                    "bitsize": 64,
117                    "offset": 40,
118                    "encoding": "uint",
119                    "format": "hex",
120                    "set": 0,
121                    "gcc": 4,
122                    "dwarf": 4,
123                    "generic": "arg2",
124                    "alt-name": "arg2",
125                },
126                {
127                    "name": "rbp",
128                    "bitsize": 64,
129                    "offset": 48,
130                    "encoding": "uint",
131                    "format": "hex",
132                    "set": 0,
133                    "gcc": 6,
134                    "dwarf": 6,
135                    "generic": "fp",
136                    "alt-name": "fp",
137                },
138                {
139                    "name": "rsp",
140                    "bitsize": 64,
141                    "offset": 56,
142                    "encoding": "uint",
143                    "format": "hex",
144                    "set": 0,
145                    "gcc": 7,
146                    "dwarf": 7,
147                    "generic": "sp",
148                    "alt-name": "sp",
149                },
150                {
151                    "name": "r8",
152                    "bitsize": 64,
153                    "offset": 64,
154                    "encoding": "uint",
155                    "format": "hex",
156                    "set": 0,
157                    "gcc": 8,
158                    "dwarf": 8,
159                    "generic": "arg5",
160                    "alt-name": "arg5",
161                },
162                {
163                    "name": "r9",
164                    "bitsize": 64,
165                    "offset": 72,
166                    "encoding": "uint",
167                    "format": "hex",
168                    "set": 0,
169                    "gcc": 9,
170                    "dwarf": 9,
171                    "generic": "arg6",
172                    "alt-name": "arg6",
173                },
174                {
175                    "name": "r10",
176                    "bitsize": 64,
177                    "offset": 80,
178                    "encoding": "uint",
179                    "format": "hex",
180                    "set": 0,
181                    "gcc": 10,
182                    "dwarf": 10,
183                },
184                {
185                    "name": "r11",
186                    "bitsize": 64,
187                    "offset": 88,
188                    "encoding": "uint",
189                    "format": "hex",
190                    "set": 0,
191                    "gcc": 11,
192                    "dwarf": 11,
193                },
194                {
195                    "name": "r12",
196                    "bitsize": 64,
197                    "offset": 96,
198                    "encoding": "uint",
199                    "format": "hex",
200                    "set": 0,
201                    "gcc": 12,
202                    "dwarf": 12,
203                },
204                {
205                    "name": "r13",
206                    "bitsize": 64,
207                    "offset": 104,
208                    "encoding": "uint",
209                    "format": "hex",
210                    "set": 0,
211                    "gcc": 13,
212                    "dwarf": 13,
213                },
214                {
215                    "name": "r14",
216                    "bitsize": 64,
217                    "offset": 112,
218                    "encoding": "uint",
219                    "format": "hex",
220                    "set": 0,
221                    "gcc": 14,
222                    "dwarf": 14,
223                },
224                {
225                    "name": "r15",
226                    "bitsize": 64,
227                    "offset": 120,
228                    "encoding": "uint",
229                    "format": "hex",
230                    "set": 0,
231                    "gcc": 15,
232                    "dwarf": 15,
233                },
234                {
235                    "name": "rip",
236                    "bitsize": 64,
237                    "offset": 128,
238                    "encoding": "uint",
239                    "format": "hex",
240                    "set": 0,
241                    "gcc": 16,
242                    "dwarf": 16,
243                    "generic": "pc",
244                    "alt-name": "pc",
245                },
246                {
247                    "name": "rflags",
248                    "bitsize": 64,
249                    "offset": 136,
250                    "encoding": "uint",
251                    "format": "hex",
252                    "set": 0,
253                    "generic": "flags",
254                    "alt-name": "flags",
255                },
256                {
257                    "name": "cs",
258                    "bitsize": 64,
259                    "offset": 144,
260                    "encoding": "uint",
261                    "format": "hex",
262                    "set": 0,
263                },
264                {
265                    "name": "fs",
266                    "bitsize": 64,
267                    "offset": 152,
268                    "encoding": "uint",
269                    "format": "hex",
270                    "set": 0,
271                },
272                {
273                    "name": "gs",
274                    "bitsize": 64,
275                    "offset": 160,
276                    "encoding": "uint",
277                    "format": "hex",
278                    "set": 0,
279                },
280            ]
281        return self.registers
282
283    def get_register_data(self, tid):
284        return struct.pack(
285            "21Q",
286            tid + 1,
287            tid + 2,
288            tid + 3,
289            tid + 4,
290            tid + 5,
291            tid + 6,
292            tid + 7,
293            tid + 8,
294            tid + 9,
295            tid + 10,
296            tid + 11,
297            tid + 12,
298            tid + 13,
299            tid + 14,
300            tid + 15,
301            tid + 16,
302            tid + 17,
303            tid + 18,
304            tid + 19,
305            tid + 20,
306            tid + 21,
307        )
308