Home | History | Annotate | Download | only in POSIX
      1 //===-- RegisterContext_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_RegisterContext_i386_h_
     11 #define liblldb_RegisterContext_i386_h_
     12 
     13 // C Includes
     14 // C++ Includes
     15 // Other libraries and framework includes
     16 // Project includes
     17 #include "lldb/Core/Log.h"
     18 #include "RegisterContextPOSIX.h"
     19 
     20 class RegisterContext_i386 : public RegisterContextPOSIX
     21 {
     22 public:
     23     RegisterContext_i386(lldb_private::Thread &thread,
     24                               uint32_t concreate_frame_idx);
     25 
     26     ~RegisterContext_i386();
     27 
     28     void
     29     Invalidate();
     30 
     31     void
     32     InvalidateAllRegisters();
     33 
     34     size_t
     35     GetRegisterCount();
     36 
     37     const lldb_private::RegisterInfo *
     38     GetRegisterInfoAtIndex(size_t reg);
     39 
     40     size_t
     41     GetRegisterSetCount();
     42 
     43     const lldb_private::RegisterSet *
     44     GetRegisterSet(size_t set);
     45 
     46     unsigned
     47     GetRegisterIndexFromOffset(unsigned offset);
     48 
     49     const char *
     50     GetRegisterName(unsigned reg);
     51 
     52     bool
     53     ReadRegisterValue(uint32_t reg, lldb_private::Scalar &value);
     54 
     55     bool
     56     ReadRegisterBytes(uint32_t reg, lldb_private::DataExtractor &data);
     57 
     58     virtual bool
     59     ReadRegister(const lldb_private::RegisterInfo *reg_info,
     60                  lldb_private::RegisterValue &value);
     61 
     62     bool
     63     ReadAllRegisterValues(lldb::DataBufferSP &data_sp);
     64 
     65     bool
     66     WriteRegisterValue(uint32_t reg, const lldb_private::Scalar &value);
     67 
     68     bool
     69     WriteRegisterBytes(uint32_t reg, lldb_private::DataExtractor &data,
     70                        uint32_t data_offset = 0);
     71 
     72     virtual bool
     73     WriteRegister(const lldb_private::RegisterInfo *reg_info,
     74                   const lldb_private::RegisterValue &value);
     75 
     76     bool
     77     WriteAllRegisterValues(const lldb::DataBufferSP &data_sp);
     78 
     79     uint32_t
     80     ConvertRegisterKindToRegisterNumber(uint32_t kind, uint32_t num);
     81 
     82     bool
     83     HardwareSingleStep(bool enable);
     84 
     85     bool
     86     UpdateAfterBreakpoint();
     87 
     88     struct GPR
     89     {
     90         uint32_t ebx;
     91         uint32_t ecx;
     92         uint32_t edx;
     93         uint32_t esi;
     94         uint32_t edi;
     95         uint32_t ebp;
     96         uint32_t eax;
     97         uint32_t ds;
     98         uint32_t es;
     99         uint32_t fs;
    100         uint32_t gs;
    101         uint32_t orig_ax;
    102         uint32_t eip;
    103         uint32_t cs;
    104         uint32_t eflags;
    105         uint32_t esp;
    106         uint32_t ss;
    107     };
    108 
    109     struct MMSReg
    110     {
    111         uint8_t bytes[8];
    112     };
    113 
    114     struct XMMReg
    115     {
    116         uint8_t bytes[16];
    117     };
    118 
    119     struct FPU
    120     {
    121         uint16_t    fcw;
    122         uint16_t    fsw;
    123         uint16_t    ftw;
    124         uint16_t    fop;
    125         uint32_t    ip;
    126         uint32_t    cs;
    127         uint32_t    foo;
    128         uint32_t    fos;
    129         uint32_t    mxcsr;
    130         uint32_t    reserved;
    131         MMSReg      stmm[8];
    132         XMMReg      xmm[8];
    133         uint32_t    pad[56];
    134     };
    135 
    136     // A user area like this no longer exists on FreeBSD
    137     // making this a Linux artifact. Nonetheless, it is safe
    138     // leaving it here while the code is being cleaned up and generalized.
    139 
    140     struct UserArea
    141     {
    142         GPR      regs;          // General purpose registers.
    143         int32_t  fpvalid;       // True if FPU is being used.
    144         FPU      i387;          // FPU registers.
    145         uint32_t tsize;         // Text segment size.
    146         uint32_t dsize;         // Data segment size.
    147         uint32_t ssize;         // Stack segment size.
    148         uint32_t start_code;    // VM address of text.
    149         uint32_t start_stack;   // VM address of stack bottom (top in rsp).
    150         int32_t  signal;        // Signal causing core dump.
    151         int32_t  reserved;      // Unused.
    152         uint32_t ar0;           // Location of GPR's.
    153         FPU*     fpstate;       // Location of FPR's.
    154         uint32_t magic;         // Identifier for core dumps.
    155         char     u_comm[32];    // Command causing core dump.
    156         uint32_t u_debugreg[8]; // Debug registers (DR0 - DR7).
    157     };
    158 private:
    159     UserArea user;
    160 
    161     ProcessMonitor &GetMonitor();
    162 
    163     void LogGPR(const char *title);
    164 
    165     bool ReadGPR();
    166     bool ReadFPR();
    167 };
    168 
    169 #endif // #ifndef liblldb_RegisterContext_i386_h_
    170