From: Mike Frysinger <vapier@gentoo.org>
To: util-linux@vger.kernel.org
Subject: [PATCH] lscpu: clean up vmware inline asm
Date: Tue, 5 Aug 2014 18:59:50 -0400 [thread overview]
Message-ID: <1407279590-4224-1-git-send-email-vapier@gentoo.org> (raw)
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 | 36 ++++++++++++++++++++++++++----------
1 file changed, 26 insertions(+), 10 deletions(-)
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c
index 062dff5..9965eeb 100644
--- a/sys-utils/lscpu.c
+++ b/sys-utils/lscpu.c
@@ -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"));
--
2.0.0
next reply other threads:[~2014-08-05 22:59 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-05 22:59 Mike Frysinger [this message]
2014-08-11 12:54 ` [PATCH] lscpu: clean up vmware inline asm Karel Zak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1407279590-4224-1-git-send-email-vapier@gentoo.org \
--to=vapier@gentoo.org \
--cc=util-linux@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox