summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2018-07-29 06:08:59 -0700
committerAndreas K. Hüttel <dilfridge@gentoo.org>2018-08-04 20:48:30 +0200
commit4945cb771b7ad6b44c832a0919734e3a0741a005 (patch)
treeea257b60c4f786fd6872af5a32a5e0907b6491e0
parentx86: Correct index_cpu_LZCNT [BZ #23456] (diff)
downloadglibc-gentoo/glibc-2.27-3.tar.gz
glibc-gentoo/glibc-2.27-3.tar.bz2
glibc-gentoo/glibc-2.27-3.zip
x86: Populate COMMON_CPUID_INDEX_80000001 for Intel CPUs [BZ #23459]gentoo/glibc-2.27-3
Reviewed-by: Carlos O'Donell <carlos@redhat.com> [BZ #23459] * sysdeps/x86/cpu-features.c (get_extended_indices): New function. (init_cpu_features): Call get_extended_indices for both Intel and AMD CPUs. * sysdeps/x86/cpu-features.h (COMMON_CPUID_INDEX_80000001): Remove "for AMD" comment. (cherry picked from commit be525a69a6630abc83144c0a96474f2e26da7443) (cherry picked from commit 2dab17550dd464bcf531088efa81a9d595167f2a)
-rw-r--r--ChangeLog10
-rw-r--r--NEWS1
-rw-r--r--sysdeps/x86/cpu-features.c27
-rw-r--r--sysdeps/x86/cpu-features.h2
4 files changed, 30 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 7d88c08491..7fcb7d5981 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2018-07-29 H.J. Lu <hongjiu.lu@intel.com>
+ [BZ #23459]
+ * sysdeps/x86/cpu-features.c (get_extended_indices): New
+ function.
+ (init_cpu_features): Call get_extended_indices for both Intel
+ and AMD CPUs.
+ * sysdeps/x86/cpu-features.h (COMMON_CPUID_INDEX_80000001):
+ Remove "for AMD" comment.
+
+2018-07-29 H.J. Lu <hongjiu.lu@intel.com>
+
[BZ #23456]
* sysdeps/x86/cpu-features.h (index_cpu_LZCNT): Set to
COMMON_CPUID_INDEX_80000001.
diff --git a/NEWS b/NEWS
index 7627bb0b6e..bc150b63f9 100644
--- a/NEWS
+++ b/NEWS
@@ -88,6 +88,7 @@ The following bugs are resolved with this release:
[23349] Various glibc headers no longer compatible with <linux/time.h>
[23363] stdio-common/tst-printf.c has non-free license
[23456] Wrong index_cpu_LZCNT
+ [23459] COMMON_CPUID_INDEX_80000001 isn't populated for Intel processors
Version 2.27
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index 0fc3674c4b..122372862c 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -31,6 +31,20 @@ extern void TUNABLE_CALLBACK (set_hwcaps) (tunable_val_t *)
#endif
static void
+get_extended_indices (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,
unsigned int *extended_model, unsigned int *stepping)
@@ -205,6 +219,8 @@ init_cpu_features (struct cpu_features *cpu_features)
get_common_indeces (cpu_features, &family, &model, &extended_model,
&stepping);
+ get_extended_indices (cpu_features);
+
if (family == 0x06)
{
model += extended_model;
@@ -324,16 +340,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_indices (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))
{
diff --git a/sysdeps/x86/cpu-features.h b/sysdeps/x86/cpu-features.h
index 906ad50920..4588c11095 100644
--- a/sysdeps/x86/cpu-features.h
+++ b/sysdeps/x86/cpu-features.h
@@ -106,7 +106,7 @@ enum
{
COMMON_CPUID_INDEX_1 = 0,
COMMON_CPUID_INDEX_7,
- COMMON_CPUID_INDEX_80000001, /* for AMD */
+ COMMON_CPUID_INDEX_80000001,
/* Keep the following line at the end. */
COMMON_CPUID_INDEX_MAX
};