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_
13 #include "lldb/Target/RegisterContext.h"
14 #include "lldb/lldb-private.h"
16 class RegisterContextDarwin_x86_64 : public lldb_private::RegisterContext {
18 RegisterContextDarwin_x86_64(lldb_private::Thread &thread,
19 uint32_t concrete_frame_idx);
21 ~RegisterContextDarwin_x86_64() 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;
83 uint16_t fcw; // "fctrl"
84 uint16_t fsw; // "fstat"
85 uint8_t ftw; // "ftag"
87 uint16_t fop; // "fop"
88 uint32_t ip; // "fioff"
89 uint16_t cs; // "fiseg"
91 uint32_t dp; // "fooff"
92 uint16_t ds; // "foseg"
109 enum { GPRRegSet = 4, FPURegSet = 5, EXCRegSet = 6 };
112 GPRWordCount = sizeof(GPR) / sizeof(uint32_t),
113 FPUWordCount = sizeof(FPU) / sizeof(uint32_t),
114 EXCWordCount = sizeof(EXC) / sizeof(uint32_t)
117 enum { Read = 0, Write = 1, kNumErrors = 2 };
122 int gpr_errs[2]; // Read/Write errors
123 int fpu_errs[2]; // Read/Write errors
124 int exc_errs[2]; // Read/Write errors
126 void InvalidateAllRegisterStates() {
127 SetError(GPRRegSet, Read, -1);
128 SetError(FPURegSet, Read, -1);
129 SetError(EXCRegSet, Read, -1);
132 int GetError(int flavor, uint32_t err_idx) const {
133 if (err_idx < kNumErrors) {
135 // When getting all errors, just OR all values together to see if
136 // we got any kind of error.
138 return gpr_errs[err_idx];
140 return fpu_errs[err_idx];
142 return exc_errs[err_idx];
150 bool SetError(int flavor, uint32_t err_idx, int err) {
151 if (err_idx < kNumErrors) {
154 gpr_errs[err_idx] = err;
158 fpu_errs[err_idx] = err;
162 exc_errs[err_idx] = err;
172 bool RegisterSetIsCached(int set) const { return GetError(set, Read) == 0; }
174 void LogGPR(lldb_private::Log *log, const char *format, ...);
176 int ReadGPR(bool force);
178 int ReadFPU(bool force);
180 int ReadEXC(bool force);
188 // Subclasses override these to do the actual reading.
189 virtual int DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr) = 0;
191 virtual int DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu) = 0;
193 virtual int DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc) = 0;
195 virtual int DoWriteGPR(lldb::tid_t tid, int flavor, const GPR &gpr) = 0;
197 virtual int DoWriteFPU(lldb::tid_t tid, int flavor, const FPU &fpu) = 0;
199 virtual int DoWriteEXC(lldb::tid_t tid, int flavor, const EXC &exc) = 0;
201 int ReadRegisterSet(uint32_t set, bool force);
203 int WriteRegisterSet(uint32_t set);
205 static uint32_t GetRegisterNumber(uint32_t reg_kind, uint32_t reg_num);
207 static int GetSetForNativeRegNum(int reg_num);
209 static size_t GetRegisterInfosCount();
211 static const lldb_private::RegisterInfo *GetRegisterInfos();
214 #endif // liblldb_RegisterContextDarwin_x86_64_h_