This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH [BZ #17259]: sysdeps/x86_64/cacheinfo.c:intel_check_word may corrupt rbx


intel_check_word has

	      asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1"
			    : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)
			    : "0" (4), "2" (round));

The only register compiler isn't aware of is RBX.  No other registers are
impacted.  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 in intel_check_word.  This patch uses __cpuid_count instead.
Tested on x86 and x86-64.  OK to install?

Thanks.


H.J.
---
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.

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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]