about summary refs log tree commit diff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-08-13 04:52:50 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-08-13 04:53:03 -0700
commita5cf909b8f25f8240eabc5f1ff96b4be0472d8e1 (patch)
treee354b344307bdd5689e4e8551294a7da49d62b20
parente54388bd8be2828b8b7a207e9c5a10049ad3bb79 (diff)
downloadglibc-a5cf909b8f25f8240eabc5f1ff96b4be0472d8e1.tar.gz
glibc-a5cf909b8f25f8240eabc5f1ff96b4be0472d8e1.tar.xz
glibc-a5cf909b8f25f8240eabc5f1ff96b4be0472d8e1.zip
Check if cpuid is available in init_cpu_features
Since not all i486 processors support cpuid, we call __get_cpuid_max to
check if cpuid is available before using it if not compiling for i586,
i686 nor x86-64.

	* sysdeps/x86/cpu-features.c (init_cpu_features): Call
	__get_cpuid_max if not compiling for i586, i686 nor x86-64.
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/x86/cpu-features.c12
2 files changed, 17 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 51c6fef0a5..3f55c55a1d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2015-08-13  H.J. Lu  <hongjiu.lu@intel.com>
 
+	* sysdeps/x86/cpu-features.c (init_cpu_features): Call
+	__get_cpuid_max if not compiling for i586, i686 nor x86-64.
+
+2015-08-13  H.J. Lu  <hongjiu.lu@intel.com>
+
 	* sysdeps/unix/sysv/linux/x86/elision-conf.h: Don't include
 	<cpuid.h>.
 
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index 587080c1a4..582a8f5f79 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -40,6 +40,14 @@ init_cpu_features (struct cpu_features *cpu_features)
   unsigned int model = 0;
   enum cpu_features_kind kind;
 
+#if !defined __i586__ && !defined __i686__ && !defined __x86_64__
+  if (__get_cpuid_max (0, 0) == 0)
+    {
+      kind = arch_kind_other;
+      goto no_cpuid;
+    }
+#endif
+
   __cpuid (0, cpu_features->max_cpuid, ebx, ecx, edx);
 
   /* This spells out "GenuineIntel".  */
@@ -196,6 +204,10 @@ init_cpu_features (struct cpu_features *cpu_features)
 	}
     }
 
+#if !defined __i586__ && !defined __i686__ && !defined __x86_64__
+no_cpuid:
+#endif
+
   cpu_features->family = family;
   cpu_features->model = model;
   cpu_features->kind = kind;