xref: /OK3568_Linux_fs/kernel/Documentation/arm64/elf_hwcaps.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun================
2*4882a593SmuzhiyunARM64 ELF hwcaps
3*4882a593Smuzhiyun================
4*4882a593Smuzhiyun
5*4882a593SmuzhiyunThis document describes the usage and semantics of the arm64 ELF hwcaps.
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun1. Introduction
9*4882a593Smuzhiyun---------------
10*4882a593Smuzhiyun
11*4882a593SmuzhiyunSome hardware or software features are only available on some CPU
12*4882a593Smuzhiyunimplementations, and/or with certain kernel configurations, but have no
13*4882a593Smuzhiyunarchitected discovery mechanism available to userspace code at EL0. The
14*4882a593Smuzhiyunkernel exposes the presence of these features to userspace through a set
15*4882a593Smuzhiyunof flags called hwcaps, exposed in the auxilliary vector.
16*4882a593Smuzhiyun
17*4882a593SmuzhiyunUserspace software can test for features by acquiring the AT_HWCAP or
18*4882a593SmuzhiyunAT_HWCAP2 entry of the auxiliary vector, and testing whether the relevant
19*4882a593Smuzhiyunflags are set, e.g.::
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun	bool floating_point_is_present(void)
22*4882a593Smuzhiyun	{
23*4882a593Smuzhiyun		unsigned long hwcaps = getauxval(AT_HWCAP);
24*4882a593Smuzhiyun		if (hwcaps & HWCAP_FP)
25*4882a593Smuzhiyun			return true;
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun		return false;
28*4882a593Smuzhiyun	}
29*4882a593Smuzhiyun
30*4882a593SmuzhiyunWhere software relies on a feature described by a hwcap, it should check
31*4882a593Smuzhiyunthe relevant hwcap flag to verify that the feature is present before
32*4882a593Smuzhiyunattempting to make use of the feature.
33*4882a593Smuzhiyun
34*4882a593SmuzhiyunFeatures cannot be probed reliably through other means. When a feature
35*4882a593Smuzhiyunis not available, attempting to use it may result in unpredictable
36*4882a593Smuzhiyunbehaviour, and is not guaranteed to result in any reliable indication
37*4882a593Smuzhiyunthat the feature is unavailable, such as a SIGILL.
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun2. Interpretation of hwcaps
41*4882a593Smuzhiyun---------------------------
42*4882a593Smuzhiyun
43*4882a593SmuzhiyunThe majority of hwcaps are intended to indicate the presence of features
44*4882a593Smuzhiyunwhich are described by architected ID registers inaccessible to
45*4882a593Smuzhiyunuserspace code at EL0. These hwcaps are defined in terms of ID register
46*4882a593Smuzhiyunfields, and should be interpreted with reference to the definition of
47*4882a593Smuzhiyunthese fields in the ARM Architecture Reference Manual (ARM ARM).
48*4882a593Smuzhiyun
49*4882a593SmuzhiyunSuch hwcaps are described below in the form::
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun    Functionality implied by idreg.field == val.
52*4882a593Smuzhiyun
53*4882a593SmuzhiyunSuch hwcaps indicate the availability of functionality that the ARM ARM
54*4882a593Smuzhiyundefines as being present when idreg.field has value val, but do not
55*4882a593Smuzhiyunindicate that idreg.field is precisely equal to val, nor do they
56*4882a593Smuzhiyunindicate the absence of functionality implied by other values of
57*4882a593Smuzhiyunidreg.field.
58*4882a593Smuzhiyun
59*4882a593SmuzhiyunOther hwcaps may indicate the presence of features which cannot be
60*4882a593Smuzhiyundescribed by ID registers alone. These may be described without
61*4882a593Smuzhiyunreference to ID registers, and may refer to other documentation.
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun3. The hwcaps exposed in AT_HWCAP
65*4882a593Smuzhiyun---------------------------------
66*4882a593Smuzhiyun
67*4882a593SmuzhiyunHWCAP_FP
68*4882a593Smuzhiyun    Functionality implied by ID_AA64PFR0_EL1.FP == 0b0000.
69*4882a593Smuzhiyun
70*4882a593SmuzhiyunHWCAP_ASIMD
71*4882a593Smuzhiyun    Functionality implied by ID_AA64PFR0_EL1.AdvSIMD == 0b0000.
72*4882a593Smuzhiyun
73*4882a593SmuzhiyunHWCAP_EVTSTRM
74*4882a593Smuzhiyun    The generic timer is configured to generate events at a frequency of
75*4882a593Smuzhiyun    approximately 100KHz.
76*4882a593Smuzhiyun
77*4882a593SmuzhiyunHWCAP_AES
78*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.AES == 0b0001.
79*4882a593Smuzhiyun
80*4882a593SmuzhiyunHWCAP_PMULL
81*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.AES == 0b0010.
82*4882a593Smuzhiyun
83*4882a593SmuzhiyunHWCAP_SHA1
84*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.SHA1 == 0b0001.
85*4882a593Smuzhiyun
86*4882a593SmuzhiyunHWCAP_SHA2
87*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.SHA2 == 0b0001.
88*4882a593Smuzhiyun
89*4882a593SmuzhiyunHWCAP_CRC32
90*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.CRC32 == 0b0001.
91*4882a593Smuzhiyun
92*4882a593SmuzhiyunHWCAP_ATOMICS
93*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.Atomic == 0b0010.
94*4882a593Smuzhiyun
95*4882a593SmuzhiyunHWCAP_FPHP
96*4882a593Smuzhiyun    Functionality implied by ID_AA64PFR0_EL1.FP == 0b0001.
97*4882a593Smuzhiyun
98*4882a593SmuzhiyunHWCAP_ASIMDHP
99*4882a593Smuzhiyun    Functionality implied by ID_AA64PFR0_EL1.AdvSIMD == 0b0001.
100*4882a593Smuzhiyun
101*4882a593SmuzhiyunHWCAP_CPUID
102*4882a593Smuzhiyun    EL0 access to certain ID registers is available, to the extent
103*4882a593Smuzhiyun    described by Documentation/arm64/cpu-feature-registers.rst.
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun    These ID registers may imply the availability of features.
106*4882a593Smuzhiyun
107*4882a593SmuzhiyunHWCAP_ASIMDRDM
108*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.RDM == 0b0001.
109*4882a593Smuzhiyun
110*4882a593SmuzhiyunHWCAP_JSCVT
111*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.JSCVT == 0b0001.
112*4882a593Smuzhiyun
113*4882a593SmuzhiyunHWCAP_FCMA
114*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.FCMA == 0b0001.
115*4882a593Smuzhiyun
116*4882a593SmuzhiyunHWCAP_LRCPC
117*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.LRCPC == 0b0001.
118*4882a593Smuzhiyun
119*4882a593SmuzhiyunHWCAP_DCPOP
120*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.DPB == 0b0001.
121*4882a593Smuzhiyun
122*4882a593SmuzhiyunHWCAP_SHA3
123*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.SHA3 == 0b0001.
124*4882a593Smuzhiyun
125*4882a593SmuzhiyunHWCAP_SM3
126*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.SM3 == 0b0001.
127*4882a593Smuzhiyun
128*4882a593SmuzhiyunHWCAP_SM4
129*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.SM4 == 0b0001.
130*4882a593Smuzhiyun
131*4882a593SmuzhiyunHWCAP_ASIMDDP
132*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.DP == 0b0001.
133*4882a593Smuzhiyun
134*4882a593SmuzhiyunHWCAP_SHA512
135*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.SHA2 == 0b0010.
136*4882a593Smuzhiyun
137*4882a593SmuzhiyunHWCAP_SVE
138*4882a593Smuzhiyun    Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001.
139*4882a593Smuzhiyun
140*4882a593SmuzhiyunHWCAP_ASIMDFHM
141*4882a593Smuzhiyun   Functionality implied by ID_AA64ISAR0_EL1.FHM == 0b0001.
142*4882a593Smuzhiyun
143*4882a593SmuzhiyunHWCAP_DIT
144*4882a593Smuzhiyun    Functionality implied by ID_AA64PFR0_EL1.DIT == 0b0001.
145*4882a593Smuzhiyun
146*4882a593SmuzhiyunHWCAP_USCAT
147*4882a593Smuzhiyun    Functionality implied by ID_AA64MMFR2_EL1.AT == 0b0001.
148*4882a593Smuzhiyun
149*4882a593SmuzhiyunHWCAP_ILRCPC
150*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.LRCPC == 0b0010.
151*4882a593Smuzhiyun
152*4882a593SmuzhiyunHWCAP_FLAGM
153*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.TS == 0b0001.
154*4882a593Smuzhiyun
155*4882a593SmuzhiyunHWCAP_SSBS
156*4882a593Smuzhiyun    Functionality implied by ID_AA64PFR1_EL1.SSBS == 0b0010.
157*4882a593Smuzhiyun
158*4882a593SmuzhiyunHWCAP_SB
159*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.SB == 0b0001.
160*4882a593Smuzhiyun
161*4882a593SmuzhiyunHWCAP_PACA
162*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.APA == 0b0001 or
163*4882a593Smuzhiyun    ID_AA64ISAR1_EL1.API == 0b0001, as described by
164*4882a593Smuzhiyun    Documentation/arm64/pointer-authentication.rst.
165*4882a593Smuzhiyun
166*4882a593SmuzhiyunHWCAP_PACG
167*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.GPA == 0b0001 or
168*4882a593Smuzhiyun    ID_AA64ISAR1_EL1.GPI == 0b0001, as described by
169*4882a593Smuzhiyun    Documentation/arm64/pointer-authentication.rst.
170*4882a593Smuzhiyun
171*4882a593SmuzhiyunHWCAP2_DCPODP
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.DPB == 0b0010.
174*4882a593Smuzhiyun
175*4882a593SmuzhiyunHWCAP2_SVE2
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun    Functionality implied by ID_AA64ZFR0_EL1.SVEVer == 0b0001.
178*4882a593Smuzhiyun
179*4882a593SmuzhiyunHWCAP2_SVEAES
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun    Functionality implied by ID_AA64ZFR0_EL1.AES == 0b0001.
182*4882a593Smuzhiyun
183*4882a593SmuzhiyunHWCAP2_SVEPMULL
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun    Functionality implied by ID_AA64ZFR0_EL1.AES == 0b0010.
186*4882a593Smuzhiyun
187*4882a593SmuzhiyunHWCAP2_SVEBITPERM
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun    Functionality implied by ID_AA64ZFR0_EL1.BitPerm == 0b0001.
190*4882a593Smuzhiyun
191*4882a593SmuzhiyunHWCAP2_SVESHA3
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun    Functionality implied by ID_AA64ZFR0_EL1.SHA3 == 0b0001.
194*4882a593Smuzhiyun
195*4882a593SmuzhiyunHWCAP2_SVESM4
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun    Functionality implied by ID_AA64ZFR0_EL1.SM4 == 0b0001.
198*4882a593Smuzhiyun
199*4882a593SmuzhiyunHWCAP2_FLAGM2
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.TS == 0b0010.
202*4882a593Smuzhiyun
203*4882a593SmuzhiyunHWCAP2_FRINT
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.FRINTTS == 0b0001.
206*4882a593Smuzhiyun
207*4882a593SmuzhiyunHWCAP2_SVEI8MM
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun    Functionality implied by ID_AA64ZFR0_EL1.I8MM == 0b0001.
210*4882a593Smuzhiyun
211*4882a593SmuzhiyunHWCAP2_SVEF32MM
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun    Functionality implied by ID_AA64ZFR0_EL1.F32MM == 0b0001.
214*4882a593Smuzhiyun
215*4882a593SmuzhiyunHWCAP2_SVEF64MM
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun    Functionality implied by ID_AA64ZFR0_EL1.F64MM == 0b0001.
218*4882a593Smuzhiyun
219*4882a593SmuzhiyunHWCAP2_SVEBF16
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun    Functionality implied by ID_AA64ZFR0_EL1.BF16 == 0b0001.
222*4882a593Smuzhiyun
223*4882a593SmuzhiyunHWCAP2_I8MM
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.I8MM == 0b0001.
226*4882a593Smuzhiyun
227*4882a593SmuzhiyunHWCAP2_BF16
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.BF16 == 0b0001.
230*4882a593Smuzhiyun
231*4882a593SmuzhiyunHWCAP2_DGH
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR1_EL1.DGH == 0b0001.
234*4882a593Smuzhiyun
235*4882a593SmuzhiyunHWCAP2_RNG
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR0_EL1.RNDR == 0b0001.
238*4882a593Smuzhiyun
239*4882a593SmuzhiyunHWCAP2_BTI
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun    Functionality implied by ID_AA64PFR0_EL1.BT == 0b0001.
242*4882a593Smuzhiyun
243*4882a593SmuzhiyunHWCAP2_MTE
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun    Functionality implied by ID_AA64PFR1_EL1.MTE == 0b0010, as described
246*4882a593Smuzhiyun    by Documentation/arm64/memory-tagging-extension.rst.
247*4882a593Smuzhiyun
248*4882a593SmuzhiyunHWCAP2_ECV
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun    Functionality implied by ID_AA64MMFR0_EL1.ECV == 0b0001.
251*4882a593Smuzhiyun
252*4882a593SmuzhiyunHWCAP2_AFP
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun    Functionality implied by ID_AA64MFR1_EL1.AFP == 0b0001.
255*4882a593Smuzhiyun
256*4882a593SmuzhiyunHWCAP2_RPRES
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun    Functionality implied by ID_AA64ISAR2_EL1.RPRES == 0b0001.
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun4. Unused AT_HWCAP bits
261*4882a593Smuzhiyun-----------------------
262*4882a593Smuzhiyun
263*4882a593SmuzhiyunFor interoperation with userspace, the kernel guarantees that bits 62
264*4882a593Smuzhiyunand 63 of AT_HWCAP will always be returned as 0.
265