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 //===----------------------------------------------------------------------===//
12 #include <inttypes.h> // PRIx64
14 #include <stddef.h> // offsetof
17 // Other libraries and framework includes
18 #include "lldb/Core/DataBufferHeap.h"
19 #include "lldb/Core/DataExtractor.h"
20 #include "lldb/Core/Log.h"
21 #include "lldb/Core/RegisterValue.h"
22 #include "lldb/Core/Scalar.h"
23 #include "lldb/Host/Endian.h"
24 #include "llvm/ADT/STLExtras.h"
25 #include "llvm/Support/Compiler.h"
27 // Support building against older versions of LLVM, this macro was added
29 #ifndef LLVM_EXTENSION
30 #define LLVM_EXTENSION
34 #include "RegisterContextDarwin_x86_64.h"
37 using namespace lldb_private;
114 enum ehframe_dwarf_regnums
116 ehframe_dwarf_gpr_rax = 0,
117 ehframe_dwarf_gpr_rdx,
118 ehframe_dwarf_gpr_rcx,
119 ehframe_dwarf_gpr_rbx,
120 ehframe_dwarf_gpr_rsi,
121 ehframe_dwarf_gpr_rdi,
122 ehframe_dwarf_gpr_rbp,
123 ehframe_dwarf_gpr_rsp,
124 ehframe_dwarf_gpr_r8,
125 ehframe_dwarf_gpr_r9,
126 ehframe_dwarf_gpr_r10,
127 ehframe_dwarf_gpr_r11,
128 ehframe_dwarf_gpr_r12,
129 ehframe_dwarf_gpr_r13,
130 ehframe_dwarf_gpr_r14,
131 ehframe_dwarf_gpr_r15,
132 ehframe_dwarf_gpr_rip,
133 ehframe_dwarf_fpu_xmm0,
134 ehframe_dwarf_fpu_xmm1,
135 ehframe_dwarf_fpu_xmm2,
136 ehframe_dwarf_fpu_xmm3,
137 ehframe_dwarf_fpu_xmm4,
138 ehframe_dwarf_fpu_xmm5,
139 ehframe_dwarf_fpu_xmm6,
140 ehframe_dwarf_fpu_xmm7,
141 ehframe_dwarf_fpu_xmm8,
142 ehframe_dwarf_fpu_xmm9,
143 ehframe_dwarf_fpu_xmm10,
144 ehframe_dwarf_fpu_xmm11,
145 ehframe_dwarf_fpu_xmm12,
146 ehframe_dwarf_fpu_xmm13,
147 ehframe_dwarf_fpu_xmm14,
148 ehframe_dwarf_fpu_xmm15,
149 ehframe_dwarf_fpu_stmm0,
150 ehframe_dwarf_fpu_stmm1,
151 ehframe_dwarf_fpu_stmm2,
152 ehframe_dwarf_fpu_stmm3,
153 ehframe_dwarf_fpu_stmm4,
154 ehframe_dwarf_fpu_stmm5,
155 ehframe_dwarf_fpu_stmm6,
156 ehframe_dwarf_fpu_stmm7
160 #define GPR_OFFSET(reg) (LLVM_EXTENSION offsetof (RegisterContextDarwin_x86_64::GPR, reg))
161 #define FPU_OFFSET(reg) (LLVM_EXTENSION offsetof (RegisterContextDarwin_x86_64::FPU, reg) + sizeof (RegisterContextDarwin_x86_64::GPR))
162 #define EXC_OFFSET(reg) (LLVM_EXTENSION offsetof (RegisterContextDarwin_x86_64::EXC, reg) + sizeof (RegisterContextDarwin_x86_64::GPR) + sizeof (RegisterContextDarwin_x86_64::FPU))
164 // These macros will auto define the register name, alt name, register size,
165 // register offset, encoding, format and native register. This ensures that
166 // the register state structures are defined correctly and have the correct
167 // sizes and offsets.
168 #define DEFINE_GPR(reg, alt) #reg, alt, sizeof(((RegisterContextDarwin_x86_64::GPR *)NULL)->reg), GPR_OFFSET(reg), eEncodingUint, eFormatHex
169 #define DEFINE_FPU_UINT(reg) #reg, NULL, sizeof(((RegisterContextDarwin_x86_64::FPU *)NULL)->reg), FPU_OFFSET(reg), eEncodingUint, eFormatHex
170 #define DEFINE_FPU_VECT(reg, i) #reg#i, NULL, sizeof(((RegisterContextDarwin_x86_64::FPU *)NULL)->reg[i].bytes), FPU_OFFSET(reg[i]), eEncodingVector, eFormatVectorOfUInt8, { ehframe_dwarf_fpu_##reg##i, ehframe_dwarf_fpu_##reg##i, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpu_##reg##i }, NULL, NULL
171 #define DEFINE_EXC(reg) #reg, NULL, sizeof(((RegisterContextDarwin_x86_64::EXC *)NULL)->reg), EXC_OFFSET(reg), eEncodingUint, eFormatHex
173 #define REG_CONTEXT_SIZE (sizeof (RegisterContextDarwin_x86_64::GPR) + sizeof (RegisterContextDarwin_x86_64::FPU) + sizeof (RegisterContextDarwin_x86_64::EXC))
175 // General purpose registers for 64 bit
176 static RegisterInfo g_register_infos[] =
178 // Macro auto defines most stuff EH_FRAME DWARF GENERIC PROCESS PLUGIN LLDB VALUE REGS INVALIDATE REGS
179 // =============================== ====================== =================== ========================== ==================== =================== ========== ===============
180 { DEFINE_GPR (rax , NULL) , { ehframe_dwarf_gpr_rax , ehframe_dwarf_gpr_rax , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_rax }, NULL, NULL},
181 { DEFINE_GPR (rbx , NULL) , { ehframe_dwarf_gpr_rbx , ehframe_dwarf_gpr_rbx , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_rbx }, NULL, NULL},
182 { DEFINE_GPR (rcx , NULL) , { ehframe_dwarf_gpr_rcx , ehframe_dwarf_gpr_rcx , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_rcx }, NULL, NULL},
183 { DEFINE_GPR (rdx , NULL) , { ehframe_dwarf_gpr_rdx , ehframe_dwarf_gpr_rdx , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_rdx }, NULL, NULL},
184 { DEFINE_GPR (rdi , NULL) , { ehframe_dwarf_gpr_rdi , ehframe_dwarf_gpr_rdi , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_rdi }, NULL, NULL},
185 { DEFINE_GPR (rsi , NULL) , { ehframe_dwarf_gpr_rsi , ehframe_dwarf_gpr_rsi , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_rsi }, NULL, NULL},
186 { DEFINE_GPR (rbp , "fp") , { ehframe_dwarf_gpr_rbp , ehframe_dwarf_gpr_rbp , LLDB_REGNUM_GENERIC_FP , LLDB_INVALID_REGNUM, gpr_rbp }, NULL, NULL},
187 { DEFINE_GPR (rsp , "sp") , { ehframe_dwarf_gpr_rsp , ehframe_dwarf_gpr_rsp , LLDB_REGNUM_GENERIC_SP , LLDB_INVALID_REGNUM, gpr_rsp }, NULL, NULL},
188 { DEFINE_GPR (r8 , NULL) , { ehframe_dwarf_gpr_r8 , ehframe_dwarf_gpr_r8 , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_r8 }, NULL, NULL},
189 { DEFINE_GPR (r9 , NULL) , { ehframe_dwarf_gpr_r9 , ehframe_dwarf_gpr_r9 , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_r9 }, NULL, NULL},
190 { DEFINE_GPR (r10 , NULL) , { ehframe_dwarf_gpr_r10 , ehframe_dwarf_gpr_r10 , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_r10 }, NULL, NULL},
191 { DEFINE_GPR (r11 , NULL) , { ehframe_dwarf_gpr_r11 , ehframe_dwarf_gpr_r11 , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_r11 }, NULL, NULL},
192 { DEFINE_GPR (r12 , NULL) , { ehframe_dwarf_gpr_r12 , ehframe_dwarf_gpr_r12 , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_r12 }, NULL, NULL},
193 { DEFINE_GPR (r13 , NULL) , { ehframe_dwarf_gpr_r13 , ehframe_dwarf_gpr_r13 , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_r13 }, NULL, NULL},
194 { DEFINE_GPR (r14 , NULL) , { ehframe_dwarf_gpr_r14 , ehframe_dwarf_gpr_r14 , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_r14 }, NULL, NULL},
195 { DEFINE_GPR (r15 , NULL) , { ehframe_dwarf_gpr_r15 , ehframe_dwarf_gpr_r15 , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_r15 }, NULL, NULL},
196 { DEFINE_GPR (rip , "pc") , { ehframe_dwarf_gpr_rip , ehframe_dwarf_gpr_rip , LLDB_REGNUM_GENERIC_PC , LLDB_INVALID_REGNUM, gpr_rip }, NULL, NULL},
197 { DEFINE_GPR (rflags, "flags") , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, gpr_rflags }, NULL, NULL},
198 { DEFINE_GPR (cs , NULL) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_cs }, NULL, NULL},
199 { DEFINE_GPR (fs , NULL) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_fs }, NULL, NULL},
200 { DEFINE_GPR (gs , NULL) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, gpr_gs }, NULL, NULL},
202 { DEFINE_FPU_UINT(fcw) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, fpu_fcw }, NULL, NULL},
203 { DEFINE_FPU_UINT(fsw) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, fpu_fsw }, NULL, NULL},
204 { DEFINE_FPU_UINT(ftw) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, fpu_ftw }, NULL, NULL},
205 { DEFINE_FPU_UINT(fop) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, fpu_fop }, NULL, NULL},
206 { DEFINE_FPU_UINT(ip) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, fpu_ip }, NULL, NULL},
207 { DEFINE_FPU_UINT(cs) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, fpu_cs }, NULL, NULL},
208 { DEFINE_FPU_UINT(dp) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, fpu_dp }, NULL, NULL},
209 { DEFINE_FPU_UINT(ds) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, fpu_ds }, NULL, NULL},
210 { DEFINE_FPU_UINT(mxcsr) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, fpu_mxcsr }, NULL, NULL},
211 { DEFINE_FPU_UINT(mxcsrmask) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, fpu_mxcsrmask }, NULL, NULL},
212 { DEFINE_FPU_VECT(stmm,0) },
213 { DEFINE_FPU_VECT(stmm,1) },
214 { DEFINE_FPU_VECT(stmm,2) },
215 { DEFINE_FPU_VECT(stmm,3) },
216 { DEFINE_FPU_VECT(stmm,4) },
217 { DEFINE_FPU_VECT(stmm,5) },
218 { DEFINE_FPU_VECT(stmm,6) },
219 { DEFINE_FPU_VECT(stmm,7) },
220 { DEFINE_FPU_VECT(xmm,0) },
221 { DEFINE_FPU_VECT(xmm,1) },
222 { DEFINE_FPU_VECT(xmm,2) },
223 { DEFINE_FPU_VECT(xmm,3) },
224 { DEFINE_FPU_VECT(xmm,4) },
225 { DEFINE_FPU_VECT(xmm,5) },
226 { DEFINE_FPU_VECT(xmm,6) },
227 { DEFINE_FPU_VECT(xmm,7) },
228 { DEFINE_FPU_VECT(xmm,8) },
229 { DEFINE_FPU_VECT(xmm,9) },
230 { DEFINE_FPU_VECT(xmm,10) },
231 { DEFINE_FPU_VECT(xmm,11) },
232 { DEFINE_FPU_VECT(xmm,12) },
233 { DEFINE_FPU_VECT(xmm,13) },
234 { DEFINE_FPU_VECT(xmm,14) },
235 { DEFINE_FPU_VECT(xmm,15) },
237 { DEFINE_EXC(trapno) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, exc_trapno }, NULL, NULL},
238 { DEFINE_EXC(err) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, exc_err }, NULL, NULL},
239 { DEFINE_EXC(faultvaddr) , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM, exc_faultvaddr }, NULL, NULL}
242 static size_t k_num_register_infos = llvm::array_lengthof(g_register_infos);
244 RegisterContextDarwin_x86_64::RegisterContextDarwin_x86_64 (Thread &thread, uint32_t concrete_frame_idx) :
245 RegisterContext (thread, concrete_frame_idx),
251 for (i=0; i<kNumErrors; i++)
259 RegisterContextDarwin_x86_64::~RegisterContextDarwin_x86_64()
265 RegisterContextDarwin_x86_64::InvalidateAllRegisters ()
267 InvalidateAllRegisterStates();
272 RegisterContextDarwin_x86_64::GetRegisterCount ()
274 assert(k_num_register_infos == k_num_registers);
275 return k_num_registers;
280 RegisterContextDarwin_x86_64::GetRegisterInfoAtIndex (size_t reg)
282 assert(k_num_register_infos == k_num_registers);
283 if (reg < k_num_registers)
284 return &g_register_infos[reg];
290 RegisterContextDarwin_x86_64::GetRegisterInfosCount ()
292 return k_num_register_infos;
295 const lldb_private::RegisterInfo *
296 RegisterContextDarwin_x86_64::GetRegisterInfos ()
298 return g_register_infos;
303 static uint32_t g_gpr_regnums[] =
328 static uint32_t g_fpu_regnums[] =
374 // Number of registers in each register set
375 const size_t k_num_gpr_registers = llvm::array_lengthof(g_gpr_regnums);
376 const size_t k_num_fpu_registers = llvm::array_lengthof(g_fpu_regnums);
377 const size_t k_num_exc_registers = llvm::array_lengthof(g_exc_regnums);
379 //----------------------------------------------------------------------
380 // Register set definitions. The first definitions at register set index
381 // of zero is for all registers, followed by other registers sets. The
382 // register information for the all register set need not be filled in.
383 //----------------------------------------------------------------------
384 static const RegisterSet g_reg_sets[] =
386 { "General Purpose Registers", "gpr", k_num_gpr_registers, g_gpr_regnums, },
387 { "Floating Point Registers", "fpu", k_num_fpu_registers, g_fpu_regnums },
388 { "Exception State Registers", "exc", k_num_exc_registers, g_exc_regnums }
391 const size_t k_num_regsets = llvm::array_lengthof(g_reg_sets);
395 RegisterContextDarwin_x86_64::GetRegisterSetCount ()
397 return k_num_regsets;
401 RegisterContextDarwin_x86_64::GetRegisterSet (size_t reg_set)
403 if (reg_set < k_num_regsets)
404 return &g_reg_sets[reg_set];
409 RegisterContextDarwin_x86_64::GetSetForNativeRegNum (int reg_num)
411 if (reg_num < fpu_fcw)
413 else if (reg_num < exc_trapno)
415 else if (reg_num < k_num_registers)
421 RegisterContextDarwin_x86_64::LogGPR(Log *log, const char *format, ...)
428 va_start (args, format);
429 log->VAPrintf (format, args);
432 for (uint32_t i=0; i<k_num_gpr_registers; i++)
434 uint32_t reg = gpr_rax + i;
435 log->Printf("%12s = 0x%16.16" PRIx64, g_register_infos[reg].name, (&gpr.rax)[reg]);
441 RegisterContextDarwin_x86_64::ReadGPR (bool force)
444 if (force || !RegisterSetIsCached(set))
446 SetError(set, Read, DoReadGPR(GetThreadID(), set, gpr));
448 return GetError(GPRRegSet, Read);
452 RegisterContextDarwin_x86_64::ReadFPU (bool force)
455 if (force || !RegisterSetIsCached(set))
457 SetError(set, Read, DoReadFPU(GetThreadID(), set, fpu));
459 return GetError(FPURegSet, Read);
463 RegisterContextDarwin_x86_64::ReadEXC (bool force)
466 if (force || !RegisterSetIsCached(set))
468 SetError(set, Read, DoReadEXC(GetThreadID(), set, exc));
470 return GetError(EXCRegSet, Read);
474 RegisterContextDarwin_x86_64::WriteGPR ()
477 if (!RegisterSetIsCached(set))
479 SetError (set, Write, -1);
482 SetError (set, Write, DoWriteGPR(GetThreadID(), set, gpr));
483 SetError (set, Read, -1);
484 return GetError (set, Write);
488 RegisterContextDarwin_x86_64::WriteFPU ()
491 if (!RegisterSetIsCached(set))
493 SetError (set, Write, -1);
496 SetError (set, Write, DoWriteFPU(GetThreadID(), set, fpu));
497 SetError (set, Read, -1);
498 return GetError (set, Write);
502 RegisterContextDarwin_x86_64::WriteEXC ()
505 if (!RegisterSetIsCached(set))
507 SetError (set, Write, -1);
510 SetError (set, Write, DoWriteEXC(GetThreadID(), set, exc));
511 SetError (set, Read, -1);
512 return GetError (set, Write);
516 RegisterContextDarwin_x86_64::ReadRegisterSet(uint32_t set, bool force)
520 case GPRRegSet: return ReadGPR (force);
521 case FPURegSet: return ReadFPU (force);
522 case EXCRegSet: return ReadEXC (force);
529 RegisterContextDarwin_x86_64::WriteRegisterSet(uint32_t set)
531 // Make sure we have a valid context to set.
534 case GPRRegSet: return WriteGPR ();
535 case FPURegSet: return WriteFPU ();
536 case EXCRegSet: return WriteEXC ();
544 RegisterContextDarwin_x86_64::ReadRegister (const RegisterInfo *reg_info,
545 RegisterValue &value)
547 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
548 int set = RegisterContextDarwin_x86_64::GetSetForNativeRegNum (reg);
552 if (ReadRegisterSet(set, false) != 0)
578 value = (&gpr.rax)[reg - gpr_rax];
618 value = fpu.mxcsrmask;
629 value.SetBytes(fpu.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size, endian::InlHostByteOrder());
648 value.SetBytes(fpu.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size, endian::InlHostByteOrder());
660 value = exc.faultvaddr;
671 RegisterContextDarwin_x86_64::WriteRegister (const RegisterInfo *reg_info,
672 const RegisterValue &value)
674 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
675 int set = RegisterContextDarwin_x86_64::GetSetForNativeRegNum (reg);
680 if (ReadRegisterSet(set, false) != 0)
706 (&gpr.rax)[reg - gpr_rax] = value.GetAsUInt64();
710 fpu.fcw = value.GetAsUInt16();
714 fpu.fsw = value.GetAsUInt16();
718 fpu.ftw = value.GetAsUInt8();
722 fpu.fop = value.GetAsUInt16();
726 fpu.ip = value.GetAsUInt32();
730 fpu.cs = value.GetAsUInt16();
734 fpu.dp = value.GetAsUInt32();
738 fpu.ds = value.GetAsUInt16();
742 fpu.mxcsr = value.GetAsUInt32();
746 fpu.mxcsrmask = value.GetAsUInt32();
757 ::memcpy (fpu.stmm[reg - fpu_stmm0].bytes, value.GetBytes(), value.GetByteSize());
776 ::memcpy (fpu.xmm[reg - fpu_xmm0].bytes, value.GetBytes(), value.GetByteSize());
780 exc.trapno = value.GetAsUInt32();
784 exc.err = value.GetAsUInt32();
788 exc.faultvaddr = value.GetAsUInt64();
794 return WriteRegisterSet(set) == 0;
798 RegisterContextDarwin_x86_64::ReadAllRegisterValues (lldb::DataBufferSP &data_sp)
800 data_sp.reset (new DataBufferHeap (REG_CONTEXT_SIZE, 0));
802 ReadGPR (false) == 0 &&
803 ReadFPU (false) == 0 &&
804 ReadEXC (false) == 0)
806 uint8_t *dst = data_sp->GetBytes();
807 ::memcpy (dst, &gpr, sizeof(gpr));
810 ::memcpy (dst, &fpu, sizeof(fpu));
813 ::memcpy (dst, &exc, sizeof(exc));
820 RegisterContextDarwin_x86_64::WriteAllRegisterValues (const lldb::DataBufferSP &data_sp)
822 if (data_sp && data_sp->GetByteSize() == REG_CONTEXT_SIZE)
824 const uint8_t *src = data_sp->GetBytes();
825 ::memcpy (&gpr, src, sizeof(gpr));
828 ::memcpy (&fpu, src, sizeof(fpu));
831 ::memcpy (&exc, src, sizeof(exc));
832 uint32_t success_count = 0;
839 return success_count == 3;
846 RegisterContextDarwin_x86_64::ConvertRegisterKindToRegisterNumber (lldb::RegisterKind kind, uint32_t reg)
848 if (kind == eRegisterKindGeneric)
852 case LLDB_REGNUM_GENERIC_PC: return gpr_rip;
853 case LLDB_REGNUM_GENERIC_SP: return gpr_rsp;
854 case LLDB_REGNUM_GENERIC_FP: return gpr_rbp;
855 case LLDB_REGNUM_GENERIC_FLAGS: return gpr_rflags;
856 case LLDB_REGNUM_GENERIC_RA:
861 else if (kind == eRegisterKindEHFrame || kind == eRegisterKindDWARF)
865 case ehframe_dwarf_gpr_rax: return gpr_rax;
866 case ehframe_dwarf_gpr_rdx: return gpr_rdx;
867 case ehframe_dwarf_gpr_rcx: return gpr_rcx;
868 case ehframe_dwarf_gpr_rbx: return gpr_rbx;
869 case ehframe_dwarf_gpr_rsi: return gpr_rsi;
870 case ehframe_dwarf_gpr_rdi: return gpr_rdi;
871 case ehframe_dwarf_gpr_rbp: return gpr_rbp;
872 case ehframe_dwarf_gpr_rsp: return gpr_rsp;
873 case ehframe_dwarf_gpr_r8: return gpr_r8;
874 case ehframe_dwarf_gpr_r9: return gpr_r9;
875 case ehframe_dwarf_gpr_r10: return gpr_r10;
876 case ehframe_dwarf_gpr_r11: return gpr_r11;
877 case ehframe_dwarf_gpr_r12: return gpr_r12;
878 case ehframe_dwarf_gpr_r13: return gpr_r13;
879 case ehframe_dwarf_gpr_r14: return gpr_r14;
880 case ehframe_dwarf_gpr_r15: return gpr_r15;
881 case ehframe_dwarf_gpr_rip: return gpr_rip;
882 case ehframe_dwarf_fpu_xmm0: return fpu_xmm0;
883 case ehframe_dwarf_fpu_xmm1: return fpu_xmm1;
884 case ehframe_dwarf_fpu_xmm2: return fpu_xmm2;
885 case ehframe_dwarf_fpu_xmm3: return fpu_xmm3;
886 case ehframe_dwarf_fpu_xmm4: return fpu_xmm4;
887 case ehframe_dwarf_fpu_xmm5: return fpu_xmm5;
888 case ehframe_dwarf_fpu_xmm6: return fpu_xmm6;
889 case ehframe_dwarf_fpu_xmm7: return fpu_xmm7;
890 case ehframe_dwarf_fpu_xmm8: return fpu_xmm8;
891 case ehframe_dwarf_fpu_xmm9: return fpu_xmm9;
892 case ehframe_dwarf_fpu_xmm10: return fpu_xmm10;
893 case ehframe_dwarf_fpu_xmm11: return fpu_xmm11;
894 case ehframe_dwarf_fpu_xmm12: return fpu_xmm12;
895 case ehframe_dwarf_fpu_xmm13: return fpu_xmm13;
896 case ehframe_dwarf_fpu_xmm14: return fpu_xmm14;
897 case ehframe_dwarf_fpu_xmm15: return fpu_xmm15;
898 case ehframe_dwarf_fpu_stmm0: return fpu_stmm0;
899 case ehframe_dwarf_fpu_stmm1: return fpu_stmm1;
900 case ehframe_dwarf_fpu_stmm2: return fpu_stmm2;
901 case ehframe_dwarf_fpu_stmm3: return fpu_stmm3;
902 case ehframe_dwarf_fpu_stmm4: return fpu_stmm4;
903 case ehframe_dwarf_fpu_stmm5: return fpu_stmm5;
904 case ehframe_dwarf_fpu_stmm6: return fpu_stmm6;
905 case ehframe_dwarf_fpu_stmm7: return fpu_stmm7;
910 else if (kind == eRegisterKindLLDB)
914 return LLDB_INVALID_REGNUM;
918 RegisterContextDarwin_x86_64::HardwareSingleStep (bool enable)
920 if (ReadGPR(true) != 0)
923 const uint64_t trace_bit = 0x100ull;
927 if (gpr.rflags & trace_bit)
928 return true; // trace bit is already set, there is nothing to do
930 gpr.rflags |= trace_bit;
934 if (gpr.rflags & trace_bit)
935 gpr.rflags &= ~trace_bit;
937 return true; // trace bit is clear, there is nothing to do
940 return WriteGPR() == 0;