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