@@ -23,13 +23,8 @@ RegisterContextCorePOSIX_arm64::Create(Thread &thread, const ArchSpec &arch,
23
23
llvm::ArrayRef<CoreNote> notes) {
24
24
Flags opt_regsets = RegisterInfoPOSIX_arm64::eRegsetMaskDefault;
25
25
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
-
31
26
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))
33
28
opt_regsets.Set (RegisterInfoPOSIX_arm64::eRegsetMaskSVE);
34
29
35
30
// Pointer Authentication register set data is based on struct
@@ -45,11 +40,6 @@ RegisterContextCorePOSIX_arm64::Create(Thread &thread, const ArchSpec &arch,
45
40
if (tls_data.GetByteSize () >= sizeof (uint64_t ))
46
41
opt_regsets.Set (RegisterInfoPOSIX_arm64::eRegsetMaskTLS);
47
42
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
-
53
43
auto register_info_up =
54
44
std::make_unique<RegisterInfoPOSIX_arm64>(arch, opt_regsets);
55
45
return std::unique_ptr<RegisterContextCorePOSIX_arm64>(
@@ -61,8 +51,6 @@ RegisterContextCorePOSIX_arm64::RegisterContextCorePOSIX_arm64(
61
51
Thread &thread, std::unique_ptr<RegisterInfoPOSIX_arm64> register_info,
62
52
const DataExtractor &gpregset, llvm::ArrayRef<CoreNote> notes)
63
53
: RegisterContextPOSIX_arm64(thread, std::move(register_info)) {
64
- ::memset (&m_sme_pseudo_regs, 0 , sizeof (m_sme_pseudo_regs));
65
-
66
54
m_gpr_data.SetData (std::make_shared<DataBufferHeap>(gpregset.GetDataStart (),
67
55
gpregset.GetByteSize ()));
68
56
m_gpr_data.SetByteOrder (gpregset.GetByteOrder ());
@@ -71,15 +59,7 @@ RegisterContextCorePOSIX_arm64::RegisterContextCorePOSIX_arm64(
71
59
m_register_info_up->GetTargetArchitecture ().GetTriple ();
72
60
m_fpr_data = getRegset (notes, target_triple, FPR_Desc);
73
61
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 ())
83
63
m_sve_data = getRegset (notes, target_triple, AARCH64_SVE_Desc);
84
64
85
65
if (m_register_info_up->IsPAuthEnabled ())
@@ -88,9 +68,6 @@ RegisterContextCorePOSIX_arm64::RegisterContextCorePOSIX_arm64(
88
68
if (m_register_info_up->IsTLSEnabled ())
89
69
m_tls_data = getRegset (notes, target_triple, AARCH64_TLS_Desc);
90
70
91
- if (m_register_info_up->IsZAEnabled ())
92
- m_za_data = getRegset (notes, target_triple, AARCH64_ZA_Desc);
93
-
94
71
ConfigureRegisterContext ();
95
72
}
96
73
@@ -118,18 +95,15 @@ void RegisterContextCorePOSIX_arm64::ConfigureRegisterContext() {
118
95
if (m_sve_data.GetByteSize () > sizeof (sve::user_sve_header)) {
119
96
uint64_t sve_header_field_offset = 8 ;
120
97
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;
133
107
134
108
if (!sve::vl_valid (m_sve_vector_length)) {
135
109
m_sve_state = SVEState::Disabled;
@@ -141,23 +115,6 @@ void RegisterContextCorePOSIX_arm64::ConfigureRegisterContext() {
141
115
if (m_sve_state != SVEState::Disabled)
142
116
m_register_info_up->ConfigureVectorLengthSVE (
143
117
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
- }
161
118
}
162
119
163
120
uint32_t RegisterContextCorePOSIX_arm64::CalculateSVEOffset (
@@ -167,8 +124,7 @@ uint32_t RegisterContextCorePOSIX_arm64::CalculateSVEOffset(
167
124
if (m_sve_state == SVEState::FPSIMD) {
168
125
const uint32_t reg = reg_info->kinds [lldb::eRegisterKindLLDB];
169
126
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) {
172
128
uint32_t sve_z0_offset = GetGPRSize () + 16 ;
173
129
sve_reg_offset =
174
130
sve::SigRegsOffset () + reg_info->byte_offset - sve_z0_offset;
@@ -207,19 +163,19 @@ bool RegisterContextCorePOSIX_arm64::ReadRegister(const RegisterInfo *reg_info,
207
163
}
208
164
} else {
209
165
// 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.
213
169
uint32_t sve_reg_num = LLDB_INVALID_REGNUM;
214
170
if (reg == GetRegNumFPSR ()) {
215
171
sve_reg_num = reg;
216
- if (m_sve_state == SVEState::Full || m_sve_state == SVEState::Streaming )
172
+ if (m_sve_state == SVEState::Full)
217
173
offset = sve::PTraceFPSROffset (sve::vq_from_vl (m_sve_vector_length));
218
174
else if (m_sve_state == SVEState::FPSIMD)
219
175
offset = sve::ptrace_fpsimd_offset + (32 * 16 );
220
176
} else if (reg == GetRegNumFPCR ()) {
221
177
sve_reg_num = reg;
222
- if (m_sve_state == SVEState::Full || m_sve_state == SVEState::Streaming )
178
+ if (m_sve_state == SVEState::Full)
223
179
offset = sve::PTraceFPCROffset (sve::vq_from_vl (m_sve_vector_length));
224
180
else if (m_sve_state == SVEState::FPSIMD)
225
181
offset = sve::ptrace_fpsimd_offset + (32 * 16 ) + 4 ;
@@ -261,7 +217,6 @@ bool RegisterContextCorePOSIX_arm64::ReadRegister(const RegisterInfo *reg_info,
261
217
error);
262
218
} break ;
263
219
case SVEState::Full:
264
- case SVEState::Streaming:
265
220
offset = CalculateSVEOffset (reg_info);
266
221
assert (offset < m_sve_data.GetByteSize ());
267
222
value.SetFromMemoryData (*reg_info, GetSVEBuffer (offset),
@@ -282,54 +237,6 @@ bool RegisterContextCorePOSIX_arm64::ReadRegister(const RegisterInfo *reg_info,
282
237
assert (offset < m_tls_data.GetByteSize ());
283
238
value.SetFromMemoryData (*reg_info, m_tls_data.GetDataStart () + offset,
284
239
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
- }
333
240
} else
334
241
return false ;
335
242
0 commit comments