aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2014-08-12 17:02:51 -0700
committerH.J. Lu <hjl.tools@gmail.com>2014-08-12 17:02:51 -0700
commitb4acef1ffe2e1ba6c608f31c1954a8100d3eabb0 (patch)
treea93ac67799d6e5086b0c60296690bf9316d10776
parent61b1ef6e7cc4518cdadb808dfa78980cc15a63c3 (diff)
downloadglibc-b4acef1ffe2e1ba6c608f31c1954a8100d3eabb0.zip
glibc-b4acef1ffe2e1ba6c608f31c1954a8100d3eabb0.tar.gz
glibc-b4acef1ffe2e1ba6c608f31c1954a8100d3eabb0.tar.bz2
Replace cpuid asm statement with __cpuid_count
The compiler doesn't know that the cpuid asm statement in intel_check_word will trash RBX. We are lucky that it doesn't cause any problems since RBX is also used by compiler for other purposes so that RBX is saved and restored. This patch replaces it with __cpuid_count. [BZ #17259] * sysdeps/x86_64/cacheinfo.c (intel_check_word): Replace cpuid asm statement with __cpuid_count.
-rw-r--r--ChangeLog6
-rw-r--r--NEWS3
-rw-r--r--sysdeps/x86_64/cacheinfo.c4
3 files changed, 9 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index d385cc9..e3a1f0a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2014-08-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ [BZ #17259]
+ * sysdeps/x86_64/cacheinfo.c (intel_check_word): Replace cpuid
+ asm statement with __cpuid_count.
+
2014-08-12 Mike Frysinger <vapier@gentoo.org>
* configure.ac: Change __ehdr_start code to dereference the struct.
diff --git a/NEWS b/NEWS
index ad337e8..03132e2 100644
--- a/NEWS
+++ b/NEWS
@@ -22,7 +22,8 @@ Version 2.20
16918, 16922, 16927, 16928, 16932, 16943, 16958, 16965, 16966, 16967,
16977, 16978, 16984, 16990, 16996, 17009, 17022, 17031, 17042, 17048,
17050, 17058, 17061, 17062, 17069, 17075, 17078, 17079, 17084, 17086,
- 17088, 17092, 17097, 17125, 17135, 17137, 17150, 17153, 17213, 17261.
+ 17088, 17092, 17097, 17125, 17135, 17137, 17150, 17153, 17213, 17259,
+ 17261.
* Reverted change of ABI data structures for s390 and s390x:
On s390 and s390x the size of struct ucontext and jmp_buf was increased in
diff --git a/sysdeps/x86_64/cacheinfo.c b/sysdeps/x86_64/cacheinfo.c
index 163af2a..ca13a53 100644
--- a/sysdeps/x86_64/cacheinfo.c
+++ b/sysdeps/x86_64/cacheinfo.c
@@ -191,9 +191,7 @@ intel_check_word (int name, unsigned int value, bool *has_level_2,
unsigned int round = 0;
while (1)
{
- asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
- : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)
- : "0" (4), "2" (round));
+ __cpuid_count (4, round, eax, ebx, ecx, edx);
enum { null = 0, data = 1, inst = 2, uni = 3 } type = eax & 0x1f;
if (type == null)