1*bbb1b6f9SApple OSS Distributions /*
2*bbb1b6f9SApple OSS Distributions * Copyright (c) 2020 Apple Computer, Inc. All rights reserved.
3*bbb1b6f9SApple OSS Distributions *
4*bbb1b6f9SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*bbb1b6f9SApple OSS Distributions *
6*bbb1b6f9SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7*bbb1b6f9SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8*bbb1b6f9SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9*bbb1b6f9SApple OSS Distributions * compliance with the License. The rights granted to you under the License
10*bbb1b6f9SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11*bbb1b6f9SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12*bbb1b6f9SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13*bbb1b6f9SApple OSS Distributions * terms of an Apple operating system software license agreement.
14*bbb1b6f9SApple OSS Distributions *
15*bbb1b6f9SApple OSS Distributions * Please obtain a copy of the License at
16*bbb1b6f9SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*bbb1b6f9SApple OSS Distributions *
18*bbb1b6f9SApple OSS Distributions * The Original Code and all software distributed under the License are
19*bbb1b6f9SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*bbb1b6f9SApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*bbb1b6f9SApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*bbb1b6f9SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*bbb1b6f9SApple OSS Distributions * Please see the License for the specific language governing rights and
24*bbb1b6f9SApple OSS Distributions * limitations under the License.
25*bbb1b6f9SApple OSS Distributions *
26*bbb1b6f9SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*bbb1b6f9SApple OSS Distributions */
28*bbb1b6f9SApple OSS Distributions
29*bbb1b6f9SApple OSS Distributions #include <cpu_capabilities_public.h>
30*bbb1b6f9SApple OSS Distributions #include <darwintest.h>
31*bbb1b6f9SApple OSS Distributions #include <machine/cpu_capabilities.h>
32*bbb1b6f9SApple OSS Distributions #include <stdlib.h>
33*bbb1b6f9SApple OSS Distributions #include <sys/sysctl.h>
34*bbb1b6f9SApple OSS Distributions
35*bbb1b6f9SApple OSS Distributions #include "exc_helpers.h"
36*bbb1b6f9SApple OSS Distributions
37*bbb1b6f9SApple OSS Distributions T_GLOBAL_META(
38*bbb1b6f9SApple OSS Distributions T_META_NAMESPACE("xnu.arm"),
39*bbb1b6f9SApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"),
40*bbb1b6f9SApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("arm"),
41*bbb1b6f9SApple OSS Distributions T_META_OWNER("ghackmann"),
42*bbb1b6f9SApple OSS Distributions T_META_RUN_CONCURRENTLY(true),
43*bbb1b6f9SApple OSS Distributions T_META_TAG("SoCSpecific")
44*bbb1b6f9SApple OSS Distributions );
45*bbb1b6f9SApple OSS Distributions
46*bbb1b6f9SApple OSS Distributions static volatile bool cap_usable;
47*bbb1b6f9SApple OSS Distributions
48*bbb1b6f9SApple OSS Distributions static size_t
bad_instruction_handler(mach_port_t task __unused,mach_port_t thread __unused,exception_type_t type __unused,mach_exception_data_t codes __unused,uint64_t exception_pc __unused)49*bbb1b6f9SApple OSS Distributions bad_instruction_handler(mach_port_t task __unused, mach_port_t thread __unused,
50*bbb1b6f9SApple OSS Distributions exception_type_t type __unused, mach_exception_data_t codes __unused,
51*bbb1b6f9SApple OSS Distributions uint64_t exception_pc __unused)
52*bbb1b6f9SApple OSS Distributions {
53*bbb1b6f9SApple OSS Distributions cap_usable = false;
54*bbb1b6f9SApple OSS Distributions return 4;
55*bbb1b6f9SApple OSS Distributions }
56*bbb1b6f9SApple OSS Distributions
57*bbb1b6f9SApple OSS Distributions static void
try_fp16(void)58*bbb1b6f9SApple OSS Distributions try_fp16(void)
59*bbb1b6f9SApple OSS Distributions {
60*bbb1b6f9SApple OSS Distributions asm volatile (
61*bbb1b6f9SApple OSS Distributions "fmov h0, #0" "\n"
62*bbb1b6f9SApple OSS Distributions :
63*bbb1b6f9SApple OSS Distributions :
64*bbb1b6f9SApple OSS Distributions : "v0"
65*bbb1b6f9SApple OSS Distributions );
66*bbb1b6f9SApple OSS Distributions }
67*bbb1b6f9SApple OSS Distributions
68*bbb1b6f9SApple OSS Distributions static void
try_atomics(void)69*bbb1b6f9SApple OSS Distributions try_atomics(void)
70*bbb1b6f9SApple OSS Distributions {
71*bbb1b6f9SApple OSS Distributions uint64_t dword;
72*bbb1b6f9SApple OSS Distributions asm volatile (
73*bbb1b6f9SApple OSS Distributions "swp xzr, xzr, [%[dword]]"
74*bbb1b6f9SApple OSS Distributions :
75*bbb1b6f9SApple OSS Distributions : [dword]"r"(&dword)
76*bbb1b6f9SApple OSS Distributions );
77*bbb1b6f9SApple OSS Distributions }
78*bbb1b6f9SApple OSS Distributions
79*bbb1b6f9SApple OSS Distributions static void
try_crc32(void)80*bbb1b6f9SApple OSS Distributions try_crc32(void)
81*bbb1b6f9SApple OSS Distributions {
82*bbb1b6f9SApple OSS Distributions asm volatile ( "crc32b wzr, wzr, wzr");
83*bbb1b6f9SApple OSS Distributions }
84*bbb1b6f9SApple OSS Distributions
85*bbb1b6f9SApple OSS Distributions static void
try_fhm(void)86*bbb1b6f9SApple OSS Distributions try_fhm(void)
87*bbb1b6f9SApple OSS Distributions {
88*bbb1b6f9SApple OSS Distributions asm volatile (
89*bbb1b6f9SApple OSS Distributions "fmov d0, #0" "\n"
90*bbb1b6f9SApple OSS Distributions "fmlal v0.2s, v0.2h, v0.2h" "\n"
91*bbb1b6f9SApple OSS Distributions :
92*bbb1b6f9SApple OSS Distributions :
93*bbb1b6f9SApple OSS Distributions : "v0"
94*bbb1b6f9SApple OSS Distributions );
95*bbb1b6f9SApple OSS Distributions }
96*bbb1b6f9SApple OSS Distributions
97*bbb1b6f9SApple OSS Distributions static void
try_sha512(void)98*bbb1b6f9SApple OSS Distributions try_sha512(void)
99*bbb1b6f9SApple OSS Distributions {
100*bbb1b6f9SApple OSS Distributions asm volatile (
101*bbb1b6f9SApple OSS Distributions "fmov d0, #0" "\n"
102*bbb1b6f9SApple OSS Distributions "fmov d1, #0" "\n"
103*bbb1b6f9SApple OSS Distributions "sha512h q0, q0, v0.2d" "\n"
104*bbb1b6f9SApple OSS Distributions :
105*bbb1b6f9SApple OSS Distributions :
106*bbb1b6f9SApple OSS Distributions : "v0"
107*bbb1b6f9SApple OSS Distributions );
108*bbb1b6f9SApple OSS Distributions }
109*bbb1b6f9SApple OSS Distributions
110*bbb1b6f9SApple OSS Distributions static void
try_sha3(void)111*bbb1b6f9SApple OSS Distributions try_sha3(void)
112*bbb1b6f9SApple OSS Distributions {
113*bbb1b6f9SApple OSS Distributions asm volatile (
114*bbb1b6f9SApple OSS Distributions "fmov d0, #0" "\n"
115*bbb1b6f9SApple OSS Distributions "fmov d1, #0" "\n"
116*bbb1b6f9SApple OSS Distributions "eor3 v0.16b, v0.16b, v0.16b, v0.16b" "\n"
117*bbb1b6f9SApple OSS Distributions :
118*bbb1b6f9SApple OSS Distributions :
119*bbb1b6f9SApple OSS Distributions : "v0"
120*bbb1b6f9SApple OSS Distributions );
121*bbb1b6f9SApple OSS Distributions }
122*bbb1b6f9SApple OSS Distributions
123*bbb1b6f9SApple OSS Distributions static void
try_sha1(void)124*bbb1b6f9SApple OSS Distributions try_sha1(void)
125*bbb1b6f9SApple OSS Distributions {
126*bbb1b6f9SApple OSS Distributions asm volatile (
127*bbb1b6f9SApple OSS Distributions "fmov s0, #0" "\n"
128*bbb1b6f9SApple OSS Distributions "sha1h s0, s0" "\n"
129*bbb1b6f9SApple OSS Distributions :
130*bbb1b6f9SApple OSS Distributions :
131*bbb1b6f9SApple OSS Distributions : "v0"
132*bbb1b6f9SApple OSS Distributions );
133*bbb1b6f9SApple OSS Distributions }
134*bbb1b6f9SApple OSS Distributions
135*bbb1b6f9SApple OSS Distributions static void
try_pmull(void)136*bbb1b6f9SApple OSS Distributions try_pmull(void)
137*bbb1b6f9SApple OSS Distributions {
138*bbb1b6f9SApple OSS Distributions asm volatile (
139*bbb1b6f9SApple OSS Distributions "fmov d0, #0" "\n"
140*bbb1b6f9SApple OSS Distributions "pmull v0.1q, v0.1d, v0.1d" "\n"
141*bbb1b6f9SApple OSS Distributions :
142*bbb1b6f9SApple OSS Distributions :
143*bbb1b6f9SApple OSS Distributions : "v0"
144*bbb1b6f9SApple OSS Distributions );
145*bbb1b6f9SApple OSS Distributions }
146*bbb1b6f9SApple OSS Distributions
147*bbb1b6f9SApple OSS Distributions static void
try_aes(void)148*bbb1b6f9SApple OSS Distributions try_aes(void)
149*bbb1b6f9SApple OSS Distributions {
150*bbb1b6f9SApple OSS Distributions asm volatile (
151*bbb1b6f9SApple OSS Distributions "fmov d0, #0" "\n"
152*bbb1b6f9SApple OSS Distributions "fmov d1, #0" "\n"
153*bbb1b6f9SApple OSS Distributions "aesd v0.16B, v0.16B" "\n"
154*bbb1b6f9SApple OSS Distributions :
155*bbb1b6f9SApple OSS Distributions :
156*bbb1b6f9SApple OSS Distributions : "v0"
157*bbb1b6f9SApple OSS Distributions );
158*bbb1b6f9SApple OSS Distributions }
159*bbb1b6f9SApple OSS Distributions
160*bbb1b6f9SApple OSS Distributions
161*bbb1b6f9SApple OSS Distributions static void
try_sha256(void)162*bbb1b6f9SApple OSS Distributions try_sha256(void)
163*bbb1b6f9SApple OSS Distributions {
164*bbb1b6f9SApple OSS Distributions asm volatile (
165*bbb1b6f9SApple OSS Distributions "fmov d0, #0" "\n"
166*bbb1b6f9SApple OSS Distributions "fmov d1, #0" "\n"
167*bbb1b6f9SApple OSS Distributions "sha256h q0, q0, v0.4s" "\n"
168*bbb1b6f9SApple OSS Distributions :
169*bbb1b6f9SApple OSS Distributions :
170*bbb1b6f9SApple OSS Distributions : "v0"
171*bbb1b6f9SApple OSS Distributions );
172*bbb1b6f9SApple OSS Distributions }
173*bbb1b6f9SApple OSS Distributions
174*bbb1b6f9SApple OSS Distributions
175*bbb1b6f9SApple OSS Distributions static void
try_compnum(void)176*bbb1b6f9SApple OSS Distributions try_compnum(void)
177*bbb1b6f9SApple OSS Distributions {
178*bbb1b6f9SApple OSS Distributions asm volatile (
179*bbb1b6f9SApple OSS Distributions "fmov d0, #0" "\n"
180*bbb1b6f9SApple OSS Distributions "fcadd v0.2s, v0.2s, v0.2s, #90" "\n"
181*bbb1b6f9SApple OSS Distributions :
182*bbb1b6f9SApple OSS Distributions :
183*bbb1b6f9SApple OSS Distributions : "v0"
184*bbb1b6f9SApple OSS Distributions );
185*bbb1b6f9SApple OSS Distributions }
186*bbb1b6f9SApple OSS Distributions
187*bbb1b6f9SApple OSS Distributions
188*bbb1b6f9SApple OSS Distributions static void
try_flagm(void)189*bbb1b6f9SApple OSS Distributions try_flagm(void)
190*bbb1b6f9SApple OSS Distributions {
191*bbb1b6f9SApple OSS Distributions asm volatile (
192*bbb1b6f9SApple OSS Distributions "cfinv" "\n"
193*bbb1b6f9SApple OSS Distributions "cfinv" "\n"
194*bbb1b6f9SApple OSS Distributions );
195*bbb1b6f9SApple OSS Distributions }
196*bbb1b6f9SApple OSS Distributions
197*bbb1b6f9SApple OSS Distributions static void
try_flagm2(void)198*bbb1b6f9SApple OSS Distributions try_flagm2(void)
199*bbb1b6f9SApple OSS Distributions {
200*bbb1b6f9SApple OSS Distributions asm volatile (
201*bbb1b6f9SApple OSS Distributions "axflag" "\n"
202*bbb1b6f9SApple OSS Distributions "xaflag" "\n"
203*bbb1b6f9SApple OSS Distributions );
204*bbb1b6f9SApple OSS Distributions }
205*bbb1b6f9SApple OSS Distributions
206*bbb1b6f9SApple OSS Distributions static void
try_dotprod(void)207*bbb1b6f9SApple OSS Distributions try_dotprod(void)
208*bbb1b6f9SApple OSS Distributions {
209*bbb1b6f9SApple OSS Distributions asm volatile (
210*bbb1b6f9SApple OSS Distributions "udot v0.4S,v1.16B,v2.16B"
211*bbb1b6f9SApple OSS Distributions :
212*bbb1b6f9SApple OSS Distributions :
213*bbb1b6f9SApple OSS Distributions : "v0"
214*bbb1b6f9SApple OSS Distributions );
215*bbb1b6f9SApple OSS Distributions }
216*bbb1b6f9SApple OSS Distributions
217*bbb1b6f9SApple OSS Distributions static void
try_rdm(void)218*bbb1b6f9SApple OSS Distributions try_rdm(void)
219*bbb1b6f9SApple OSS Distributions {
220*bbb1b6f9SApple OSS Distributions asm volatile (
221*bbb1b6f9SApple OSS Distributions "sqrdmlah s0, s1, s2"
222*bbb1b6f9SApple OSS Distributions :
223*bbb1b6f9SApple OSS Distributions :
224*bbb1b6f9SApple OSS Distributions : "s0"
225*bbb1b6f9SApple OSS Distributions );
226*bbb1b6f9SApple OSS Distributions }
227*bbb1b6f9SApple OSS Distributions
228*bbb1b6f9SApple OSS Distributions static void
try_sb(void)229*bbb1b6f9SApple OSS Distributions try_sb(void)
230*bbb1b6f9SApple OSS Distributions {
231*bbb1b6f9SApple OSS Distributions asm volatile (
232*bbb1b6f9SApple OSS Distributions "sb"
233*bbb1b6f9SApple OSS Distributions );
234*bbb1b6f9SApple OSS Distributions }
235*bbb1b6f9SApple OSS Distributions
236*bbb1b6f9SApple OSS Distributions static void
try_frintts(void)237*bbb1b6f9SApple OSS Distributions try_frintts(void)
238*bbb1b6f9SApple OSS Distributions {
239*bbb1b6f9SApple OSS Distributions asm volatile (
240*bbb1b6f9SApple OSS Distributions "frint32x s0, s0"
241*bbb1b6f9SApple OSS Distributions :
242*bbb1b6f9SApple OSS Distributions :
243*bbb1b6f9SApple OSS Distributions : "s0"
244*bbb1b6f9SApple OSS Distributions );
245*bbb1b6f9SApple OSS Distributions }
246*bbb1b6f9SApple OSS Distributions
247*bbb1b6f9SApple OSS Distributions static void
try_jscvt(void)248*bbb1b6f9SApple OSS Distributions try_jscvt(void)
249*bbb1b6f9SApple OSS Distributions {
250*bbb1b6f9SApple OSS Distributions asm volatile (
251*bbb1b6f9SApple OSS Distributions "fmov d0, #0" "\n"
252*bbb1b6f9SApple OSS Distributions "fjcvtzs w1, d0" "\n"
253*bbb1b6f9SApple OSS Distributions :
254*bbb1b6f9SApple OSS Distributions :
255*bbb1b6f9SApple OSS Distributions : "w1", "d0"
256*bbb1b6f9SApple OSS Distributions );
257*bbb1b6f9SApple OSS Distributions }
258*bbb1b6f9SApple OSS Distributions
259*bbb1b6f9SApple OSS Distributions static void
try_pauth(void)260*bbb1b6f9SApple OSS Distributions try_pauth(void)
261*bbb1b6f9SApple OSS Distributions {
262*bbb1b6f9SApple OSS Distributions asm volatile (
263*bbb1b6f9SApple OSS Distributions "pacga x0, x0, x0"
264*bbb1b6f9SApple OSS Distributions :
265*bbb1b6f9SApple OSS Distributions :
266*bbb1b6f9SApple OSS Distributions : "x0"
267*bbb1b6f9SApple OSS Distributions );
268*bbb1b6f9SApple OSS Distributions }
269*bbb1b6f9SApple OSS Distributions
270*bbb1b6f9SApple OSS Distributions static void
try_dpb(void)271*bbb1b6f9SApple OSS Distributions try_dpb(void)
272*bbb1b6f9SApple OSS Distributions {
273*bbb1b6f9SApple OSS Distributions int x;
274*bbb1b6f9SApple OSS Distributions asm volatile (
275*bbb1b6f9SApple OSS Distributions "dc cvap, %0"
276*bbb1b6f9SApple OSS Distributions :
277*bbb1b6f9SApple OSS Distributions : "r" (&x)
278*bbb1b6f9SApple OSS Distributions );
279*bbb1b6f9SApple OSS Distributions }
280*bbb1b6f9SApple OSS Distributions
281*bbb1b6f9SApple OSS Distributions static void
try_dpb2(void)282*bbb1b6f9SApple OSS Distributions try_dpb2(void)
283*bbb1b6f9SApple OSS Distributions {
284*bbb1b6f9SApple OSS Distributions int x;
285*bbb1b6f9SApple OSS Distributions asm volatile (
286*bbb1b6f9SApple OSS Distributions "dc cvadp, %0"
287*bbb1b6f9SApple OSS Distributions :
288*bbb1b6f9SApple OSS Distributions : "r" (&x)
289*bbb1b6f9SApple OSS Distributions );
290*bbb1b6f9SApple OSS Distributions }
291*bbb1b6f9SApple OSS Distributions
292*bbb1b6f9SApple OSS Distributions static void
try_lrcpc(void)293*bbb1b6f9SApple OSS Distributions try_lrcpc(void)
294*bbb1b6f9SApple OSS Distributions {
295*bbb1b6f9SApple OSS Distributions int x;
296*bbb1b6f9SApple OSS Distributions asm volatile (
297*bbb1b6f9SApple OSS Distributions "ldaprb w0, [%0]"
298*bbb1b6f9SApple OSS Distributions :
299*bbb1b6f9SApple OSS Distributions : "r" (&x)
300*bbb1b6f9SApple OSS Distributions : "w0"
301*bbb1b6f9SApple OSS Distributions );
302*bbb1b6f9SApple OSS Distributions }
303*bbb1b6f9SApple OSS Distributions
304*bbb1b6f9SApple OSS Distributions static void
try_lrcpc2(void)305*bbb1b6f9SApple OSS Distributions try_lrcpc2(void)
306*bbb1b6f9SApple OSS Distributions {
307*bbb1b6f9SApple OSS Distributions int x;
308*bbb1b6f9SApple OSS Distributions asm volatile (
309*bbb1b6f9SApple OSS Distributions "ldapurb w0, [%0]"
310*bbb1b6f9SApple OSS Distributions :
311*bbb1b6f9SApple OSS Distributions : "r" (&x)
312*bbb1b6f9SApple OSS Distributions : "w0"
313*bbb1b6f9SApple OSS Distributions );
314*bbb1b6f9SApple OSS Distributions }
315*bbb1b6f9SApple OSS Distributions
316*bbb1b6f9SApple OSS Distributions
317*bbb1b6f9SApple OSS Distributions static void
try_specres(void)318*bbb1b6f9SApple OSS Distributions try_specres(void)
319*bbb1b6f9SApple OSS Distributions {
320*bbb1b6f9SApple OSS Distributions int x;
321*bbb1b6f9SApple OSS Distributions asm volatile (
322*bbb1b6f9SApple OSS Distributions "cfp rctx, %0"
323*bbb1b6f9SApple OSS Distributions :
324*bbb1b6f9SApple OSS Distributions : "r" (&x)
325*bbb1b6f9SApple OSS Distributions );
326*bbb1b6f9SApple OSS Distributions }
327*bbb1b6f9SApple OSS Distributions
328*bbb1b6f9SApple OSS Distributions static void
try_bf16(void)329*bbb1b6f9SApple OSS Distributions try_bf16(void)
330*bbb1b6f9SApple OSS Distributions {
331*bbb1b6f9SApple OSS Distributions asm volatile (
332*bbb1b6f9SApple OSS Distributions "bfdot v0.4S,v1.8H,v2.8H"
333*bbb1b6f9SApple OSS Distributions :
334*bbb1b6f9SApple OSS Distributions :
335*bbb1b6f9SApple OSS Distributions : "v0"
336*bbb1b6f9SApple OSS Distributions );
337*bbb1b6f9SApple OSS Distributions }
338*bbb1b6f9SApple OSS Distributions
339*bbb1b6f9SApple OSS Distributions static void
try_i8mm(void)340*bbb1b6f9SApple OSS Distributions try_i8mm(void)
341*bbb1b6f9SApple OSS Distributions {
342*bbb1b6f9SApple OSS Distributions asm volatile (
343*bbb1b6f9SApple OSS Distributions "sudot v0.4S,v1.16B,v2.4B[0]"
344*bbb1b6f9SApple OSS Distributions :
345*bbb1b6f9SApple OSS Distributions :
346*bbb1b6f9SApple OSS Distributions : "v0"
347*bbb1b6f9SApple OSS Distributions );
348*bbb1b6f9SApple OSS Distributions }
349*bbb1b6f9SApple OSS Distributions
350*bbb1b6f9SApple OSS Distributions static void
try_ecv(void)351*bbb1b6f9SApple OSS Distributions try_ecv(void)
352*bbb1b6f9SApple OSS Distributions {
353*bbb1b6f9SApple OSS Distributions /*
354*bbb1b6f9SApple OSS Distributions * These registers are present only when FEAT_ECV is implemented.
355*bbb1b6f9SApple OSS Distributions * Otherwise, direct accesses to CNTPCTSS_EL0 or CNTVCTSS_EL0 are UNDEFINED.
356*bbb1b6f9SApple OSS Distributions */
357*bbb1b6f9SApple OSS Distributions (void)__builtin_arm_rsr64("CNTPCTSS_EL0");
358*bbb1b6f9SApple OSS Distributions (void)__builtin_arm_rsr64("CNTVCTSS_EL0");
359*bbb1b6f9SApple OSS Distributions }
360*bbb1b6f9SApple OSS Distributions
361*bbb1b6f9SApple OSS Distributions static void
try_afp(void)362*bbb1b6f9SApple OSS Distributions try_afp(void)
363*bbb1b6f9SApple OSS Distributions {
364*bbb1b6f9SApple OSS Distributions /*
365*bbb1b6f9SApple OSS Distributions * FEAT_AFP can be detected via three new FPCR bits which were
366*bbb1b6f9SApple OSS Distributions * previously marked read-as-zero.
367*bbb1b6f9SApple OSS Distributions */
368*bbb1b6f9SApple OSS Distributions const uint64_t FPCR_AFP_FLAGS = (1 << 0) | (1 << 1) | (1 << 2);
369*bbb1b6f9SApple OSS Distributions
370*bbb1b6f9SApple OSS Distributions uint64_t old_fpcr = __builtin_arm_rsr64("FPCR");
371*bbb1b6f9SApple OSS Distributions __builtin_arm_wsr64("FPCR", old_fpcr | FPCR_AFP_FLAGS);
372*bbb1b6f9SApple OSS Distributions uint64_t new_fpcr = __builtin_arm_rsr64("FPCR");
373*bbb1b6f9SApple OSS Distributions __builtin_arm_wsr64("FPCR", old_fpcr);
374*bbb1b6f9SApple OSS Distributions
375*bbb1b6f9SApple OSS Distributions if ((new_fpcr & FPCR_AFP_FLAGS) != FPCR_AFP_FLAGS) {
376*bbb1b6f9SApple OSS Distributions cap_usable = false;
377*bbb1b6f9SApple OSS Distributions }
378*bbb1b6f9SApple OSS Distributions }
379*bbb1b6f9SApple OSS Distributions
380*bbb1b6f9SApple OSS Distributions static void
try_rpres(void)381*bbb1b6f9SApple OSS Distributions try_rpres(void)
382*bbb1b6f9SApple OSS Distributions {
383*bbb1b6f9SApple OSS Distributions /*
384*bbb1b6f9SApple OSS Distributions * When FEAT_RPRES is enabled via FPCR.AH, floating-point reciprocal
385*bbb1b6f9SApple OSS Distributions * estimate instructions increase precision from 8 mantissa bits to 12
386*bbb1b6f9SApple OSS Distributions * mantissa bits. This can be detected by estimating 1/10.0 (which has
387*bbb1b6f9SApple OSS Distributions * no exact floating-point representation) and checking bits 11-14.
388*bbb1b6f9SApple OSS Distributions */
389*bbb1b6f9SApple OSS Distributions const uint64_t FPCR_AH = (1 << 1);
390*bbb1b6f9SApple OSS Distributions const uint32_t EXTRA_MANTISSA_BITS = (0xf << 11);
391*bbb1b6f9SApple OSS Distributions
392*bbb1b6f9SApple OSS Distributions uint32_t recip;
393*bbb1b6f9SApple OSS Distributions uint64_t old_fpcr = __builtin_arm_rsr64("FPCR");
394*bbb1b6f9SApple OSS Distributions __builtin_arm_wsr64("FPCR", old_fpcr | FPCR_AH);
395*bbb1b6f9SApple OSS Distributions asm volatile (
396*bbb1b6f9SApple OSS Distributions "fmov s0, #10.0" "\n"
397*bbb1b6f9SApple OSS Distributions "frecpe s0, s0" "\n"
398*bbb1b6f9SApple OSS Distributions "fmov %w0, s0" "\n"
399*bbb1b6f9SApple OSS Distributions : "=r"(recip)
400*bbb1b6f9SApple OSS Distributions :
401*bbb1b6f9SApple OSS Distributions : "s0"
402*bbb1b6f9SApple OSS Distributions );
403*bbb1b6f9SApple OSS Distributions __builtin_arm_wsr64("FPCR", old_fpcr);
404*bbb1b6f9SApple OSS Distributions
405*bbb1b6f9SApple OSS Distributions if ((recip & EXTRA_MANTISSA_BITS) == 0) {
406*bbb1b6f9SApple OSS Distributions cap_usable = false;
407*bbb1b6f9SApple OSS Distributions }
408*bbb1b6f9SApple OSS Distributions }
409*bbb1b6f9SApple OSS Distributions
410*bbb1b6f9SApple OSS Distributions __attribute__((target("wfxt")))
411*bbb1b6f9SApple OSS Distributions static void
try_wfxt(void)412*bbb1b6f9SApple OSS Distributions try_wfxt(void)
413*bbb1b6f9SApple OSS Distributions {
414*bbb1b6f9SApple OSS Distributions asm volatile ("wfet xzr");
415*bbb1b6f9SApple OSS Distributions }
416*bbb1b6f9SApple OSS Distributions
417*bbb1b6f9SApple OSS Distributions static void
try_sme(void)418*bbb1b6f9SApple OSS Distributions try_sme(void)
419*bbb1b6f9SApple OSS Distributions {
420*bbb1b6f9SApple OSS Distributions asm volatile (
421*bbb1b6f9SApple OSS Distributions "rdsvl x0, #1"
422*bbb1b6f9SApple OSS Distributions :
423*bbb1b6f9SApple OSS Distributions :
424*bbb1b6f9SApple OSS Distributions : "x0"
425*bbb1b6f9SApple OSS Distributions );
426*bbb1b6f9SApple OSS Distributions }
427*bbb1b6f9SApple OSS Distributions
428*bbb1b6f9SApple OSS Distributions static void
try_sme2(void)429*bbb1b6f9SApple OSS Distributions try_sme2(void)
430*bbb1b6f9SApple OSS Distributions {
431*bbb1b6f9SApple OSS Distributions asm volatile (
432*bbb1b6f9SApple OSS Distributions "smstart za" "\n"
433*bbb1b6f9SApple OSS Distributions "zero { zt0 }" "\n"
434*bbb1b6f9SApple OSS Distributions "smstop za" "\n"
435*bbb1b6f9SApple OSS Distributions );
436*bbb1b6f9SApple OSS Distributions }
437*bbb1b6f9SApple OSS Distributions
438*bbb1b6f9SApple OSS Distributions static void
try_sme_f32f32(void)439*bbb1b6f9SApple OSS Distributions try_sme_f32f32(void)
440*bbb1b6f9SApple OSS Distributions {
441*bbb1b6f9SApple OSS Distributions asm volatile (
442*bbb1b6f9SApple OSS Distributions "smstart" "\n"
443*bbb1b6f9SApple OSS Distributions "fmopa za0.s, p0/m, p0/m, z0.s, z0.s" "\n"
444*bbb1b6f9SApple OSS Distributions "smstop" "\n"
445*bbb1b6f9SApple OSS Distributions );
446*bbb1b6f9SApple OSS Distributions }
447*bbb1b6f9SApple OSS Distributions
448*bbb1b6f9SApple OSS Distributions static void
try_sme_bi32i32(void)449*bbb1b6f9SApple OSS Distributions try_sme_bi32i32(void)
450*bbb1b6f9SApple OSS Distributions {
451*bbb1b6f9SApple OSS Distributions asm volatile (
452*bbb1b6f9SApple OSS Distributions "smstart" "\n"
453*bbb1b6f9SApple OSS Distributions "bmopa za0.s, p0/m, p0/m, z0.s, z0.s" "\n"
454*bbb1b6f9SApple OSS Distributions "smstop" "\n"
455*bbb1b6f9SApple OSS Distributions );
456*bbb1b6f9SApple OSS Distributions }
457*bbb1b6f9SApple OSS Distributions
458*bbb1b6f9SApple OSS Distributions static void
try_sme_b16f32(void)459*bbb1b6f9SApple OSS Distributions try_sme_b16f32(void)
460*bbb1b6f9SApple OSS Distributions {
461*bbb1b6f9SApple OSS Distributions asm volatile (
462*bbb1b6f9SApple OSS Distributions "smstart" "\n"
463*bbb1b6f9SApple OSS Distributions "bfmopa za0.s, p0/m, p0/m, z0.h, z0.h" "\n"
464*bbb1b6f9SApple OSS Distributions "smstop" "\n"
465*bbb1b6f9SApple OSS Distributions );
466*bbb1b6f9SApple OSS Distributions }
467*bbb1b6f9SApple OSS Distributions
468*bbb1b6f9SApple OSS Distributions static void
try_sme_f16f32(void)469*bbb1b6f9SApple OSS Distributions try_sme_f16f32(void)
470*bbb1b6f9SApple OSS Distributions {
471*bbb1b6f9SApple OSS Distributions asm volatile (
472*bbb1b6f9SApple OSS Distributions "smstart" "\n"
473*bbb1b6f9SApple OSS Distributions "fmopa za0.s, p0/m, p0/m, z0.h, z0.h" "\n"
474*bbb1b6f9SApple OSS Distributions "smstop" "\n"
475*bbb1b6f9SApple OSS Distributions );
476*bbb1b6f9SApple OSS Distributions }
477*bbb1b6f9SApple OSS Distributions
478*bbb1b6f9SApple OSS Distributions static void
try_sme_i8i32(void)479*bbb1b6f9SApple OSS Distributions try_sme_i8i32(void)
480*bbb1b6f9SApple OSS Distributions {
481*bbb1b6f9SApple OSS Distributions asm volatile (
482*bbb1b6f9SApple OSS Distributions "smstart" "\n"
483*bbb1b6f9SApple OSS Distributions "smopa za0.s, p0/m, p0/m, z0.b, z0.b" "\n"
484*bbb1b6f9SApple OSS Distributions "smstop" "\n"
485*bbb1b6f9SApple OSS Distributions );
486*bbb1b6f9SApple OSS Distributions }
487*bbb1b6f9SApple OSS Distributions
488*bbb1b6f9SApple OSS Distributions static void
try_sme_i16i32(void)489*bbb1b6f9SApple OSS Distributions try_sme_i16i32(void)
490*bbb1b6f9SApple OSS Distributions {
491*bbb1b6f9SApple OSS Distributions asm volatile (
492*bbb1b6f9SApple OSS Distributions "smstart" "\n"
493*bbb1b6f9SApple OSS Distributions "smopa za0.s, p0/m, p0/m, z0.h, z0.h" "\n"
494*bbb1b6f9SApple OSS Distributions "smstop" "\n"
495*bbb1b6f9SApple OSS Distributions );
496*bbb1b6f9SApple OSS Distributions }
497*bbb1b6f9SApple OSS Distributions
498*bbb1b6f9SApple OSS Distributions __attribute__((target("sme-f64f64")))
499*bbb1b6f9SApple OSS Distributions static void
try_sme_f64f64(void)500*bbb1b6f9SApple OSS Distributions try_sme_f64f64(void)
501*bbb1b6f9SApple OSS Distributions {
502*bbb1b6f9SApple OSS Distributions asm volatile (
503*bbb1b6f9SApple OSS Distributions "smstart" "\n"
504*bbb1b6f9SApple OSS Distributions "fmopa za0.d, p0/m, p0/m, z0.d, z0.d" "\n"
505*bbb1b6f9SApple OSS Distributions "smstop" "\n"
506*bbb1b6f9SApple OSS Distributions );
507*bbb1b6f9SApple OSS Distributions }
508*bbb1b6f9SApple OSS Distributions
509*bbb1b6f9SApple OSS Distributions __attribute__((target("sme-i16i64")))
510*bbb1b6f9SApple OSS Distributions static void
try_sme_i16i64(void)511*bbb1b6f9SApple OSS Distributions try_sme_i16i64(void)
512*bbb1b6f9SApple OSS Distributions {
513*bbb1b6f9SApple OSS Distributions asm volatile (
514*bbb1b6f9SApple OSS Distributions "smstart" "\n"
515*bbb1b6f9SApple OSS Distributions "smopa za0.d, p0/m, p0/m, z0.h, z0.h" "\n"
516*bbb1b6f9SApple OSS Distributions "smstop" "\n"
517*bbb1b6f9SApple OSS Distributions );
518*bbb1b6f9SApple OSS Distributions }
519*bbb1b6f9SApple OSS Distributions
520*bbb1b6f9SApple OSS Distributions __attribute__((target("sme2p1")))
521*bbb1b6f9SApple OSS Distributions static void
try_sme2p1(void)522*bbb1b6f9SApple OSS Distributions try_sme2p1(void)
523*bbb1b6f9SApple OSS Distributions {
524*bbb1b6f9SApple OSS Distributions asm volatile (
525*bbb1b6f9SApple OSS Distributions "mov x8, #0" "\n"
526*bbb1b6f9SApple OSS Distributions "smstart" "\n"
527*bbb1b6f9SApple OSS Distributions "zero za.d[w8, #0, VGx2]" "\n"
528*bbb1b6f9SApple OSS Distributions "smstop" "\n"
529*bbb1b6f9SApple OSS Distributions :
530*bbb1b6f9SApple OSS Distributions :
531*bbb1b6f9SApple OSS Distributions : "x8"
532*bbb1b6f9SApple OSS Distributions );
533*bbb1b6f9SApple OSS Distributions }
534*bbb1b6f9SApple OSS Distributions
535*bbb1b6f9SApple OSS Distributions __attribute__((target("sme2p1,sme-f16f16")))
536*bbb1b6f9SApple OSS Distributions static void
try_sme_f16f16(void)537*bbb1b6f9SApple OSS Distributions try_sme_f16f16(void)
538*bbb1b6f9SApple OSS Distributions {
539*bbb1b6f9SApple OSS Distributions asm volatile (
540*bbb1b6f9SApple OSS Distributions "smstart" "\n"
541*bbb1b6f9SApple OSS Distributions "fmopa za0.h, p0/m, p0/m, z0.h, z0.h" "\n"
542*bbb1b6f9SApple OSS Distributions "smstop" "\n"
543*bbb1b6f9SApple OSS Distributions );
544*bbb1b6f9SApple OSS Distributions }
545*bbb1b6f9SApple OSS Distributions
546*bbb1b6f9SApple OSS Distributions __attribute__((target("sme2p1,b16b16,sme-b16b16")))
547*bbb1b6f9SApple OSS Distributions static void
try_sme_b16b16(void)548*bbb1b6f9SApple OSS Distributions try_sme_b16b16(void)
549*bbb1b6f9SApple OSS Distributions {
550*bbb1b6f9SApple OSS Distributions asm volatile (
551*bbb1b6f9SApple OSS Distributions "smstart" "\n"
552*bbb1b6f9SApple OSS Distributions "bfmopa za0.h, p0/m, p0/m, z0.h, z0.h" "\n"
553*bbb1b6f9SApple OSS Distributions "smstop" "\n"
554*bbb1b6f9SApple OSS Distributions );
555*bbb1b6f9SApple OSS Distributions }
556*bbb1b6f9SApple OSS Distributions
557*bbb1b6f9SApple OSS Distributions
558*bbb1b6f9SApple OSS Distributions static void
try_fpexcp(void)559*bbb1b6f9SApple OSS Distributions try_fpexcp(void)
560*bbb1b6f9SApple OSS Distributions {
561*bbb1b6f9SApple OSS Distributions /* FP Exceptions are supported if all exceptions bit can be set. */
562*bbb1b6f9SApple OSS Distributions const uint64_t flags = (1 << 8) | (1 << 9) | (1 << 10) | (1 << 11) | (1 << 12) | (1 << 15);
563*bbb1b6f9SApple OSS Distributions
564*bbb1b6f9SApple OSS Distributions uint64_t old_fpcr = __builtin_arm_rsr64("FPCR");
565*bbb1b6f9SApple OSS Distributions __builtin_arm_wsr64("FPCR", old_fpcr | flags);
566*bbb1b6f9SApple OSS Distributions uint64_t new_fpcr = __builtin_arm_rsr64("FPCR");
567*bbb1b6f9SApple OSS Distributions __builtin_arm_wsr64("FPCR", old_fpcr);
568*bbb1b6f9SApple OSS Distributions
569*bbb1b6f9SApple OSS Distributions if ((new_fpcr & flags) != flags) {
570*bbb1b6f9SApple OSS Distributions cap_usable = false;
571*bbb1b6f9SApple OSS Distributions }
572*bbb1b6f9SApple OSS Distributions }
573*bbb1b6f9SApple OSS Distributions
574*bbb1b6f9SApple OSS Distributions static void
try_dit(void)575*bbb1b6f9SApple OSS Distributions try_dit(void)
576*bbb1b6f9SApple OSS Distributions {
577*bbb1b6f9SApple OSS Distributions asm volatile (
578*bbb1b6f9SApple OSS Distributions "msr DIT, x0"
579*bbb1b6f9SApple OSS Distributions :
580*bbb1b6f9SApple OSS Distributions :
581*bbb1b6f9SApple OSS Distributions : "x0"
582*bbb1b6f9SApple OSS Distributions );
583*bbb1b6f9SApple OSS Distributions }
584*bbb1b6f9SApple OSS Distributions
585*bbb1b6f9SApple OSS Distributions static mach_port_t exc_port;
586*bbb1b6f9SApple OSS Distributions
587*bbb1b6f9SApple OSS Distributions static uint8_t hw_optional_arm_caps[(CAP_BIT_NB + 7) / 8];
588*bbb1b6f9SApple OSS Distributions
589*bbb1b6f9SApple OSS Distributions static void
test_cpu_capability(const char * cap_name,uint64_t commpage_flag,const char * cap_sysctl,int cap_bit,void (* try_cpu_capability)(void))590*bbb1b6f9SApple OSS Distributions test_cpu_capability(const char *cap_name, uint64_t commpage_flag, const char *cap_sysctl, int cap_bit, void (*try_cpu_capability)(void))
591*bbb1b6f9SApple OSS Distributions {
592*bbb1b6f9SApple OSS Distributions bool has_commpage_flag = commpage_flag != 0;
593*bbb1b6f9SApple OSS Distributions uint64_t commpage_caps = _get_cpu_capabilities();
594*bbb1b6f9SApple OSS Distributions bool commpage_flag_set = false;
595*bbb1b6f9SApple OSS Distributions if (has_commpage_flag) {
596*bbb1b6f9SApple OSS Distributions commpage_flag_set = (commpage_caps & commpage_flag);
597*bbb1b6f9SApple OSS Distributions }
598*bbb1b6f9SApple OSS Distributions
599*bbb1b6f9SApple OSS Distributions bool has_sysctl = cap_sysctl != NULL;
600*bbb1b6f9SApple OSS Distributions int sysctl_val;
601*bbb1b6f9SApple OSS Distributions bool sysctl_flag_set = false;
602*bbb1b6f9SApple OSS Distributions if (has_sysctl) {
603*bbb1b6f9SApple OSS Distributions size_t sysctl_size = sizeof(sysctl_val);
604*bbb1b6f9SApple OSS Distributions int err = sysctlbyname(cap_sysctl, &sysctl_val, &sysctl_size, NULL, 0);
605*bbb1b6f9SApple OSS Distributions sysctl_flag_set = (err == 0 && sysctl_val > 0);
606*bbb1b6f9SApple OSS Distributions }
607*bbb1b6f9SApple OSS Distributions
608*bbb1b6f9SApple OSS Distributions bool has_cap_bit = (cap_bit != -1);
609*bbb1b6f9SApple OSS Distributions bool cap_bit_set = false;
610*bbb1b6f9SApple OSS Distributions if (has_cap_bit) {
611*bbb1b6f9SApple OSS Distributions size_t idx = (unsigned int)cap_bit / 8;
612*bbb1b6f9SApple OSS Distributions unsigned int bit = 1U << (cap_bit % 8);
613*bbb1b6f9SApple OSS Distributions cap_bit_set = (hw_optional_arm_caps[idx] & bit);
614*bbb1b6f9SApple OSS Distributions }
615*bbb1b6f9SApple OSS Distributions
616*bbb1b6f9SApple OSS Distributions bool has_capability = has_commpage_flag ? commpage_flag_set : sysctl_flag_set;
617*bbb1b6f9SApple OSS Distributions
618*bbb1b6f9SApple OSS Distributions if (!has_commpage_flag && !has_sysctl) {
619*bbb1b6f9SApple OSS Distributions T_FAIL("Tested capability must have either sysctl or commpage flag");
620*bbb1b6f9SApple OSS Distributions return;
621*bbb1b6f9SApple OSS Distributions }
622*bbb1b6f9SApple OSS Distributions
623*bbb1b6f9SApple OSS Distributions if (has_commpage_flag && has_sysctl) {
624*bbb1b6f9SApple OSS Distributions T_EXPECT_EQ(commpage_flag_set, sysctl_flag_set, "%s commpage flag matches sysctl flag", cap_name);
625*bbb1b6f9SApple OSS Distributions }
626*bbb1b6f9SApple OSS Distributions if (has_commpage_flag && has_cap_bit) {
627*bbb1b6f9SApple OSS Distributions T_EXPECT_EQ(commpage_flag_set, cap_bit_set, "%s commpage flag matches hw.optional.arm.caps bit", cap_name);
628*bbb1b6f9SApple OSS Distributions }
629*bbb1b6f9SApple OSS Distributions if (has_sysctl && has_cap_bit) {
630*bbb1b6f9SApple OSS Distributions T_EXPECT_EQ(sysctl_flag_set, cap_bit_set, "%s sysctl flag matches hw.optional.arm.caps bit", cap_name);
631*bbb1b6f9SApple OSS Distributions }
632*bbb1b6f9SApple OSS Distributions
633*bbb1b6f9SApple OSS Distributions if (try_cpu_capability != NULL) {
634*bbb1b6f9SApple OSS Distributions cap_usable = true;
635*bbb1b6f9SApple OSS Distributions try_cpu_capability();
636*bbb1b6f9SApple OSS Distributions T_EXPECT_EQ(has_capability, cap_usable, "%s capability matches actual usability", cap_name);
637*bbb1b6f9SApple OSS Distributions }
638*bbb1b6f9SApple OSS Distributions }
639*bbb1b6f9SApple OSS Distributions
640*bbb1b6f9SApple OSS Distributions static inline void
test_deprecated_sysctl(const char * cap_name,uint64_t commpage_flag,const char * deprecated_sysctl)641*bbb1b6f9SApple OSS Distributions test_deprecated_sysctl(const char *cap_name, uint64_t commpage_flag, const char *deprecated_sysctl)
642*bbb1b6f9SApple OSS Distributions {
643*bbb1b6f9SApple OSS Distributions char *deprecated_cap_name;
644*bbb1b6f9SApple OSS Distributions int err = asprintf(&deprecated_cap_name, "%s (deprecated sysctl)", cap_name);
645*bbb1b6f9SApple OSS Distributions T_QUIET; T_ASSERT_NE(err, -1, "asprintf");
646*bbb1b6f9SApple OSS Distributions test_cpu_capability(deprecated_cap_name, commpage_flag, deprecated_sysctl, -1, NULL);
647*bbb1b6f9SApple OSS Distributions free(deprecated_cap_name);
648*bbb1b6f9SApple OSS Distributions }
649*bbb1b6f9SApple OSS Distributions
650*bbb1b6f9SApple OSS Distributions T_DECL(cpu_capabilities, "Verify ARM CPU capabilities", T_META_TAG_VM_NOT_ELIGIBLE) {
651*bbb1b6f9SApple OSS Distributions T_SETUPBEGIN;
652*bbb1b6f9SApple OSS Distributions size_t hw_optional_arm_caps_size = sizeof(hw_optional_arm_caps);
653*bbb1b6f9SApple OSS Distributions int err = sysctlbyname("hw.optional.arm.caps", hw_optional_arm_caps, &hw_optional_arm_caps_size, NULL, 0);
654*bbb1b6f9SApple OSS Distributions T_QUIET; T_ASSERT_POSIX_SUCCESS(err, "sysctlbyname(\"hw.optional.arm.caps\")");
655*bbb1b6f9SApple OSS Distributions
656*bbb1b6f9SApple OSS Distributions exc_port = create_exception_port(EXC_MASK_BAD_INSTRUCTION);
657*bbb1b6f9SApple OSS Distributions T_SETUPEND;
658*bbb1b6f9SApple OSS Distributions
659*bbb1b6f9SApple OSS Distributions repeat_exception_handler(exc_port, bad_instruction_handler);
660*bbb1b6f9SApple OSS Distributions
661*bbb1b6f9SApple OSS Distributions test_deprecated_sysctl("FP16", kHasFeatFP16, "hw.optional.neon_fp16");
662*bbb1b6f9SApple OSS Distributions test_cpu_capability("FP16", kHasFeatFP16, "hw.optional.arm.FEAT_FP16", CAP_BIT_FEAT_FP16, try_fp16);
663*bbb1b6f9SApple OSS Distributions test_deprecated_sysctl("LSE", kHasFeatLSE, "hw.optional.armv8_1_atomics");
664*bbb1b6f9SApple OSS Distributions test_cpu_capability("LSE", kHasFeatLSE, "hw.optional.arm.FEAT_LSE", CAP_BIT_FEAT_LSE, try_atomics);
665*bbb1b6f9SApple OSS Distributions test_deprecated_sysctl("CRC32", kHasARMv8Crc32, "hw.optional.armv8_crc32");
666*bbb1b6f9SApple OSS Distributions test_cpu_capability("CRC32", kHasARMv8Crc32, "hw.optional.arm.FEAT_CRC32", CAP_BIT_FEAT_CRC32, try_crc32);
667*bbb1b6f9SApple OSS Distributions test_deprecated_sysctl("FHM", kHasFeatFHM, "hw.optional.armv8_2_fhm");
668*bbb1b6f9SApple OSS Distributions test_cpu_capability("FHM", kHasFeatFHM, "hw.optional.arm.FEAT_FHM", CAP_BIT_FEAT_FHM, try_fhm);
669*bbb1b6f9SApple OSS Distributions test_deprecated_sysctl("SHA512", kHasFeatSHA512, "hw.optional.armv8_2_sha512");
670*bbb1b6f9SApple OSS Distributions test_cpu_capability("SHA512", kHasFeatSHA512, "hw.optional.arm.FEAT_SHA512", CAP_BIT_FEAT_SHA512, try_sha512);
671*bbb1b6f9SApple OSS Distributions test_deprecated_sysctl("SHA3", kHasFeatSHA3, "hw.optional.armv8_2_sha3");
672*bbb1b6f9SApple OSS Distributions test_cpu_capability("SHA3", kHasFeatSHA3, "hw.optional.arm.FEAT_SHA3", CAP_BIT_FEAT_SHA3, try_sha3);
673*bbb1b6f9SApple OSS Distributions test_cpu_capability("AES", kHasFeatAES, "hw.optional.arm.FEAT_AES", CAP_BIT_FEAT_AES, try_aes);
674*bbb1b6f9SApple OSS Distributions test_cpu_capability("SHA1", kHasFeatSHA1, "hw.optional.arm.FEAT_SHA1", CAP_BIT_FEAT_SHA1, try_sha1);
675*bbb1b6f9SApple OSS Distributions test_cpu_capability("SHA256", kHasFeatSHA256, "hw.optional.arm.FEAT_SHA256", CAP_BIT_FEAT_SHA256, try_sha256);
676*bbb1b6f9SApple OSS Distributions test_cpu_capability("PMULL", kHasFeatPMULL, "hw.optional.arm.FEAT_PMULL", CAP_BIT_FEAT_PMULL, try_pmull);
677*bbb1b6f9SApple OSS Distributions test_deprecated_sysctl("FCMA", kHasFeatFCMA, "hw.optional.armv8_3_compnum");
678*bbb1b6f9SApple OSS Distributions test_cpu_capability("FCMA", kHasFeatFCMA, "hw.optional.arm.FEAT_FCMA", CAP_BIT_FEAT_FCMA, try_compnum);
679*bbb1b6f9SApple OSS Distributions test_cpu_capability("FlagM", kHasFEATFlagM, "hw.optional.arm.FEAT_FlagM", CAP_BIT_FEAT_FlagM, try_flagm);
680*bbb1b6f9SApple OSS Distributions test_cpu_capability("FlagM2", kHasFEATFlagM2, "hw.optional.arm.FEAT_FlagM2", CAP_BIT_FEAT_FlagM2, try_flagm2);
681*bbb1b6f9SApple OSS Distributions test_cpu_capability("DotProd", kHasFeatDotProd, "hw.optional.arm.FEAT_DotProd", CAP_BIT_FEAT_DotProd, try_dotprod);
682*bbb1b6f9SApple OSS Distributions test_cpu_capability("RDM", kHasFeatRDM, "hw.optional.arm.FEAT_RDM", CAP_BIT_FEAT_RDM, try_rdm);
683*bbb1b6f9SApple OSS Distributions test_cpu_capability("SB", kHasFeatSB, "hw.optional.arm.FEAT_SB", CAP_BIT_FEAT_SB, try_sb);
684*bbb1b6f9SApple OSS Distributions test_cpu_capability("FRINTTS", kHasFeatFRINTTS, "hw.optional.arm.FEAT_FRINTTS", CAP_BIT_FEAT_FRINTTS, try_frintts);
685*bbb1b6f9SApple OSS Distributions test_cpu_capability("JSCVT", kHasFeatJSCVT, "hw.optional.arm.FEAT_JSCVT", CAP_BIT_FEAT_JSCVT, try_jscvt);
686*bbb1b6f9SApple OSS Distributions test_cpu_capability("PAuth", kHasFeatPAuth, "hw.optional.arm.FEAT_PAuth", CAP_BIT_FEAT_PAuth, try_pauth);
687*bbb1b6f9SApple OSS Distributions test_cpu_capability("DBP", kHasFeatDPB, "hw.optional.arm.FEAT_DPB", CAP_BIT_FEAT_DPB, try_dpb);
688*bbb1b6f9SApple OSS Distributions test_cpu_capability("DBP2", kHasFeatDPB2, "hw.optional.arm.FEAT_DPB2", CAP_BIT_FEAT_DPB2, try_dpb2);
689*bbb1b6f9SApple OSS Distributions test_cpu_capability("SPECRES", kHasFeatSPECRES, "hw.optional.arm.FEAT_SPECRES", CAP_BIT_FEAT_SPECRES, try_specres);
690*bbb1b6f9SApple OSS Distributions test_cpu_capability("LRCPC", kHasFeatLRCPC, "hw.optional.arm.FEAT_LRCPC", CAP_BIT_FEAT_LRCPC, try_lrcpc);
691*bbb1b6f9SApple OSS Distributions test_cpu_capability("LRCPC2", kHasFeatLRCPC2, "hw.optional.arm.FEAT_LRCPC2", CAP_BIT_FEAT_LRCPC2, try_lrcpc2);
692*bbb1b6f9SApple OSS Distributions test_cpu_capability("AFP", kHasFeatAFP, "hw.optional.arm.FEAT_AFP", CAP_BIT_FEAT_AFP, try_afp);
693*bbb1b6f9SApple OSS Distributions test_cpu_capability("DIT", kHasFeatDIT, "hw.optional.arm.FEAT_DIT", CAP_BIT_FEAT_DIT, try_dit);
694*bbb1b6f9SApple OSS Distributions test_cpu_capability("FP16", kHasFP_SyncExceptions, "hw.optional.arm.FP_SyncExceptions", -1, try_fpexcp);
695*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME", kHasFeatSME, "hw.optional.arm.FEAT_SME", CAP_BIT_FEAT_SME, try_sme);
696*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME2", kHasFeatSME2, "hw.optional.arm.FEAT_SME2", CAP_BIT_FEAT_SME2, try_sme2);
697*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME2.1", kHasFeatSME2p1, "hw.optional.arm.FEAT_SME2p1", CAP_BIT_FEAT_SME2p1, try_sme2p1);
698*bbb1b6f9SApple OSS Distributions
699*bbb1b6f9SApple OSS Distributions // The following features do not have a commpage entry
700*bbb1b6f9SApple OSS Distributions test_cpu_capability("BF16", 0, "hw.optional.arm.FEAT_BF16", CAP_BIT_FEAT_BF16, try_bf16);
701*bbb1b6f9SApple OSS Distributions test_cpu_capability("I8MM", 0, "hw.optional.arm.FEAT_I8MM", CAP_BIT_FEAT_I8MM, try_i8mm);
702*bbb1b6f9SApple OSS Distributions test_cpu_capability("ECV", 0, "hw.optional.arm.FEAT_ECV", CAP_BIT_FEAT_ECV, try_ecv);
703*bbb1b6f9SApple OSS Distributions test_cpu_capability("RPRES", 0, "hw.optional.arm.FEAT_RPRES", CAP_BIT_FEAT_RPRES, try_rpres);
704*bbb1b6f9SApple OSS Distributions test_cpu_capability("WFxT", 0, "hw.optional.arm.FEAT_WFxT", CAP_BIT_FEAT_WFxT, try_wfxt);
705*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME_F32F32", 0, "hw.optional.arm.SME_F32F32", CAP_BIT_SME_F32F32, try_sme_f32f32);
706*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME_BI32I32", 0, "hw.optional.arm.SME_BI32I32", CAP_BIT_SME_BI32I32, try_sme_bi32i32);
707*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME_B16F32", 0, "hw.optional.arm.SME_B16F32", CAP_BIT_SME_B16F32, try_sme_b16f32);
708*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME_F16F32", 0, "hw.optional.arm.SME_F16F32", CAP_BIT_SME_F16F32, try_sme_f16f32);
709*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME_I8I32", 0, "hw.optional.arm.SME_I8I32", CAP_BIT_SME_I8I32, try_sme_i8i32);
710*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME_I16I32", 0, "hw.optional.arm.SME_I16I32", CAP_BIT_SME_I16I32, try_sme_i16i32);
711*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME_F64F64", 0, "hw.optional.arm.FEAT_SME_F64F64", CAP_BIT_FEAT_SME_F64F64, try_sme_f64f64);
712*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME_I16I64", 0, "hw.optional.arm.FEAT_SME_I16I64", CAP_BIT_FEAT_SME_I16I64, try_sme_i16i64);
713*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME_F16F16", 0, "hw.optional.arm.FEAT_SME_F16F16", CAP_BIT_FEAT_SME_F16F16, try_sme_f16f16);
714*bbb1b6f9SApple OSS Distributions test_cpu_capability("SME_B16B16", 0, "hw.optional.arm.FEAT_SME_B16B16", CAP_BIT_FEAT_SME_B16B16, try_sme_b16b16);
715*bbb1b6f9SApple OSS Distributions
716*bbb1b6f9SApple OSS Distributions // The following features do not add instructions or registers to test for the presence of
717*bbb1b6f9SApple OSS Distributions test_deprecated_sysctl("PACIMP", kHasArmv8GPI, "hw.optional.armv8_gpi");
718*bbb1b6f9SApple OSS Distributions test_cpu_capability("PACIMP", kHasArmv8GPI, "hw.optional.arm.FEAT_PACIMP", CAP_BIT_FEAT_PACIMP, NULL);
719*bbb1b6f9SApple OSS Distributions test_cpu_capability("LSE2", kHasFeatLSE2, "hw.optional.arm.FEAT_LSE2", CAP_BIT_FEAT_LSE2, NULL);
720*bbb1b6f9SApple OSS Distributions test_cpu_capability("CSV2", kHasFeatCSV2, "hw.optional.arm.FEAT_CSV2", CAP_BIT_FEAT_CSV2, NULL);
721*bbb1b6f9SApple OSS Distributions test_cpu_capability("CSV3", kHasFeatCSV3, "hw.optional.arm.FEAT_CSV3", CAP_BIT_FEAT_CSV3, NULL);
722*bbb1b6f9SApple OSS Distributions }
723