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 //===----------------------------------------------------------------------===//
11 #include <inttypes.h> // PRIx64
13 #include <stddef.h> // offsetof
16 // Other libraries and framework includes
17 #include "lldb/Core/RegisterValue.h"
18 #include "lldb/Core/Scalar.h"
19 #include "lldb/Utility/DataBufferHeap.h"
20 #include "lldb/Utility/DataExtractor.h"
21 #include "lldb/Utility/Endian.h"
22 #include "lldb/Utility/Log.h"
23 #include "llvm/ADT/STLExtras.h"
24 #include "llvm/Support/Compiler.h"
26 // Support building against older versions of LLVM, this macro was added
28 #ifndef LLVM_EXTENSION
29 #define LLVM_EXTENSION
33 #include "RegisterContextDarwin_x86_64.h"
36 using namespace lldb_private;
112 enum ehframe_dwarf_regnums {
113 ehframe_dwarf_gpr_rax = 0,
114 ehframe_dwarf_gpr_rdx,
115 ehframe_dwarf_gpr_rcx,
116 ehframe_dwarf_gpr_rbx,
117 ehframe_dwarf_gpr_rsi,
118 ehframe_dwarf_gpr_rdi,
119 ehframe_dwarf_gpr_rbp,
120 ehframe_dwarf_gpr_rsp,
121 ehframe_dwarf_gpr_r8,
122 ehframe_dwarf_gpr_r9,
123 ehframe_dwarf_gpr_r10,
124 ehframe_dwarf_gpr_r11,
125 ehframe_dwarf_gpr_r12,
126 ehframe_dwarf_gpr_r13,
127 ehframe_dwarf_gpr_r14,
128 ehframe_dwarf_gpr_r15,
129 ehframe_dwarf_gpr_rip,
130 ehframe_dwarf_fpu_xmm0,
131 ehframe_dwarf_fpu_xmm1,
132 ehframe_dwarf_fpu_xmm2,
133 ehframe_dwarf_fpu_xmm3,
134 ehframe_dwarf_fpu_xmm4,
135 ehframe_dwarf_fpu_xmm5,
136 ehframe_dwarf_fpu_xmm6,
137 ehframe_dwarf_fpu_xmm7,
138 ehframe_dwarf_fpu_xmm8,
139 ehframe_dwarf_fpu_xmm9,
140 ehframe_dwarf_fpu_xmm10,
141 ehframe_dwarf_fpu_xmm11,
142 ehframe_dwarf_fpu_xmm12,
143 ehframe_dwarf_fpu_xmm13,
144 ehframe_dwarf_fpu_xmm14,
145 ehframe_dwarf_fpu_xmm15,
146 ehframe_dwarf_fpu_stmm0,
147 ehframe_dwarf_fpu_stmm1,
148 ehframe_dwarf_fpu_stmm2,
149 ehframe_dwarf_fpu_stmm3,
150 ehframe_dwarf_fpu_stmm4,
151 ehframe_dwarf_fpu_stmm5,
152 ehframe_dwarf_fpu_stmm6,
153 ehframe_dwarf_fpu_stmm7
157 #define GPR_OFFSET(reg) \
158 (LLVM_EXTENSION offsetof(RegisterContextDarwin_x86_64::GPR, reg))
159 #define FPU_OFFSET(reg) \
160 (LLVM_EXTENSION offsetof(RegisterContextDarwin_x86_64::FPU, reg) + \
161 sizeof(RegisterContextDarwin_x86_64::GPR))
162 #define EXC_OFFSET(reg) \
163 (LLVM_EXTENSION offsetof(RegisterContextDarwin_x86_64::EXC, reg) + \
164 sizeof(RegisterContextDarwin_x86_64::GPR) + \
165 sizeof(RegisterContextDarwin_x86_64::FPU))
167 // These macros will auto define the register name, alt name, register size,
168 // register offset, encoding, format and native register. This ensures that the
169 // register state structures are defined correctly and have the correct sizes
171 #define DEFINE_GPR(reg, alt) \
172 #reg, alt, sizeof(((RegisterContextDarwin_x86_64::GPR *) NULL)->reg), \
173 GPR_OFFSET(reg), eEncodingUint, eFormatHex
174 #define DEFINE_FPU_UINT(reg) \
175 #reg, NULL, sizeof(((RegisterContextDarwin_x86_64::FPU *) NULL)->reg), \
176 FPU_OFFSET(reg), eEncodingUint, eFormatHex
177 #define DEFINE_FPU_VECT(reg, i) \
179 sizeof(((RegisterContextDarwin_x86_64::FPU *) NULL)->reg[i].bytes), \
180 FPU_OFFSET(reg[i]), eEncodingVector, eFormatVectorOfUInt8, \
181 {ehframe_dwarf_fpu_##reg##i, \
182 ehframe_dwarf_fpu_##reg##i, LLDB_INVALID_REGNUM, \
183 LLDB_INVALID_REGNUM, fpu_##reg##i }, \
184 nullptr, nullptr, nullptr, 0
185 #define DEFINE_EXC(reg) \
186 #reg, NULL, sizeof(((RegisterContextDarwin_x86_64::EXC *) NULL)->reg), \
187 EXC_OFFSET(reg), eEncodingUint, eFormatHex
189 #define REG_CONTEXT_SIZE \
190 (sizeof(RegisterContextDarwin_x86_64::GPR) + \
191 sizeof(RegisterContextDarwin_x86_64::FPU) + \
192 sizeof(RegisterContextDarwin_x86_64::EXC))
194 // General purpose registers for 64 bit
195 static RegisterInfo g_register_infos[] = {
196 // Macro auto defines most stuff EH_FRAME DWARF
197 // GENERIC PROCESS PLUGIN LLDB
198 // =============================== ======================
199 // =================== ========================== ====================
200 // ===================
201 {DEFINE_GPR(rax, NULL),
202 {ehframe_dwarf_gpr_rax, ehframe_dwarf_gpr_rax, LLDB_INVALID_REGNUM,
203 LLDB_INVALID_REGNUM, gpr_rax},
208 {DEFINE_GPR(rbx, NULL),
209 {ehframe_dwarf_gpr_rbx, ehframe_dwarf_gpr_rbx, LLDB_INVALID_REGNUM,
210 LLDB_INVALID_REGNUM, gpr_rbx},
215 {DEFINE_GPR(rcx, NULL),
216 {ehframe_dwarf_gpr_rcx, ehframe_dwarf_gpr_rcx, LLDB_INVALID_REGNUM,
217 LLDB_INVALID_REGNUM, gpr_rcx},
222 {DEFINE_GPR(rdx, NULL),
223 {ehframe_dwarf_gpr_rdx, ehframe_dwarf_gpr_rdx, LLDB_INVALID_REGNUM,
224 LLDB_INVALID_REGNUM, gpr_rdx},
229 {DEFINE_GPR(rdi, NULL),
230 {ehframe_dwarf_gpr_rdi, ehframe_dwarf_gpr_rdi, LLDB_INVALID_REGNUM,
231 LLDB_INVALID_REGNUM, gpr_rdi},
236 {DEFINE_GPR(rsi, NULL),
237 {ehframe_dwarf_gpr_rsi, ehframe_dwarf_gpr_rsi, LLDB_INVALID_REGNUM,
238 LLDB_INVALID_REGNUM, gpr_rsi},
243 {DEFINE_GPR(rbp, "fp"),
244 {ehframe_dwarf_gpr_rbp, ehframe_dwarf_gpr_rbp, LLDB_REGNUM_GENERIC_FP,
245 LLDB_INVALID_REGNUM, gpr_rbp},
250 {DEFINE_GPR(rsp, "sp"),
251 {ehframe_dwarf_gpr_rsp, ehframe_dwarf_gpr_rsp, LLDB_REGNUM_GENERIC_SP,
252 LLDB_INVALID_REGNUM, gpr_rsp},
257 {DEFINE_GPR(r8, NULL),
258 {ehframe_dwarf_gpr_r8, ehframe_dwarf_gpr_r8, LLDB_INVALID_REGNUM,
259 LLDB_INVALID_REGNUM, gpr_r8},
264 {DEFINE_GPR(r9, NULL),
265 {ehframe_dwarf_gpr_r9, ehframe_dwarf_gpr_r9, LLDB_INVALID_REGNUM,
266 LLDB_INVALID_REGNUM, gpr_r9},
271 {DEFINE_GPR(r10, NULL),
272 {ehframe_dwarf_gpr_r10, ehframe_dwarf_gpr_r10, LLDB_INVALID_REGNUM,
273 LLDB_INVALID_REGNUM, gpr_r10},
278 {DEFINE_GPR(r11, NULL),
279 {ehframe_dwarf_gpr_r11, ehframe_dwarf_gpr_r11, LLDB_INVALID_REGNUM,
280 LLDB_INVALID_REGNUM, gpr_r11},
285 {DEFINE_GPR(r12, NULL),
286 {ehframe_dwarf_gpr_r12, ehframe_dwarf_gpr_r12, LLDB_INVALID_REGNUM,
287 LLDB_INVALID_REGNUM, gpr_r12},
292 {DEFINE_GPR(r13, NULL),
293 {ehframe_dwarf_gpr_r13, ehframe_dwarf_gpr_r13, LLDB_INVALID_REGNUM,
294 LLDB_INVALID_REGNUM, gpr_r13},
299 {DEFINE_GPR(r14, NULL),
300 {ehframe_dwarf_gpr_r14, ehframe_dwarf_gpr_r14, LLDB_INVALID_REGNUM,
301 LLDB_INVALID_REGNUM, gpr_r14},
306 {DEFINE_GPR(r15, NULL),
307 {ehframe_dwarf_gpr_r15, ehframe_dwarf_gpr_r15, LLDB_INVALID_REGNUM,
308 LLDB_INVALID_REGNUM, gpr_r15},
313 {DEFINE_GPR(rip, "pc"),
314 {ehframe_dwarf_gpr_rip, ehframe_dwarf_gpr_rip, LLDB_REGNUM_GENERIC_PC,
315 LLDB_INVALID_REGNUM, gpr_rip},
320 {DEFINE_GPR(rflags, "flags"),
321 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_REGNUM_GENERIC_FLAGS,
322 LLDB_INVALID_REGNUM, gpr_rflags},
327 {DEFINE_GPR(cs, NULL),
328 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
329 LLDB_INVALID_REGNUM, gpr_cs},
334 {DEFINE_GPR(fs, NULL),
335 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
336 LLDB_INVALID_REGNUM, gpr_fs},
341 {DEFINE_GPR(gs, NULL),
342 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
343 LLDB_INVALID_REGNUM, gpr_gs},
349 {DEFINE_FPU_UINT(fcw),
350 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
351 LLDB_INVALID_REGNUM, fpu_fcw},
356 {DEFINE_FPU_UINT(fsw),
357 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
358 LLDB_INVALID_REGNUM, fpu_fsw},
363 {DEFINE_FPU_UINT(ftw),
364 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
365 LLDB_INVALID_REGNUM, fpu_ftw},
370 {DEFINE_FPU_UINT(fop),
371 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
372 LLDB_INVALID_REGNUM, fpu_fop},
377 {DEFINE_FPU_UINT(ip),
378 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
379 LLDB_INVALID_REGNUM, fpu_ip},
384 {DEFINE_FPU_UINT(cs),
385 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
386 LLDB_INVALID_REGNUM, fpu_cs},
391 {DEFINE_FPU_UINT(dp),
392 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
393 LLDB_INVALID_REGNUM, fpu_dp},
398 {DEFINE_FPU_UINT(ds),
399 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
400 LLDB_INVALID_REGNUM, fpu_ds},
405 {DEFINE_FPU_UINT(mxcsr),
406 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
407 LLDB_INVALID_REGNUM, fpu_mxcsr},
412 {DEFINE_FPU_UINT(mxcsrmask),
413 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
414 LLDB_INVALID_REGNUM, fpu_mxcsrmask},
419 {DEFINE_FPU_VECT(stmm, 0)},
420 {DEFINE_FPU_VECT(stmm, 1)},
421 {DEFINE_FPU_VECT(stmm, 2)},
422 {DEFINE_FPU_VECT(stmm, 3)},
423 {DEFINE_FPU_VECT(stmm, 4)},
424 {DEFINE_FPU_VECT(stmm, 5)},
425 {DEFINE_FPU_VECT(stmm, 6)},
426 {DEFINE_FPU_VECT(stmm, 7)},
427 {DEFINE_FPU_VECT(xmm, 0)},
428 {DEFINE_FPU_VECT(xmm, 1)},
429 {DEFINE_FPU_VECT(xmm, 2)},
430 {DEFINE_FPU_VECT(xmm, 3)},
431 {DEFINE_FPU_VECT(xmm, 4)},
432 {DEFINE_FPU_VECT(xmm, 5)},
433 {DEFINE_FPU_VECT(xmm, 6)},
434 {DEFINE_FPU_VECT(xmm, 7)},
435 {DEFINE_FPU_VECT(xmm, 8)},
436 {DEFINE_FPU_VECT(xmm, 9)},
437 {DEFINE_FPU_VECT(xmm, 10)},
438 {DEFINE_FPU_VECT(xmm, 11)},
439 {DEFINE_FPU_VECT(xmm, 12)},
440 {DEFINE_FPU_VECT(xmm, 13)},
441 {DEFINE_FPU_VECT(xmm, 14)},
442 {DEFINE_FPU_VECT(xmm, 15)},
445 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
446 LLDB_INVALID_REGNUM, exc_trapno},
452 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
453 LLDB_INVALID_REGNUM, exc_err},
458 {DEFINE_EXC(faultvaddr),
459 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
460 LLDB_INVALID_REGNUM, exc_faultvaddr},
466 static size_t k_num_register_infos = llvm::array_lengthof(g_register_infos);
468 RegisterContextDarwin_x86_64::RegisterContextDarwin_x86_64(
469 Thread &thread, uint32_t concrete_frame_idx)
470 : RegisterContext(thread, concrete_frame_idx), gpr(), fpu(), exc() {
472 for (i = 0; i < kNumErrors; i++) {
479 RegisterContextDarwin_x86_64::~RegisterContextDarwin_x86_64() {}
481 void RegisterContextDarwin_x86_64::InvalidateAllRegisters() {
482 InvalidateAllRegisterStates();
485 size_t RegisterContextDarwin_x86_64::GetRegisterCount() {
486 assert(k_num_register_infos == k_num_registers);
487 return k_num_registers;
491 RegisterContextDarwin_x86_64::GetRegisterInfoAtIndex(size_t reg) {
492 assert(k_num_register_infos == k_num_registers);
493 if (reg < k_num_registers)
494 return &g_register_infos[reg];
498 size_t RegisterContextDarwin_x86_64::GetRegisterInfosCount() {
499 return k_num_register_infos;
502 const lldb_private::RegisterInfo *
503 RegisterContextDarwin_x86_64::GetRegisterInfos() {
504 return g_register_infos;
507 static uint32_t g_gpr_regnums[] = {
508 gpr_rax, gpr_rbx, gpr_rcx, gpr_rdx, gpr_rdi, gpr_rsi, gpr_rbp,
509 gpr_rsp, gpr_r8, gpr_r9, gpr_r10, gpr_r11, gpr_r12, gpr_r13,
510 gpr_r14, gpr_r15, gpr_rip, gpr_rflags, gpr_cs, gpr_fs, gpr_gs};
512 static uint32_t g_fpu_regnums[] = {
513 fpu_fcw, fpu_fsw, fpu_ftw, fpu_fop, fpu_ip, fpu_cs,
514 fpu_dp, fpu_ds, fpu_mxcsr, fpu_mxcsrmask, fpu_stmm0, fpu_stmm1,
515 fpu_stmm2, fpu_stmm3, fpu_stmm4, fpu_stmm5, fpu_stmm6, fpu_stmm7,
516 fpu_xmm0, fpu_xmm1, fpu_xmm2, fpu_xmm3, fpu_xmm4, fpu_xmm5,
517 fpu_xmm6, fpu_xmm7, fpu_xmm8, fpu_xmm9, fpu_xmm10, fpu_xmm11,
518 fpu_xmm12, fpu_xmm13, fpu_xmm14, fpu_xmm15};
520 static uint32_t g_exc_regnums[] = {exc_trapno, exc_err, exc_faultvaddr};
522 // Number of registers in each register set
523 const size_t k_num_gpr_registers = llvm::array_lengthof(g_gpr_regnums);
524 const size_t k_num_fpu_registers = llvm::array_lengthof(g_fpu_regnums);
525 const size_t k_num_exc_registers = llvm::array_lengthof(g_exc_regnums);
527 //----------------------------------------------------------------------
528 // Register set definitions. The first definitions at register set index of
529 // zero is for all registers, followed by other registers sets. The register
530 // information for the all register set need not be filled in.
531 //----------------------------------------------------------------------
532 static const RegisterSet g_reg_sets[] = {
534 "General Purpose Registers", "gpr", k_num_gpr_registers, g_gpr_regnums,
536 {"Floating Point Registers", "fpu", k_num_fpu_registers, g_fpu_regnums},
537 {"Exception State Registers", "exc", k_num_exc_registers, g_exc_regnums}};
539 const size_t k_num_regsets = llvm::array_lengthof(g_reg_sets);
541 size_t RegisterContextDarwin_x86_64::GetRegisterSetCount() {
542 return k_num_regsets;
546 RegisterContextDarwin_x86_64::GetRegisterSet(size_t reg_set) {
547 if (reg_set < k_num_regsets)
548 return &g_reg_sets[reg_set];
552 int RegisterContextDarwin_x86_64::GetSetForNativeRegNum(int reg_num) {
553 if (reg_num < fpu_fcw)
555 else if (reg_num < exc_trapno)
557 else if (reg_num < k_num_registers)
562 void RegisterContextDarwin_x86_64::LogGPR(Log *log, const char *format, ...) {
566 va_start(args, format);
567 log->VAPrintf(format, args);
570 for (uint32_t i = 0; i < k_num_gpr_registers; i++) {
571 uint32_t reg = gpr_rax + i;
572 log->Printf("%12s = 0x%16.16" PRIx64, g_register_infos[reg].name,
578 int RegisterContextDarwin_x86_64::ReadGPR(bool force) {
580 if (force || !RegisterSetIsCached(set)) {
581 SetError(set, Read, DoReadGPR(GetThreadID(), set, gpr));
583 return GetError(GPRRegSet, Read);
586 int RegisterContextDarwin_x86_64::ReadFPU(bool force) {
588 if (force || !RegisterSetIsCached(set)) {
589 SetError(set, Read, DoReadFPU(GetThreadID(), set, fpu));
591 return GetError(FPURegSet, Read);
594 int RegisterContextDarwin_x86_64::ReadEXC(bool force) {
596 if (force || !RegisterSetIsCached(set)) {
597 SetError(set, Read, DoReadEXC(GetThreadID(), set, exc));
599 return GetError(EXCRegSet, Read);
602 int RegisterContextDarwin_x86_64::WriteGPR() {
604 if (!RegisterSetIsCached(set)) {
605 SetError(set, Write, -1);
608 SetError(set, Write, DoWriteGPR(GetThreadID(), set, gpr));
609 SetError(set, Read, -1);
610 return GetError(set, Write);
613 int RegisterContextDarwin_x86_64::WriteFPU() {
615 if (!RegisterSetIsCached(set)) {
616 SetError(set, Write, -1);
619 SetError(set, Write, DoWriteFPU(GetThreadID(), set, fpu));
620 SetError(set, Read, -1);
621 return GetError(set, Write);
624 int RegisterContextDarwin_x86_64::WriteEXC() {
626 if (!RegisterSetIsCached(set)) {
627 SetError(set, Write, -1);
630 SetError(set, Write, DoWriteEXC(GetThreadID(), set, exc));
631 SetError(set, Read, -1);
632 return GetError(set, Write);
635 int RegisterContextDarwin_x86_64::ReadRegisterSet(uint32_t set, bool force) {
638 return ReadGPR(force);
640 return ReadFPU(force);
642 return ReadEXC(force);
649 int RegisterContextDarwin_x86_64::WriteRegisterSet(uint32_t set) {
650 // Make sure we have a valid context to set.
664 bool RegisterContextDarwin_x86_64::ReadRegister(const RegisterInfo *reg_info,
665 RegisterValue &value) {
666 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
667 int set = RegisterContextDarwin_x86_64::GetSetForNativeRegNum(reg);
671 if (ReadRegisterSet(set, false) != 0)
696 value = (&gpr.rax)[reg - gpr_rax];
736 value = fpu.mxcsrmask;
747 value.SetBytes(fpu.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size,
748 endian::InlHostByteOrder());
767 value.SetBytes(fpu.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size,
768 endian::InlHostByteOrder());
780 value = exc.faultvaddr;
789 bool RegisterContextDarwin_x86_64::WriteRegister(const RegisterInfo *reg_info,
790 const RegisterValue &value) {
791 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
792 int set = RegisterContextDarwin_x86_64::GetSetForNativeRegNum(reg);
797 if (ReadRegisterSet(set, false) != 0)
822 (&gpr.rax)[reg - gpr_rax] = value.GetAsUInt64();
826 fpu.fcw = value.GetAsUInt16();
830 fpu.fsw = value.GetAsUInt16();
834 fpu.ftw = value.GetAsUInt8();
838 fpu.fop = value.GetAsUInt16();
842 fpu.ip = value.GetAsUInt32();
846 fpu.cs = value.GetAsUInt16();
850 fpu.dp = value.GetAsUInt32();
854 fpu.ds = value.GetAsUInt16();
858 fpu.mxcsr = value.GetAsUInt32();
862 fpu.mxcsrmask = value.GetAsUInt32();
873 ::memcpy(fpu.stmm[reg - fpu_stmm0].bytes, value.GetBytes(),
874 value.GetByteSize());
893 ::memcpy(fpu.xmm[reg - fpu_xmm0].bytes, value.GetBytes(),
894 value.GetByteSize());
898 exc.trapno = value.GetAsUInt32();
902 exc.err = value.GetAsUInt32();
906 exc.faultvaddr = value.GetAsUInt64();
912 return WriteRegisterSet(set) == 0;
915 bool RegisterContextDarwin_x86_64::ReadAllRegisterValues(
916 lldb::DataBufferSP &data_sp) {
917 data_sp.reset(new DataBufferHeap(REG_CONTEXT_SIZE, 0));
918 if (data_sp && ReadGPR(false) == 0 && ReadFPU(false) == 0 &&
919 ReadEXC(false) == 0) {
920 uint8_t *dst = data_sp->GetBytes();
921 ::memcpy(dst, &gpr, sizeof(gpr));
924 ::memcpy(dst, &fpu, sizeof(fpu));
927 ::memcpy(dst, &exc, sizeof(exc));
933 bool RegisterContextDarwin_x86_64::WriteAllRegisterValues(
934 const lldb::DataBufferSP &data_sp) {
935 if (data_sp && data_sp->GetByteSize() == REG_CONTEXT_SIZE) {
936 const uint8_t *src = data_sp->GetBytes();
937 ::memcpy(&gpr, src, sizeof(gpr));
940 ::memcpy(&fpu, src, sizeof(fpu));
943 ::memcpy(&exc, src, sizeof(exc));
944 uint32_t success_count = 0;
951 return success_count == 3;
956 uint32_t RegisterContextDarwin_x86_64::ConvertRegisterKindToRegisterNumber(
957 lldb::RegisterKind kind, uint32_t reg) {
958 if (kind == eRegisterKindGeneric) {
960 case LLDB_REGNUM_GENERIC_PC:
962 case LLDB_REGNUM_GENERIC_SP:
964 case LLDB_REGNUM_GENERIC_FP:
966 case LLDB_REGNUM_GENERIC_FLAGS:
968 case LLDB_REGNUM_GENERIC_RA:
972 } else if (kind == eRegisterKindEHFrame || kind == eRegisterKindDWARF) {
974 case ehframe_dwarf_gpr_rax:
976 case ehframe_dwarf_gpr_rdx:
978 case ehframe_dwarf_gpr_rcx:
980 case ehframe_dwarf_gpr_rbx:
982 case ehframe_dwarf_gpr_rsi:
984 case ehframe_dwarf_gpr_rdi:
986 case ehframe_dwarf_gpr_rbp:
988 case ehframe_dwarf_gpr_rsp:
990 case ehframe_dwarf_gpr_r8:
992 case ehframe_dwarf_gpr_r9:
994 case ehframe_dwarf_gpr_r10:
996 case ehframe_dwarf_gpr_r11:
998 case ehframe_dwarf_gpr_r12:
1000 case ehframe_dwarf_gpr_r13:
1002 case ehframe_dwarf_gpr_r14:
1004 case ehframe_dwarf_gpr_r15:
1006 case ehframe_dwarf_gpr_rip:
1008 case ehframe_dwarf_fpu_xmm0:
1010 case ehframe_dwarf_fpu_xmm1:
1012 case ehframe_dwarf_fpu_xmm2:
1014 case ehframe_dwarf_fpu_xmm3:
1016 case ehframe_dwarf_fpu_xmm4:
1018 case ehframe_dwarf_fpu_xmm5:
1020 case ehframe_dwarf_fpu_xmm6:
1022 case ehframe_dwarf_fpu_xmm7:
1024 case ehframe_dwarf_fpu_xmm8:
1026 case ehframe_dwarf_fpu_xmm9:
1028 case ehframe_dwarf_fpu_xmm10:
1030 case ehframe_dwarf_fpu_xmm11:
1032 case ehframe_dwarf_fpu_xmm12:
1034 case ehframe_dwarf_fpu_xmm13:
1036 case ehframe_dwarf_fpu_xmm14:
1038 case ehframe_dwarf_fpu_xmm15:
1040 case ehframe_dwarf_fpu_stmm0:
1042 case ehframe_dwarf_fpu_stmm1:
1044 case ehframe_dwarf_fpu_stmm2:
1046 case ehframe_dwarf_fpu_stmm3:
1048 case ehframe_dwarf_fpu_stmm4:
1050 case ehframe_dwarf_fpu_stmm5:
1052 case ehframe_dwarf_fpu_stmm6:
1054 case ehframe_dwarf_fpu_stmm7:
1059 } else if (kind == eRegisterKindLLDB) {
1062 return LLDB_INVALID_REGNUM;
1065 bool RegisterContextDarwin_x86_64::HardwareSingleStep(bool enable) {
1066 if (ReadGPR(true) != 0)
1069 const uint64_t trace_bit = 0x100ull;
1072 if (gpr.rflags & trace_bit)
1073 return true; // trace bit is already set, there is nothing to do
1075 gpr.rflags |= trace_bit;
1077 if (gpr.rflags & trace_bit)
1078 gpr.rflags &= ~trace_bit;
1080 return true; // trace bit is clear, there is nothing to do
1083 return WriteGPR() == 0;