diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2018-12-03 05:54:43 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2018-12-03 05:54:56 -0800 |
commit | c22e4c2a1431c5e77bf4288d35bf7629f2f093aa (patch) | |
tree | 666ae70088b899ad87a250a08b3be7a24bbc0157 /sysdeps/x86/tst-get-cpu-features.c | |
parent | 7b36d26b22d147ffc347f427f9fd584700578a94 (diff) | |
download | glibc-c22e4c2a1431c5e77bf4288d35bf7629f2f093aa.tar.gz glibc-c22e4c2a1431c5e77bf4288d35bf7629f2f093aa.tar.xz glibc-c22e4c2a1431c5e77bf4288d35bf7629f2f093aa.zip |
x86: Extend CPUID support in struct cpu_features
Extend CPUID support for all feature bits from CPUID. Add a new macro, CPU_FEATURE_USABLE, which can be used to check if a feature is usable at run-time, instead of HAS_CPU_FEATURE and HAS_ARCH_FEATURE. Add COMMON_CPUID_INDEX_D_ECX_1, COMMON_CPUID_INDEX_80000007 and COMMON_CPUID_INDEX_80000008 to check CPU feature bits in them. Tested on i686 and x86-64 as well as using build-many-glibcs.py with x86 targets. * sysdeps/x86/cacheinfo.c (intel_check_word): Updated for cpu_features_basic. (__cache_sysconf): Likewise. (init_cacheinfo): Likewise. * sysdeps/x86/cpu-features.c (get_extended_indeces): Also populate COMMON_CPUID_INDEX_80000007 and COMMON_CPUID_INDEX_80000008. (get_common_indices): Also populate COMMON_CPUID_INDEX_D_ECX_1. Use CPU_FEATURES_CPU_P (cpu_features, XSAVEC) to check if XSAVEC is available. Set the bit_arch_XXX_Usable bits. (init_cpu_features): Use _Static_assert on index_arch_Fast_Unaligned_Load. __get_cpuid_registers and __get_arch_feature. Updated for cpu_features_basic. Set stepping in cpu_features. * sysdeps/x86/cpu-features.h: (FEATURE_INDEX_1): Changed to enum. (FEATURE_INDEX_2): New. (FEATURE_INDEX_MAX): Changed to enum. (COMMON_CPUID_INDEX_D_ECX_1): New. (COMMON_CPUID_INDEX_80000007): Likewise. (COMMON_CPUID_INDEX_80000008): Likewise. (cpuid_registers): Likewise. (cpu_features_basic): Likewise. (CPU_FEATURE_USABLE): Likewise. (bit_arch_XXX_Usable): Likewise. (cpu_features): Use cpuid_registers and cpu_features_basic. (bit_arch_XXX): Reweritten. (bit_cpu_XXX): Likewise. (index_cpu_XXX): Likewise. (reg_XXX): Likewise. * sysdeps/x86/tst-get-cpu-features.c: Include <stdio.h> and <support/check.h>. (CHECK_CPU_FEATURE): New. (CHECK_CPU_FEATURE_USABLE): Likewise. (cpu_kinds): Likewise. (do_test): Print vendor, family, model and stepping. Check HAS_CPU_FEATURE and CPU_FEATURE_USABLE. (TEST_FUNCTION): Removed. Include <support/test-driver.c> instead of "../../test-skeleton.c". * sysdeps/x86_64/multiarch/sched_cpucount.c (__sched_cpucount): Check POPCNT instead of POPCOUNT. * sysdeps/x86_64/multiarch/test-multiarch.c (do_test): Likewise.
Diffstat (limited to 'sysdeps/x86/tst-get-cpu-features.c')
-rw-r--r-- | sysdeps/x86/tst-get-cpu-features.c | 264 |
1 files changed, 260 insertions, 4 deletions
diff --git a/sysdeps/x86/tst-get-cpu-features.c b/sysdeps/x86/tst-get-cpu-features.c index b2fac197da..64a7fd6157 100644 --- a/sysdeps/x86/tst-get-cpu-features.c +++ b/sysdeps/x86/tst-get-cpu-features.c @@ -17,15 +17,271 @@ <http://www.gnu.org/licenses/>. */ #include <stdlib.h> +#include <stdio.h> #include <cpu-features.h> +#include <support/check.h> + +#define CHECK_CPU_FEATURE(name) \ + { \ + if (HAS_CPU_FEATURE (name)) \ + printf (" " #name "\n"); \ + } + +#define CHECK_CPU_FEATURE_USABLE(name) \ + { \ + if (CPU_FEATURE_USABLE(name)) \ + printf (" " #name "\n"); \ + } + +static const char * const cpu_kinds[] = +{ + "Unknown", + "Intel", + "AMD", + "Other", +}; static int do_test (void) { - if (__get_cpu_features ()->kind == arch_kind_unknown) - abort (); + const struct cpu_features *cpu_features = __get_cpu_features (); + + switch (cpu_features->basic.kind) + { + case arch_kind_intel: + case arch_kind_amd: + case arch_kind_other: + printf ("Vendor: %s\n", cpu_kinds[cpu_features->basic.kind]); + printf ("Family: 0x%x\n", cpu_features->basic.family); + printf ("Model: 0x%x\n", cpu_features->basic.model); + printf ("Stepping: 0x%x\n", cpu_features->basic.stepping); + break; + + default: + abort (); + } + +#ifdef __SSE2__ + TEST_VERIFY_EXIT (HAS_CPU_FEATURE (SSE2)); +#endif + + printf ("CPU features:\n"); + CHECK_CPU_FEATURE (SSE3); + CHECK_CPU_FEATURE (PCLMULQDQ); + CHECK_CPU_FEATURE (DTES64); + CHECK_CPU_FEATURE (MONITOR); + CHECK_CPU_FEATURE (DS_CPL); + CHECK_CPU_FEATURE (VMX); + CHECK_CPU_FEATURE (SMX); + CHECK_CPU_FEATURE (EST); + CHECK_CPU_FEATURE (TM2); + CHECK_CPU_FEATURE (SSSE3); + CHECK_CPU_FEATURE (CNXT_ID); + CHECK_CPU_FEATURE (SDBG); + CHECK_CPU_FEATURE (FMA); + CHECK_CPU_FEATURE (CMPXCHG16B); + CHECK_CPU_FEATURE (XTPRUPDCTRL); + CHECK_CPU_FEATURE (PDCM); + CHECK_CPU_FEATURE (PCID); + CHECK_CPU_FEATURE (DCA); + CHECK_CPU_FEATURE (SSE4_1); + CHECK_CPU_FEATURE (SSE4_2); + CHECK_CPU_FEATURE (X2APIC); + CHECK_CPU_FEATURE (MOVBE); + CHECK_CPU_FEATURE (POPCNT); + CHECK_CPU_FEATURE (TSC_DEADLINE); + CHECK_CPU_FEATURE (AES); + CHECK_CPU_FEATURE (XSAVE); + CHECK_CPU_FEATURE (OSXSAVE); + CHECK_CPU_FEATURE (AVX); + CHECK_CPU_FEATURE (F16C); + CHECK_CPU_FEATURE (RDRAND); + CHECK_CPU_FEATURE (FPU); + CHECK_CPU_FEATURE (VME); + CHECK_CPU_FEATURE (DE); + CHECK_CPU_FEATURE (PSE); + CHECK_CPU_FEATURE (TSC); + CHECK_CPU_FEATURE (MSR); + CHECK_CPU_FEATURE (PAE); + CHECK_CPU_FEATURE (MCE); + CHECK_CPU_FEATURE (CX8); + CHECK_CPU_FEATURE (APIC); + CHECK_CPU_FEATURE (SEP); + CHECK_CPU_FEATURE (MTRR); + CHECK_CPU_FEATURE (PGE); + CHECK_CPU_FEATURE (MCA); + CHECK_CPU_FEATURE (CMOV); + CHECK_CPU_FEATURE (PAT); + CHECK_CPU_FEATURE (PSE_36); + CHECK_CPU_FEATURE (PSN); + CHECK_CPU_FEATURE (CLFSH); + CHECK_CPU_FEATURE (DS); + CHECK_CPU_FEATURE (ACPI); + CHECK_CPU_FEATURE (MMX); + CHECK_CPU_FEATURE (FXSR); + CHECK_CPU_FEATURE (SSE); + CHECK_CPU_FEATURE (SSE2); + CHECK_CPU_FEATURE (SS); + CHECK_CPU_FEATURE (HTT); + CHECK_CPU_FEATURE (TM); + CHECK_CPU_FEATURE (PBE); + CHECK_CPU_FEATURE (FSGSBASE); + CHECK_CPU_FEATURE (TSC_ADJUST); + CHECK_CPU_FEATURE (SGX); + CHECK_CPU_FEATURE (BMI1); + CHECK_CPU_FEATURE (HLE); + CHECK_CPU_FEATURE (AVX2); + CHECK_CPU_FEATURE (SMEP); + CHECK_CPU_FEATURE (BMI2); + CHECK_CPU_FEATURE (ERMS); + CHECK_CPU_FEATURE (INVPCID); + CHECK_CPU_FEATURE (RTM); + CHECK_CPU_FEATURE (PQM); + CHECK_CPU_FEATURE (MPX); + CHECK_CPU_FEATURE (PQE); + CHECK_CPU_FEATURE (AVX512F); + CHECK_CPU_FEATURE (AVX512DQ); + CHECK_CPU_FEATURE (RDSEED); + CHECK_CPU_FEATURE (ADX); + CHECK_CPU_FEATURE (SMAP); + CHECK_CPU_FEATURE (AVX512_IFMA); + CHECK_CPU_FEATURE (CLFLUSHOPT); + CHECK_CPU_FEATURE (CLWB); + CHECK_CPU_FEATURE (TRACE); + CHECK_CPU_FEATURE (AVX512PF); + CHECK_CPU_FEATURE (AVX512ER); + CHECK_CPU_FEATURE (AVX512CD); + CHECK_CPU_FEATURE (SHA); + CHECK_CPU_FEATURE (AVX512BW); + CHECK_CPU_FEATURE (AVX512VL); + CHECK_CPU_FEATURE (PREFETCHWT1); + CHECK_CPU_FEATURE (AVX512_VBMI); + CHECK_CPU_FEATURE (UMIP); + CHECK_CPU_FEATURE (PKU); + CHECK_CPU_FEATURE (OSPKE); + CHECK_CPU_FEATURE (WAITPKG); + CHECK_CPU_FEATURE (AVX512_VBMI2); + CHECK_CPU_FEATURE (SHSTK); + CHECK_CPU_FEATURE (GFNI); + CHECK_CPU_FEATURE (VAES); + CHECK_CPU_FEATURE (VPCLMULQDQ); + CHECK_CPU_FEATURE (AVX512_VNNI); + CHECK_CPU_FEATURE (AVX512_BITALG); + CHECK_CPU_FEATURE (AVX512_VPOPCNTDQ); + CHECK_CPU_FEATURE (RDPID); + CHECK_CPU_FEATURE (CLDEMOTE); + CHECK_CPU_FEATURE (MOVDIRI); + CHECK_CPU_FEATURE (MOVDIR64B); + CHECK_CPU_FEATURE (SGX_LC); + CHECK_CPU_FEATURE (AVX512_4VNNIW); + CHECK_CPU_FEATURE (AVX512_4FMAPS); + CHECK_CPU_FEATURE (FSRM); + CHECK_CPU_FEATURE (PCONFIG); + CHECK_CPU_FEATURE (IBT); + CHECK_CPU_FEATURE (IBRS_IBPB); + CHECK_CPU_FEATURE (STIBP); + CHECK_CPU_FEATURE (CAPABILITIES); + CHECK_CPU_FEATURE (SSBD); + CHECK_CPU_FEATURE (LAHF64_SAHF64); + CHECK_CPU_FEATURE (SVM); + CHECK_CPU_FEATURE (LZCNT); + CHECK_CPU_FEATURE (SSE4A); + CHECK_CPU_FEATURE (PREFETCHW); + CHECK_CPU_FEATURE (XOP); + CHECK_CPU_FEATURE (LWP); + CHECK_CPU_FEATURE (FMA4); + CHECK_CPU_FEATURE (TBM); + CHECK_CPU_FEATURE (SYSCALL_SYSRET); + CHECK_CPU_FEATURE (NX); + CHECK_CPU_FEATURE (PAGE1GB); + CHECK_CPU_FEATURE (RDTSCP); + CHECK_CPU_FEATURE (LM); + CHECK_CPU_FEATURE (XSAVEOPT); + CHECK_CPU_FEATURE (XSAVEC); + CHECK_CPU_FEATURE (XGETBV_ECX_1); + CHECK_CPU_FEATURE (XSAVES); + CHECK_CPU_FEATURE (INVARIANT_TSC); + CHECK_CPU_FEATURE (WBNOINVD); + + printf ("Usable CPU features:\n"); + CHECK_CPU_FEATURE_USABLE (SSE3); + CHECK_CPU_FEATURE_USABLE (PCLMULQDQ); + CHECK_CPU_FEATURE_USABLE (SSSE3); + CHECK_CPU_FEATURE_USABLE (FMA); + CHECK_CPU_FEATURE_USABLE (CMPXCHG16B); + CHECK_CPU_FEATURE_USABLE (SSE4_1); + CHECK_CPU_FEATURE_USABLE (SSE4_2); + CHECK_CPU_FEATURE_USABLE (MOVBE); + CHECK_CPU_FEATURE_USABLE (POPCNT); + CHECK_CPU_FEATURE_USABLE (AES); + CHECK_CPU_FEATURE_USABLE (XSAVE); + CHECK_CPU_FEATURE_USABLE (OSXSAVE); + CHECK_CPU_FEATURE_USABLE (AVX); + CHECK_CPU_FEATURE_USABLE (F16C); + CHECK_CPU_FEATURE_USABLE (RDRAND); + CHECK_CPU_FEATURE_USABLE (FPU); + CHECK_CPU_FEATURE_USABLE (TSC); + CHECK_CPU_FEATURE_USABLE (MSR); + CHECK_CPU_FEATURE_USABLE (CX8); + CHECK_CPU_FEATURE_USABLE (SEP); + CHECK_CPU_FEATURE_USABLE (CMOV); + CHECK_CPU_FEATURE_USABLE (CLFSH); + CHECK_CPU_FEATURE_USABLE (MMX); + CHECK_CPU_FEATURE_USABLE (FXSR); + CHECK_CPU_FEATURE_USABLE (SSE); + CHECK_CPU_FEATURE_USABLE (SSE2); + CHECK_CPU_FEATURE_USABLE (FSGSBASE); + CHECK_CPU_FEATURE_USABLE (BMI1); + CHECK_CPU_FEATURE_USABLE (HLE); + CHECK_CPU_FEATURE_USABLE (AVX2); + CHECK_CPU_FEATURE_USABLE (BMI2); + CHECK_CPU_FEATURE_USABLE (ERMS); + CHECK_CPU_FEATURE_USABLE (AVX512F); + CHECK_CPU_FEATURE_USABLE (AVX512DQ); + CHECK_CPU_FEATURE_USABLE (RDSEED); + CHECK_CPU_FEATURE_USABLE (ADX); + CHECK_CPU_FEATURE_USABLE (AVX512_IFMA); + CHECK_CPU_FEATURE_USABLE (CLFLUSHOPT); + CHECK_CPU_FEATURE_USABLE (CLWB); + CHECK_CPU_FEATURE_USABLE (AVX512PF); + CHECK_CPU_FEATURE_USABLE (AVX512ER); + CHECK_CPU_FEATURE_USABLE (AVX512CD); + CHECK_CPU_FEATURE_USABLE (SHA); + CHECK_CPU_FEATURE_USABLE (AVX512BW); + CHECK_CPU_FEATURE_USABLE (AVX512VL); + CHECK_CPU_FEATURE_USABLE (PREFETCHWT1); + CHECK_CPU_FEATURE_USABLE (AVX512_VBMI); + CHECK_CPU_FEATURE_USABLE (AVX512_VBMI2); + CHECK_CPU_FEATURE_USABLE (GFNI); + CHECK_CPU_FEATURE_USABLE (VAES); + CHECK_CPU_FEATURE_USABLE (VPCLMULQDQ); + CHECK_CPU_FEATURE_USABLE (AVX512_VNNI); + CHECK_CPU_FEATURE_USABLE (AVX512_BITALG); + CHECK_CPU_FEATURE_USABLE (AVX512_VPOPCNTDQ); + CHECK_CPU_FEATURE_USABLE (RDPID); + CHECK_CPU_FEATURE_USABLE (CLDEMOTE); + CHECK_CPU_FEATURE_USABLE (MOVDIRI); + CHECK_CPU_FEATURE_USABLE (MOVDIR64B); + CHECK_CPU_FEATURE_USABLE (AVX512_4VNNIW); + CHECK_CPU_FEATURE_USABLE (AVX512_4FMAPS); + CHECK_CPU_FEATURE_USABLE (FSRM); + CHECK_CPU_FEATURE_USABLE (LAHF64_SAHF64); + CHECK_CPU_FEATURE_USABLE (LZCNT); + CHECK_CPU_FEATURE_USABLE (SSE4A); + CHECK_CPU_FEATURE_USABLE (PREFETCHW); + CHECK_CPU_FEATURE_USABLE (XOP); + CHECK_CPU_FEATURE_USABLE (FMA4); + CHECK_CPU_FEATURE_USABLE (TBM); + CHECK_CPU_FEATURE_USABLE (SYSCALL_SYSRET); + CHECK_CPU_FEATURE_USABLE (RDTSCP); + CHECK_CPU_FEATURE_USABLE (XSAVEOPT); + CHECK_CPU_FEATURE_USABLE (XSAVEC); + CHECK_CPU_FEATURE_USABLE (XGETBV_ECX_1); + CHECK_CPU_FEATURE_USABLE (XSAVES); + CHECK_CPU_FEATURE_USABLE (INVARIANT_TSC); + CHECK_CPU_FEATURE_USABLE (WBNOINVD); + return 0; } -#define TEST_FUNCTION do_test () -#include "../../test-skeleton.c" +#include <support/test-driver.c> |