]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/source/Plugins/Process/POSIX/RegisterContext_i386.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / source / Plugins / Process / POSIX / RegisterContext_i386.h
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_