unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] x86: Set CPU usable feature bits conservatively [BZ #26552]
@ 2020-08-29 16:24 H.J. Lu via Libc-alpha
  2020-09-01 14:49 ` H.J. Lu via Libc-alpha
  0 siblings, 1 reply; 3+ messages in thread
From: H.J. Lu via Libc-alpha @ 2020-08-29 16:24 UTC (permalink / raw
  To: libc-alpha

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


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] x86: Set CPU usable feature bits conservatively [BZ #26552]
  2020-08-29 16:24 [PATCH] x86: Set CPU usable feature bits conservatively [BZ #26552] H.J. Lu via Libc-alpha
@ 2020-09-01 14:49 ` H.J. Lu via Libc-alpha
  2020-09-01 18:43   ` Adhemerval Zanella via Libc-alpha
  0 siblings, 1 reply; 3+ messages in thread
From: H.J. Lu via Libc-alpha @ 2020-09-01 14:49 UTC (permalink / raw
  To: GNU C Library

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.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] x86: Set CPU usable feature bits conservatively [BZ #26552]
  2020-09-01 14:49 ` H.J. Lu via Libc-alpha
@ 2020-09-01 18:43   ` Adhemerval Zanella via Libc-alpha
  0 siblings, 0 replies; 3+ messages in thread
From: Adhemerval Zanella via Libc-alpha @ 2020-09-01 18:43 UTC (permalink / raw
  To: libc-alpha, H.J. Lu



On 01/09/2020 11:49, H.J. Lu via Libc-alpha wrote:
> 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.
> 

As a side note, could you check if the recent AMD tuning does not break
anything for Intel [1]?  This has been lingering for review for some time 
and it seems to be an improvement on recent AMD chips [2].

[1] https://sourceware.org/pipermail/libc-alpha/2020-August/117081.html
[2] https://sourceware.org/pipermail/libc-alpha/2020-August/117080.html

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-09-01 18:43 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-08-29 16:24 [PATCH] x86: Set CPU usable feature bits conservatively [BZ #26552] H.J. Lu via Libc-alpha
2020-09-01 14:49 ` H.J. Lu via Libc-alpha
2020-09-01 18:43   ` Adhemerval Zanella via Libc-alpha

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).