Home | History | Annotate | Download | only in Utility
      1 //===-- RegisterContextDarwin_i386.h ----------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef liblldb_RegisterContextDarwin_i386_h_
     11 #define liblldb_RegisterContextDarwin_i386_h_
     12 
     13 // C Includes
     14 // C++ Includes
     15 // Other libraries and framework includes
     16 // Project includes
     17 #include "lldb/lldb-private.h"
     18 #include "lldb/Target/RegisterContext.h"
     19 
     20 class RegisterContextDarwin_i386 : public lldb_private::RegisterContext
     21 {
     22 public:
     23 
     24     RegisterContextDarwin_i386(lldb_private::Thread &thread,
     25                              uint32_t concrete_frame_idx);
     26 
     27     virtual
     28     ~RegisterContextDarwin_i386();
     29 
     30     virtual void
     31     InvalidateAllRegisters ();
     32 
     33     virtual size_t
     34     GetRegisterCount ();
     35 
     36     virtual const lldb_private::RegisterInfo *
     37     GetRegisterInfoAtIndex (size_t reg);
     38 
     39     virtual size_t
     40     GetRegisterSetCount ();
     41 
     42     virtual const lldb_private::RegisterSet *
     43     GetRegisterSet (size_t set);
     44 
     45     virtual bool
     46     ReadRegister (const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value);
     47 
     48     virtual bool
     49     WriteRegister (const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value);
     50 
     51     virtual bool
     52     ReadAllRegisterValues (lldb::DataBufferSP &data_sp);
     53 
     54     virtual bool
     55     WriteAllRegisterValues (const lldb::DataBufferSP &data_sp);
     56 
     57     virtual uint32_t
     58     ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num);
     59 
     60     virtual bool
     61     HardwareSingleStep (bool enable);
     62 
     63     struct GPR
     64     {
     65         uint32_t eax;
     66         uint32_t ebx;
     67         uint32_t ecx;
     68         uint32_t edx;
     69         uint32_t edi;
     70         uint32_t esi;
     71         uint32_t ebp;
     72         uint32_t esp;
     73         uint32_t ss;
     74         uint32_t eflags;
     75         uint32_t eip;
     76         uint32_t cs;
     77         uint32_t ds;
     78         uint32_t es;
     79         uint32_t fs;
     80         uint32_t gs;
     81     };
     82 
     83     struct MMSReg
     84     {
     85         uint8_t bytes[10];
     86         uint8_t pad[6];
     87     };
     88 
     89     struct XMMReg
     90     {
     91         uint8_t bytes[16];
     92     };
     93 
     94     struct FPU
     95     {
     96         uint32_t    pad[2];
     97         uint16_t    fcw;
     98         uint16_t    fsw;
     99         uint8_t     ftw;
    100         uint8_t     pad1;
    101         uint16_t    fop;
    102         uint32_t    ip;
    103         uint16_t    cs;
    104         uint16_t    pad2;
    105         uint32_t    dp;
    106         uint16_t    ds;
    107         uint16_t    pad3;
    108         uint32_t    mxcsr;
    109         uint32_t    mxcsrmask;
    110         MMSReg      stmm[8];
    111         XMMReg      xmm[8];
    112         uint8_t     pad4[14*16];
    113         int         pad5;
    114     };
    115 
    116     struct EXC
    117     {
    118         uint32_t trapno;
    119         uint32_t err;
    120         uint32_t faultvaddr;
    121     };
    122 
    123 protected:
    124 
    125     enum
    126     {
    127         GPRRegSet = 1,
    128         FPURegSet = 2,
    129         EXCRegSet = 3
    130     };
    131 
    132     enum
    133     {
    134         GPRWordCount = sizeof(GPR)/sizeof(uint32_t),
    135         FPUWordCount = sizeof(FPU)/sizeof(uint32_t),
    136         EXCWordCount = sizeof(EXC)/sizeof(uint32_t)
    137     };
    138 
    139     enum
    140     {
    141         Read = 0,
    142         Write = 1,
    143         kNumErrors = 2
    144     };
    145 
    146     GPR gpr;
    147     FPU fpu;
    148     EXC exc;
    149     int gpr_errs[2]; // Read/Write errors
    150     int fpu_errs[2]; // Read/Write errors
    151     int exc_errs[2]; // Read/Write errors
    152 
    153     void
    154     InvalidateAllRegisterStates()
    155     {
    156         SetError (GPRRegSet, Read, -1);
    157         SetError (FPURegSet, Read, -1);
    158         SetError (EXCRegSet, Read, -1);
    159     }
    160 
    161     int
    162     GetError (int flavor, uint32_t err_idx) const
    163     {
    164         if (err_idx < kNumErrors)
    165         {
    166             switch (flavor)
    167             {
    168             // When getting all errors, just OR all values together to see if
    169             // we got any kind of error.
    170             case GPRRegSet:    return gpr_errs[err_idx];
    171             case FPURegSet:    return fpu_errs[err_idx];
    172             case EXCRegSet:    return exc_errs[err_idx];
    173             default: break;
    174             }
    175         }
    176         return -1;
    177     }
    178 
    179     bool
    180     SetError (int flavor, uint32_t err_idx, int err)
    181     {
    182         if (err_idx < kNumErrors)
    183         {
    184             switch (flavor)
    185             {
    186             case GPRRegSet:
    187                 gpr_errs[err_idx] = err;
    188                 return true;
    189 
    190             case FPURegSet:
    191                 fpu_errs[err_idx] = err;
    192                 return true;
    193 
    194             case EXCRegSet:
    195                 exc_errs[err_idx] = err;
    196                 return true;
    197 
    198             default: break;
    199             }
    200         }
    201         return false;
    202     }
    203 
    204     bool
    205     RegisterSetIsCached (int set) const
    206     {
    207         return GetError(set, Read) == 0;
    208     }
    209 
    210     void
    211     LogGPR (lldb_private::Log *log, const char *title);
    212 
    213     int
    214     ReadGPR (bool force);
    215 
    216     int
    217     ReadFPU (bool force);
    218 
    219     int
    220     ReadEXC (bool force);
    221 
    222     int
    223     WriteGPR ();
    224 
    225     int
    226     WriteFPU ();
    227 
    228     int
    229     WriteEXC ();
    230 
    231     // Subclasses override these to do the actual reading.
    232     virtual int
    233     DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr) = 0;
    234 
    235     virtual int
    236     DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu) = 0;
    237 
    238     virtual int
    239     DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc) = 0;
    240 
    241     virtual int
    242     DoWriteGPR (lldb::tid_t tid, int flavor, const GPR &gpr) = 0;
    243 
    244     virtual int
    245     DoWriteFPU (lldb::tid_t tid, int flavor, const FPU &fpu) = 0;
    246 
    247     virtual int
    248     DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc) = 0;
    249 
    250     int
    251     ReadRegisterSet (uint32_t set, bool force);
    252 
    253     int
    254     WriteRegisterSet (uint32_t set);
    255 
    256     static uint32_t
    257     GetRegisterNumber (uint32_t reg_kind, uint32_t reg_num);
    258 
    259     static int
    260     GetSetForNativeRegNum (int reg_num);
    261 
    262     static size_t
    263     GetRegisterInfosCount ();
    264 
    265     static const lldb_private::RegisterInfo *
    266     GetRegisterInfos ();
    267 };
    268 
    269 #endif  // liblldb_RegisterContextDarwin_i386_h_
    270