1 //===-- RegisterContextDarwin_x86_64.h --------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTDARWIN_X86_64_H
10 #define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTDARWIN_X86_64_H
12 #include "lldb/Target/RegisterContext.h"
13 #include "lldb/lldb-private.h"
15 class RegisterContextDarwin_x86_64
: public lldb_private::RegisterContext
{
17 RegisterContextDarwin_x86_64(lldb_private::Thread
&thread
,
18 uint32_t concrete_frame_idx
);
20 ~RegisterContextDarwin_x86_64() override
;
22 void InvalidateAllRegisters() override
;
24 size_t GetRegisterCount() override
;
26 const lldb_private::RegisterInfo
*GetRegisterInfoAtIndex(size_t reg
) override
;
28 size_t GetRegisterSetCount() override
;
30 const lldb_private::RegisterSet
*GetRegisterSet(size_t set
) override
;
32 bool ReadRegister(const lldb_private::RegisterInfo
*reg_info
,
33 lldb_private::RegisterValue
&value
) override
;
35 bool WriteRegister(const lldb_private::RegisterInfo
*reg_info
,
36 const lldb_private::RegisterValue
&value
) override
;
38 bool ReadAllRegisterValues(lldb::WritableDataBufferSP
&data_sp
) override
;
40 bool WriteAllRegisterValues(const lldb::DataBufferSP
&data_sp
) override
;
42 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind
,
43 uint32_t num
) override
;
45 bool HardwareSingleStep(bool enable
) override
;
82 uint16_t fcw
; // "fctrl"
83 uint16_t fsw
; // "fstat"
84 uint8_t ftw
; // "ftag"
86 uint16_t fop
; // "fop"
87 uint32_t ip
; // "fioff"
88 uint16_t cs
; // "fiseg"
90 uint32_t dp
; // "fooff"
91 uint16_t ds
; // "foseg"
108 enum { GPRRegSet
= 4, FPURegSet
= 5, EXCRegSet
= 6 };
111 GPRWordCount
= sizeof(GPR
) / sizeof(uint32_t),
112 FPUWordCount
= sizeof(FPU
) / sizeof(uint32_t),
113 EXCWordCount
= sizeof(EXC
) / sizeof(uint32_t)
116 enum { Read
= 0, Write
= 1, kNumErrors
= 2 };
121 int gpr_errs
[2]; // Read/Write errors
122 int fpu_errs
[2]; // Read/Write errors
123 int exc_errs
[2]; // Read/Write errors
125 void InvalidateAllRegisterStates() {
126 SetError(GPRRegSet
, Read
, -1);
127 SetError(FPURegSet
, Read
, -1);
128 SetError(EXCRegSet
, Read
, -1);
131 int GetError(int flavor
, uint32_t err_idx
) const {
132 if (err_idx
< kNumErrors
) {
134 // When getting all errors, just OR all values together to see if
135 // we got any kind of error.
137 return gpr_errs
[err_idx
];
139 return fpu_errs
[err_idx
];
141 return exc_errs
[err_idx
];
149 bool SetError(int flavor
, uint32_t err_idx
, int err
) {
150 if (err_idx
< kNumErrors
) {
153 gpr_errs
[err_idx
] = err
;
157 fpu_errs
[err_idx
] = err
;
161 exc_errs
[err_idx
] = err
;
171 bool RegisterSetIsCached(int set
) const { return GetError(set
, Read
) == 0; }
173 void LogGPR(lldb_private::Log
*log
, const char *format
, ...);
175 int ReadGPR(bool force
);
177 int ReadFPU(bool force
);
179 int ReadEXC(bool force
);
187 // Subclasses override these to do the actual reading.
188 virtual int DoReadGPR(lldb::tid_t tid
, int flavor
, GPR
&gpr
) = 0;
190 virtual int DoReadFPU(lldb::tid_t tid
, int flavor
, FPU
&fpu
) = 0;
192 virtual int DoReadEXC(lldb::tid_t tid
, int flavor
, EXC
&exc
) = 0;
194 virtual int DoWriteGPR(lldb::tid_t tid
, int flavor
, const GPR
&gpr
) = 0;
196 virtual int DoWriteFPU(lldb::tid_t tid
, int flavor
, const FPU
&fpu
) = 0;
198 virtual int DoWriteEXC(lldb::tid_t tid
, int flavor
, const EXC
&exc
) = 0;
200 int ReadRegisterSet(uint32_t set
, bool force
);
202 int WriteRegisterSet(uint32_t set
);
204 static uint32_t GetRegisterNumber(uint32_t reg_kind
, uint32_t reg_num
);
206 static int GetSetForNativeRegNum(int reg_num
);
208 static size_t GetRegisterInfosCount();
210 static const lldb_private::RegisterInfo
*GetRegisterInfos();
213 #endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTDARWIN_X86_64_H