• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
InvalidateAllRegisterStates()154     InvalidateAllRegisterStates()
155     {
156         SetError (GPRRegSet, Read, -1);
157         SetError (FPURegSet, Read, -1);
158         SetError (EXCRegSet, Read, -1);
159     }
160 
161     int
GetError(int flavor,uint32_t err_idx)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
SetError(int flavor,uint32_t err_idx,int err)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
RegisterSetIsCached(int set)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