about summary refs log tree commit diff
path: root/sysdeps/x86/tst-cpu-features-cpuinfo.c
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2021-07-15 08:52:44 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2021-07-19 14:12:29 -0300
commit469761eac842663365bba3dacd4cdf15a2ae328d (patch)
tree570826e6942f9bc0bb7eec6bb34dedec141e0d01 /sysdeps/x86/tst-cpu-features-cpuinfo.c
parent5adb0e14a5cc9e011e58a7aaf193b598ecbd7b07 (diff)
downloadglibc-469761eac842663365bba3dacd4cdf15a2ae328d.tar.gz
glibc-469761eac842663365bba3dacd4cdf15a2ae328d.tar.xz
glibc-469761eac842663365bba3dacd4cdf15a2ae328d.zip
elf: Fix tst-cpu-features-cpuinfo on some AMD systems (BZ #28090)
The SSBD feature is implemented in 2 different ways on AMD processors:
newer systems (Zen3) provides AMD_SSBD (function 8000_0008, EBX[24]),
while older system provides AMD_VIRT_SSBD (function 8000_0008, EBX[25]).
However for AMD_VIRT_SSBD, kernel shows both 'ssdb' and 'virt_ssdb' on
/proc/cpuinfo; while for AMD_SSBD only 'ssdb' is provided.

This now check is AMD_SSBD is set to check for 'ssbd', otherwise check
if AMD_VIRT_SSDB is set to check for 'virt_ssbd'.

Checked on x86_64-linux-gnu on a Ryzen 9 5900x.

Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
Diffstat (limited to 'sysdeps/x86/tst-cpu-features-cpuinfo.c')
-rw-r--r--sysdeps/x86/tst-cpu-features-cpuinfo.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/sysdeps/x86/tst-cpu-features-cpuinfo.c b/sysdeps/x86/tst-cpu-features-cpuinfo.c
index f457e8677b..76bf5b2653 100644
--- a/sysdeps/x86/tst-cpu-features-cpuinfo.c
+++ b/sysdeps/x86/tst-cpu-features-cpuinfo.c
@@ -236,7 +236,18 @@ do_test (int argc, char **argv)
   if (cpu_features->basic.kind == arch_kind_intel)
     fails += CHECK_PROC (ssbd, SSBD);
   else if (cpu_features->basic.kind == arch_kind_amd)
-    fails += CHECK_PROC (ssbd, AMD_SSBD);
+    {
+      /* This feature is implemented in 2 different ways on AMD processors:
+	 newer systems provides AMD_SSBD (function 8000_0008, EBX[24]),
+	 while older system proviseds AMD_VIRT_SSBD (function 8000_008,
+	 EBX[25]).  However for AMD_VIRT_SSBD, kernel shows both 'ssbd'
+	 and 'virt_ssbd' on /proc/cpuinfo; while for AMD_SSBD only 'ssbd'
+	 is provided.  */
+      if (HAS_CPU_FEATURE (AMD_SSBD))
+	fails += CHECK_PROC (ssbd, AMD_SSBD);
+      else if (HAS_CPU_FEATURE (AMD_VIRT_SSBD))
+	fails += CHECK_PROC (virt_ssbd, AMD_VIRT_SSBD);
+    }
   fails += CHECK_PROC (sse, SSE);
   fails += CHECK_PROC (sse2, SSE2);
   fails += CHECK_PROC (pni, SSE3);