Skip to content

Commit 45be29b

Browse files
committed
CPU (Linux): replaces HWCAP defines with explicit bitmasks for ARM
1 parent 6f5e618 commit 45be29b

File tree

1 file changed

+33
-61
lines changed

1 file changed

+33
-61
lines changed

src/detection/cpu/cpu.c

Lines changed: 33 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -132,35 +132,7 @@ void ffCPUDetectByCpuid(FFCPUResult* cpu)
132132
#ifdef __linux__
133133
#include "common/io/io.h"
134134
#include <elf.h>
135-
#include <asm/hwcap.h>
136-
137-
#ifndef HWCAP2_SME
138-
#define HWCAP2_SME (1UL << 23)
139-
#endif
140-
#ifndef HWCAP2_SME2
141-
#define HWCAP2_SME2 (1UL << 37)
142-
#endif
143-
#ifndef HWCAP2_CSSC
144-
#define HWCAP2_CSSC (1UL << 34)
145-
#endif
146-
#ifndef HWCAP2_SME2P1
147-
#define HWCAP2_SME2P1 (1UL << 38)
148-
#endif
149-
#ifndef HWCAP2_MOPS
150-
#define HWCAP2_MOPS (1UL << 43)
151-
#endif
152-
#ifndef HWCAP2_F8E4M3
153-
#define HWCAP2_F8E4M3 (1UL << 55)
154-
#endif
155-
#ifndef HWCAP2_F8E5M2
156-
#define HWCAP2_F8E5M2 (1UL << 56)
157-
#endif
158-
#ifndef HWCAP_CMPBR
159-
#define HWCAP_CMPBR (1UL << 33)
160-
#endif
161-
#ifndef HWCAP_FPRCVT
162-
#define HWCAP_FPRCVT (1UL << 34)
163-
#endif
135+
// #include <asm/hwcap.h>
164136

165137
void ffCPUDetectByCpuid(FFCPUResult* cpu)
166138
{
@@ -188,69 +160,69 @@ void ffCPUDetectByCpuid(FFCPUResult* cpu)
188160
cpu->march = "unknown";
189161

190162
// ARMv8-A
191-
bool has_fp = (hwcap & HWCAP_FP) != 0;
192-
bool has_asimd = (hwcap & HWCAP_ASIMD) != 0;
163+
bool has_fp = (hwcap & (1 << 0) /* HWCAP_FP */) != 0;
164+
bool has_asimd = (hwcap & (1 << 1) /* HWCAP_ASIMD */) != 0;
193165

194166
// ARMv8.1-A
195-
bool has_atomics = (hwcap & HWCAP_ATOMICS) != 0; // optional from v8.0
196-
bool has_crc32 = (hwcap & HWCAP_CRC32) != 0; // optional from v8.0
197-
bool has_asimdrdm = (hwcap & HWCAP_ASIMDRDM) != 0; // optional from v8.0
167+
bool has_atomics = (hwcap & (1 << 8) /* HWCAP_ATOMICS */) != 0; // optional from v8.0
168+
bool has_crc32 = (hwcap & (1 << 7) /* HWCAP_CRC32 */) != 0; // optional from v8.0
169+
bool has_asimdrdm = (hwcap & (1 << 12) /* HWCAP_ASIMDRDM */) != 0; // optional from v8.0
198170

199171
// ARMv8.2-A
200-
bool has_fphp = (hwcap & HWCAP_FPHP) != 0; // optional
201-
bool has_dcpop = (hwcap & HWCAP_DCPOP) != 0; // DC CVAP, optional from v8.1
172+
bool has_fphp = (hwcap & (1 << 9) /* HWCAP_FPHP */) != 0; // optional
173+
bool has_dcpop = (hwcap & (1 << 16) /* HWCAP_DCPOP */) != 0; // DC CVAP, optional from v8.1
202174

203175
// ARMv8.3-A
204-
bool has_paca = (hwcap & HWCAP_PACA) != 0; // optional from v8.2
205-
bool has_lrcpc = (hwcap & HWCAP_LRCPC) != 0; // optional from v8.2
206-
bool has_fcma = (hwcap & HWCAP_FCMA) != 0; // optional from v8.2
207-
bool has_jscvt = (hwcap & HWCAP_JSCVT) != 0; // optional from v8.2
176+
bool has_paca = (hwcap & (1 << 30) /* HWCAP_PACA */) != 0; // optional from v8.2
177+
bool has_lrcpc = (hwcap & (1 << 15) /* HWCAP_LRCPC */) != 0; // optional from v8.2
178+
bool has_fcma = (hwcap & (1 << 14) /* HWCAP_FCMA */) != 0; // optional from v8.2
179+
bool has_jscvt = (hwcap & (1 << 13) /* HWCAP_JSCVT */) != 0; // optional from v8.2
208180

209181
// ARMv8.4-A
210-
bool has_dit = (hwcap & HWCAP_DIT) != 0; // optional from v8.3
211-
bool has_flagm = (hwcap & HWCAP_FLAGM) != 0; // optional from v8.1
212-
bool has_ilrcpc = (hwcap & HWCAP_ILRCPC) != 0; // optional from v8.2
182+
bool has_dit = (hwcap & (1 << 24) /* HWCAP_DIT */) != 0; // optional from v8.3
183+
bool has_flagm = (hwcap & (1 << 27) /* HWCAP_FLAGM */) != 0; // optional from v8.1
184+
bool has_ilrcpc = (hwcap & (1 << 26) /* HWCAP_ILRCPC */) != 0; // optional from v8.2
213185

214186
// ARMv8.5-A
215-
bool has_bti = (hwcap2 & HWCAP2_BTI) != 0; // optional from v8.4
216-
bool has_sb = (hwcap & HWCAP_SB) != 0; // optional from v8.0
217-
bool has_dcpodp = (hwcap2 & HWCAP2_DCPODP) != 0; // optional from v8.1
218-
bool has_flagm2 = (hwcap2 & HWCAP2_FLAGM2) != 0; // optional from v8.4
219-
bool has_frint = (hwcap2 & HWCAP2_FRINT) != 0; // optional from v8.4
187+
bool has_bti = (hwcap2 & (1 << 17) /* HWCAP2_BTI */) != 0; // optional from v8.4
188+
bool has_sb = (hwcap & (1 << 29) /* HWCAP_SB */) != 0; // optional from v8.0
189+
bool has_dcpodp = (hwcap2 & (1 << 0) /* HWCAP2_DCPODP */) != 0; // optional from v8.1
190+
bool has_flagm2 = (hwcap2 & (1 << 7) /* HWCAP2_FLAGM2 */) != 0; // optional from v8.4
191+
bool has_frint = (hwcap2 & (1 << 8) /* HWCAP2_FRINT */) != 0; // optional from v8.4
220192

221193
// ARMv9.0-A
222-
bool has_sve2 = (hwcap2 & HWCAP2_SVE2) != 0;
194+
bool has_sve2 = (hwcap2 & (1 << 1) /* HWCAP2_SVE2 */) != 0;
223195

224196
// ARMv9.1-A
225197
// ARMv8.6-A
226-
bool has_bf16 = (hwcap2 & HWCAP2_BF16) != 0; // optional from v8.2
227-
bool has_i8mm = (hwcap2 & HWCAP2_I8MM) != 0; // optional from v8.1
198+
bool has_bf16 = (hwcap2 & (1 << 14) /* HWCAP2_BF16 */) != 0; // optional from v8.2
199+
bool has_i8mm = (hwcap2 & (1 << 13) /* HWCAP2_I8MM */) != 0; // optional from v8.1
228200

229201
// ARMv8.7-A
230-
bool has_afp = (hwcap2 & HWCAP2_AFP) != 0; // optional from v8.6
202+
bool has_afp = (hwcap2 & (1 << 20) /* HWCAP2_AFP */) != 0; // optional from v8.6
231203

232204
// ARMv9.2-A
233-
bool has_sme = (hwcap2 & HWCAP2_SME) != 0;
205+
bool has_sme = (hwcap2 & (1 << 23) /* HWCAP2_SME */) != 0;
234206

235207
// ARMv9.3-A
236-
bool has_sme2 = (hwcap2 & HWCAP2_SME2) != 0; // optional from v9.2
208+
bool has_sme2 = (hwcap2 & (1UL << 37) /* HWCAP2_SME2 */) != 0; // optional from v9.2
237209

238210
// ARMv8.8-A
239-
bool has_mops = (hwcap2 & HWCAP2_MOPS) != 0; // optional from v8.7
211+
bool has_mops = (hwcap2 & (1UL << 43) /* HWCAP2_MOPS */) != 0; // optional from v8.7
240212

241213
// ARMv8.9-A
242-
bool has_cssc = (hwcap2 & HWCAP2_CSSC) != 0; // optional from v8.7
214+
bool has_cssc = (hwcap2 & (1UL << 34) /* HWCAP2_CSSC */) != 0; // optional from v8.7
243215

244216
// ARMv9.4-A
245-
bool has_sme2p1 = (hwcap2 & HWCAP2_SME2P1) != 0; // optional from v9.2
217+
bool has_sme2p1 = (hwcap2 & (1UL << 38) /* HWCAP2_SME2P1 */) != 0; // optional from v9.2
246218

247219
// ARMv9.5-A
248-
bool has_f8e4m3 = (hwcap2 & HWCAP2_F8E4M3) != 0; // optional from v9.2
249-
bool has_f8e5m2 = (hwcap2 & HWCAP2_F8E5M2) != 0; // optional from v9.2
220+
bool has_f8e4m3 = (hwcap2 & (1UL << 55) /* HWCAP2_F8E4M3 */) != 0; // optional from v9.2
221+
bool has_f8e5m2 = (hwcap2 & (1UL << 56) /* HWCAP2_F8E5M2 */) != 0; // optional from v9.2
250222

251223
// ARMv9.6-A
252-
bool has_cmpbr = (hwcap & HWCAP_CMPBR) != 0; // optional from v9.5
253-
bool has_fprcvt = (hwcap & HWCAP_FPRCVT) != 0; // optional from v9.5
224+
bool has_cmpbr = (hwcap & (1UL << 33) /* HWCAP_CMPBR */) != 0; // optional from v9.5
225+
bool has_fprcvt = (hwcap & (1UL << 34) /* HWCAP_FPRCVT */) != 0; // optional from v9.5
254226

255227
if (has_sve2 || has_sme) {
256228
// ARMv9

0 commit comments

Comments
 (0)