1 //===-- RegisterContextDarwin_i386.h ----------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_RegisterContextDarwin_i386_h_
11 #define liblldb_RegisterContextDarwin_i386_h_
13 #include "lldb/Target/RegisterContext.h"
14 #include "lldb/lldb-private.h"
16 class RegisterContextDarwin_i386 : public lldb_private::RegisterContext {
18 RegisterContextDarwin_i386(lldb_private::Thread &thread,
19 uint32_t concrete_frame_idx);
21 ~RegisterContextDarwin_i386() override;
23 void InvalidateAllRegisters() override;
25 size_t GetRegisterCount() override;
27 const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
29 size_t GetRegisterSetCount() override;
31 const lldb_private::RegisterSet *GetRegisterSet(size_t set) override;
33 bool ReadRegister(const lldb_private::RegisterInfo *reg_info,
34 lldb_private::RegisterValue &value) override;
36 bool WriteRegister(const lldb_private::RegisterInfo *reg_info,
37 const lldb_private::RegisterValue &value) override;
39 bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
41 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
43 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
44 uint32_t num) override;
46 bool HardwareSingleStep(bool enable) override;
93 uint8_t pad4[14 * 16];
104 enum { GPRRegSet = 1, FPURegSet = 2, EXCRegSet = 3 };
107 GPRWordCount = sizeof(GPR) / sizeof(uint32_t),
108 FPUWordCount = sizeof(FPU) / sizeof(uint32_t),
109 EXCWordCount = sizeof(EXC) / sizeof(uint32_t)
112 enum { Read = 0, Write = 1, kNumErrors = 2 };
117 int gpr_errs[2]; // Read/Write errors
118 int fpu_errs[2]; // Read/Write errors
119 int exc_errs[2]; // Read/Write errors
121 void InvalidateAllRegisterStates() {
122 SetError(GPRRegSet, Read, -1);
123 SetError(FPURegSet, Read, -1);
124 SetError(EXCRegSet, Read, -1);
127 int GetError(int flavor, uint32_t err_idx) const {
128 if (err_idx < kNumErrors) {
130 // When getting all errors, just OR all values together to see if
131 // we got any kind of error.
133 return gpr_errs[err_idx];
135 return fpu_errs[err_idx];
137 return exc_errs[err_idx];
145 bool SetError(int flavor, uint32_t err_idx, int err) {
146 if (err_idx < kNumErrors) {
149 gpr_errs[err_idx] = err;
153 fpu_errs[err_idx] = err;
157 exc_errs[err_idx] = err;
167 bool RegisterSetIsCached(int set) const { return GetError(set, Read) == 0; }
169 void LogGPR(lldb_private::Log *log, const char *title);
171 int ReadGPR(bool force);
173 int ReadFPU(bool force);
175 int ReadEXC(bool force);
183 // Subclasses override these to do the actual reading.
184 virtual int DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr) = 0;
186 virtual int DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu) = 0;
188 virtual int DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc) = 0;
190 virtual int DoWriteGPR(lldb::tid_t tid, int flavor, const GPR &gpr) = 0;
192 virtual int DoWriteFPU(lldb::tid_t tid, int flavor, const FPU &fpu) = 0;
194 virtual int DoWriteEXC(lldb::tid_t tid, int flavor, const EXC &exc) = 0;
196 int ReadRegisterSet(uint32_t set, bool force);
198 int WriteRegisterSet(uint32_t set);
200 static uint32_t GetRegisterNumber(uint32_t reg_kind, uint32_t reg_num);
202 static int GetSetForNativeRegNum(int reg_num);
204 static size_t GetRegisterInfosCount();
206 static const lldb_private::RegisterInfo *GetRegisterInfos();
209 #endif // liblldb_RegisterContextDarwin_i386_h_