9#if defined(__arm64__) || defined(__aarch64__)
36#define NT_ARM_SVE 0x405
39#ifndef NT_ARM_PAC_MASK
40#define NT_ARM_PAC_MASK 0x406
43#ifndef NT_ARM_TAGGED_ADDR_CTRL
44#define NT_ARM_TAGGED_ADDR_CTRL 0x409
47#define HWCAP_PACA (1 << 30)
48#define HWCAP2_MTE (1 << 18)
54std::unique_ptr<NativeRegisterContextLinux>
55NativeRegisterContextLinux::CreateHostNativeRegisterContextLinux(
58 case llvm::Triple::arm:
59 return std::make_unique<NativeRegisterContextLinux_arm>(target_arch,
61 case llvm::Triple::aarch64: {
64 struct user_sve_header sve_header;
66 ioVec.iov_base = &sve_header;
67 ioVec.iov_len =
sizeof(sve_header);
68 unsigned int regset = NT_ARM_SVE;
72 native_thread.
GetID(), ®set,
73 &ioVec,
sizeof(sve_header))
79 std::optional<uint64_t> auxv_at_hwcap =
81 if (auxv_at_hwcap && (*auxv_at_hwcap & HWCAP_PACA))
84 std::optional<uint64_t> auxv_at_hwcap2 =
86 if (auxv_at_hwcap2 && (*auxv_at_hwcap2 &
HWCAP2_MTE))
89 auto register_info_up =
90 std::make_unique<RegisterInfoPOSIX_arm64>(target_arch, opt_regsets);
91 return std::make_unique<NativeRegisterContextLinux_arm64>(
92 target_arch, native_thread, std::move(register_info_up));
95 llvm_unreachable(
"have no register context for architecture");
99llvm::Expected<ArchSpec>
100NativeRegisterContextLinux::DetermineArchitecture(
lldb::tid_t tid) {
101 return DetermineArchitectureViaGPR(
105NativeRegisterContextLinux_arm64::NativeRegisterContextLinux_arm64(
107 std::unique_ptr<RegisterInfoPOSIX_arm64> register_info_up)
109 register_info_up.release()),
111 ::memset(&m_fpr, 0,
sizeof(m_fpr));
112 ::memset(&m_gpr_arm64, 0,
sizeof(m_gpr_arm64));
113 ::memset(&m_hwp_regs, 0,
sizeof(m_hwp_regs));
114 ::memset(&m_hbp_regs, 0,
sizeof(m_hbp_regs));
115 ::memset(&m_sve_header, 0,
sizeof(m_sve_header));
116 ::memset(&m_pac_mask, 0,
sizeof(m_pac_mask));
121 m_max_hwp_supported = 16;
122 m_max_hbp_supported = 16;
124 m_refresh_hwdebug_info =
true;
126 m_gpr_is_valid =
false;
127 m_fpu_is_valid =
false;
128 m_sve_buffer_is_valid =
false;
129 m_sve_header_is_valid =
false;
130 m_pac_mask_is_valid =
false;
131 m_mte_ctrl_is_valid =
false;
133 if (GetRegisterInfo().IsSVEEnabled())
140NativeRegisterContextLinux_arm64::GetRegisterInfo()
const {
144uint32_t NativeRegisterContextLinux_arm64::GetRegisterSetCount()
const {
145 return GetRegisterInfo().GetRegisterSetCount();
149NativeRegisterContextLinux_arm64::GetRegisterSet(
uint32_t set_index)
const {
150 return GetRegisterInfo().GetRegisterSet(set_index);
153uint32_t NativeRegisterContextLinux_arm64::GetUserRegisterCount()
const {
155 for (
uint32_t set_index = 0; set_index < GetRegisterSetCount(); ++set_index)
156 count += GetRegisterSet(set_index)->num_registers;
161NativeRegisterContextLinux_arm64::ReadRegister(
const RegisterInfo *reg_info,
166 error.SetErrorString(
"reg_info NULL");
173 return Status(
"no lldb regnum for %s", reg_info && reg_info->name
175 :
"<unknown register>");
180 std::vector<uint8_t> sve_reg_non_live;
187 offset = reg_info->byte_offset;
188 assert(offset < GetGPRSize());
189 src = (uint8_t *)GetGPRBuffer() + offset;
191 }
else if (IsFPR(reg)) {
198 offset = CalculateFprOffset(reg_info);
199 assert(offset < GetFPRSize());
200 src = (uint8_t *)GetFPRBuffer() + offset;
203 error = ReadAllSVE();
212 if (reg == GetRegisterInfo().GetRegNumFPSR()) {
215 offset = sve::PTraceFPSROffset(sve::vq_from_vl(m_sve_header.vl));
217 offset = sve::ptrace_fpsimd_offset + (32 * 16);
218 }
else if (reg == GetRegisterInfo().GetRegNumFPCR()) {
221 offset = sve::PTraceFPCROffset(sve::vq_from_vl(m_sve_header.vl));
223 offset = sve::ptrace_fpsimd_offset + (32 * 16) + 4;
226 if (reg_info->value_regs &&
228 sve_reg_num = reg_info->value_regs[0];
229 offset = CalculateSVEOffset(GetRegisterInfoAtIndex(sve_reg_num));
232 assert(offset < GetSVEBufferSize());
233 src = (uint8_t *)GetSVEBuffer() + offset;
235 }
else if (IsSVE(reg)) {
238 return Status(
"SVE disabled or not supported");
240 if (GetRegisterInfo().IsSVERegVG(reg)) {
241 sve_vg = GetSVERegVG();
242 src = (uint8_t *)&sve_vg;
245 error = ReadAllSVE();
253 sve_reg_non_live.resize(reg_info->byte_size, 0);
254 src = sve_reg_non_live.data();
256 if (GetRegisterInfo().IsSVEZReg(reg)) {
257 offset = CalculateSVEOffset(reg_info);
258 assert(offset < GetSVEBufferSize());
259 ::memcpy(sve_reg_non_live.data(), (uint8_t *)GetSVEBuffer() + offset,
263 offset = CalculateSVEOffset(reg_info);
264 assert(offset < GetSVEBufferSize());
265 src = (uint8_t *)GetSVEBuffer() + offset;
268 }
else if (IsPAuth(reg)) {
269 error = ReadPAuthMask();
273 offset = reg_info->byte_offset - GetRegisterInfo().GetPAuthOffset();
274 assert(offset < GetPACMaskSize());
275 src = (uint8_t *)GetPACMask() + offset;
276 }
else if (IsMTE(reg)) {
277 error = ReadMTEControl();
281 offset = reg_info->byte_offset - GetRegisterInfo().GetMTEOffset();
282 assert(offset < GetMTEControlSize());
283 src = (uint8_t *)GetMTEControl() + offset;
285 return Status(
"failed - register wasn't recognized to be a GPR or an FPR, "
286 "write strategy unknown");
289 eByteOrderLittle,
error);
294Status NativeRegisterContextLinux_arm64::WriteRegister(
295 const RegisterInfo *reg_info,
const RegisterValue ®_value) {
299 return Status(
"reg_info NULL");
304 return Status(
"no lldb regnum for %s", reg_info && reg_info->name
306 :
"<unknown register>");
310 std::vector<uint8_t> sve_reg_non_live;
317 assert(reg_info->byte_offset < GetGPRSize());
318 dst = (uint8_t *)GetGPRBuffer() + reg_info->byte_offset;
319 ::memcpy(dst, reg_value.
GetBytes(), reg_info->byte_size);
322 }
else if (IsFPR(reg)) {
329 offset = CalculateFprOffset(reg_info);
330 assert(offset < GetFPRSize());
331 dst = (uint8_t *)GetFPRBuffer() + offset;
332 ::memcpy(dst, reg_value.
GetBytes(), reg_info->byte_size);
337 error = ReadAllSVE();
346 if (reg == GetRegisterInfo().GetRegNumFPSR()) {
349 offset = sve::PTraceFPSROffset(sve::vq_from_vl(m_sve_header.vl));
351 offset = sve::ptrace_fpsimd_offset + (32 * 16);
352 }
else if (reg == GetRegisterInfo().GetRegNumFPCR()) {
355 offset = sve::PTraceFPCROffset(sve::vq_from_vl(m_sve_header.vl));
357 offset = sve::ptrace_fpsimd_offset + (32 * 16) + 4;
360 if (reg_info->value_regs &&
362 sve_reg_num = reg_info->value_regs[0];
363 offset = CalculateSVEOffset(GetRegisterInfoAtIndex(sve_reg_num));
366 assert(offset < GetSVEBufferSize());
367 dst = (uint8_t *)GetSVEBuffer() + offset;
368 ::memcpy(dst, reg_value.
GetBytes(), reg_info->byte_size);
369 return WriteAllSVE();
371 }
else if (IsSVE(reg)) {
373 return Status(
"SVE disabled or not supported");
376 error = ReadAllSVE();
380 if (GetRegisterInfo().IsSVERegVG(reg)) {
383 if (sve_vl_valid(vg_value * 8)) {
384 if (m_sve_header_is_valid && vg_value == GetSVERegVG())
387 SetSVERegVG(vg_value);
389 error = WriteSVEHeader();
391 ConfigureRegisterContext();
393 if (m_sve_header_is_valid && vg_value == GetSVERegVG())
397 return Status(
"SVE vector length update failed.");
404 bool set_sve_state_full =
false;
405 const uint8_t *reg_bytes = (
const uint8_t *)reg_value.
GetBytes();
406 if (GetRegisterInfo().IsSVEZReg(reg)) {
407 for (
uint32_t i = 16; i < reg_info->byte_size; i++) {
409 set_sve_state_full =
true;
413 }
else if (GetRegisterInfo().IsSVEPReg(reg) ||
414 reg == GetRegisterInfo().GetRegNumSVEFFR()) {
415 for (
uint32_t i = 0; i < reg_info->byte_size; i++) {
417 set_sve_state_full =
true;
423 if (!set_sve_state_full && GetRegisterInfo().IsSVEZReg(reg)) {
426 offset = CalculateSVEOffset(reg_info);
427 assert(offset < GetSVEBufferSize());
428 dst = (uint8_t *)GetSVEBuffer() + offset;
429 ::memcpy(dst, reg_value.
GetBytes(), 16);
431 return WriteAllSVE();
433 return Status(
"SVE state change operation not supported");
435 offset = CalculateSVEOffset(reg_info);
436 assert(offset < GetSVEBufferSize());
437 dst = (uint8_t *)GetSVEBuffer() + offset;
438 ::memcpy(dst, reg_value.
GetBytes(), reg_info->byte_size);
439 return WriteAllSVE();
442 }
else if (IsMTE(reg)) {
443 error = ReadMTEControl();
447 offset = reg_info->byte_offset - GetRegisterInfo().GetMTEOffset();
448 assert(offset < GetMTEControlSize());
449 dst = (uint8_t *)GetMTEControl() + offset;
450 ::memcpy(dst, reg_value.
GetBytes(), reg_info->byte_size);
452 return WriteMTEControl();
455 return Status(
"Failed to write register value");
458Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues(
459 lldb::WritableDataBufferSP &data_sp) {
470 uint32_t reg_data_byte_size = GetGPRBufferSize();
476 if (GetRegisterInfo().IsSVEEnabled()) {
477 reg_data_byte_size += GetSVEBufferSize();
478 error = ReadAllSVE();
480 reg_data_byte_size += GetFPRSize();
486 if (GetRegisterInfo().IsMTEEnabled()) {
487 reg_data_byte_size += GetMTEControlSize();
488 error = ReadMTEControl();
494 uint8_t *dst = data_sp->GetBytes();
496 ::memcpy(dst, GetGPRBuffer(), GetGPRBufferSize());
497 dst += GetGPRBufferSize();
499 if (GetRegisterInfo().IsSVEEnabled()) {
500 ::memcpy(dst, GetSVEBuffer(), GetSVEBufferSize());
501 dst += GetSVEBufferSize();
503 ::memcpy(dst, GetFPRBuffer(), GetFPRSize());
507 if (GetRegisterInfo().IsMTEEnabled())
508 ::memcpy(dst, GetMTEControl(), GetMTEControlSize());
513Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues(
514 const lldb::DataBufferSP &data_sp) {
528 error.SetErrorStringWithFormat(
529 "NativeRegisterContextLinux_arm64::%s invalid data_sp provided",
534 const uint8_t *src = data_sp->GetBytes();
535 if (src ==
nullptr) {
536 error.SetErrorStringWithFormat(
"NativeRegisterContextLinux_arm64::%s "
537 "DataBuffer::GetBytes() returned a null "
543 uint64_t reg_data_min_size = GetGPRBufferSize() + GetFPRSize();
544 if (data_sp->GetByteSize() < reg_data_min_size) {
545 error.SetErrorStringWithFormat(
546 "NativeRegisterContextLinux_arm64::%s data_sp contained insufficient "
547 "register data bytes, expected at least %" PRIu64
", actual %" PRIu64,
548 __FUNCTION__, reg_data_min_size, data_sp->GetByteSize());
553 ::memcpy(GetGPRBuffer(), src, GetGPRBufferSize());
554 m_gpr_is_valid =
true;
560 src += GetGPRBufferSize();
563 bool contains_sve_reg_data =
564 (data_sp->GetByteSize() > (reg_data_min_size + GetSVEHeaderSize()));
566 if (contains_sve_reg_data) {
568 ::memcpy(GetSVEHeader(), src, GetSVEHeaderSize());
569 if (!sve_vl_valid(m_sve_header.vl)) {
570 m_sve_header_is_valid =
false;
571 error.SetErrorStringWithFormat(
"NativeRegisterContextLinux_arm64::%s "
572 "Invalid SVE header in data_sp",
576 m_sve_header_is_valid =
true;
577 error = WriteSVEHeader();
582 ConfigureRegisterContext();
585 reg_data_min_size = GetGPRBufferSize() + GetSVEBufferSize();
586 if (data_sp->GetByteSize() < reg_data_min_size) {
587 error.SetErrorStringWithFormat(
588 "NativeRegisterContextLinux_arm64::%s data_sp contained insufficient "
589 "register data bytes, expected %" PRIu64
", actual %" PRIu64,
590 __FUNCTION__, reg_data_min_size, data_sp->GetByteSize());
594 ::memcpy(GetSVEBuffer(), src, GetSVEBufferSize());
595 m_sve_buffer_is_valid =
true;
596 error = WriteAllSVE();
597 src += GetSVEBufferSize();
599 ::memcpy(GetFPRBuffer(), src, GetFPRSize());
600 m_fpu_is_valid =
true;
608 if (GetRegisterInfo().IsMTEEnabled() &&
609 data_sp->GetByteSize() > reg_data_min_size) {
610 ::memcpy(GetMTEControl(), src, GetMTEControlSize());
611 m_mte_ctrl_is_valid =
true;
612 error = WriteMTEControl();
618bool NativeRegisterContextLinux_arm64::IsGPR(
unsigned reg)
const {
619 if (GetRegisterInfo().GetRegisterSetFromRegisterIndex(reg) ==
625bool NativeRegisterContextLinux_arm64::IsFPR(
unsigned reg)
const {
626 if (GetRegisterInfo().GetRegisterSetFromRegisterIndex(reg) ==
632bool NativeRegisterContextLinux_arm64::IsSVE(
unsigned reg)
const {
633 return GetRegisterInfo().IsSVEReg(reg);
636bool NativeRegisterContextLinux_arm64::IsPAuth(
unsigned reg)
const {
637 return GetRegisterInfo().IsPAuthReg(reg);
640bool NativeRegisterContextLinux_arm64::IsMTE(
unsigned reg)
const {
641 return GetRegisterInfo().IsMTEReg(reg);
644llvm::Error NativeRegisterContextLinux_arm64::ReadHardwareDebugInfo() {
645 if (!m_refresh_hwdebug_info) {
646 return llvm::Error::success();
649 ::pid_t tid = m_thread.GetID();
651 int regset = NT_ARM_HW_WATCH;
653 struct user_hwdebug_state dreg_state;
656 ioVec.iov_base = &dreg_state;
657 ioVec.iov_len =
sizeof(dreg_state);
659 &ioVec, ioVec.iov_len);
662 return error.ToError();
664 m_max_hwp_supported = dreg_state.dbg_info & 0xff;
666 regset = NT_ARM_HW_BREAK;
668 &ioVec, ioVec.iov_len);
671 return error.ToError();
673 m_max_hbp_supported = dreg_state.dbg_info & 0xff;
674 m_refresh_hwdebug_info =
false;
676 return llvm::Error::success();
680NativeRegisterContextLinux_arm64::WriteHardwareDebugRegs(DREGType hwbType) {
682 struct user_hwdebug_state dreg_state;
685 memset(&dreg_state, 0,
sizeof(dreg_state));
686 ioVec.iov_base = &dreg_state;
690 regset = NT_ARM_HW_WATCH;
691 ioVec.iov_len =
sizeof(dreg_state.dbg_info) +
sizeof(dreg_state.pad) +
692 (
sizeof(dreg_state.dbg_regs[0]) * m_max_hwp_supported);
694 for (
uint32_t i = 0; i < m_max_hwp_supported; i++) {
695 dreg_state.dbg_regs[i].addr = m_hwp_regs[i].address;
696 dreg_state.dbg_regs[i].ctrl = m_hwp_regs[i].control;
700 regset = NT_ARM_HW_BREAK;
701 ioVec.iov_len =
sizeof(dreg_state.dbg_info) +
sizeof(dreg_state.pad) +
702 (
sizeof(dreg_state.dbg_regs[0]) * m_max_hbp_supported);
704 for (
uint32_t i = 0; i < m_max_hbp_supported; i++) {
705 dreg_state.dbg_regs[i].addr = m_hbp_regs[i].address;
706 dreg_state.dbg_regs[i].ctrl = m_hbp_regs[i].control;
711 return NativeProcessLinux::PtraceWrapper(
PTRACE_SETREGSET, m_thread.GetID(),
712 ®set, &ioVec, ioVec.iov_len)
716Status NativeRegisterContextLinux_arm64::ReadGPR() {
723 ioVec.iov_base = GetGPRBuffer();
724 ioVec.iov_len = GetGPRBufferSize();
726 error = ReadRegisterSet(&ioVec, GetGPRBufferSize(), NT_PRSTATUS);
729 m_gpr_is_valid =
true;
734Status NativeRegisterContextLinux_arm64::WriteGPR() {
740 ioVec.iov_base = GetGPRBuffer();
741 ioVec.iov_len = GetGPRBufferSize();
743 m_gpr_is_valid =
false;
745 return WriteRegisterSet(&ioVec, GetGPRBufferSize(), NT_PRSTATUS);
748Status NativeRegisterContextLinux_arm64::ReadFPR() {
755 ioVec.iov_base = GetFPRBuffer();
756 ioVec.iov_len = GetFPRSize();
758 error = ReadRegisterSet(&ioVec, GetFPRSize(), NT_FPREGSET);
761 m_fpu_is_valid =
true;
766Status NativeRegisterContextLinux_arm64::WriteFPR() {
772 ioVec.iov_base = GetFPRBuffer();
773 ioVec.iov_len = GetFPRSize();
775 m_fpu_is_valid =
false;
777 return WriteRegisterSet(&ioVec, GetFPRSize(), NT_FPREGSET);
780void NativeRegisterContextLinux_arm64::InvalidateAllRegisters() {
781 m_gpr_is_valid =
false;
782 m_fpu_is_valid =
false;
783 m_sve_buffer_is_valid =
false;
784 m_sve_header_is_valid =
false;
785 m_pac_mask_is_valid =
false;
786 m_mte_ctrl_is_valid =
false;
789 ConfigureRegisterContext();
792Status NativeRegisterContextLinux_arm64::ReadSVEHeader() {
795 if (m_sve_header_is_valid)
799 ioVec.iov_base = GetSVEHeader();
800 ioVec.iov_len = GetSVEHeaderSize();
802 error = ReadRegisterSet(&ioVec, GetSVEHeaderSize(), NT_ARM_SVE);
805 m_sve_header_is_valid =
true;
810Status NativeRegisterContextLinux_arm64::ReadPAuthMask() {
813 if (m_pac_mask_is_valid)
817 ioVec.iov_base = GetPACMask();
818 ioVec.iov_len = GetPACMaskSize();
820 error = ReadRegisterSet(&ioVec, GetPACMaskSize(), NT_ARM_PAC_MASK);
823 m_pac_mask_is_valid =
true;
828Status NativeRegisterContextLinux_arm64::WriteSVEHeader() {
831 error = ReadSVEHeader();
836 ioVec.iov_base = GetSVEHeader();
837 ioVec.iov_len = GetSVEHeaderSize();
839 m_sve_buffer_is_valid =
false;
840 m_sve_header_is_valid =
false;
841 m_fpu_is_valid =
false;
843 return WriteRegisterSet(&ioVec, GetSVEHeaderSize(), NT_ARM_SVE);
846Status NativeRegisterContextLinux_arm64::ReadAllSVE() {
849 if (m_sve_buffer_is_valid)
853 ioVec.iov_base = GetSVEBuffer();
854 ioVec.iov_len = GetSVEBufferSize();
856 error = ReadRegisterSet(&ioVec, GetSVEBufferSize(), NT_ARM_SVE);
859 m_sve_buffer_is_valid =
true;
864Status NativeRegisterContextLinux_arm64::WriteAllSVE() {
867 error = ReadAllSVE();
873 ioVec.iov_base = GetSVEBuffer();
874 ioVec.iov_len = GetSVEBufferSize();
876 m_sve_buffer_is_valid =
false;
877 m_sve_header_is_valid =
false;
878 m_fpu_is_valid =
false;
880 return WriteRegisterSet(&ioVec, GetSVEBufferSize(), NT_ARM_SVE);
883Status NativeRegisterContextLinux_arm64::ReadMTEControl() {
886 if (m_mte_ctrl_is_valid)
890 ioVec.iov_base = GetMTEControl();
891 ioVec.iov_len = GetMTEControlSize();
893 error = ReadRegisterSet(&ioVec, GetMTEControlSize(), NT_ARM_TAGGED_ADDR_CTRL);
896 m_mte_ctrl_is_valid =
true;
901Status NativeRegisterContextLinux_arm64::WriteMTEControl() {
904 error = ReadMTEControl();
909 ioVec.iov_base = GetMTEControl();
910 ioVec.iov_len = GetMTEControlSize();
912 m_mte_ctrl_is_valid =
false;
914 return WriteRegisterSet(&ioVec, GetMTEControlSize(), NT_ARM_TAGGED_ADDR_CTRL);
917void NativeRegisterContextLinux_arm64::ConfigureRegisterContext() {
924 if (
error.Success()) {
927 if ((m_sve_header.flags & sve::ptrace_regs_mask) ==
928 sve::ptrace_regs_fpsimd)
930 else if ((m_sve_header.flags & sve::ptrace_regs_mask) ==
931 sve::ptrace_regs_sve)
937 if (sve_vl_valid(m_sve_header.vl))
938 vq = sve::vq_from_vl(m_sve_header.vl);
940 GetRegisterInfo().ConfigureVectorLength(vq);
941 m_sve_ptrace_payload.resize(sve::PTraceSize(vq, sve::ptrace_regs_sve));
946uint32_t NativeRegisterContextLinux_arm64::CalculateFprOffset(
947 const RegisterInfo *reg_info)
const {
948 return reg_info->byte_offset - GetGPRSize();
951uint32_t NativeRegisterContextLinux_arm64::CalculateSVEOffset(
952 const RegisterInfo *reg_info)
const {
957 sve_reg_offset = sve::ptrace_fpsimd_offset +
958 (reg - GetRegisterInfo().GetRegNumSVEZ0()) * 16;
960 uint32_t sve_z0_offset = GetGPRSize() + 16;
962 sve::SigRegsOffset() + reg_info->byte_offset - sve_z0_offset;
964 return sve_reg_offset;
967std::vector<uint32_t> NativeRegisterContextLinux_arm64::GetExpeditedRegisters(
969 std::vector<uint32_t> expedited_reg_nums =
970 NativeRegisterContext::GetExpeditedRegisters(expType);
972 expedited_reg_nums.push_back(GetRegisterInfo().GetRegNumSVEVG());
974 return expedited_reg_nums;
977llvm::Expected<NativeRegisterContextLinux::MemoryTaggingDetails>
978NativeRegisterContextLinux_arm64::GetMemoryTaggingDetails(int32_t type) {
979 if (type == MemoryTagManagerAArch64MTE::eMTE_allocation) {
980 return MemoryTaggingDetails{std::make_unique<MemoryTagManagerAArch64MTE>(),
984 return llvm::createStringError(llvm::inconvertibleErrorCode(),
985 "Unknown AArch64 memory tag type %d", type);
988lldb::addr_t NativeRegisterContextLinux_arm64::FixWatchpointHitAddress(
996 if (ReadPAuthMask().Success())
997 mask |= m_pac_mask.data_mask;
999 return hit_addr & ~mask;
static llvm::raw_ostream & error(Stream &strm)
#define PTRACE_PEEKMTETAGS
#define PTRACE_POKEMTETAGS
@ AUXV_AT_HWCAP2
Extension of AT_HWCAP.
@ AUXV_AT_HWCAP
Machine dependent hints about processor capabilities.
static size_t GetGPRSizeStatic()
@ eVectorQuadwordAArch64SVE
An architecture specification class.
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
A subclass of DataBuffer that stores a data buffer on the heap.
ValueType Set(ValueType mask)
Set one or more flags by logical OR'ing mask with the current flags.
std::optional< uint64_t > GetAuxValue(enum AuxVector::EntryType type)
lldb::tid_t GetID() const
uint32_t SetFromMemoryData(const RegisterInfo ®_info, const void *src, uint32_t src_len, lldb::ByteOrder src_byte_order, Status &error)
uint64_t GetAsUInt64(uint64_t fail_value=UINT64_MAX, bool *success_ptr=nullptr) const
const void * GetBytes() const
Manages communication with the inferior (debugee) process.
NativeProcessLinux & GetProcess()
#define LLDB_INVALID_INDEX32
#define LLDB_INVALID_REGNUM
A class that represents a running process on the host machine.
@ eRegisterKindLLDB
lldb's internal register numbers