Preserve %ebx across CPUID when using PIE (thanks Faustus, Anthony Basile from Gentoo).
authorRichard W.M. Jones <rjones@redhat.com>
Sat, 17 Mar 2012 10:32:39 +0000 (10:32 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Mon, 31 Oct 2016 10:13:08 +0000 (06:13 -0400)
PIE on i686 uses %ebx as a base register.  Don't clobber it across the
CPUID instruction.

https://bugs.gentoo.org/show_bug.cgi?id=341271
https://bugzilla.redhat.com/show_bug.cgi?id=804282
(cherry picked from commit 53cf9493343e34b09622a544c84957d60d50c038)

virt-what-cpuid-helper.c

index 8b81be3..7812545 100644 (file)
@@ -31,8 +31,8 @@ cpuid (unsigned int eax, char *sig)
   unsigned int *sig32 = (unsigned int *) sig;
 
   asm volatile (
-        "xor %%ebx, %%ebx; cpuid"
-        : "=a" (eax), "=b" (sig32[0]), "=c" (sig32[1]), "=d" (sig32[2])
+        "xchgl %%ebx,%1; xor %%ebx,%%ebx; cpuid; xchgl %%ebx,%1"
+        : "=a" (eax), "+r" (sig32[0]), "=c" (sig32[1]), "=d" (sig32[2])
         : "0" (eax));
   sig[12] = 0;