9#if defined(__x86_64__) || defined(_M_X64)
23#include "llvm/ADT/STLExtras.h"
28#define DEFINE_GPR(reg, alt, generic) \
30 #reg, alt, 8, 0, eEncodingUint, eFormatHexUppercase, \
31 {dwarf_##reg##_x86_64, dwarf_##reg##_x86_64, generic, \
32 LLDB_INVALID_REGNUM, lldb_##reg##_x86_64 }, \
33 nullptr, nullptr, nullptr, \
36#define DEFINE_GPR_BIN(reg, alt) #reg, alt, 8, 0, eEncodingUint, eFormatBinary
37#define DEFINE_FPU_XMM(reg) \
38 #reg, nullptr, 16, 0, eEncodingUint, eFormatVectorOfUInt64, \
39 {dwarf_##reg##_x86_64, dwarf_##reg##_x86_64, LLDB_INVALID_REGNUM, \
40 LLDB_INVALID_REGNUM, lldb_##reg##_x86_64}, \
41 nullptr, nullptr, nullptr,
43#define DEFINE_GPR_PSEUDO_32(reg) \
45 #reg, nullptr, 4, 0, eEncodingUint, eFormatHexUppercase, \
46 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \
47 LLDB_INVALID_REGNUM, lldb_##reg##_x86_64 }, \
48 nullptr, nullptr, nullptr, \
51#define DEFINE_GPR_PSEUDO_16(reg) \
53 #reg, nullptr, 2, 0, eEncodingUint, eFormatHexUppercase, \
54 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \
55 LLDB_INVALID_REGNUM, lldb_##reg##_x86_64 }, \
56 nullptr, nullptr, nullptr, \
59#define DEFINE_GPR_PSEUDO_8(reg) \
61 #reg, nullptr, 1, 0, eEncodingUint, eFormatHexUppercase, \
62 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \
63 LLDB_INVALID_REGNUM, lldb_##reg##_x86_64 }, \
64 nullptr, nullptr, nullptr, \
185 DEFINE_GPR_BIN(eflags,
"flags"),
192 DEFINE_GPR_PSEUDO_32(
eax),
193 DEFINE_GPR_PSEUDO_32(
ebx),
194 DEFINE_GPR_PSEUDO_32(
ecx),
195 DEFINE_GPR_PSEUDO_32(
edx),
196 DEFINE_GPR_PSEUDO_32(
edi),
197 DEFINE_GPR_PSEUDO_32(
esi),
198 DEFINE_GPR_PSEUDO_32(
ebp),
199 DEFINE_GPR_PSEUDO_32(
esp),
200 DEFINE_GPR_PSEUDO_32(r8d),
201 DEFINE_GPR_PSEUDO_32(r9d),
202 DEFINE_GPR_PSEUDO_32(r10d),
203 DEFINE_GPR_PSEUDO_32(r11d),
204 DEFINE_GPR_PSEUDO_32(r12d),
205 DEFINE_GPR_PSEUDO_32(r13d),
206 DEFINE_GPR_PSEUDO_32(r14d),
207 DEFINE_GPR_PSEUDO_32(r15d),
208 DEFINE_GPR_PSEUDO_16(ax),
209 DEFINE_GPR_PSEUDO_16(bx),
210 DEFINE_GPR_PSEUDO_16(cx),
211 DEFINE_GPR_PSEUDO_16(dx),
212 DEFINE_GPR_PSEUDO_16(di),
213 DEFINE_GPR_PSEUDO_16(si),
214 DEFINE_GPR_PSEUDO_16(bp),
215 DEFINE_GPR_PSEUDO_16(
sp),
216 DEFINE_GPR_PSEUDO_16(r8w),
217 DEFINE_GPR_PSEUDO_16(r9w),
218 DEFINE_GPR_PSEUDO_16(r10w),
219 DEFINE_GPR_PSEUDO_16(r11w),
220 DEFINE_GPR_PSEUDO_16(r12w),
221 DEFINE_GPR_PSEUDO_16(r13w),
222 DEFINE_GPR_PSEUDO_16(r14w),
223 DEFINE_GPR_PSEUDO_16(r15w),
224 DEFINE_GPR_PSEUDO_8(ah),
225 DEFINE_GPR_PSEUDO_8(bh),
226 DEFINE_GPR_PSEUDO_8(ch),
227 DEFINE_GPR_PSEUDO_8(dh),
228 DEFINE_GPR_PSEUDO_8(al),
229 DEFINE_GPR_PSEUDO_8(bl),
230 DEFINE_GPR_PSEUDO_8(cl),
231 DEFINE_GPR_PSEUDO_8(dl),
232 DEFINE_GPR_PSEUDO_8(
dil),
233 DEFINE_GPR_PSEUDO_8(sil),
234 DEFINE_GPR_PSEUDO_8(bpl),
235 DEFINE_GPR_PSEUDO_8(spl),
236 DEFINE_GPR_PSEUDO_8(r8l),
237 DEFINE_GPR_PSEUDO_8(r9l),
238 DEFINE_GPR_PSEUDO_8(r10l),
239 DEFINE_GPR_PSEUDO_8(r11l),
240 DEFINE_GPR_PSEUDO_8(r12l),
241 DEFINE_GPR_PSEUDO_8(r13l),
242 DEFINE_GPR_PSEUDO_8(r14l),
243 DEFINE_GPR_PSEUDO_8(r15l),
244 {DEFINE_FPU_XMM(xmm0)},
245 {DEFINE_FPU_XMM(xmm1)},
246 {DEFINE_FPU_XMM(xmm2)},
247 {DEFINE_FPU_XMM(xmm3)},
248 {DEFINE_FPU_XMM(xmm4)},
249 {DEFINE_FPU_XMM(xmm5)},
250 {DEFINE_FPU_XMM(xmm6)},
251 {DEFINE_FPU_XMM(xmm7)},
252 {DEFINE_FPU_XMM(xmm8)},
253 {DEFINE_FPU_XMM(xmm9)},
254 {DEFINE_FPU_XMM(xmm10)},
255 {DEFINE_FPU_XMM(xmm11)},
256 {DEFINE_FPU_XMM(xmm12)},
257 {DEFINE_FPU_XMM(xmm13)},
258 {DEFINE_FPU_XMM(xmm14)},
259 {DEFINE_FPU_XMM(xmm15)}};
265uint32_t g_gpr_reg_indices[] = {
266 eRegisterIndexRax, eRegisterIndexRbx, eRegisterIndexRcx,
267 eRegisterIndexRdx, eRegisterIndexRdi, eRegisterIndexRsi,
268 eRegisterIndexRbp, eRegisterIndexRsp, eRegisterIndexR8,
269 eRegisterIndexR9, eRegisterIndexR10, eRegisterIndexR11,
270 eRegisterIndexR12, eRegisterIndexR13, eRegisterIndexR14,
271 eRegisterIndexR15, eRegisterIndexRip, eRegisterIndexRflags,
272 eRegisterIndexEax, eRegisterIndexEbx, eRegisterIndexEcx,
273 eRegisterIndexEdx, eRegisterIndexEdi, eRegisterIndexEsi,
274 eRegisterIndexEbp, eRegisterIndexEsp, eRegisterIndexR8d,
275 eRegisterIndexR9d, eRegisterIndexR10d, eRegisterIndexR11d,
276 eRegisterIndexR12d, eRegisterIndexR13d, eRegisterIndexR14d,
277 eRegisterIndexR15d, eRegisterIndexAx, eRegisterIndexBx,
278 eRegisterIndexCx, eRegisterIndexDx, eRegisterIndexDi,
279 eRegisterIndexSi, eRegisterIndexBp, eRegisterIndexSp,
280 eRegisterIndexR8w, eRegisterIndexR9w, eRegisterIndexR10w,
281 eRegisterIndexR11w, eRegisterIndexR12w, eRegisterIndexR13w,
282 eRegisterIndexR14w, eRegisterIndexR15w, eRegisterIndexAh,
283 eRegisterIndexBh, eRegisterIndexCh, eRegisterIndexDh,
284 eRegisterIndexAl, eRegisterIndexBl, eRegisterIndexCl,
285 eRegisterIndexDl, eRegisterIndexDil, eRegisterIndexSil,
286 eRegisterIndexBpl, eRegisterIndexSpl, eRegisterIndexR8l,
287 eRegisterIndexR9l, eRegisterIndexR10l, eRegisterIndexR11l,
288 eRegisterIndexR12l, eRegisterIndexR13l, eRegisterIndexR14l,
292uint32_t g_fpu_reg_indices[] = {
293 eRegisterIndexXmm0, eRegisterIndexXmm1, eRegisterIndexXmm2,
294 eRegisterIndexXmm3, eRegisterIndexXmm4, eRegisterIndexXmm5,
295 eRegisterIndexXmm6, eRegisterIndexXmm7, eRegisterIndexXmm8,
296 eRegisterIndexXmm9, eRegisterIndexXmm10, eRegisterIndexXmm11,
297 eRegisterIndexXmm12, eRegisterIndexXmm13, eRegisterIndexXmm14,
302 {
"General Purpose Registers",
"gpr", std::size(g_gpr_reg_indices),
304 {
"Floating Point Registers",
"fpu", std::size(g_fpu_reg_indices),
309RegisterContextWindows_x64::RegisterContextWindows_x64(
310 Thread &thread, uint32_t concrete_frame_idx)
313RegisterContextWindows_x64::~RegisterContextWindows_x64() {}
315size_t RegisterContextWindows_x64::GetRegisterCount() {
320RegisterContextWindows_x64::GetRegisterInfoAtIndex(
size_t reg) {
326size_t RegisterContextWindows_x64::GetRegisterSetCount() {
327 return std::size(g_register_sets);
330const RegisterSet *RegisterContextWindows_x64::GetRegisterSet(
size_t reg_set) {
331 return &g_register_sets[reg_set];
334bool RegisterContextWindows_x64::ReadRegister(
const RegisterInfo *reg_info,
336 if (!CacheAllRegisterValues())
339 if (reg_info ==
nullptr)
345#define GPR_CASE(size, reg_case, reg_val) \
347 reg_value.SetUInt##size(reg_val); \
384 GPR_CASE(16,
lldb_ax_x86_64,
static_cast<uint16_t
>(m_context.Rax));
385 GPR_CASE(16,
lldb_bx_x86_64,
static_cast<uint16_t
>(m_context.Rbx));
386 GPR_CASE(16,
lldb_cx_x86_64,
static_cast<uint16_t
>(m_context.Rcx));
387 GPR_CASE(16,
lldb_dx_x86_64,
static_cast<uint16_t
>(m_context.Rdx));
388 GPR_CASE(16,
lldb_di_x86_64,
static_cast<uint16_t
>(m_context.Rdi));
389 GPR_CASE(16,
lldb_si_x86_64,
static_cast<uint16_t
>(m_context.Rsi));
390 GPR_CASE(16,
lldb_bp_x86_64,
static_cast<uint16_t
>(m_context.Rbp));
391 GPR_CASE(16,
lldb_sp_x86_64,
static_cast<uint16_t
>(m_context.Rsp));
400 GPR_CASE(8,
lldb_ah_x86_64,
static_cast<uint16_t
>(m_context.Rax) >> 8);
401 GPR_CASE(8,
lldb_bh_x86_64,
static_cast<uint16_t
>(m_context.Rbx) >> 8);
402 GPR_CASE(8,
lldb_ch_x86_64,
static_cast<uint16_t
>(m_context.Rcx) >> 8);
403 GPR_CASE(8,
lldb_dh_x86_64,
static_cast<uint16_t
>(m_context.Rdx) >> 8);
462 reg_value.
SetBytes(&m_context.Xmm10,
466 reg_value.
SetBytes(&m_context.Xmm11,
470 reg_value.
SetBytes(&m_context.Xmm12,
474 reg_value.
SetBytes(&m_context.Xmm13,
478 reg_value.
SetBytes(&m_context.Xmm14,
482 reg_value.
SetBytes(&m_context.Xmm15,
489bool RegisterContextWindows_x64::WriteRegister(
const RegisterInfo *reg_info,
495 if (!CacheAllRegisterValues())
557 memcpy(&m_context.Xmm0, reg_value.
GetBytes(), 16);
560 memcpy(&m_context.Xmm1, reg_value.
GetBytes(), 16);
563 memcpy(&m_context.Xmm2, reg_value.
GetBytes(), 16);
566 memcpy(&m_context.Xmm3, reg_value.
GetBytes(), 16);
569 memcpy(&m_context.Xmm4, reg_value.
GetBytes(), 16);
572 memcpy(&m_context.Xmm5, reg_value.
GetBytes(), 16);
575 memcpy(&m_context.Xmm6, reg_value.
GetBytes(), 16);
578 memcpy(&m_context.Xmm7, reg_value.
GetBytes(), 16);
581 memcpy(&m_context.Xmm8, reg_value.
GetBytes(), 16);
584 memcpy(&m_context.Xmm9, reg_value.
GetBytes(), 16);
587 memcpy(&m_context.Xmm10, reg_value.
GetBytes(), 16);
590 memcpy(&m_context.Xmm11, reg_value.
GetBytes(), 16);
593 memcpy(&m_context.Xmm12, reg_value.
GetBytes(), 16);
596 memcpy(&m_context.Xmm13, reg_value.
GetBytes(), 16);
599 memcpy(&m_context.Xmm14, reg_value.
GetBytes(), 16);
602 memcpy(&m_context.Xmm15, reg_value.
GetBytes(), 16);
605 LLDB_LOG(log,
"Write value {0:x} to unknown register {1}",
611 return ApplyAllRegisterValues();
static const uint32_t k_num_register_infos
static const RegisterInfo g_register_infos[]
#define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
uint64_t GetAsUInt64(uint64_t fail_value=UINT64_MAX, bool *success_ptr=nullptr) const
void SetBytes(const void *bytes, size_t length, lldb::ByteOrder byte_order)
const void * GetBytes() const
uint32_t GetAsUInt32(uint32_t fail_value=UINT32_MAX, bool *success_ptr=nullptr) const
#define LLDB_REGNUM_GENERIC_SP
#define LLDB_REGNUM_GENERIC_ARG4
#define LLDB_REGNUM_GENERIC_ARG3
#define LLDB_REGNUM_GENERIC_ARG1
#define LLDB_REGNUM_GENERIC_FLAGS
#define LLDB_INVALID_REGNUM
#define LLDB_REGNUM_GENERIC_ARG2
#define LLDB_REGNUM_GENERIC_PC
#define LLDB_REGNUM_GENERIC_FP
lldb::ByteOrder InlHostByteOrder()
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
@ eRegisterKindLLDB
lldb's internal register numbers
Every register is described in detail including its name, alternate name (optional),...
uint32_t byte_size
Size in bytes of the register.
uint32_t kinds[lldb::kNumRegisterKinds]
Holds all of the various register numbers for all register kinds.
Registers are grouped into register sets.