1 //===-- RegisterContextDarwin_x86_64.cpp ------------------------*- 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 //===----------------------------------------------------------------------===//
14 #include "lldb/Utility/DataBufferHeap.h"
15 #include "lldb/Utility/DataExtractor.h"
16 #include "lldb/Utility/Endian.h"
17 #include "lldb/Utility/Log.h"
18 #include "lldb/Utility/RegisterValue.h"
19 #include "lldb/Utility/Scalar.h"
20 #include "llvm/ADT/STLExtras.h"
21 #include "llvm/Support/Compiler.h"
23 // Support building against older versions of LLVM, this macro was added
25 #ifndef LLVM_EXTENSION
26 #define LLVM_EXTENSION
29 #include "RegisterContextDarwin_x86_64.h"
32 using namespace lldb_private;
108 enum ehframe_dwarf_regnums {
109 ehframe_dwarf_gpr_rax = 0,
110 ehframe_dwarf_gpr_rdx,
111 ehframe_dwarf_gpr_rcx,
112 ehframe_dwarf_gpr_rbx,
113 ehframe_dwarf_gpr_rsi,
114 ehframe_dwarf_gpr_rdi,
115 ehframe_dwarf_gpr_rbp,
116 ehframe_dwarf_gpr_rsp,
117 ehframe_dwarf_gpr_r8,
118 ehframe_dwarf_gpr_r9,
119 ehframe_dwarf_gpr_r10,
120 ehframe_dwarf_gpr_r11,
121 ehframe_dwarf_gpr_r12,
122 ehframe_dwarf_gpr_r13,
123 ehframe_dwarf_gpr_r14,
124 ehframe_dwarf_gpr_r15,
125 ehframe_dwarf_gpr_rip,
126 ehframe_dwarf_fpu_xmm0,
127 ehframe_dwarf_fpu_xmm1,
128 ehframe_dwarf_fpu_xmm2,
129 ehframe_dwarf_fpu_xmm3,
130 ehframe_dwarf_fpu_xmm4,
131 ehframe_dwarf_fpu_xmm5,
132 ehframe_dwarf_fpu_xmm6,
133 ehframe_dwarf_fpu_xmm7,
134 ehframe_dwarf_fpu_xmm8,
135 ehframe_dwarf_fpu_xmm9,
136 ehframe_dwarf_fpu_xmm10,
137 ehframe_dwarf_fpu_xmm11,
138 ehframe_dwarf_fpu_xmm12,
139 ehframe_dwarf_fpu_xmm13,
140 ehframe_dwarf_fpu_xmm14,
141 ehframe_dwarf_fpu_xmm15,
142 ehframe_dwarf_fpu_stmm0,
143 ehframe_dwarf_fpu_stmm1,
144 ehframe_dwarf_fpu_stmm2,
145 ehframe_dwarf_fpu_stmm3,
146 ehframe_dwarf_fpu_stmm4,
147 ehframe_dwarf_fpu_stmm5,
148 ehframe_dwarf_fpu_stmm6,
149 ehframe_dwarf_fpu_stmm7
153 #define GPR_OFFSET(reg) \
154 (LLVM_EXTENSION offsetof(RegisterContextDarwin_x86_64::GPR, reg))
155 #define FPU_OFFSET(reg) \
156 (LLVM_EXTENSION offsetof(RegisterContextDarwin_x86_64::FPU, reg) + \
157 sizeof(RegisterContextDarwin_x86_64::GPR))
158 #define EXC_OFFSET(reg) \
159 (LLVM_EXTENSION offsetof(RegisterContextDarwin_x86_64::EXC, reg) + \
160 sizeof(RegisterContextDarwin_x86_64::GPR) + \
161 sizeof(RegisterContextDarwin_x86_64::FPU))
163 // These macros will auto define the register name, alt name, register size,
164 // register offset, encoding, format and native register. This ensures that the
165 // register state structures are defined correctly and have the correct sizes
167 #define DEFINE_GPR(reg, alt) \
168 #reg, alt, sizeof(((RegisterContextDarwin_x86_64::GPR *) NULL)->reg), \
169 GPR_OFFSET(reg), eEncodingUint, eFormatHex
170 #define DEFINE_FPU_UINT(reg) \
171 #reg, NULL, sizeof(((RegisterContextDarwin_x86_64::FPU *) NULL)->reg), \
172 FPU_OFFSET(reg), eEncodingUint, eFormatHex
173 #define DEFINE_FPU_VECT(reg, i) \
175 sizeof(((RegisterContextDarwin_x86_64::FPU *) NULL)->reg[i].bytes), \
176 FPU_OFFSET(reg[i]), eEncodingVector, eFormatVectorOfUInt8, \
177 {ehframe_dwarf_fpu_##reg##i, \
178 ehframe_dwarf_fpu_##reg##i, LLDB_INVALID_REGNUM, \
179 LLDB_INVALID_REGNUM, fpu_##reg##i }, \
180 nullptr, nullptr, nullptr, 0
181 #define DEFINE_EXC(reg) \
182 #reg, NULL, sizeof(((RegisterContextDarwin_x86_64::EXC *) NULL)->reg), \
183 EXC_OFFSET(reg), eEncodingUint, eFormatHex
185 #define REG_CONTEXT_SIZE \
186 (sizeof(RegisterContextDarwin_x86_64::GPR) + \
187 sizeof(RegisterContextDarwin_x86_64::FPU) + \
188 sizeof(RegisterContextDarwin_x86_64::EXC))
190 // General purpose registers for 64 bit
191 static RegisterInfo g_register_infos[] = {
192 // Macro auto defines most stuff EH_FRAME DWARF
193 // GENERIC PROCESS PLUGIN LLDB
194 // =============================== ======================
195 // =================== ========================== ====================
196 // ===================
197 {DEFINE_GPR(rax, NULL),
198 {ehframe_dwarf_gpr_rax, ehframe_dwarf_gpr_rax, LLDB_INVALID_REGNUM,
199 LLDB_INVALID_REGNUM, gpr_rax},
204 {DEFINE_GPR(rbx, NULL),
205 {ehframe_dwarf_gpr_rbx, ehframe_dwarf_gpr_rbx, LLDB_INVALID_REGNUM,
206 LLDB_INVALID_REGNUM, gpr_rbx},
211 {DEFINE_GPR(rcx, NULL),
212 {ehframe_dwarf_gpr_rcx, ehframe_dwarf_gpr_rcx, LLDB_INVALID_REGNUM,
213 LLDB_INVALID_REGNUM, gpr_rcx},
218 {DEFINE_GPR(rdx, NULL),
219 {ehframe_dwarf_gpr_rdx, ehframe_dwarf_gpr_rdx, LLDB_INVALID_REGNUM,
220 LLDB_INVALID_REGNUM, gpr_rdx},
225 {DEFINE_GPR(rdi, NULL),
226 {ehframe_dwarf_gpr_rdi, ehframe_dwarf_gpr_rdi, LLDB_INVALID_REGNUM,
227 LLDB_INVALID_REGNUM, gpr_rdi},
232 {DEFINE_GPR(rsi, NULL),
233 {ehframe_dwarf_gpr_rsi, ehframe_dwarf_gpr_rsi, LLDB_INVALID_REGNUM,
234 LLDB_INVALID_REGNUM, gpr_rsi},
239 {DEFINE_GPR(rbp, "fp"),
240 {ehframe_dwarf_gpr_rbp, ehframe_dwarf_gpr_rbp, LLDB_REGNUM_GENERIC_FP,
241 LLDB_INVALID_REGNUM, gpr_rbp},
246 {DEFINE_GPR(rsp, "sp"),
247 {ehframe_dwarf_gpr_rsp, ehframe_dwarf_gpr_rsp, LLDB_REGNUM_GENERIC_SP,
248 LLDB_INVALID_REGNUM, gpr_rsp},
253 {DEFINE_GPR(r8, NULL),
254 {ehframe_dwarf_gpr_r8, ehframe_dwarf_gpr_r8, LLDB_INVALID_REGNUM,
255 LLDB_INVALID_REGNUM, gpr_r8},
260 {DEFINE_GPR(r9, NULL),
261 {ehframe_dwarf_gpr_r9, ehframe_dwarf_gpr_r9, LLDB_INVALID_REGNUM,
262 LLDB_INVALID_REGNUM, gpr_r9},
267 {DEFINE_GPR(r10, NULL),
268 {ehframe_dwarf_gpr_r10, ehframe_dwarf_gpr_r10, LLDB_INVALID_REGNUM,
269 LLDB_INVALID_REGNUM, gpr_r10},
274 {DEFINE_GPR(r11, NULL),
275 {ehframe_dwarf_gpr_r11, ehframe_dwarf_gpr_r11, LLDB_INVALID_REGNUM,
276 LLDB_INVALID_REGNUM, gpr_r11},
281 {DEFINE_GPR(r12, NULL),
282 {ehframe_dwarf_gpr_r12, ehframe_dwarf_gpr_r12, LLDB_INVALID_REGNUM,
283 LLDB_INVALID_REGNUM, gpr_r12},
288 {DEFINE_GPR(r13, NULL),
289 {ehframe_dwarf_gpr_r13, ehframe_dwarf_gpr_r13, LLDB_INVALID_REGNUM,
290 LLDB_INVALID_REGNUM, gpr_r13},
295 {DEFINE_GPR(r14, NULL),
296 {ehframe_dwarf_gpr_r14, ehframe_dwarf_gpr_r14, LLDB_INVALID_REGNUM,
297 LLDB_INVALID_REGNUM, gpr_r14},
302 {DEFINE_GPR(r15, NULL),
303 {ehframe_dwarf_gpr_r15, ehframe_dwarf_gpr_r15, LLDB_INVALID_REGNUM,
304 LLDB_INVALID_REGNUM, gpr_r15},
309 {DEFINE_GPR(rip, "pc"),
310 {ehframe_dwarf_gpr_rip, ehframe_dwarf_gpr_rip, LLDB_REGNUM_GENERIC_PC,
311 LLDB_INVALID_REGNUM, gpr_rip},
316 {DEFINE_GPR(rflags, "flags"),
317 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_REGNUM_GENERIC_FLAGS,
318 LLDB_INVALID_REGNUM, gpr_rflags},
323 {DEFINE_GPR(cs, NULL),
324 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
325 LLDB_INVALID_REGNUM, gpr_cs},
330 {DEFINE_GPR(fs, NULL),
331 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
332 LLDB_INVALID_REGNUM, gpr_fs},
337 {DEFINE_GPR(gs, NULL),
338 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
339 LLDB_INVALID_REGNUM, gpr_gs},
345 {DEFINE_FPU_UINT(fcw),
346 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
347 LLDB_INVALID_REGNUM, fpu_fcw},
352 {DEFINE_FPU_UINT(fsw),
353 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
354 LLDB_INVALID_REGNUM, fpu_fsw},
359 {DEFINE_FPU_UINT(ftw),
360 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
361 LLDB_INVALID_REGNUM, fpu_ftw},
366 {DEFINE_FPU_UINT(fop),
367 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
368 LLDB_INVALID_REGNUM, fpu_fop},
373 {DEFINE_FPU_UINT(ip),
374 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
375 LLDB_INVALID_REGNUM, fpu_ip},
380 {DEFINE_FPU_UINT(cs),
381 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
382 LLDB_INVALID_REGNUM, fpu_cs},
387 {DEFINE_FPU_UINT(dp),
388 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
389 LLDB_INVALID_REGNUM, fpu_dp},
394 {DEFINE_FPU_UINT(ds),
395 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
396 LLDB_INVALID_REGNUM, fpu_ds},
401 {DEFINE_FPU_UINT(mxcsr),
402 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
403 LLDB_INVALID_REGNUM, fpu_mxcsr},
408 {DEFINE_FPU_UINT(mxcsrmask),
409 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
410 LLDB_INVALID_REGNUM, fpu_mxcsrmask},
415 {DEFINE_FPU_VECT(stmm, 0)},
416 {DEFINE_FPU_VECT(stmm, 1)},
417 {DEFINE_FPU_VECT(stmm, 2)},
418 {DEFINE_FPU_VECT(stmm, 3)},
419 {DEFINE_FPU_VECT(stmm, 4)},
420 {DEFINE_FPU_VECT(stmm, 5)},
421 {DEFINE_FPU_VECT(stmm, 6)},
422 {DEFINE_FPU_VECT(stmm, 7)},
423 {DEFINE_FPU_VECT(xmm, 0)},
424 {DEFINE_FPU_VECT(xmm, 1)},
425 {DEFINE_FPU_VECT(xmm, 2)},
426 {DEFINE_FPU_VECT(xmm, 3)},
427 {DEFINE_FPU_VECT(xmm, 4)},
428 {DEFINE_FPU_VECT(xmm, 5)},
429 {DEFINE_FPU_VECT(xmm, 6)},
430 {DEFINE_FPU_VECT(xmm, 7)},
431 {DEFINE_FPU_VECT(xmm, 8)},
432 {DEFINE_FPU_VECT(xmm, 9)},
433 {DEFINE_FPU_VECT(xmm, 10)},
434 {DEFINE_FPU_VECT(xmm, 11)},
435 {DEFINE_FPU_VECT(xmm, 12)},
436 {DEFINE_FPU_VECT(xmm, 13)},
437 {DEFINE_FPU_VECT(xmm, 14)},
438 {DEFINE_FPU_VECT(xmm, 15)},
441 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
442 LLDB_INVALID_REGNUM, exc_trapno},
448 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
449 LLDB_INVALID_REGNUM, exc_err},
454 {DEFINE_EXC(faultvaddr),
455 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
456 LLDB_INVALID_REGNUM, exc_faultvaddr},
462 static size_t k_num_register_infos = llvm::array_lengthof(g_register_infos);
464 RegisterContextDarwin_x86_64::RegisterContextDarwin_x86_64(
465 Thread &thread, uint32_t concrete_frame_idx)
466 : RegisterContext(thread, concrete_frame_idx), gpr(), fpu(), exc() {
468 for (i = 0; i < kNumErrors; i++) {
475 RegisterContextDarwin_x86_64::~RegisterContextDarwin_x86_64() {}
477 void RegisterContextDarwin_x86_64::InvalidateAllRegisters() {
478 InvalidateAllRegisterStates();
481 size_t RegisterContextDarwin_x86_64::GetRegisterCount() {
482 assert(k_num_register_infos == k_num_registers);
483 return k_num_registers;
487 RegisterContextDarwin_x86_64::GetRegisterInfoAtIndex(size_t reg) {
488 assert(k_num_register_infos == k_num_registers);
489 if (reg < k_num_registers)
490 return &g_register_infos[reg];
494 size_t RegisterContextDarwin_x86_64::GetRegisterInfosCount() {
495 return k_num_register_infos;
498 const lldb_private::RegisterInfo *
499 RegisterContextDarwin_x86_64::GetRegisterInfos() {
500 return g_register_infos;
503 static uint32_t g_gpr_regnums[] = {
504 gpr_rax, gpr_rbx, gpr_rcx, gpr_rdx, gpr_rdi, gpr_rsi, gpr_rbp,
505 gpr_rsp, gpr_r8, gpr_r9, gpr_r10, gpr_r11, gpr_r12, gpr_r13,
506 gpr_r14, gpr_r15, gpr_rip, gpr_rflags, gpr_cs, gpr_fs, gpr_gs};
508 static uint32_t g_fpu_regnums[] = {
509 fpu_fcw, fpu_fsw, fpu_ftw, fpu_fop, fpu_ip, fpu_cs,
510 fpu_dp, fpu_ds, fpu_mxcsr, fpu_mxcsrmask, fpu_stmm0, fpu_stmm1,
511 fpu_stmm2, fpu_stmm3, fpu_stmm4, fpu_stmm5, fpu_stmm6, fpu_stmm7,
512 fpu_xmm0, fpu_xmm1, fpu_xmm2, fpu_xmm3, fpu_xmm4, fpu_xmm5,
513 fpu_xmm6, fpu_xmm7, fpu_xmm8, fpu_xmm9, fpu_xmm10, fpu_xmm11,
514 fpu_xmm12, fpu_xmm13, fpu_xmm14, fpu_xmm15};
516 static uint32_t g_exc_regnums[] = {exc_trapno, exc_err, exc_faultvaddr};
518 // Number of registers in each register set
519 const size_t k_num_gpr_registers = llvm::array_lengthof(g_gpr_regnums);
520 const size_t k_num_fpu_registers = llvm::array_lengthof(g_fpu_regnums);
521 const size_t k_num_exc_registers = llvm::array_lengthof(g_exc_regnums);
523 //----------------------------------------------------------------------
524 // Register set definitions. The first definitions at register set index of
525 // zero is for all registers, followed by other registers sets. The register
526 // information for the all register set need not be filled in.
527 //----------------------------------------------------------------------
528 static const RegisterSet g_reg_sets[] = {
530 "General Purpose Registers", "gpr", k_num_gpr_registers, g_gpr_regnums,
532 {"Floating Point Registers", "fpu", k_num_fpu_registers, g_fpu_regnums},
533 {"Exception State Registers", "exc", k_num_exc_registers, g_exc_regnums}};
535 const size_t k_num_regsets = llvm::array_lengthof(g_reg_sets);
537 size_t RegisterContextDarwin_x86_64::GetRegisterSetCount() {
538 return k_num_regsets;
542 RegisterContextDarwin_x86_64::GetRegisterSet(size_t reg_set) {
543 if (reg_set < k_num_regsets)
544 return &g_reg_sets[reg_set];
548 int RegisterContextDarwin_x86_64::GetSetForNativeRegNum(int reg_num) {
549 if (reg_num < fpu_fcw)
551 else if (reg_num < exc_trapno)
553 else if (reg_num < k_num_registers)
558 void RegisterContextDarwin_x86_64::LogGPR(Log *log, const char *format, ...) {
562 va_start(args, format);
563 log->VAPrintf(format, args);
566 for (uint32_t i = 0; i < k_num_gpr_registers; i++) {
567 uint32_t reg = gpr_rax + i;
568 log->Printf("%12s = 0x%16.16" PRIx64, g_register_infos[reg].name,
574 int RegisterContextDarwin_x86_64::ReadGPR(bool force) {
576 if (force || !RegisterSetIsCached(set)) {
577 SetError(set, Read, DoReadGPR(GetThreadID(), set, gpr));
579 return GetError(GPRRegSet, Read);
582 int RegisterContextDarwin_x86_64::ReadFPU(bool force) {
584 if (force || !RegisterSetIsCached(set)) {
585 SetError(set, Read, DoReadFPU(GetThreadID(), set, fpu));
587 return GetError(FPURegSet, Read);
590 int RegisterContextDarwin_x86_64::ReadEXC(bool force) {
592 if (force || !RegisterSetIsCached(set)) {
593 SetError(set, Read, DoReadEXC(GetThreadID(), set, exc));
595 return GetError(EXCRegSet, Read);
598 int RegisterContextDarwin_x86_64::WriteGPR() {
600 if (!RegisterSetIsCached(set)) {
601 SetError(set, Write, -1);
604 SetError(set, Write, DoWriteGPR(GetThreadID(), set, gpr));
605 SetError(set, Read, -1);
606 return GetError(set, Write);
609 int RegisterContextDarwin_x86_64::WriteFPU() {
611 if (!RegisterSetIsCached(set)) {
612 SetError(set, Write, -1);
615 SetError(set, Write, DoWriteFPU(GetThreadID(), set, fpu));
616 SetError(set, Read, -1);
617 return GetError(set, Write);
620 int RegisterContextDarwin_x86_64::WriteEXC() {
622 if (!RegisterSetIsCached(set)) {
623 SetError(set, Write, -1);
626 SetError(set, Write, DoWriteEXC(GetThreadID(), set, exc));
627 SetError(set, Read, -1);
628 return GetError(set, Write);
631 int RegisterContextDarwin_x86_64::ReadRegisterSet(uint32_t set, bool force) {
634 return ReadGPR(force);
636 return ReadFPU(force);
638 return ReadEXC(force);
645 int RegisterContextDarwin_x86_64::WriteRegisterSet(uint32_t set) {
646 // Make sure we have a valid context to set.
660 bool RegisterContextDarwin_x86_64::ReadRegister(const RegisterInfo *reg_info,
661 RegisterValue &value) {
662 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
663 int set = RegisterContextDarwin_x86_64::GetSetForNativeRegNum(reg);
667 if (ReadRegisterSet(set, false) != 0)
692 value = (&gpr.rax)[reg - gpr_rax];
732 value = fpu.mxcsrmask;
743 value.SetBytes(fpu.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size,
744 endian::InlHostByteOrder());
763 value.SetBytes(fpu.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size,
764 endian::InlHostByteOrder());
776 value = exc.faultvaddr;
785 bool RegisterContextDarwin_x86_64::WriteRegister(const RegisterInfo *reg_info,
786 const RegisterValue &value) {
787 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
788 int set = RegisterContextDarwin_x86_64::GetSetForNativeRegNum(reg);
793 if (ReadRegisterSet(set, false) != 0)
818 (&gpr.rax)[reg - gpr_rax] = value.GetAsUInt64();
822 fpu.fcw = value.GetAsUInt16();
826 fpu.fsw = value.GetAsUInt16();
830 fpu.ftw = value.GetAsUInt8();
834 fpu.fop = value.GetAsUInt16();
838 fpu.ip = value.GetAsUInt32();
842 fpu.cs = value.GetAsUInt16();
846 fpu.dp = value.GetAsUInt32();
850 fpu.ds = value.GetAsUInt16();
854 fpu.mxcsr = value.GetAsUInt32();
858 fpu.mxcsrmask = value.GetAsUInt32();
869 ::memcpy(fpu.stmm[reg - fpu_stmm0].bytes, value.GetBytes(),
870 value.GetByteSize());
889 ::memcpy(fpu.xmm[reg - fpu_xmm0].bytes, value.GetBytes(),
890 value.GetByteSize());
894 exc.trapno = value.GetAsUInt32();
898 exc.err = value.GetAsUInt32();
902 exc.faultvaddr = value.GetAsUInt64();
908 return WriteRegisterSet(set) == 0;
911 bool RegisterContextDarwin_x86_64::ReadAllRegisterValues(
912 lldb::DataBufferSP &data_sp) {
913 data_sp.reset(new DataBufferHeap(REG_CONTEXT_SIZE, 0));
914 if (data_sp && ReadGPR(false) == 0 && ReadFPU(false) == 0 &&
915 ReadEXC(false) == 0) {
916 uint8_t *dst = data_sp->GetBytes();
917 ::memcpy(dst, &gpr, sizeof(gpr));
920 ::memcpy(dst, &fpu, sizeof(fpu));
923 ::memcpy(dst, &exc, sizeof(exc));
929 bool RegisterContextDarwin_x86_64::WriteAllRegisterValues(
930 const lldb::DataBufferSP &data_sp) {
931 if (data_sp && data_sp->GetByteSize() == REG_CONTEXT_SIZE) {
932 const uint8_t *src = data_sp->GetBytes();
933 ::memcpy(&gpr, src, sizeof(gpr));
936 ::memcpy(&fpu, src, sizeof(fpu));
939 ::memcpy(&exc, src, sizeof(exc));
940 uint32_t success_count = 0;
947 return success_count == 3;
952 uint32_t RegisterContextDarwin_x86_64::ConvertRegisterKindToRegisterNumber(
953 lldb::RegisterKind kind, uint32_t reg) {
954 if (kind == eRegisterKindGeneric) {
956 case LLDB_REGNUM_GENERIC_PC:
958 case LLDB_REGNUM_GENERIC_SP:
960 case LLDB_REGNUM_GENERIC_FP:
962 case LLDB_REGNUM_GENERIC_FLAGS:
964 case LLDB_REGNUM_GENERIC_RA:
968 } else if (kind == eRegisterKindEHFrame || kind == eRegisterKindDWARF) {
970 case ehframe_dwarf_gpr_rax:
972 case ehframe_dwarf_gpr_rdx:
974 case ehframe_dwarf_gpr_rcx:
976 case ehframe_dwarf_gpr_rbx:
978 case ehframe_dwarf_gpr_rsi:
980 case ehframe_dwarf_gpr_rdi:
982 case ehframe_dwarf_gpr_rbp:
984 case ehframe_dwarf_gpr_rsp:
986 case ehframe_dwarf_gpr_r8:
988 case ehframe_dwarf_gpr_r9:
990 case ehframe_dwarf_gpr_r10:
992 case ehframe_dwarf_gpr_r11:
994 case ehframe_dwarf_gpr_r12:
996 case ehframe_dwarf_gpr_r13:
998 case ehframe_dwarf_gpr_r14:
1000 case ehframe_dwarf_gpr_r15:
1002 case ehframe_dwarf_gpr_rip:
1004 case ehframe_dwarf_fpu_xmm0:
1006 case ehframe_dwarf_fpu_xmm1:
1008 case ehframe_dwarf_fpu_xmm2:
1010 case ehframe_dwarf_fpu_xmm3:
1012 case ehframe_dwarf_fpu_xmm4:
1014 case ehframe_dwarf_fpu_xmm5:
1016 case ehframe_dwarf_fpu_xmm6:
1018 case ehframe_dwarf_fpu_xmm7:
1020 case ehframe_dwarf_fpu_xmm8:
1022 case ehframe_dwarf_fpu_xmm9:
1024 case ehframe_dwarf_fpu_xmm10:
1026 case ehframe_dwarf_fpu_xmm11:
1028 case ehframe_dwarf_fpu_xmm12:
1030 case ehframe_dwarf_fpu_xmm13:
1032 case ehframe_dwarf_fpu_xmm14:
1034 case ehframe_dwarf_fpu_xmm15:
1036 case ehframe_dwarf_fpu_stmm0:
1038 case ehframe_dwarf_fpu_stmm1:
1040 case ehframe_dwarf_fpu_stmm2:
1042 case ehframe_dwarf_fpu_stmm3:
1044 case ehframe_dwarf_fpu_stmm4:
1046 case ehframe_dwarf_fpu_stmm5:
1048 case ehframe_dwarf_fpu_stmm6:
1050 case ehframe_dwarf_fpu_stmm7:
1055 } else if (kind == eRegisterKindLLDB) {
1058 return LLDB_INVALID_REGNUM;
1061 bool RegisterContextDarwin_x86_64::HardwareSingleStep(bool enable) {
1062 if (ReadGPR(true) != 0)
1065 const uint64_t trace_bit = 0x100ull;
1068 if (gpr.rflags & trace_bit)
1069 return true; // trace bit is already set, there is nothing to do
1071 gpr.rflags |= trace_bit;
1073 if (gpr.rflags & trace_bit)
1074 gpr.rflags &= ~trace_bit;
1076 return true; // trace bit is clear, there is nothing to do
1079 return WriteGPR() == 0;