This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] x86: Populate COMMON_CPUID_INDEX_80000001 for Intel CPUs [BZ #23459]
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: libc-alpha at sourceware dot org
- Date: Thu, 26 Jul 2018 11:07:47 -0700
- Subject: [PATCH] x86: Populate COMMON_CPUID_INDEX_80000001 for Intel CPUs [BZ #23459]
[BZ #23459]
* sysdeps/x86/cpu-features.c (get_extended_indeces): New
function.
(init_cpu_features): Call get_extended_indeces for both Intel
and AMD CPUs.
---
sysdeps/x86/cpu-features.c | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index 8108256c42..f8beb96e51 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -42,6 +42,20 @@ extern void TUNABLE_CALLBACK (set_x86_shstk) (tunable_val_t *)
# include <cet-tunables.h>
#endif
+static void
+get_extended_indeces (struct cpu_features *cpu_features)
+{
+ unsigned int eax, ebx, ecx, edx;
+ __cpuid (0x80000000, eax, ebx, ecx, edx);
+ if (eax >= 0x80000001)
+ __cpuid (0x80000001,
+ cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].eax,
+ cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].ebx,
+ cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].ecx,
+ cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].edx);
+
+}
+
static void
get_common_indeces (struct cpu_features *cpu_features,
unsigned int *family, unsigned int *model,
@@ -224,6 +238,8 @@ init_cpu_features (struct cpu_features *cpu_features)
get_common_indeces (cpu_features, &family, &model, &extended_model,
&stepping);
+ get_extended_indeces (cpu_features);
+
if (family == 0x06)
{
model += extended_model;
@@ -338,16 +354,9 @@ init_cpu_features (struct cpu_features *cpu_features)
get_common_indeces (cpu_features, &family, &model, &extended_model,
&stepping);
- ecx = cpu_features->cpuid[COMMON_CPUID_INDEX_1].ecx;
+ get_extended_indeces (cpu_features);
- unsigned int eax;
- __cpuid (0x80000000, eax, ebx, ecx, edx);
- if (eax >= 0x80000001)
- __cpuid (0x80000001,
- cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].eax,
- cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].ebx,
- cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].ecx,
- cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].edx);
+ ecx = cpu_features->cpuid[COMMON_CPUID_INDEX_1].ecx;
if (HAS_ARCH_FEATURE (AVX_Usable))
{
--
2.17.1