brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.4 KiB · 3ba68e4 Raw
318 lines · python
1#!/usr/bin/env python2 3import lldb4import struct5 6 7class OperatingSystemPlugIn(object):8    """Class that provides data for an instance of a LLDB 'OperatingSystemPython' plug-in class"""9 10    def __init__(self, process):11        """Initialization needs a valid.SBProcess object.12 13        This plug-in will get created after a live process is valid and has stopped for the14        first time."""15        self.process = None16        self.registers = None17        self.threads = None18        if isinstance(process, lldb.SBProcess) and process.IsValid():19            self.process = process20            self.threads = None  # Will be an dictionary containing info for each thread21 22    def get_target(self):23        # NOTE: Don't use "lldb.target" when trying to get your target as the "lldb.target"24        # tracks the current target in the LLDB command interpreter which isn't the25        # correct thing to use for this plug-in.26        return self.process.target27 28    def create_thread(self, tid, context):29        if tid == 0x444444444:30            thread_info = {31                "tid": tid,32                "name": "four",33                "queue": "queue4",34                "state": "stopped",35                "stop_reason": "none",36            }37            self.threads.append(thread_info)38            return thread_info39        return None40 41    def get_thread_info(self):42        if not self.threads:43            # The sample dictionary below shows the values that can be returned for a thread44            # tid => thread ID (mandatory)45            # name => thread name (optional key/value pair)46            # queue => thread dispatch queue name (optional key/value pair)47            # state => thred state (mandatory, set to 'stopped' for now)48            # stop_reason => thread stop reason. (mandatory, usually set to 'none')49            #  Possible values include:50            #   'breakpoint' if the thread is stopped at a breakpoint51            #   'none' thread is just stopped because the process is stopped52            #   'trace' the thread just single stepped53            #   The usual value for this while threads are in memory is 'none'54            # register_data_addr => the address of the register data in memory (optional key/value pair)55            #   Specifying this key/value pair for a thread will avoid a call to get_register_data()56            #   and can be used when your registers are in a thread context structure that is contiguous57            #   in memory. Don't specify this if your register layout in memory doesn't match the layout58            # described by the dictionary returned from a call to the59            # get_register_info() method.60            self.threads = [{"tid": 0x111111111, "core": 0}]61        return self.threads62 63    def get_register_info(self):64        if self.registers is None:65            self.registers = dict()66            self.registers["sets"] = ["GPR"]67            self.registers["registers"] = [68                {69                    "name": "rax",70                    "bitsize": 64,71                    "offset": 0,72                    "encoding": "uint",73                    "format": "hex",74                    "set": 0,75                    "gcc": 0,76                    "dwarf": 0,77                },78                {79                    "name": "rbx",80                    "bitsize": 64,81                    "offset": 8,82                    "encoding": "uint",83                    "format": "hex",84                    "set": 0,85                    "gcc": 3,86                    "dwarf": 3,87                },88                {89                    "name": "rcx",90                    "bitsize": 64,91                    "offset": 16,92                    "encoding": "uint",93                    "format": "hex",94                    "set": 0,95                    "gcc": 2,96                    "dwarf": 2,97                    "generic": "arg4",98                    "alt-name": "arg4",99                },100                {101                    "name": "rdx",102                    "bitsize": 64,103                    "offset": 24,104                    "encoding": "uint",105                    "format": "hex",106                    "set": 0,107                    "gcc": 1,108                    "dwarf": 1,109                    "generic": "arg3",110                    "alt-name": "arg3",111                },112                {113                    "name": "rdi",114                    "bitsize": 64,115                    "offset": 32,116                    "encoding": "uint",117                    "format": "hex",118                    "set": 0,119                    "gcc": 5,120                    "dwarf": 5,121                    "generic": "arg1",122                    "alt-name": "arg1",123                },124                {125                    "name": "rsi",126                    "bitsize": 64,127                    "offset": 40,128                    "encoding": "uint",129                    "format": "hex",130                    "set": 0,131                    "gcc": 4,132                    "dwarf": 4,133                    "generic": "arg2",134                    "alt-name": "arg2",135                },136                {137                    "name": "rbp",138                    "bitsize": 64,139                    "offset": 48,140                    "encoding": "uint",141                    "format": "hex",142                    "set": 0,143                    "gcc": 6,144                    "dwarf": 6,145                    "generic": "fp",146                    "alt-name": "fp",147                },148                {149                    "name": "rsp",150                    "bitsize": 64,151                    "offset": 56,152                    "encoding": "uint",153                    "format": "hex",154                    "set": 0,155                    "gcc": 7,156                    "dwarf": 7,157                    "generic": "sp",158                    "alt-name": "sp",159                },160                {161                    "name": "r8",162                    "bitsize": 64,163                    "offset": 64,164                    "encoding": "uint",165                    "format": "hex",166                    "set": 0,167                    "gcc": 8,168                    "dwarf": 8,169                    "generic": "arg5",170                    "alt-name": "arg5",171                },172                {173                    "name": "r9",174                    "bitsize": 64,175                    "offset": 72,176                    "encoding": "uint",177                    "format": "hex",178                    "set": 0,179                    "gcc": 9,180                    "dwarf": 9,181                    "generic": "arg6",182                    "alt-name": "arg6",183                },184                {185                    "name": "r10",186                    "bitsize": 64,187                    "offset": 80,188                    "encoding": "uint",189                    "format": "hex",190                    "set": 0,191                    "gcc": 10,192                    "dwarf": 10,193                },194                {195                    "name": "r11",196                    "bitsize": 64,197                    "offset": 88,198                    "encoding": "uint",199                    "format": "hex",200                    "set": 0,201                    "gcc": 11,202                    "dwarf": 11,203                },204                {205                    "name": "r12",206                    "bitsize": 64,207                    "offset": 96,208                    "encoding": "uint",209                    "format": "hex",210                    "set": 0,211                    "gcc": 12,212                    "dwarf": 12,213                },214                {215                    "name": "r13",216                    "bitsize": 64,217                    "offset": 104,218                    "encoding": "uint",219                    "format": "hex",220                    "set": 0,221                    "gcc": 13,222                    "dwarf": 13,223                },224                {225                    "name": "r14",226                    "bitsize": 64,227                    "offset": 112,228                    "encoding": "uint",229                    "format": "hex",230                    "set": 0,231                    "gcc": 14,232                    "dwarf": 14,233                },234                {235                    "name": "r15",236                    "bitsize": 64,237                    "offset": 120,238                    "encoding": "uint",239                    "format": "hex",240                    "set": 0,241                    "gcc": 15,242                    "dwarf": 15,243                },244                {245                    "name": "rip",246                    "bitsize": 64,247                    "offset": 128,248                    "encoding": "uint",249                    "format": "hex",250                    "set": 0,251                    "gcc": 16,252                    "dwarf": 16,253                    "generic": "pc",254                    "alt-name": "pc",255                },256                {257                    "name": "rflags",258                    "bitsize": 64,259                    "offset": 136,260                    "encoding": "uint",261                    "format": "hex",262                    "set": 0,263                    "generic": "flags",264                    "alt-name": "flags",265                },266                {267                    "name": "cs",268                    "bitsize": 64,269                    "offset": 144,270                    "encoding": "uint",271                    "format": "hex",272                    "set": 0,273                },274                {275                    "name": "fs",276                    "bitsize": 64,277                    "offset": 152,278                    "encoding": "uint",279                    "format": "hex",280                    "set": 0,281                },282                {283                    "name": "gs",284                    "bitsize": 64,285                    "offset": 160,286                    "encoding": "uint",287                    "format": "hex",288                    "set": 0,289                },290            ]291        return self.registers292 293    def get_register_data(self, tid):294        return struct.pack(295            "21Q",296            tid + 1,297            tid + 2,298            tid + 3,299            tid + 4,300            tid + 5,301            tid + 6,302            tid + 7,303            tid + 8,304            tid + 9,305            tid + 10,306            tid + 11,307            tid + 12,308            tid + 13,309            tid + 14,310            tid + 15,311            tid + 16,312            tid + 17,313            tid + 18,314            tid + 19,315            tid + 20,316            tid + 21,317        )318