[PATCH] x86: Set CPU usable feature bits conservatively [BZ #26552]
H.J. Lu
hjl.tools@gmail.com
Tue Sep 1 14:49:27 GMT 2020
On Sat, Aug 29, 2020 at 9:24 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> Set CPU usable feature bits only for CPU features which are usable in
> user space and whose usability can be detected from user space, excluding
> features like FSGSBASE whose enable bit can only be checked in the kernel.
> ---
> sysdeps/x86/cpu-features.c | 143 ++++++++++++-------------------------
> 1 file changed, 47 insertions(+), 96 deletions(-)
>
> diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
> index 4c24ba7c31..b0ded20486 100644
> --- a/sysdeps/x86/cpu-features.c
> +++ b/sysdeps/x86/cpu-features.c
> @@ -44,107 +44,55 @@ extern void TUNABLE_CALLBACK (set_x86_shstk) (tunable_val_t *)
> static void
> update_usable (struct cpu_features *cpu_features)
> {
> - /* Before COMMON_CPUID_INDEX_80000001, copy the cpuid array elements to
> - the usable array. */
> - unsigned int i;
> - for (i = 0; i < COMMON_CPUID_INDEX_80000001; i++)
> - cpu_features->features[i].usable = cpu_features->features[i].cpuid;
> -
> - /* Before COMMON_CPUID_INDEX_80000001, clear the unknown usable bits
> - and the always zero bits. */
> - CPU_FEATURE_UNSET (cpu_features, INDEX_1_ECX_16);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_1_ECX_31);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_1_EDX_10);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_1_EDX_20);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_1_EDX_30);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EBX_6);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EBX_22);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_13);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_15);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_16);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_23);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_24);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_26);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_0);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_1);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_5);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_6);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_7);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_9);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_11);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_12);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_13);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_17);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_19);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_21);
> - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_23);
> -
> - /* EAX/EBX from COMMON_CPUID_INDEX_1 and EAX from COMMON_CPUID_INDEX_7
> - aren't used for CPU feature detection. */
> - cpu_features->features[COMMON_CPUID_INDEX_1].usable.eax = 0;
> - cpu_features->features[COMMON_CPUID_INDEX_1].usable.ebx = 0;
> - cpu_features->features[COMMON_CPUID_INDEX_7].usable.eax = 0;
> -
> - /* Starting from COMMON_CPUID_INDEX_80000001, copy the cpuid bits to
> - usable bits. */
> + /* Copy the cpuid bits to usable bits for CPU featuress whose usability
> + in user space can be detected without additonal OS support. */
> + CPU_FEATURE_SET_USABLE (cpu_features, SSE3);
> + CPU_FEATURE_SET_USABLE (cpu_features, PCLMULQDQ);
> + CPU_FEATURE_SET_USABLE (cpu_features, SSSE3);
> + CPU_FEATURE_SET_USABLE (cpu_features, CMPXCHG16B);
> + CPU_FEATURE_SET_USABLE (cpu_features, SSE4_1);
> + CPU_FEATURE_SET_USABLE (cpu_features, SSE4_2);
> + CPU_FEATURE_SET_USABLE (cpu_features, MOVBE);
> + CPU_FEATURE_SET_USABLE (cpu_features, POPCNT);
> + CPU_FEATURE_SET_USABLE (cpu_features, AES);
> + CPU_FEATURE_SET_USABLE (cpu_features, OSXSAVE);
> + CPU_FEATURE_SET_USABLE (cpu_features, TSC);
> + CPU_FEATURE_SET_USABLE (cpu_features, CX8);
> + CPU_FEATURE_SET_USABLE (cpu_features, CMOV);
> + CPU_FEATURE_SET_USABLE (cpu_features, CLFSH);
> + CPU_FEATURE_SET_USABLE (cpu_features, MMX);
> + CPU_FEATURE_SET_USABLE (cpu_features, FXSR);
> + CPU_FEATURE_SET_USABLE (cpu_features, SSE);
> + CPU_FEATURE_SET_USABLE (cpu_features, SSE2);
> + CPU_FEATURE_SET_USABLE (cpu_features, HTT);
> + CPU_FEATURE_SET_USABLE (cpu_features, BMI1);
> + CPU_FEATURE_SET_USABLE (cpu_features, HLE);
> + CPU_FEATURE_SET_USABLE (cpu_features, BMI2);
> + CPU_FEATURE_SET_USABLE (cpu_features, ERMS);
> + CPU_FEATURE_SET_USABLE (cpu_features, RTM);
> + CPU_FEATURE_SET_USABLE (cpu_features, RDSEED);
> + CPU_FEATURE_SET_USABLE (cpu_features, ADX);
> + CPU_FEATURE_SET_USABLE (cpu_features, CLFLUSHOPT);
> + CPU_FEATURE_SET_USABLE (cpu_features, CLWB);
> + CPU_FEATURE_SET_USABLE (cpu_features, SHA);
> + CPU_FEATURE_SET_USABLE (cpu_features, PREFETCHWT1);
> + CPU_FEATURE_SET_USABLE (cpu_features, OSPKE);
> + CPU_FEATURE_SET_USABLE (cpu_features, WAITPKG);
> + CPU_FEATURE_SET_USABLE (cpu_features, GFNI);
> + CPU_FEATURE_SET_USABLE (cpu_features, RDPID);
> + CPU_FEATURE_SET_USABLE (cpu_features, CLDEMOTE);
> + CPU_FEATURE_SET_USABLE (cpu_features, MOVDIRI);
> + CPU_FEATURE_SET_USABLE (cpu_features, MOVDIR64B);
> + CPU_FEATURE_SET_USABLE (cpu_features, FSRM);
> + CPU_FEATURE_SET_USABLE (cpu_features, SERIALIZE);
> + CPU_FEATURE_SET_USABLE (cpu_features, TSXLDTRK);
> CPU_FEATURE_SET_USABLE (cpu_features, LAHF64_SAHF64);
> - CPU_FEATURE_SET_USABLE (cpu_features, SVM);
> CPU_FEATURE_SET_USABLE (cpu_features, LZCNT);
> CPU_FEATURE_SET_USABLE (cpu_features, SSE4A);
> CPU_FEATURE_SET_USABLE (cpu_features, PREFETCHW);
> - CPU_FEATURE_SET_USABLE (cpu_features, XOP);
> - CPU_FEATURE_SET_USABLE (cpu_features, LWP);
> - CPU_FEATURE_SET_USABLE (cpu_features, FMA4);
> CPU_FEATURE_SET_USABLE (cpu_features, TBM);
> - CPU_FEATURE_SET_USABLE (cpu_features, SYSCALL_SYSRET);
> - CPU_FEATURE_SET_USABLE (cpu_features, NX);
> - CPU_FEATURE_SET_USABLE (cpu_features, PAGE1GB);
> CPU_FEATURE_SET_USABLE (cpu_features, RDTSCP);
> - CPU_FEATURE_SET_USABLE (cpu_features, LM);
> - CPU_FEATURE_SET_USABLE (cpu_features, XSAVEOPT);
> - CPU_FEATURE_SET_USABLE (cpu_features, XSAVEC);
> - CPU_FEATURE_SET_USABLE (cpu_features, XGETBV_ECX_1);
> - CPU_FEATURE_SET_USABLE (cpu_features, XSAVES);
> - CPU_FEATURE_SET_USABLE (cpu_features, XFD);
> - CPU_FEATURE_SET_USABLE (cpu_features, INVARIANT_TSC);
> CPU_FEATURE_SET_USABLE (cpu_features, WBNOINVD);
> - CPU_FEATURE_SET_USABLE (cpu_features, AVX512_BF16);
> -
> - /* MPX has been deprecated. */
> - CPU_FEATURE_UNSET (cpu_features, MPX);
> -
> - /* Clear the usable bits which require OS support. */
> - CPU_FEATURE_UNSET (cpu_features, FMA);
> - CPU_FEATURE_UNSET (cpu_features, AVX);
> - CPU_FEATURE_UNSET (cpu_features, F16C);
> - CPU_FEATURE_UNSET (cpu_features, AVX2);
> - CPU_FEATURE_UNSET (cpu_features, AVX512F);
> - CPU_FEATURE_UNSET (cpu_features, AVX512DQ);
> - CPU_FEATURE_UNSET (cpu_features, AVX512_IFMA);
> - CPU_FEATURE_UNSET (cpu_features, AVX512PF);
> - CPU_FEATURE_UNSET (cpu_features, AVX512ER);
> - CPU_FEATURE_UNSET (cpu_features, AVX512CD);
> - CPU_FEATURE_UNSET (cpu_features, AVX512BW);
> - CPU_FEATURE_UNSET (cpu_features, AVX512VL);
> - CPU_FEATURE_UNSET (cpu_features, AVX512_VBMI);
> - CPU_FEATURE_UNSET (cpu_features, PKU);
> - CPU_FEATURE_UNSET (cpu_features, AVX512_VBMI2);
> - CPU_FEATURE_UNSET (cpu_features, VAES);
> - CPU_FEATURE_UNSET (cpu_features, VPCLMULQDQ);
> - CPU_FEATURE_UNSET (cpu_features, AVX512_VNNI);
> - CPU_FEATURE_UNSET (cpu_features, AVX512_BITALG);
> - CPU_FEATURE_UNSET (cpu_features, AVX512_VPOPCNTDQ);
> - CPU_FEATURE_UNSET (cpu_features, AVX512_4VNNIW);
> - CPU_FEATURE_UNSET (cpu_features, AVX512_4FMAPS);
> - CPU_FEATURE_UNSET (cpu_features, AVX512_VP2INTERSECT);
> - CPU_FEATURE_UNSET (cpu_features, AMX_BF16);
> - CPU_FEATURE_UNSET (cpu_features, AMX_TILE);
> - CPU_FEATURE_UNSET (cpu_features, AMX_INT8);
> - CPU_FEATURE_UNSET (cpu_features, XOP);
> - CPU_FEATURE_UNSET (cpu_features, FMA4);
> - CPU_FEATURE_UNSET (cpu_features, XSAVEC);
> - CPU_FEATURE_UNSET (cpu_features, XFD);
> - CPU_FEATURE_UNSET (cpu_features, AVX512_BF16);
>
> /* Can we call xgetbv? */
> if (CPU_FEATURES_CPU_P (cpu_features, OSXSAVE))
> @@ -243,8 +191,11 @@ update_usable (struct cpu_features *cpu_features)
> CPU_FEATURE_SET_USABLE (cpu_features, AMX_INT8);
> }
>
> -
> - /* XFD is usable only when OSXSAVE is enabled. */
> + /* These features are usable only when OSXSAVE is enabled. */
> + CPU_FEATURE_SET (cpu_features, XSAVE);
> + CPU_FEATURE_SET_USABLE (cpu_features, XSAVEOPT);
> + CPU_FEATURE_SET_USABLE (cpu_features, XSAVEC);
> + CPU_FEATURE_SET_USABLE (cpu_features, XGETBV_ECX_1);
> CPU_FEATURE_SET_USABLE (cpu_features, XFD);
>
> /* For _dl_runtime_resolve, set xsave_state_size to xsave area
> --
> 2.26.2
>
I will check in it on Thursday if there are no comments nor objections.
--
H.J.
More information about the Libc-alpha
mailing list