From: Richard W.M. Jones Date: Sat, 17 Mar 2012 10:32:39 +0000 (+0000) Subject: Preserve %ebx across CPUID when using PIE (thanks Faustus, Anthony Basile from Gentoo). X-Git-Url: http://git.annexia.org/?a=commitdiff_plain;h=2065168e8b4bba4fec4e4b0fae69e373f50f8382;p=virt-what.git Preserve %ebx across CPUID when using PIE (thanks Faustus, Anthony Basile from Gentoo). 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) --- diff --git a/virt-what-cpuid-helper.c b/virt-what-cpuid-helper.c index 8b81be3..7812545 100644 --- a/virt-what-cpuid-helper.c +++ b/virt-what-cpuid-helper.c @@ -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;