https://github.com/DavidSpickett updated https://github.com/llvm/llvm-project/pull/213976
>From c68f937ced7e286c841c4c1d6ac96db331094e68 Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 13:57:52 +0000 Subject: [PATCH 01/12] [lldb][AArch64][Linux] Add function to get size of register set Another one to be used in a generic read/write function later. Replaces all the Get<thing>Size() methods. --- .../NativeRegisterContextLinux_arm64.cpp | 34 +++++++++++++++++++ .../Linux/NativeRegisterContextLinux_arm64.h | 2 ++ 2 files changed, 36 insertions(+) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index a870c07aa0459..d42d55d6ecdca 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -123,6 +123,40 @@ unsigned int NativeRegisterContextLinux_arm64::GetPtraceSet( } } +size_t NativeRegisterContextLinux_arm64::GetSetSize( + NativeRegisterContextLinux_arm64::RegisterSetType set) const { + switch (set) { + case RegisterSetType::GPR: + // Returns sizeof arm64 GPR ptrace buffer, which is different + // from GetGPRSize which returns sizeof RegisterInfoPOSIX_arm64::GPR. + return sizeof(m_gpr_arm64); + case RegisterSetType::FPR: + return sizeof(m_fpr); + case RegisterSetType::SVE: + return m_sve_ptrace_payload.size(); + case RegisterSetType::SVE_HEADER: + return sizeof(m_sve_header); + case RegisterSetType::PAC: + return sizeof(m_pac_mask); + case RegisterSetType::MTE: + return sizeof(m_mte_ctrl_reg); + case RegisterSetType::TLS: + return m_tls_size; + case RegisterSetType::ZA: + return m_za_ptrace_payload.size(); + case RegisterSetType::ZA_HEADER: + return sizeof(m_za_header); + case RegisterSetType::ZT: + return m_zt_reg.size(); + case RegisterSetType::FPMR: + return sizeof(m_fpmr_reg); + case RegisterSetType::GCS: + return sizeof(m_gcs_regs); + case RegisterSetType::POE: + return sizeof(m_poe_regs); + } +} + // A NativeRegisterContext is constructed per thread, but all threads' registers // will contain the same fields. Therefore this mutex prevents each instance // competing with the other, and subsequent instances from having to detect the diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index 8e6b2d793bf6f..53fca1f10ab0f 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -120,6 +120,8 @@ class NativeRegisterContextLinux_arm64 // Returns the ptrace register set number for the given register set. unsigned int GetPtraceSet(RegisterSetType set) const; + size_t GetSetSize(RegisterSetType set) const; + void MakeValid(RegisterSetType set) { m_validity |= set; } [[nodiscard]] bool IsValid(RegisterSetType set) const { >From af86b5eea4692dbf1b3fe19fc7b54a174cffc5ed Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 14:01:52 +0000 Subject: [PATCH 02/12] replace za_header --- .../Linux/NativeRegisterContextLinux_arm64.cpp | 12 ++++++------ .../Process/Linux/NativeRegisterContextLinux_arm64.h | 2 -- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index d42d55d6ecdca..21c9db1b14bf7 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -505,7 +505,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info, // ZA is a square of VL * VL and the ptrace buffer also includes the // header itself. m_za_ptrace_payload.resize(((m_za_header.vl) * (m_za_header.vl)) + - GetZAHeaderSize()); + GetSetSize(RegisterSetType::ZA_HEADER)); std::fill(m_za_ptrace_payload.begin(), m_za_ptrace_payload.end(), 0); } else { // ZA is active, read the real register. @@ -517,7 +517,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info, // ZA is part of the SME set but uses a separate member buffer for // storage. Therefore its effective byte offset is always 0 even if it // isn't 0 within the SME register set. - src = (uint8_t *)GetZABuffer() + GetZAHeaderSize(); + src = (uint8_t *)GetZABuffer() + GetSetSize(RegisterSetType::ZA_HEADER); } else if (GetRegisterInfo().IsSMERegZT(reg)) { // Unlike ZA, the kernel will return register data for ZT0 when ZA is not // enabled. This data will be all 0s so we don't have to invent anything @@ -802,7 +802,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister( // ZA is part of the SME set but not stored with the other SME registers. // So its byte offset is effectively always 0. - dst = (uint8_t *)GetZABuffer() + GetZAHeaderSize(); + dst = (uint8_t *)GetZABuffer() + GetSetSize(RegisterSetType::ZA_HEADER); ::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size); // While this is writing a header that contains a vector length, the only @@ -1259,7 +1259,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues( // ZA header size you pass in. Therefore we must write header and register // data (if present) in one go every time. Read the header only first just // to get the size. - ::memcpy(GetZAHeader(), src, GetZAHeaderSize()); + ::memcpy(GetZAHeader(), src, GetSetSize(RegisterSetType::ZA_HEADER)); // Read the header and register data. Can't use the buffer size here, it // may be incorrect due to being filled with dummy data previously. Resize // this so WriteZA uses the correct size. @@ -1663,9 +1663,9 @@ Status NativeRegisterContextLinux_arm64::ReadZAHeader() { struct iovec ioVec; ioVec.iov_base = GetZAHeader(); - ioVec.iov_len = GetZAHeaderSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::ZA_HEADER); - error = ReadRegisterSet(&ioVec, GetZAHeaderSize(), + error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::ZA_HEADER), GetPtraceSet(RegisterSetType::ZA)); if (error.Success()) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index 53fca1f10ab0f..57e25d408e6f6 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -254,8 +254,6 @@ class NativeRegisterContextLinux_arm64 void *GetZAHeader() { return &m_za_header; } - size_t GetZAHeaderSize() { return sizeof(m_za_header); } - void *GetPACMask() { return &m_pac_mask; } void *GetMTEControl() { return &m_mte_ctrl_reg; } >From b0644481a49d0ddf064ac290360bc65315928a17 Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 14:04:02 +0000 Subject: [PATCH 03/12] replace sve header --- .../Process/Linux/NativeRegisterContextLinux_arm64.cpp | 10 +++++----- .../Process/Linux/NativeRegisterContextLinux_arm64.h | 2 -- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index 21c9db1b14bf7..e1712928b6b5d 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -1155,7 +1155,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues( // First write SVE header. We do not use RestoreRegisters because we do // not want src to be modified yet. - ::memcpy(GetSVEHeader(), src, GetSVEHeaderSize()); + ::memcpy(GetSVEHeader(), src, GetSetSize(RegisterSetType::SVE_HEADER)); if (!sve::vl_valid(m_sve_header.vl)) { Invalidate(RegisterSetType::SVE_HEADER); error = Status::FromErrorStringWithFormat( @@ -1446,9 +1446,9 @@ Status NativeRegisterContextLinux_arm64::ReadSVEHeader() { struct iovec ioVec; ioVec.iov_base = GetSVEHeader(); - ioVec.iov_len = GetSVEHeaderSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::SVE_HEADER); - error = ReadRegisterSet(&ioVec, GetSVEHeaderSize(), + error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::SVE_HEADER), GetPtraceSet(RegisterSetType::SVE_HEADER)); if (error.Success()) @@ -1485,11 +1485,11 @@ Status NativeRegisterContextLinux_arm64::WriteSVEHeader() { struct iovec ioVec; ioVec.iov_base = GetSVEHeader(); - ioVec.iov_len = GetSVEHeaderSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::SVE_HEADER); Invalidate(RegisterSetType::SVE_HEADER); - return WriteRegisterSet(&ioVec, GetSVEHeaderSize(), + return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::SVE_HEADER), GetPtraceSet(RegisterSetType::SVE_HEADER)); } diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index 57e25d408e6f6..c8bfa6ad1b4de 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -272,8 +272,6 @@ class NativeRegisterContextLinux_arm64 void *GetPOEBuffer() { return &m_poe_regs; } - size_t GetSVEHeaderSize() { return sizeof(m_sve_header); } - size_t GetPACMaskSize() { return sizeof(m_pac_mask); } size_t GetSVEBufferSize() { return m_sve_ptrace_payload.size(); } >From 1a4322fe09c483c55d02a08a910662ea69164166 Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 14:08:27 +0000 Subject: [PATCH 04/12] replace PAC --- .../Process/Linux/NativeRegisterContextLinux_arm64.cpp | 6 +++--- .../Process/Linux/NativeRegisterContextLinux_arm64.h | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index e1712928b6b5d..7d8a699ae9594 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -482,7 +482,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info, return error; offset = reg_info->byte_offset - GetRegisterInfo().GetPAuthOffset(); - assert(offset < GetPACMaskSize()); + assert(offset < GetSetSize(RegisterSetType::PAC)); src = (uint8_t *)GetPACMask() + offset; } else if (GetRegisterInfo().IsMTEReg(reg)) { error = ReadMTEControl(); @@ -1465,9 +1465,9 @@ Status NativeRegisterContextLinux_arm64::ReadPAuthMask() { struct iovec ioVec; ioVec.iov_base = GetPACMask(); - ioVec.iov_len = GetPACMaskSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::PAC); - error = ReadRegisterSet(&ioVec, GetPACMaskSize(), + error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::PAC), GetPtraceSet(RegisterSetType::PAC)); if (error.Success()) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index c8bfa6ad1b4de..4059724f1525e 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -272,8 +272,6 @@ class NativeRegisterContextLinux_arm64 void *GetPOEBuffer() { return &m_poe_regs; } - size_t GetPACMaskSize() { return sizeof(m_pac_mask); } - size_t GetSVEBufferSize() { return m_sve_ptrace_payload.size(); } void *GetZABuffer() { return m_za_ptrace_payload.data(); }; >From 23aefaca63762c8ec631ead98a6de127758ddd8d Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 14:09:42 +0000 Subject: [PATCH 05/12] remove sve buffer size --- .../NativeRegisterContextLinux_arm64.cpp | 29 ++++++++++--------- .../Linux/NativeRegisterContextLinux_arm64.h | 2 -- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index 7d8a699ae9594..2d187cb2645bb 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -387,7 +387,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info, offset = CalculateSVEOffset(GetRegisterInfoAtIndex(sve_reg_num)); } - assert(offset < GetSVEBufferSize()); + assert(offset < GetSetSize(RegisterSetType::SVE)); src = (uint8_t *)GetSVEBuffer() + offset; } } else if (GetRegisterInfo().IsTLSReg(reg)) { @@ -466,13 +466,13 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info, if (GetRegisterInfo().IsSVEZReg(reg)) { offset = CalculateSVEOffset(reg_info); - assert(offset < GetSVEBufferSize()); + assert(offset < GetSetSize(RegisterSetType::SVE)); ::memcpy(sve_reg_non_live.data(), (uint8_t *)GetSVEBuffer() + offset, 16); } } else { offset = CalculateSVEOffset(reg_info); - assert(offset < GetSVEBufferSize()); + assert(offset < GetSetSize(RegisterSetType::SVE)); src = (uint8_t *)GetSVEBuffer() + offset; } } @@ -650,7 +650,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister( offset = CalculateSVEOffset(GetRegisterInfoAtIndex(sve_reg_num)); } - assert(offset < GetSVEBufferSize()); + assert(offset < GetSetSize(RegisterSetType::SVE)); dst = (uint8_t *)GetSVEBuffer() + offset; ::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size); return WriteAllSVE(); @@ -756,7 +756,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister( // We are writing a Z register which is zero beyond 16 bytes so copy // first 16 bytes only as SVE payload mirrors legacy fpsimd structure offset = CalculateSVEOffset(reg_info); - assert(offset < GetSVEBufferSize()); + assert(offset < GetSetSize(RegisterSetType::SVE)); dst = (uint8_t *)GetSVEBuffer() + offset; ::memcpy(dst, reg_value.GetBytes(), 16); @@ -766,7 +766,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister( "SVE state change operation not supported"); } else { offset = CalculateSVEOffset(reg_info); - assert(offset < GetSVEBufferSize()); + assert(offset < GetSetSize(RegisterSetType::SVE)); dst = (uint8_t *)GetSVEBuffer() + offset; ::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size); return WriteAllSVE(); @@ -922,8 +922,8 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) { if ((GetRegisterInfo().IsSVEPresent() || GetRegisterInfo().IsSSVEPresent()) && m_sve_state != SVEState::StreamingFPSIMD) { // Store mode and register data. - cached_size += - sizeof(RegisterSetType) + sizeof(m_sve_state) + GetSVEBufferSize(); + cached_size += sizeof(RegisterSetType) + sizeof(m_sve_state) + + GetSetSize(RegisterSetType::SVE); error = ReadAllSVE(); } else { cached_size += sizeof(RegisterSetType) + GetFPRSize(); @@ -1034,7 +1034,8 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues( dst = AddRegisterSetType(dst, RegisterSetType::SVE); std::memcpy(dst, &m_sve_state, sizeof(m_sve_state)); dst += sizeof(m_sve_state); - dst = AddSavedRegistersData(dst, GetSVEBuffer(), GetSVEBufferSize()); + dst = AddSavedRegistersData(dst, GetSVEBuffer(), + GetSetSize(RegisterSetType::SVE)); } else { dst = AddSavedRegisters(dst, RegisterSetType::FPR, GetFPRBuffer(), GetFPRSize()); @@ -1176,7 +1177,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues( // Write header and register data, incrementing src this time. error = RestoreRegisters( - GetSVEBuffer(), &src, GetSVEBufferSize(), kind, + GetSVEBuffer(), &src, GetSetSize(RegisterSetType::SVE), kind, std::bind(&NativeRegisterContextLinux_arm64::WriteAllSVE, this)); break; case RegisterSetType::FPR: { @@ -1500,9 +1501,9 @@ Status NativeRegisterContextLinux_arm64::ReadAllSVE() { struct iovec ioVec; ioVec.iov_base = GetSVEBuffer(); - ioVec.iov_len = GetSVEBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::SVE); - error = ReadRegisterSet(&ioVec, GetSVEBufferSize(), + error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::SVE), GetPtraceSet(RegisterSetType::SVE)); if (error.Success()) @@ -1521,11 +1522,11 @@ Status NativeRegisterContextLinux_arm64::WriteAllSVE() { struct iovec ioVec; ioVec.iov_base = GetSVEBuffer(); - ioVec.iov_len = GetSVEBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::SVE); Invalidate(RegisterSetType::SVE); - return WriteRegisterSet(&ioVec, GetSVEBufferSize(), + return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::SVE), GetPtraceSet(RegisterSetType::SVE)); } diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index 4059724f1525e..fc78968869205 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -272,8 +272,6 @@ class NativeRegisterContextLinux_arm64 void *GetPOEBuffer() { return &m_poe_regs; } - size_t GetSVEBufferSize() { return m_sve_ptrace_payload.size(); } - void *GetZABuffer() { return m_za_ptrace_payload.data(); }; size_t GetZABufferSize() { return m_za_ptrace_payload.size(); } >From 5b24e2227d4a248bbfe36e2472940f720e3e638c Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 14:10:45 +0000 Subject: [PATCH 06/12] convert ZA buffer --- .../Linux/NativeRegisterContextLinux_arm64.cpp | 16 ++++++++-------- .../Linux/NativeRegisterContextLinux_arm64.h | 2 -- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index 2d187cb2645bb..a3992a5b981d1 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -1024,7 +1024,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues( if ((m_sve_state != SVEState::Streaming) && GetRegisterInfo().IsZAPresent()) { // Use the header size not the buffer size, as we may be using the buffer // for fake data, which we do not want to write out. - assert(m_za_header.size <= GetZABufferSize()); + assert(m_za_header.size <= GetSetSize(RegisterSetType::ZA)); dst = AddSavedRegisters(dst, RegisterSetType::ZA, GetZABuffer(), m_za_header.size); } @@ -1042,7 +1042,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues( } if ((m_sve_state == SVEState::Streaming) && GetRegisterInfo().IsZAPresent()) { - assert(m_za_header.size <= GetZABufferSize()); + assert(m_za_header.size <= GetSetSize(RegisterSetType::ZA)); dst = AddSavedRegisters(dst, RegisterSetType::ZA, GetZABuffer(), m_za_header.size); } @@ -1265,7 +1265,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues( // may be incorrect due to being filled with dummy data previously. Resize // this so WriteZA uses the correct size. m_za_ptrace_payload.resize(m_za_header.size); - ::memcpy(GetZABuffer(), src, GetZABufferSize()); + ::memcpy(GetZABuffer(), src, GetSetSize(RegisterSetType::ZA)); MakeValid(RegisterSetType::ZA); error = WriteZA(); @@ -1279,7 +1279,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues( // ZA buffer now has proper size, read back the data we wrote above, from // ptrace. error = ReadZA(); - src += GetZABufferSize(); + src += GetSetSize(RegisterSetType::ZA); break; case RegisterSetType::ZT: // Doing this would activate an inactive ZA, however we will only get here @@ -1683,9 +1683,9 @@ Status NativeRegisterContextLinux_arm64::ReadZA() { struct iovec ioVec; ioVec.iov_base = GetZABuffer(); - ioVec.iov_len = GetZABufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::ZA); - error = ReadRegisterSet(&ioVec, GetZABufferSize(), + error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::ZA), GetPtraceSet(RegisterSetType::ZA)); if (error.Success()) @@ -1706,11 +1706,11 @@ Status NativeRegisterContextLinux_arm64::WriteZA() { struct iovec ioVec; ioVec.iov_base = GetZABuffer(); - ioVec.iov_len = GetZABufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::ZA); Invalidate(RegisterSetType::ZA); - return WriteRegisterSet(&ioVec, GetZABufferSize(), + return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::ZA), GetPtraceSet(RegisterSetType::ZA)); } diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index fc78968869205..c81662aa56aee 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -274,8 +274,6 @@ class NativeRegisterContextLinux_arm64 void *GetZABuffer() { return m_za_ptrace_payload.data(); }; - size_t GetZABufferSize() { return m_za_ptrace_payload.size(); } - size_t GetMTEControlSize() { return sizeof(m_mte_ctrl_reg); } size_t GetTLSBufferSize() { return m_tls_size; } >From 7f14abd15310abbc1d8783cea6c0badf15a203f9 Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 14:12:00 +0000 Subject: [PATCH 07/12] convert MTE --- .../Linux/NativeRegisterContextLinux_arm64.cpp | 18 +++++++++--------- .../Linux/NativeRegisterContextLinux_arm64.h | 2 -- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index a3992a5b981d1..15a5346bd60c1 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -490,7 +490,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info, return error; offset = reg_info->byte_offset - GetRegisterInfo().GetMTEOffset(); - assert(offset < GetMTEControlSize()); + assert(offset < GetSetSize(RegisterSetType::MTE)); src = (uint8_t *)GetMTEControl() + offset; } else if (GetRegisterInfo().IsSMEReg(reg)) { if (GetRegisterInfo().IsSMERegZA(reg)) { @@ -778,7 +778,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister( return error; offset = reg_info->byte_offset - GetRegisterInfo().GetMTEOffset(); - assert(offset < GetMTEControlSize()); + assert(offset < GetSetSize(RegisterSetType::MTE)); dst = (uint8_t *)GetMTEControl() + offset; ::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size); @@ -933,7 +933,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) { return error; if (GetRegisterInfo().IsMTEPresent()) { - cached_size += sizeof(RegisterSetType) + GetMTEControlSize(); + cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::MTE); error = ReadMTEControl(); if (error.Fail()) return error; @@ -1062,7 +1062,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues( if (GetRegisterInfo().IsMTEPresent()) { dst = AddSavedRegisters(dst, RegisterSetType::MTE, GetMTEControl(), - GetMTEControlSize()); + GetSetSize(RegisterSetType::MTE)); } if (GetRegisterInfo().IsFPMRPresent()) { @@ -1246,7 +1246,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues( } case RegisterSetType::MTE: error = RestoreRegisters( - GetMTEControl(), &src, GetMTEControlSize(), kind, + GetMTEControl(), &src, GetSetSize(RegisterSetType::MTE), kind, std::bind(&NativeRegisterContextLinux_arm64::WriteMTEControl, this)); break; case RegisterSetType::TLS: @@ -1556,9 +1556,9 @@ Status NativeRegisterContextLinux_arm64::ReadMTEControl() { struct iovec ioVec; ioVec.iov_base = GetMTEControl(); - ioVec.iov_len = GetMTEControlSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::MTE); - error = ReadRegisterSet(&ioVec, GetMTEControlSize(), + error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::MTE), GetPtraceSet(RegisterSetType::MTE)); if (error.Success()) @@ -1576,11 +1576,11 @@ Status NativeRegisterContextLinux_arm64::WriteMTEControl() { struct iovec ioVec; ioVec.iov_base = GetMTEControl(); - ioVec.iov_len = GetMTEControlSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::MTE); Invalidate(RegisterSetType::MTE); - return WriteRegisterSet(&ioVec, GetMTEControlSize(), + return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::MTE), GetPtraceSet(RegisterSetType::MTE)); } diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index c81662aa56aee..5cbb8aaac1cd4 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -274,8 +274,6 @@ class NativeRegisterContextLinux_arm64 void *GetZABuffer() { return m_za_ptrace_payload.data(); }; - size_t GetMTEControlSize() { return sizeof(m_mte_ctrl_reg); } - size_t GetTLSBufferSize() { return m_tls_size; } size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); } >From be316fb5512799c0f23c972897bf10df8c1ed195 Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 14:13:07 +0000 Subject: [PATCH 08/12] convert TLS --- .../Linux/NativeRegisterContextLinux_arm64.cpp | 18 +++++++++--------- .../Linux/NativeRegisterContextLinux_arm64.h | 2 -- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index 15a5346bd60c1..b6a6f547d86a4 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -396,7 +396,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info, return error; offset = reg_info->byte_offset - GetRegisterInfo().GetTLSOffset(); - assert(offset < GetTLSBufferSize()); + assert(offset < GetSetSize(RegisterSetType::TLS)); src = (uint8_t *)GetTLSBuffer() + offset; } else if (GetRegisterInfo().IsSVEReg(reg)) { if (m_sve_state == SVEState::Disabled || m_sve_state == SVEState::Unknown) @@ -789,7 +789,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister( return error; offset = reg_info->byte_offset - GetRegisterInfo().GetTLSOffset(); - assert(offset < GetTLSBufferSize()); + assert(offset < GetSetSize(RegisterSetType::TLS)); dst = (uint8_t *)GetTLSBuffer() + offset; ::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size); @@ -961,7 +961,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) { } // tpidr is always present but tpidr2 depends on SME. - cached_size += sizeof(RegisterSetType) + GetTLSBufferSize(); + cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::TLS); error = ReadTLS(); return error; @@ -1081,7 +1081,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues( } dst = AddSavedRegisters(dst, RegisterSetType::TLS, GetTLSBuffer(), - GetTLSBufferSize()); + GetSetSize(RegisterSetType::TLS)); return error; } @@ -1251,7 +1251,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues( break; case RegisterSetType::TLS: error = RestoreRegisters( - GetTLSBuffer(), &src, GetTLSBufferSize(), kind, + GetTLSBuffer(), &src, GetSetSize(RegisterSetType::TLS), kind, std::bind(&NativeRegisterContextLinux_arm64::WriteTLS, this)); break; case RegisterSetType::ZA: @@ -1592,9 +1592,9 @@ Status NativeRegisterContextLinux_arm64::ReadTLS() { struct iovec ioVec; ioVec.iov_base = GetTLSBuffer(); - ioVec.iov_len = GetTLSBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::TLS); - error = ReadRegisterSet(&ioVec, GetTLSBufferSize(), + error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::TLS), GetPtraceSet(RegisterSetType::TLS)); if (error.Success()) @@ -1612,11 +1612,11 @@ Status NativeRegisterContextLinux_arm64::WriteTLS() { struct iovec ioVec; ioVec.iov_base = GetTLSBuffer(); - ioVec.iov_len = GetTLSBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::TLS); Invalidate(RegisterSetType::TLS); - return WriteRegisterSet(&ioVec, GetTLSBufferSize(), + return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::TLS), GetPtraceSet(RegisterSetType::TLS)); } diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index 5cbb8aaac1cd4..b38ab9647ecaf 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -274,8 +274,6 @@ class NativeRegisterContextLinux_arm64 void *GetZABuffer() { return m_za_ptrace_payload.data(); }; - size_t GetTLSBufferSize() { return m_tls_size; } - size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); } size_t GetZTBufferSize() { return m_zt_reg.size(); } >From 2832c52ca3b7a9f701125af0380967da2d4ba2eb Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 14:14:15 +0000 Subject: [PATCH 09/12] convert ZT --- .../Linux/NativeRegisterContextLinux_arm64.cpp | 14 +++++++------- .../Linux/NativeRegisterContextLinux_arm64.h | 2 -- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index b6a6f547d86a4..284a9cc334306 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -907,7 +907,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) { GetRegisterInfo().IsZTPresent() && // And ZA is active, which means that ZT0 is also active. m_za_header.size > sizeof(m_za_header)) { - cached_size += sizeof(RegisterSetType) + GetZTBufferSize(); + cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::ZT); // The kernel handles an inactive ZT0 for us, and it will read as 0s if // inactive (unlike ZA where we fake that behaviour). error = ReadZT(); @@ -1058,7 +1058,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues( // And ZA is enabled. m_za_header.size > sizeof(m_za_header)) dst = AddSavedRegisters(dst, RegisterSetType::ZT, GetZTBuffer(), - GetZTBufferSize()); + GetSetSize(RegisterSetType::ZT)); if (GetRegisterInfo().IsMTEPresent()) { dst = AddSavedRegisters(dst, RegisterSetType::MTE, GetMTEControl(), @@ -1286,7 +1286,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues( // if the state we are restoring had an active ZA. Restoring ZT0 will // always come after restoring ZA. error = RestoreRegisters( - GetZTBuffer(), &src, GetZTBufferSize(), kind, + GetZTBuffer(), &src, GetSetSize(RegisterSetType::ZT), kind, std::bind(&NativeRegisterContextLinux_arm64::WriteZT, this)); break; case RegisterSetType::FPMR: @@ -1722,9 +1722,9 @@ Status NativeRegisterContextLinux_arm64::ReadZT() { struct iovec ioVec; ioVec.iov_base = GetZTBuffer(); - ioVec.iov_len = GetZTBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::ZT); - error = ReadRegisterSet(&ioVec, GetZTBufferSize(), + error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::ZT), GetPtraceSet(RegisterSetType::ZT)); if (error.Success()) MakeValid(RegisterSetType::ZT); @@ -1741,11 +1741,11 @@ Status NativeRegisterContextLinux_arm64::WriteZT() { struct iovec ioVec; ioVec.iov_base = GetZTBuffer(); - ioVec.iov_len = GetZTBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::ZT); Invalidate(RegisterSetType::ZT); - return WriteRegisterSet(&ioVec, GetZTBufferSize(), + return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::ZT), GetPtraceSet(RegisterSetType::ZT)); } diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index b38ab9647ecaf..7943f62957863 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -276,8 +276,6 @@ class NativeRegisterContextLinux_arm64 size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); } - size_t GetZTBufferSize() { return m_zt_reg.size(); } - size_t GetFPMRBufferSize() { return sizeof(m_fpmr_reg); } size_t GetGCSBufferSize() { return sizeof(m_gcs_regs); } >From b101e62ec4b0c4acc23860c125694f7d9d29c3da Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 14:15:13 +0000 Subject: [PATCH 10/12] convert FPMR --- .../Linux/NativeRegisterContextLinux_arm64.cpp | 18 +++++++++--------- .../Linux/NativeRegisterContextLinux_arm64.h | 2 -- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index 284a9cc334306..8ba7043b9a93e 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -545,7 +545,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info, return error; offset = reg_info->byte_offset - GetRegisterInfo().GetFPMROffset(); - assert(offset < GetFPMRBufferSize()); + assert(offset < GetSetSize(RegisterSetType::FPMR)); src = (uint8_t *)GetFPMRBuffer() + offset; } else if (GetRegisterInfo().IsGCSReg(reg)) { error = ReadGCS(); @@ -827,7 +827,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister( return error; offset = reg_info->byte_offset - GetRegisterInfo().GetFPMROffset(); - assert(offset < GetFPMRBufferSize()); + assert(offset < GetSetSize(RegisterSetType::FPMR)); dst = (uint8_t *)GetFPMRBuffer() + offset; ::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size); @@ -940,7 +940,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) { } if (GetRegisterInfo().IsFPMRPresent()) { - cached_size += sizeof(RegisterSetType) + GetFPMRBufferSize(); + cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::FPMR); error = ReadFPMR(); if (error.Fail()) return error; @@ -1067,7 +1067,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues( if (GetRegisterInfo().IsFPMRPresent()) { dst = AddSavedRegisters(dst, RegisterSetType::FPMR, GetFPMRBuffer(), - GetFPMRBufferSize()); + GetSetSize(RegisterSetType::FPMR)); } if (GetRegisterInfo().IsGCSPresent()) { @@ -1291,7 +1291,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues( break; case RegisterSetType::FPMR: error = RestoreRegisters( - GetFPMRBuffer(), &src, GetFPMRBufferSize(), kind, + GetFPMRBuffer(), &src, GetSetSize(RegisterSetType::FPMR), kind, std::bind(&NativeRegisterContextLinux_arm64::WriteFPMR, this)); break; case RegisterSetType::GCS: { @@ -1757,9 +1757,9 @@ Status NativeRegisterContextLinux_arm64::ReadFPMR() { struct iovec ioVec; ioVec.iov_base = GetFPMRBuffer(); - ioVec.iov_len = GetFPMRBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::FPMR); - error = ReadRegisterSet(&ioVec, GetFPMRBufferSize(), + error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::FPMR), GetPtraceSet(RegisterSetType::FPMR)); if (error.Success()) @@ -1777,11 +1777,11 @@ Status NativeRegisterContextLinux_arm64::WriteFPMR() { struct iovec ioVec; ioVec.iov_base = GetFPMRBuffer(); - ioVec.iov_len = GetFPMRBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::FPMR); Invalidate(RegisterSetType::FPMR); - return WriteRegisterSet(&ioVec, GetFPMRBufferSize(), + return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::FPMR), GetPtraceSet(RegisterSetType::FPMR)); } diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index 7943f62957863..69b74240c8325 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -276,8 +276,6 @@ class NativeRegisterContextLinux_arm64 size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); } - size_t GetFPMRBufferSize() { return sizeof(m_fpmr_reg); } - size_t GetGCSBufferSize() { return sizeof(m_gcs_regs); } size_t GetPOEBufferSize() { return sizeof(m_poe_regs); } >From 4f29ba389380499edc93359eed94b6ca8ffa44c8 Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 14:15:55 +0000 Subject: [PATCH 11/12] convert gcs --- .../NativeRegisterContextLinux_arm64.cpp | 20 +++++++++---------- .../Linux/NativeRegisterContextLinux_arm64.h | 2 -- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index 8ba7043b9a93e..f8242365e7699 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -553,7 +553,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info, return error; offset = reg_info->byte_offset - GetRegisterInfo().GetGCSOffset(); - assert(offset < GetGCSBufferSize()); + assert(offset < GetSetSize(RegisterSetType::GCS)); src = (uint8_t *)GetGCSBuffer() + offset; } else if (GetRegisterInfo().IsPOEReg(reg)) { error = ReadPOE(); @@ -838,7 +838,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister( return error; offset = reg_info->byte_offset - GetRegisterInfo().GetGCSOffset(); - assert(offset < GetGCSBufferSize()); + assert(offset < GetSetSize(RegisterSetType::GCS)); dst = (uint8_t *)GetGCSBuffer() + offset; ::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size); @@ -947,7 +947,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) { } if (GetRegisterInfo().IsGCSPresent()) { - cached_size += sizeof(RegisterSetType) + GetGCSBufferSize(); + cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::GCS); error = ReadGCS(); if (error.Fail()) return error; @@ -1072,7 +1072,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues( if (GetRegisterInfo().IsGCSPresent()) { dst = AddSavedRegisters(dst, RegisterSetType::GCS, GetGCSBuffer(), - GetGCSBufferSize()); + GetSetSize(RegisterSetType::GCS)); } if (GetRegisterInfo().IsPOEPresent()) { @@ -1313,9 +1313,9 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues( const uint8_t *new_gcs_src = reinterpret_cast<const uint8_t *>(&new_gcs_regs); error = RestoreRegisters( - GetGCSBuffer(), &new_gcs_src, GetGCSBufferSize(), kind, + GetGCSBuffer(), &new_gcs_src, GetSetSize(RegisterSetType::GCS), kind, std::bind(&NativeRegisterContextLinux_arm64::WriteGCS, this)); - src += GetGCSBufferSize(); + src += GetSetSize(RegisterSetType::GCS); break; } @@ -1628,9 +1628,9 @@ Status NativeRegisterContextLinux_arm64::ReadGCS() { struct iovec ioVec; ioVec.iov_base = GetGCSBuffer(); - ioVec.iov_len = GetGCSBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::GCS); - error = ReadRegisterSet(&ioVec, GetGCSBufferSize(), + error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::GCS), GetPtraceSet(RegisterSetType::GCS)); if (error.Success()) @@ -1648,11 +1648,11 @@ Status NativeRegisterContextLinux_arm64::WriteGCS() { struct iovec ioVec; ioVec.iov_base = GetGCSBuffer(); - ioVec.iov_len = GetGCSBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::GCS); Invalidate(RegisterSetType::GCS); - return WriteRegisterSet(&ioVec, GetGCSBufferSize(), + return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::GCS), GetPtraceSet(RegisterSetType::GCS)); } diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index 69b74240c8325..4474d463504bc 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -276,8 +276,6 @@ class NativeRegisterContextLinux_arm64 size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); } - size_t GetGCSBufferSize() { return sizeof(m_gcs_regs); } - size_t GetPOEBufferSize() { return sizeof(m_poe_regs); } llvm::Error ReadHardwareDebugInfo() override; >From 8fd99793ba057715d6eae87898ea8f1f2be81a5b Mon Sep 17 00:00:00 2001 From: David Spickett <[email protected]> Date: Tue, 4 Aug 2026 14:16:41 +0000 Subject: [PATCH 12/12] convert POE --- .../Linux/NativeRegisterContextLinux_arm64.cpp | 18 +++++++++--------- .../Linux/NativeRegisterContextLinux_arm64.h | 2 -- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp index f8242365e7699..99b93ed82f5e6 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp @@ -561,7 +561,7 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info, return error; offset = reg_info->byte_offset - GetRegisterInfo().GetPOEOffset(); - assert(offset < GetPOEBufferSize()); + assert(offset < GetSetSize(RegisterSetType::POE)); src = (uint8_t *)GetPOEBuffer() + offset; } else return Status::FromErrorString( @@ -849,7 +849,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister( return error; offset = reg_info->byte_offset - GetRegisterInfo().GetPOEOffset(); - assert(offset < GetPOEBufferSize()); + assert(offset < GetSetSize(RegisterSetType::POE)); dst = (uint8_t *)GetPOEBuffer() + offset; ::memcpy(dst, reg_value.GetBytes(), reg_info->byte_size); @@ -954,7 +954,7 @@ NativeRegisterContextLinux_arm64::CacheAllRegisters(uint32_t &cached_size) { } if (GetRegisterInfo().IsPOEPresent()) { - cached_size += sizeof(RegisterSetType) + GetPOEBufferSize(); + cached_size += sizeof(RegisterSetType) + GetSetSize(RegisterSetType::POE); error = ReadPOE(); if (error.Fail()) return error; @@ -1077,7 +1077,7 @@ Status NativeRegisterContextLinux_arm64::ReadAllRegisterValues( if (GetRegisterInfo().IsPOEPresent()) { dst = AddSavedRegisters(dst, RegisterSetType::POE, GetPOEBuffer(), - GetPOEBufferSize()); + GetSetSize(RegisterSetType::POE)); } dst = AddSavedRegisters(dst, RegisterSetType::TLS, GetTLSBuffer(), @@ -1321,7 +1321,7 @@ Status NativeRegisterContextLinux_arm64::WriteAllRegisterValues( } case RegisterSetType::POE: error = RestoreRegisters( - GetPOEBuffer(), &src, GetPOEBufferSize(), kind, + GetPOEBuffer(), &src, GetSetSize(RegisterSetType::POE), kind, std::bind(&NativeRegisterContextLinux_arm64::WritePOE, this)); break; case RegisterSetType::PAC: @@ -1793,9 +1793,9 @@ Status NativeRegisterContextLinux_arm64::ReadPOE() { struct iovec ioVec; ioVec.iov_base = GetPOEBuffer(); - ioVec.iov_len = GetPOEBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::POE); - error = ReadRegisterSet(&ioVec, GetPOEBufferSize(), + error = ReadRegisterSet(&ioVec, GetSetSize(RegisterSetType::POE), GetPtraceSet(RegisterSetType::POE)); if (error.Success()) @@ -1813,11 +1813,11 @@ Status NativeRegisterContextLinux_arm64::WritePOE() { struct iovec ioVec; ioVec.iov_base = GetPOEBuffer(); - ioVec.iov_len = GetPOEBufferSize(); + ioVec.iov_len = GetSetSize(RegisterSetType::POE); Invalidate(RegisterSetType::POE); - return WriteRegisterSet(&ioVec, GetPOEBufferSize(), + return WriteRegisterSet(&ioVec, GetSetSize(RegisterSetType::POE), GetPtraceSet(RegisterSetType::POE)); } diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h index 4474d463504bc..f9e7de073da6d 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.h @@ -276,8 +276,6 @@ class NativeRegisterContextLinux_arm64 size_t GetSMEPseudoBufferSize() { return sizeof(m_sme_pseudo_regs); } - size_t GetPOEBufferSize() { return sizeof(m_poe_regs); } - llvm::Error ReadHardwareDebugInfo() override; llvm::Error WriteHardwareDebugRegs(DREGType hwbType) override; _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
