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