1 //===-- RegisterContextDarwin_x86_64.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_x86_64_h_
11 #define liblldb_RegisterContextDarwin_x86_64_h_
15 // Other libraries and framework includes
17 #include "lldb/Target/RegisterContext.h"
18 #include "lldb/lldb-private.h"
20 class RegisterContextDarwin_x86_64 : public lldb_private::RegisterContext {
22 RegisterContextDarwin_x86_64(lldb_private::Thread &thread,
23 uint32_t concrete_frame_idx);
25 ~RegisterContextDarwin_x86_64() override;
27 void InvalidateAllRegisters() override;
29 size_t GetRegisterCount() override;
31 const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
33 size_t GetRegisterSetCount() override;
35 const lldb_private::RegisterSet *GetRegisterSet(size_t set) override;
37 bool ReadRegister(const lldb_private::RegisterInfo *reg_info,
38 lldb_private::RegisterValue &value) override;
40 bool WriteRegister(const lldb_private::RegisterInfo *reg_info,
41 const lldb_private::RegisterValue &value) override;
43 bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
45 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
47 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
48 uint32_t num) override;
50 bool HardwareSingleStep(bool enable) override;
87 uint16_t fcw; // "fctrl"
88 uint16_t fsw; // "fstat"
89 uint8_t ftw; // "ftag"
91 uint16_t fop; // "fop"
92 uint32_t ip; // "fioff"
93 uint16_t cs; // "fiseg"
95 uint32_t dp; // "fooff"
96 uint16_t ds; // "foseg"
102 uint8_t pad4[6 * 16];
113 enum { GPRRegSet = 4, FPURegSet = 5, EXCRegSet = 6 };
116 GPRWordCount = sizeof(GPR) / sizeof(uint32_t),
117 FPUWordCount = sizeof(FPU) / sizeof(uint32_t),
118 EXCWordCount = sizeof(EXC) / sizeof(uint32_t)
121 enum { Read = 0, Write = 1, kNumErrors = 2 };
126 int gpr_errs[2]; // Read/Write errors
127 int fpu_errs[2]; // Read/Write errors
128 int exc_errs[2]; // Read/Write errors
130 void InvalidateAllRegisterStates() {
131 SetError(GPRRegSet, Read, -1);
132 SetError(FPURegSet, Read, -1);
133 SetError(EXCRegSet, Read, -1);
136 int GetError(int flavor, uint32_t err_idx) const {
137 if (err_idx < kNumErrors) {
139 // When getting all errors, just OR all values together to see if
140 // we got any kind of error.
142 return gpr_errs[err_idx];
144 return fpu_errs[err_idx];
146 return exc_errs[err_idx];
154 bool SetError(int flavor, uint32_t err_idx, int err) {
155 if (err_idx < kNumErrors) {
158 gpr_errs[err_idx] = err;
162 fpu_errs[err_idx] = err;
166 exc_errs[err_idx] = err;
176 bool RegisterSetIsCached(int set) const { return GetError(set, Read) == 0; }
178 void LogGPR(lldb_private::Log *log, const char *format, ...);
180 int ReadGPR(bool force);
182 int ReadFPU(bool force);
184 int ReadEXC(bool force);
192 // Subclasses override these to do the actual reading.
193 virtual int DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr) = 0;
195 virtual int DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu) = 0;
197 virtual int DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc) = 0;
199 virtual int DoWriteGPR(lldb::tid_t tid, int flavor, const GPR &gpr) = 0;
201 virtual int DoWriteFPU(lldb::tid_t tid, int flavor, const FPU &fpu) = 0;
203 virtual int DoWriteEXC(lldb::tid_t tid, int flavor, const EXC &exc) = 0;
205 int ReadRegisterSet(uint32_t set, bool force);
207 int WriteRegisterSet(uint32_t set);
209 static uint32_t GetRegisterNumber(uint32_t reg_kind, uint32_t reg_num);
211 static int GetSetForNativeRegNum(int reg_num);
213 static size_t GetRegisterInfosCount();
215 static const lldb_private::RegisterInfo *GetRegisterInfos();
218 #endif // liblldb_RegisterContextDarwin_x86_64_h_