]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lscpu: clean up vmware inline asm
authorMike Frysinger <vapier@gentoo.org>
Tue, 5 Aug 2014 22:59:50 +0000 (18:59 -0400)
committerKarel Zak <kzak@redhat.com>
Mon, 11 Aug 2014 12:51:53 +0000 (14:51 +0200)
This code is not PIC clean which means it fails to build on hardened
32bit x86 systems (i.e. building as PIE).

While here, optimize the existing cpuid logic slightly.

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

index 062dff5018868e55d3c88b53ed5e71aab1b08adf..9965eeb65ca327e6376fad36f12a569018b6d6d2 100644 (file)
@@ -546,10 +546,9 @@ cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx,
        __asm__(
 #if defined(__PIC__) && defined(__i386__)
                /* x86 PIC cannot clobber ebx -- gcc bitches */
-               "pushl %%ebx;"
+               "xchg %%ebx, %%esi;"
                "cpuid;"
-               "movl %%ebx, %%esi;"
-               "popl %%ebx;"
+               "xchg %%esi, %%ebx;"
                : "=S" (*ebx),
 #else
                "cpuid;"
@@ -656,12 +655,29 @@ read_hypervisor_powerpc(struct lscpu_desc *desc)
 #define VMWARE_BDOOR_PORT           0x5658
 #define VMWARE_BDOOR_CMD_GETVERSION 10
 
-#define VMWARE_BDOOR(eax, ebx, ecx, edx)                                  \
-        __asm__("inl (%%dx), %%eax" :                                     \
-               "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) :               \
-               "0"(VMWARE_BDOOR_MAGIC), "1"(VMWARE_BDOOR_CMD_GETVERSION), \
-               "2"(VMWARE_BDOOR_PORT), "3"(0) :                           \
-               "memory");
+static inline
+void vmware_bdoor(uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
+{
+       __asm__(
+#if defined(__PIC__) && defined(__i386__)
+               /* x86 PIC cannot clobber ebx -- gcc bitches */
+               "xchg %%ebx, %%esi;"
+               "inl (%%dx), %%eax;"
+               "xchg %%esi, %%ebx;"
+               : "=S" (*ebx),
+#else
+               "inl (%%dx), %%eax;"
+               : "=b" (*ebx),
+#endif
+                 "=a" (*eax),
+                 "=c" (*ecx),
+                 "=d" (*edx)
+               : "0" (VMWARE_BDOOR_MAGIC),
+                 "1" (VMWARE_BDOOR_CMD_GETVERSION),
+                 "2" (VMWARE_BDOOR_PORT),
+                 "3" (0)
+               : "memory");
+}
 
 static jmp_buf segv_handler_env;
 
@@ -697,7 +713,7 @@ is_vmware_platform(void)
        if (sigaction(SIGSEGV, &act, &oact))
                err(EXIT_FAILURE, _("error: can not set signal handler"));
 
-       VMWARE_BDOOR(eax, ebx, ecx, edx);
+       vmware_bdoor(&eax, &ebx, &ecx, &edx);
 
        if (sigaction(SIGSEGV, &oact, NULL))
                err(EXIT_FAILURE, _("error: can not restore signal handler"));