]> err.no Git - util-linux/commitdiff
lscpu: fix cpuid code on x86/PIC
authorMike Frysinger <vapier@gentoo.org>
Sun, 10 May 2009 20:37:18 +0000 (16:37 -0400)
committerKarel Zak <kzak@redhat.com>
Mon, 11 May 2009 08:52:02 +0000 (10:52 +0200)
If we build lscpu as PIE, we currently get a build failure:
lscpu.c: In function 'main':
lscpu.c:333: error: can't find a register in class 'BREG' while reloading 'asm'
lscpu.c:333: error: 'asm' operand has impossible constraints
make[2]: *** [lscpu.o] Error 1

So we need a little bit of register shuffling to keep gcc happy.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
sys-utils/lscpu.c

index 3e3fbbeb61e6581725dbe859c2219d54d8f68f4b..6b6082fbfb08d632c9e7cafd53ecc17c052a905e 100644 (file)
@@ -330,9 +330,19 @@ static inline void
 cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx,
                         unsigned int *ecx, unsigned int *edx)
 {
-       __asm__("cpuid"
-               : "=a" (*eax),
-                 "=b" (*ebx),
+       __asm__(
+#if defined(__PIC__) && defined(__i386__)
+               /* x86 PIC cannot clobber ebx -- gcc bitches */
+               "pushl %%ebx;"
+               "cpuid;"
+               "movl %%ebx, %%esi;"
+               "popl %%ebx;"
+               : "=S" (*ebx),
+#else
+               "cpuid;"
+               : "=b" (*ebx),
+#endif
+                 "=a" (*eax),
                  "=c" (*ecx),
                  "=d" (*edx)
                : "0" (op), "c"(0));