about summary refs log tree commit diff
path: root/sysdeps
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 /sysdeps
parent61b1ef6e7cc4518cdadb808dfa78980cc15a63c3 (diff)
downloadglibc-b4acef1ffe2e1ba6c608f31c1954a8100d3eabb0.tar.gz
glibc-b4acef1ffe2e1ba6c608f31c1954a8100d3eabb0.tar.xz
glibc-b4acef1ffe2e1ba6c608f31c1954a8100d3eabb0.zip
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.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/x86_64/cacheinfo.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/sysdeps/x86_64/cacheinfo.c b/sysdeps/x86_64/cacheinfo.c
index 163af2acbc..ca13a53f25 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)