1 /* Test CPU feature data against /proc/cpuinfo.
2 This file is part of the GNU C Library.
3 Copyright (C) 2012-2021 Free Software Foundation, Inc.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
19 #include <sys/platform/x86.h>
24 static char *cpu_flags
;
26 /* Search for flags in /proc/cpuinfo and store line
36 f
= fopen ("/proc/cpuinfo", "r");
39 printf ("cannot open /proc/cpuinfo\n");
43 while ((read
= getline (&line
, &len
, f
)) != -1)
45 if (strncmp (line
, "flags", 5) == 0)
47 cpu_flags
= strdup (line
);
56 check_proc (const char *proc_name
, const char *search_name
, int flag
,
57 int usable
, const char *name
)
61 printf ("Checking %s:\n", name
);
62 printf (" %s: %d\n", name
, flag
);
63 char *str
= strstr (cpu_flags
, search_name
);
66 /* If searching for " XXX " failed, try " XXX\n". */
67 size_t len
= strlen (search_name
);
69 if (len
>= sizeof buffer
)
71 memcpy (buffer
, search_name
, len
+ 1);
72 buffer
[len
- 1] = '\n';
73 str
= strstr (cpu_flags
, buffer
);
77 printf (" cpuinfo (%s): %d\n", proc_name
, found
);
82 printf (" *** failure ***\n");
85 printf (" *** missing in /proc/cpuinfo ***\n");
90 return (found
!= flag
);
93 #define CHECK_PROC(str, name) \
94 check_proc (#str, " "#str" ", HAS_CPU_FEATURE (name), \
95 CPU_FEATURE_USABLE (name), \
96 "HAS_CPU_FEATURE (" #name ")")
99 do_test (int argc
, char **argv
)
104 fails
+= CHECK_PROC (acpi
, ACPI
);
105 fails
+= CHECK_PROC (adx
, ADX
);
106 fails
+= CHECK_PROC (apic
, APIC
);
107 fails
+= CHECK_PROC (aes
, AES
);
108 fails
+= CHECK_PROC (amx_bf16
, AMX_BF16
);
109 fails
+= CHECK_PROC (amx_int8
, AMX_INT8
);
110 fails
+= CHECK_PROC (amx_tile
, AMX_TILE
);
111 fails
+= CHECK_PROC (arch_capabilities
, ARCH_CAPABILITIES
);
112 fails
+= CHECK_PROC (avx
, AVX
);
113 fails
+= CHECK_PROC (avx2
, AVX2
);
114 fails
+= CHECK_PROC (avx512_4fmaps
, AVX512_4FMAPS
);
115 fails
+= CHECK_PROC (avx512_4vnniw
, AVX512_4VNNIW
);
116 fails
+= CHECK_PROC (avx512_bf16
, AVX512_BF16
);
117 fails
+= CHECK_PROC (avx512_bitalg
, AVX512_BITALG
);
118 fails
+= CHECK_PROC (avx512ifma
, AVX512_IFMA
);
119 fails
+= CHECK_PROC (avx512vbmi
, AVX512_VBMI
);
120 fails
+= CHECK_PROC (avx512_vbmi2
, AVX512_VBMI2
);
121 fails
+= CHECK_PROC (avx512_vnni
, AVX512_VNNI
);
122 fails
+= CHECK_PROC (avx512_vp2intersect
, AVX512_VP2INTERSECT
);
123 fails
+= CHECK_PROC (avx512_vpopcntdq
, AVX512_VPOPCNTDQ
);
124 fails
+= CHECK_PROC (avx512bw
, AVX512BW
);
125 fails
+= CHECK_PROC (avx512cd
, AVX512CD
);
126 fails
+= CHECK_PROC (avx512er
, AVX512ER
);
127 fails
+= CHECK_PROC (avx512dq
, AVX512DQ
);
128 fails
+= CHECK_PROC (avx512f
, AVX512F
);
129 fails
+= CHECK_PROC (avx512pf
, AVX512PF
);
130 fails
+= CHECK_PROC (avx512vl
, AVX512VL
);
131 fails
+= CHECK_PROC (bmi1
, BMI1
);
132 fails
+= CHECK_PROC (bmi2
, BMI2
);
133 fails
+= CHECK_PROC (cldemote
, CLDEMOTE
);
134 fails
+= CHECK_PROC (clflushopt
, CLFLUSHOPT
);
135 fails
+= CHECK_PROC (clflush
, CLFSH
);
136 fails
+= CHECK_PROC (clwb
, CLWB
);
137 fails
+= CHECK_PROC (cmov
, CMOV
);
138 fails
+= CHECK_PROC (cx16
, CMPXCHG16B
);
139 fails
+= CHECK_PROC (cnxt_id
, CNXT_ID
);
140 fails
+= CHECK_PROC (core_capabilities
, CORE_CAPABILITIES
);
141 fails
+= CHECK_PROC (cx8
, CX8
);
142 fails
+= CHECK_PROC (dca
, DCA
);
143 fails
+= CHECK_PROC (de
, DE
);
144 fails
+= CHECK_PROC (zero_fcs_fds
, DEPR_FPU_CS_DS
);
145 fails
+= CHECK_PROC (dts
, DS
);
146 fails
+= CHECK_PROC (ds_cpl
, DS_CPL
);
147 fails
+= CHECK_PROC (dtes64
, DTES64
);
148 fails
+= CHECK_PROC (est
, EIST
);
149 fails
+= CHECK_PROC (enqcmd
, ENQCMD
);
150 fails
+= CHECK_PROC (erms
, ERMS
);
151 fails
+= CHECK_PROC (f16c
, F16C
);
152 fails
+= CHECK_PROC (fma
, FMA
);
153 fails
+= CHECK_PROC (fma4
, FMA4
);
154 fails
+= CHECK_PROC (fpu
, FPU
);
155 fails
+= CHECK_PROC (fsgsbase
, FSGSBASE
);
156 fails
+= CHECK_PROC (fsrm
, FSRM
);
157 fails
+= CHECK_PROC (fxsr
, FXSR
);
158 fails
+= CHECK_PROC (gfni
, GFNI
);
159 fails
+= CHECK_PROC (hle
, HLE
);
160 fails
+= CHECK_PROC (ht
, HTT
);
161 fails
+= CHECK_PROC (hybrid
, HYBRID
);
162 fails
+= CHECK_PROC (ibrs
, IBRS_IBPB
);
163 fails
+= CHECK_PROC (ibt
, IBT
);
164 fails
+= CHECK_PROC (invariant_tsc
, INVARIANT_TSC
);
165 fails
+= CHECK_PROC (invpcid
, INVPCID
);
166 fails
+= CHECK_PROC (flush_l1d
, L1D_FLUSH
);
167 fails
+= CHECK_PROC (lahf_lm
, LAHF64_SAHF64
);
168 fails
+= CHECK_PROC (lm
, LM
);
169 fails
+= CHECK_PROC (lwp
, LWP
);
170 fails
+= CHECK_PROC (abm
, LZCNT
);
171 fails
+= CHECK_PROC (mca
, MCA
);
172 fails
+= CHECK_PROC (mce
, MCE
);
173 fails
+= CHECK_PROC (md_clear
, MD_CLEAR
);
174 fails
+= CHECK_PROC (mmx
, MMX
);
175 fails
+= CHECK_PROC (monitor
, MONITOR
);
176 fails
+= CHECK_PROC (movbe
, MOVBE
);
177 fails
+= CHECK_PROC (movdiri
, MOVDIRI
);
178 fails
+= CHECK_PROC (movdir64b
, MOVDIR64B
);
179 fails
+= CHECK_PROC (mpx
, MPX
);
180 fails
+= CHECK_PROC (msr
, MSR
);
181 fails
+= CHECK_PROC (mtrr
, MTRR
);
182 fails
+= CHECK_PROC (nx
, NX
);
183 fails
+= CHECK_PROC (ospke
, OSPKE
);
185 /* NB: /proc/cpuinfo doesn't report this feature. */
186 fails
+= CHECK_PROC (osxsave
, OSXSAVE
);
188 fails
+= CHECK_PROC (pae
, PAE
);
189 fails
+= CHECK_PROC (pdpe1gb
, PAGE1GB
);
190 fails
+= CHECK_PROC (pat
, PAT
);
191 fails
+= CHECK_PROC (pbe
, PBE
);
192 fails
+= CHECK_PROC (pcid
, PCID
);
193 fails
+= CHECK_PROC (pclmulqdq
, PCLMULQDQ
);
194 fails
+= CHECK_PROC (pconfig
, PCONFIG
);
195 fails
+= CHECK_PROC (pdcm
, PDCM
);
196 fails
+= CHECK_PROC (pge
, PGE
);
197 fails
+= CHECK_PROC (pks
, PKS
);
198 fails
+= CHECK_PROC (pku
, PKU
);
199 fails
+= CHECK_PROC (popcnt
, POPCNT
);
200 fails
+= CHECK_PROC (3dnowprefetch
, PREFETCHW
);
201 fails
+= CHECK_PROC (prefetchwt1
, PREFETCHWT1
);
202 fails
+= CHECK_PROC (ptwrite
, PTWRITE
);
203 fails
+= CHECK_PROC (pse
, PSE
);
204 fails
+= CHECK_PROC (pse36
, PSE_36
);
205 fails
+= CHECK_PROC (psn
, PSN
);
206 fails
+= CHECK_PROC (rdpid
, RDPID
);
207 fails
+= CHECK_PROC (rdrand
, RDRAND
);
208 fails
+= CHECK_PROC (rdseed
, RDSEED
);
209 fails
+= CHECK_PROC (rdt_a
, RDT_A
);
210 fails
+= CHECK_PROC (cqm
, RDT_M
);
211 fails
+= CHECK_PROC (rdtscp
, RDTSCP
);
212 fails
+= CHECK_PROC (rtm
, RTM
);
213 fails
+= CHECK_PROC (sdbg
, SDBG
);
214 fails
+= CHECK_PROC (sep
, SEP
);
215 fails
+= CHECK_PROC (serialize
, SERIALIZE
);
216 fails
+= CHECK_PROC (sgx
, SGX
);
217 fails
+= CHECK_PROC (sgx_lc
, SGX_LC
);
218 fails
+= CHECK_PROC (sha_ni
, SHA
);
219 fails
+= CHECK_PROC (shstk
, SHSTK
);
220 fails
+= CHECK_PROC (smap
, SMAP
);
221 fails
+= CHECK_PROC (smep
, SMEP
);
222 fails
+= CHECK_PROC (smx
, SMX
);
223 fails
+= CHECK_PROC (ss
, SS
);
224 fails
+= CHECK_PROC (ssbd
, SSBD
);
225 fails
+= CHECK_PROC (sse
, SSE
);
226 fails
+= CHECK_PROC (sse2
, SSE2
);
227 fails
+= CHECK_PROC (pni
, SSE3
);
228 fails
+= CHECK_PROC (sse4_1
, SSE4_1
);
229 fails
+= CHECK_PROC (sse4_2
, SSE4_2
);
230 fails
+= CHECK_PROC (sse4a
, SSE4A
);
231 fails
+= CHECK_PROC (ssse3
, SSSE3
);
232 fails
+= CHECK_PROC (stibp
, STIBP
);
233 fails
+= CHECK_PROC (svm
, SVM
);
235 /* NB: SYSCALL_SYSRET is 64-bit only. */
236 fails
+= CHECK_PROC (syscall
, SYSCALL_SYSRET
);
238 fails
+= CHECK_PROC (tbm
, TBM
);
239 fails
+= CHECK_PROC (tm
, TM
);
240 fails
+= CHECK_PROC (tm2
, TM2
);
241 fails
+= CHECK_PROC (intel_pt
, TRACE
);
242 fails
+= CHECK_PROC (tsc
, TSC
);
243 fails
+= CHECK_PROC (tsc_adjust
, TSC_ADJUST
);
244 fails
+= CHECK_PROC (tsc_deadline_timer
, TSC_DEADLINE
);
245 fails
+= CHECK_PROC (tsxldtrk
, TSXLDTRK
);
246 fails
+= CHECK_PROC (umip
, UMIP
);
247 fails
+= CHECK_PROC (vaes
, VAES
);
248 fails
+= CHECK_PROC (vme
, VME
);
249 fails
+= CHECK_PROC (vmx
, VMX
);
250 fails
+= CHECK_PROC (vpclmulqdq
, VPCLMULQDQ
);
251 fails
+= CHECK_PROC (waitpkg
, WAITPKG
);
252 fails
+= CHECK_PROC (wbnoinvd
, WBNOINVD
);
253 fails
+= CHECK_PROC (x2apic
, X2APIC
);
254 fails
+= CHECK_PROC (xfd
, XFD
);
255 fails
+= CHECK_PROC (xgetbv1
, XGETBV_ECX_1
);
256 fails
+= CHECK_PROC (xop
, XOP
);
257 fails
+= CHECK_PROC (xsave
, XSAVE
);
258 fails
+= CHECK_PROC (xsavec
, XSAVEC
);
259 fails
+= CHECK_PROC (xsaveopt
, XSAVEOPT
);
260 fails
+= CHECK_PROC (xsaves
, XSAVES
);
261 fails
+= CHECK_PROC (xtpr
, XTPRUPDCTRL
);
263 printf ("%d differences between /proc/cpuinfo and glibc code.\n", fails
);
268 #include "../../../test-skeleton.c"