Skip to content

Commit 3fa5035

Browse files
committed
Revert "[lldb][AArch64] Linux corefile support for SME"
This reverts commit 43812c8. Due to failures on x86_64: https://lab.llvm.org/buildbot/#/builders/68/builds/60416
1 parent 996c0fb commit 3fa5035

10 files changed

+18
-383
lines changed

lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_arm64.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,15 @@ class RegisterContextPOSIX_arm64 : public lldb_private::RegisterContext {
5454
size_t GetFPUSize() { return sizeof(RegisterInfoPOSIX_arm64::FPU); }
5555

5656
bool IsSVE(unsigned reg) const;
57+
bool IsSME(unsigned reg) const;
5758
bool IsPAuth(unsigned reg) const;
5859
bool IsTLS(unsigned reg) const;
59-
bool IsSME(unsigned reg) const;
6060

6161
bool IsSVEZ(unsigned reg) const { return m_register_info_up->IsSVEZReg(reg); }
6262
bool IsSVEP(unsigned reg) const { return m_register_info_up->IsSVEPReg(reg); }
6363
bool IsSVEVG(unsigned reg) const {
6464
return m_register_info_up->IsSVERegVG(reg);
6565
}
66-
bool IsSMEZA(unsigned reg) const {
67-
return m_register_info_up->IsSMERegZA(reg);
68-
}
6966

7067
uint32_t GetRegNumSVEZ0() const {
7168
return m_register_info_up->GetRegNumSVEZ0();

lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp

Lines changed: 17 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,8 @@ RegisterContextCorePOSIX_arm64::Create(Thread &thread, const ArchSpec &arch,
2323
llvm::ArrayRef<CoreNote> notes) {
2424
Flags opt_regsets = RegisterInfoPOSIX_arm64::eRegsetMaskDefault;
2525

26-
DataExtractor ssve_data =
27-
getRegset(notes, arch.GetTriple(), AARCH64_SSVE_Desc);
28-
if (ssve_data.GetByteSize() >= sizeof(sve::user_sve_header))
29-
opt_regsets.Set(RegisterInfoPOSIX_arm64::eRegsetMaskSSVE);
30-
3126
DataExtractor sve_data = getRegset(notes, arch.GetTriple(), AARCH64_SVE_Desc);
32-
if (sve_data.GetByteSize() >= sizeof(sve::user_sve_header))
27+
if (sve_data.GetByteSize() > sizeof(sve::user_sve_header))
3328
opt_regsets.Set(RegisterInfoPOSIX_arm64::eRegsetMaskSVE);
3429

3530
// Pointer Authentication register set data is based on struct
@@ -45,11 +40,6 @@ RegisterContextCorePOSIX_arm64::Create(Thread &thread, const ArchSpec &arch,
4540
if (tls_data.GetByteSize() >= sizeof(uint64_t))
4641
opt_regsets.Set(RegisterInfoPOSIX_arm64::eRegsetMaskTLS);
4742

48-
DataExtractor za_data = getRegset(notes, arch.GetTriple(), AARCH64_ZA_Desc);
49-
// Nothing if ZA is not present, just the header if it is disabled.
50-
if (za_data.GetByteSize() >= sizeof(sve::user_za_header))
51-
opt_regsets.Set(RegisterInfoPOSIX_arm64::eRegsetMaskZA);
52-
5343
auto register_info_up =
5444
std::make_unique<RegisterInfoPOSIX_arm64>(arch, opt_regsets);
5545
return std::unique_ptr<RegisterContextCorePOSIX_arm64>(
@@ -61,8 +51,6 @@ RegisterContextCorePOSIX_arm64::RegisterContextCorePOSIX_arm64(
6151
Thread &thread, std::unique_ptr<RegisterInfoPOSIX_arm64> register_info,
6252
const DataExtractor &gpregset, llvm::ArrayRef<CoreNote> notes)
6353
: RegisterContextPOSIX_arm64(thread, std::move(register_info)) {
64-
::memset(&m_sme_pseudo_regs, 0, sizeof(m_sme_pseudo_regs));
65-
6654
m_gpr_data.SetData(std::make_shared<DataBufferHeap>(gpregset.GetDataStart(),
6755
gpregset.GetByteSize()));
6856
m_gpr_data.SetByteOrder(gpregset.GetByteOrder());
@@ -71,15 +59,7 @@ RegisterContextCorePOSIX_arm64::RegisterContextCorePOSIX_arm64(
7159
m_register_info_up->GetTargetArchitecture().GetTriple();
7260
m_fpr_data = getRegset(notes, target_triple, FPR_Desc);
7361

74-
if (m_register_info_up->IsSSVEEnabled()) {
75-
m_sve_data = getRegset(notes, target_triple, AARCH64_SSVE_Desc);
76-
lldb::offset_t flags_offset = 12;
77-
uint16_t flags = m_sve_data.GetU32(&flags_offset);
78-
if ((flags & sve::ptrace_regs_mask) == sve::ptrace_regs_sve)
79-
m_sve_state = SVEState::Streaming;
80-
}
81-
82-
if (m_sve_state != SVEState::Streaming && m_register_info_up->IsSVEEnabled())
62+
if (m_register_info_up->IsSVEEnabled())
8363
m_sve_data = getRegset(notes, target_triple, AARCH64_SVE_Desc);
8464

8565
if (m_register_info_up->IsPAuthEnabled())
@@ -88,9 +68,6 @@ RegisterContextCorePOSIX_arm64::RegisterContextCorePOSIX_arm64(
8868
if (m_register_info_up->IsTLSEnabled())
8969
m_tls_data = getRegset(notes, target_triple, AARCH64_TLS_Desc);
9070

91-
if (m_register_info_up->IsZAEnabled())
92-
m_za_data = getRegset(notes, target_triple, AARCH64_ZA_Desc);
93-
9471
ConfigureRegisterContext();
9572
}
9673

@@ -118,18 +95,15 @@ void RegisterContextCorePOSIX_arm64::ConfigureRegisterContext() {
11895
if (m_sve_data.GetByteSize() > sizeof(sve::user_sve_header)) {
11996
uint64_t sve_header_field_offset = 8;
12097
m_sve_vector_length = m_sve_data.GetU16(&sve_header_field_offset);
121-
122-
if (m_sve_state != SVEState::Streaming) {
123-
sve_header_field_offset = 12;
124-
uint16_t sve_header_flags_field =
125-
m_sve_data.GetU16(&sve_header_field_offset);
126-
if ((sve_header_flags_field & sve::ptrace_regs_mask) ==
127-
sve::ptrace_regs_fpsimd)
128-
m_sve_state = SVEState::FPSIMD;
129-
else if ((sve_header_flags_field & sve::ptrace_regs_mask) ==
130-
sve::ptrace_regs_sve)
131-
m_sve_state = SVEState::Full;
132-
}
98+
sve_header_field_offset = 12;
99+
uint16_t sve_header_flags_field =
100+
m_sve_data.GetU16(&sve_header_field_offset);
101+
if ((sve_header_flags_field & sve::ptrace_regs_mask) ==
102+
sve::ptrace_regs_fpsimd)
103+
m_sve_state = SVEState::FPSIMD;
104+
else if ((sve_header_flags_field & sve::ptrace_regs_mask) ==
105+
sve::ptrace_regs_sve)
106+
m_sve_state = SVEState::Full;
133107

134108
if (!sve::vl_valid(m_sve_vector_length)) {
135109
m_sve_state = SVEState::Disabled;
@@ -141,23 +115,6 @@ void RegisterContextCorePOSIX_arm64::ConfigureRegisterContext() {
141115
if (m_sve_state != SVEState::Disabled)
142116
m_register_info_up->ConfigureVectorLengthSVE(
143117
sve::vq_from_vl(m_sve_vector_length));
144-
145-
if (m_sve_state == SVEState::Streaming)
146-
m_sme_pseudo_regs.ctrl_reg |= 1;
147-
148-
if (m_za_data.GetByteSize() >= sizeof(sve::user_za_header)) {
149-
lldb::offset_t vlen_offset = 8;
150-
uint16_t svl = m_za_data.GetU16(&vlen_offset);
151-
m_sme_pseudo_regs.svg_reg = svl / 8;
152-
m_register_info_up->ConfigureVectorLengthZA(svl / 16);
153-
154-
// If there is register data then ZA is active. The size of the note may be
155-
// misleading here so we use the size field of the embedded header.
156-
lldb::offset_t size_offset = 0;
157-
uint32_t size = m_za_data.GetU32(&size_offset);
158-
if (size > sizeof(sve::user_za_header))
159-
m_sme_pseudo_regs.ctrl_reg |= 1 << 1;
160-
}
161118
}
162119

163120
uint32_t RegisterContextCorePOSIX_arm64::CalculateSVEOffset(
@@ -167,8 +124,7 @@ uint32_t RegisterContextCorePOSIX_arm64::CalculateSVEOffset(
167124
if (m_sve_state == SVEState::FPSIMD) {
168125
const uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
169126
sve_reg_offset = sve::ptrace_fpsimd_offset + (reg - GetRegNumSVEZ0()) * 16;
170-
} else if (m_sve_state == SVEState::Full ||
171-
m_sve_state == SVEState::Streaming) {
127+
} else if (m_sve_state == SVEState::Full) {
172128
uint32_t sve_z0_offset = GetGPRSize() + 16;
173129
sve_reg_offset =
174130
sve::SigRegsOffset() + reg_info->byte_offset - sve_z0_offset;
@@ -207,19 +163,19 @@ bool RegisterContextCorePOSIX_arm64::ReadRegister(const RegisterInfo *reg_info,
207163
}
208164
} else {
209165
// FPSR and FPCR will be located right after Z registers in
210-
// SVEState::FPSIMD while in SVEState::Full/SVEState::Streaming they will
211-
// be located at the end of register data after an alignment correction
212-
// based on currently selected vector length.
166+
// SVEState::FPSIMD while in SVEState::Full they will be located at the
167+
// end of register data after an alignment correction based on currently
168+
// selected vector length.
213169
uint32_t sve_reg_num = LLDB_INVALID_REGNUM;
214170
if (reg == GetRegNumFPSR()) {
215171
sve_reg_num = reg;
216-
if (m_sve_state == SVEState::Full || m_sve_state == SVEState::Streaming)
172+
if (m_sve_state == SVEState::Full)
217173
offset = sve::PTraceFPSROffset(sve::vq_from_vl(m_sve_vector_length));
218174
else if (m_sve_state == SVEState::FPSIMD)
219175
offset = sve::ptrace_fpsimd_offset + (32 * 16);
220176
} else if (reg == GetRegNumFPCR()) {
221177
sve_reg_num = reg;
222-
if (m_sve_state == SVEState::Full || m_sve_state == SVEState::Streaming)
178+
if (m_sve_state == SVEState::Full)
223179
offset = sve::PTraceFPCROffset(sve::vq_from_vl(m_sve_vector_length));
224180
else if (m_sve_state == SVEState::FPSIMD)
225181
offset = sve::ptrace_fpsimd_offset + (32 * 16) + 4;
@@ -261,7 +217,6 @@ bool RegisterContextCorePOSIX_arm64::ReadRegister(const RegisterInfo *reg_info,
261217
error);
262218
} break;
263219
case SVEState::Full:
264-
case SVEState::Streaming:
265220
offset = CalculateSVEOffset(reg_info);
266221
assert(offset < m_sve_data.GetByteSize());
267222
value.SetFromMemoryData(*reg_info, GetSVEBuffer(offset),
@@ -282,54 +237,6 @@ bool RegisterContextCorePOSIX_arm64::ReadRegister(const RegisterInfo *reg_info,
282237
assert(offset < m_tls_data.GetByteSize());
283238
value.SetFromMemoryData(*reg_info, m_tls_data.GetDataStart() + offset,
284239
reg_info->byte_size, lldb::eByteOrderLittle, error);
285-
} else if (IsSME(reg)) {
286-
// If you had SME in the process, active or otherwise, there will at least
287-
// be a ZA header. No header, no SME at all.
288-
if (m_za_data.GetByteSize() < sizeof(sve::user_za_header))
289-
return false;
290-
291-
if (!IsSMEZA(reg)) {
292-
offset = reg_info->byte_offset - m_register_info_up->GetSMEOffset();
293-
assert(offset < sizeof(m_sme_pseudo_regs));
294-
// Host endian since these values are derived instead of being read from a
295-
// core file note.
296-
value.SetFromMemoryData(
297-
*reg_info, reinterpret_cast<uint8_t *>(&m_sme_pseudo_regs) + offset,
298-
reg_info->byte_size, lldb_private::endian::InlHostByteOrder(), error);
299-
} else {
300-
// If the process did not have the SME extension.
301-
if (m_za_data.GetByteSize() < sizeof(sve::user_za_header))
302-
return false;
303-
304-
// Don't use the size of the note to tell whether ZA is enabled. There may
305-
// be non-register padding data after the header. Use the embedded
306-
// header's size field instead.
307-
lldb::offset_t size_offset = 0;
308-
uint32_t size = m_za_data.GetU32(&size_offset);
309-
bool za_enabled = size > sizeof(sve::user_za_header);
310-
311-
size_t za_note_size = m_za_data.GetByteSize();
312-
// For a disabled ZA we fake a value of all 0s.
313-
if (!za_enabled) {
314-
uint64_t svl = m_sme_pseudo_regs.svg_reg * 8;
315-
za_note_size = sizeof(sve::user_za_header) + (svl * svl);
316-
}
317-
318-
const uint8_t *src = nullptr;
319-
std::vector<uint8_t> disabled_za_data;
320-
321-
if (za_enabled)
322-
src = m_za_data.GetDataStart();
323-
else {
324-
disabled_za_data.resize(za_note_size);
325-
std::fill(disabled_za_data.begin(), disabled_za_data.end(), 0);
326-
src = disabled_za_data.data();
327-
}
328-
329-
value.SetFromMemoryData(*reg_info, src + sizeof(sve::user_za_header),
330-
reg_info->byte_size, lldb::eByteOrderLittle,
331-
error);
332-
}
333240
} else
334241
return false;
335242

lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,10 @@ class RegisterContextCorePOSIX_arm64 : public RegisterContextPOSIX_arm64 {
5858
lldb_private::DataExtractor m_sve_data;
5959
lldb_private::DataExtractor m_pac_data;
6060
lldb_private::DataExtractor m_tls_data;
61-
lldb_private::DataExtractor m_za_data;
6261

6362
SVEState m_sve_state;
6463
uint16_t m_sve_vector_length = 0;
6564

66-
// These are pseudo registers derived from the values in SSVE and ZA data.
67-
struct __attribute__((packed)) sme_pseudo_regs {
68-
uint64_t ctrl_reg;
69-
uint64_t svg_reg;
70-
};
71-
static_assert(sizeof(sme_pseudo_regs) == 16);
72-
73-
struct sme_pseudo_regs m_sme_pseudo_regs;
74-
7565
const uint8_t *GetSVEBuffer(uint64_t offset = 0);
7666

7767
void ConfigureRegisterContext();

lldb/source/Plugins/Process/elf-core/RegisterUtilities.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,6 @@ constexpr RegsetDesc AARCH64_SVE_Desc[] = {
119119
{llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_SVE},
120120
};
121121

122-
constexpr RegsetDesc AARCH64_SSVE_Desc[] = {
123-
{llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_SSVE},
124-
};
125-
126122
constexpr RegsetDesc AARCH64_ZA_Desc[] = {
127123
{llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_ZA},
128124
};

lldb/test/API/linux/aarch64/sme_core_file/TestAArch64LinuxSMECoreFile.py

Lines changed: 0 additions & 115 deletions
This file was deleted.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)