20#include "llvm/ADT/STLExtras.h"
21#include "llvm/Support/Compiler.h"
27#if defined(__APPLE__) && (defined(__arm64__) || defined(__aarch64__))
29#include <sys/sysctl.h>
37#define GPR_OFFSET(idx) ((idx)*8)
38#define GPR_OFFSET_NAME(reg) \
39 (LLVM_EXTENSION offsetof(RegisterContextDarwin_arm64::GPR, reg))
41#define FPU_OFFSET(idx) ((idx)*16 + sizeof(RegisterContextDarwin_arm64::GPR))
42#define FPU_OFFSET_NAME(reg) \
43 (LLVM_EXTENSION offsetof(RegisterContextDarwin_arm64::FPU, reg))
45#define EXC_OFFSET_NAME(reg) \
46 (LLVM_EXTENSION offsetof(RegisterContextDarwin_arm64::EXC, reg) + \
47 sizeof(RegisterContextDarwin_arm64::GPR) + \
48 sizeof(RegisterContextDarwin_arm64::FPU))
49#define DBG_OFFSET_NAME(reg) \
50 (LLVM_EXTENSION offsetof(RegisterContextDarwin_arm64::DBG, reg) + \
51 sizeof(RegisterContextDarwin_arm64::GPR) + \
52 sizeof(RegisterContextDarwin_arm64::FPU) + \
53 sizeof(RegisterContextDarwin_arm64::EXC))
55#define DEFINE_DBG(reg, i) \
57 sizeof(((RegisterContextDarwin_arm64::DBG *) NULL)->reg[i]), \
58 DBG_OFFSET_NAME(reg[i]), eEncodingUint, eFormatHex, \
59 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \
60 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \
61 LLDB_INVALID_REGNUM }, \
63#define REG_CONTEXT_SIZE \
64 (sizeof(RegisterContextDarwin_arm64::GPR) + \
65 sizeof(RegisterContextDarwin_arm64::FPU) + \
66 sizeof(RegisterContextDarwin_arm64::EXC))
69#define DECLARE_REGISTER_INFOS_ARM64_STRUCT
71#undef DECLARE_REGISTER_INFOS_ARM64_STRUCT
75 gpr_x0, gpr_x1, gpr_x2, gpr_x3, gpr_x4, gpr_x5, gpr_x6,
76 gpr_x7, gpr_x8, gpr_x9, gpr_x10, gpr_x11, gpr_x12, gpr_x13,
77 gpr_x14, gpr_x15, gpr_x16, gpr_x17, gpr_x18, gpr_x19, gpr_x20,
78 gpr_x21, gpr_x22, gpr_x23, gpr_x24, gpr_x25, gpr_x26, gpr_x27,
83 fpu_v0, fpu_v1, fpu_v2, fpu_v3, fpu_v4, fpu_v5, fpu_v6,
84 fpu_v7, fpu_v8, fpu_v9, fpu_v10, fpu_v11, fpu_v12, fpu_v13,
85 fpu_v14, fpu_v15, fpu_v16, fpu_v17, fpu_v18, fpu_v19, fpu_v20,
86 fpu_v21, fpu_v22, fpu_v23, fpu_v24, fpu_v25, fpu_v26, fpu_v27,
87 fpu_v28, fpu_v29, fpu_v30, fpu_v31, fpu_fpsr, fpu_fpcr};
96 Thread &thread, uint32_t concrete_frame_idx)
97 :
RegisterContext(thread, concrete_frame_idx), gpr(), fpu(), exc(), dbg() {
121 return &g_register_infos_arm64_le[reg];
130 return g_register_infos_arm64_le;
284 for (uint32_t i = 0; i < 16; i++)
286 "BVR%-2u/BCR%-2u = { 0x%8.8" PRIu64
", 0x%8.8" PRIu64
287 " } WVR%-2u/WCR%-2u "
288 "= { 0x%8.8" PRIu64
", 0x%8.8" PRIu64
" }",
382 if (process_sp.get()) {
384 process_sp->GetAddressByteSize());
386 uint64_t retval = regdata.
GetMaxU64(&offset, 8);
387 uint32_t retval_lower32 =
static_cast<uint32_t
>(retval & 0xffffffff);
461 if (process_sp.get()) {
463 process_sp->GetAddressByteSize());
502 if (process_sp.get()) {
504 process_sp->GetAddressByteSize());
649 uint8_t *dst = data_sp->GetBytes();
650 ::memcpy(dst, &
gpr,
sizeof(
gpr));
653 ::memcpy(dst, &
fpu,
sizeof(
fpu));
656 ::memcpy(dst, &
exc,
sizeof(
exc));
665 const uint8_t *src = data_sp->GetBytes();
666 ::memcpy(&
gpr, src,
sizeof(
gpr));
669 ::memcpy(&
fpu, src,
sizeof(
fpu));
672 ::memcpy(&
exc, src,
sizeof(
exc));
673 uint32_t success_count = 0;
680 return success_count == 3;
920#if defined(__APPLE__) && (defined(__arm64__) || defined(__aarch64__))
922 static uint32_t g_num_supported_hw_watchpoints =
UINT32_MAX;
923 if (g_num_supported_hw_watchpoints ==
UINT32_MAX) {
927 if (::sysctlbyname(
"hw.optional.watchpoint", &n, &len, NULL, 0) == 0) {
928 g_num_supported_hw_watchpoints = n;
931 return g_num_supported_hw_watchpoints;
964 uint32_t addr_word_offset = addr % 4;
969 uint32_t byte_mask = ((1u << size) - 1u) << addr_word_offset;
973 if (byte_mask > 0xfu)
983 for (i = 0; i < num_hw_watchpoints; ++i) {
989 if (i < num_hw_watchpoints) {
991 uint32_t byte_address_select = byte_mask << 5;
994 dbg.
wcr[i] = byte_address_select |
1023 if (hw_index < num_hw_points) {
static const uint32_t k_num_register_infos
#define LLDB_LOGF(log,...)
#define KERN_SUCCESS
Constants returned by various RegisterContextDarwin_*** functions.
#define KERN_INVALID_ARGUMENT
const size_t k_num_regsets
static uint32_t g_fpu_regnums[]
static uint32_t g_gpr_regnums[]
static uint32_t g_exc_regnums[]
const size_t k_num_gpr_registers
const size_t k_num_fpu_registers
static const RegisterSet g_reg_sets[]
const size_t k_num_exc_registers
static size_t k_num_register_infos
const size_t k_num_regsets
static RegisterSet g_reg_sets[]
bool ClearHardwareWatchpoint(uint32_t hw_index) override
virtual int DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc)=0
static int GetSetForNativeRegNum(int reg_num)
virtual int DoWriteDBG(lldb::tid_t tid, int flavor, const DBG &dbg)=0
virtual int DoWriteFPU(lldb::tid_t tid, int flavor, const FPU &fpu)=0
static const lldb_private::RegisterInfo * GetRegisterInfos()
int GetError(int flavor, uint32_t err_idx) const
bool RegisterSetIsCached(int set) const
size_t GetRegisterCount() override
virtual int DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu)=0
virtual int DoWriteEXC(lldb::tid_t tid, int flavor, const EXC &exc)=0
bool ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue ®_value) override
int ReadRegisterSet(uint32_t set, bool force)
bool SetError(int flavor, uint32_t err_idx, int err)
void InvalidateAllRegisterStates()
uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size, bool read, bool write) override
bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override
const lldb_private::RegisterInfo * GetRegisterInfoAtIndex(size_t reg) override
virtual int DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr)
void InvalidateAllRegisters() override
bool WriteRegister(const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue ®_value) override
virtual int DoReadDBG(lldb::tid_t tid, int flavor, DBG &dbg)=0
uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, uint32_t num) override
Convert from a given register numbering scheme to the lldb register numbering scheme.
bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override
uint32_t NumSupportedHardwareWatchpoints() override
~RegisterContextDarwin_arm64() override
static void LogDBGRegisters(lldb_private::Log *log, const DBG &dbg)
const lldb_private::RegisterSet * GetRegisterSet(size_t set) override
virtual int DoWriteGPR(lldb::tid_t tid, int flavor, const GPR &gpr)=0
static size_t GetRegisterInfosCount()
RegisterContextDarwin_arm64(lldb_private::Thread &thread, uint32_t concrete_frame_idx)
int WriteRegisterSet(uint32_t set)
size_t GetRegisterSetCount() override
virtual lldb::tid_t GetThreadID() const
void SetUInt64(uint64_t uint, Type t=eTypeUInt64)
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
void SetUInt32(uint32_t uint, Type t=eTypeUInt32)
uint32_t GetByteSize() const
lldb::ProcessSP GetProcess() const
#define LLDB_REGNUM_GENERIC_RA
#define LLDB_INVALID_INDEX32
#define LLDB_REGNUM_GENERIC_SP
#define LLDB_REGNUM_GENERIC_FLAGS
#define LLDB_INVALID_REGNUM
#define LLDB_REGNUM_GENERIC_PC
#define LLDB_REGNUM_GENERIC_FP
lldb::ByteOrder InlHostByteOrder()
A class that represents a running process on the host machine.
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
RegisterKind
Register numbering types.
@ eRegisterKindGeneric
insn ptr reg, stack ptr reg, etc not specific to any particular target
@ eRegisterKindLLDB
lldb's internal register numbers
@ eRegisterKindDWARF
the register numbers seen DWARF
@ eRegisterKindEHFrame
the register numbers seen in eh_frame
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.