summaryrefslogtreecommitdiff
blob: cc1d81413b0c5520e89cb9d82a4fa9e663b6b85b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
From 28b7205609252b365b5fbcb140de22858cd631da Mon Sep 17 00:00:00 2001
From: Matt Turner <mattst88@gmail.com>
Date: Mon, 25 Jul 2011 15:11:46 -0400
Subject: [PATCH] aperf: fix compilation on x86-32 with -fPIC

ebx is used to store the GOT pointer when compiled with -fPIC, so it's
not usable by inline assembly.

https://bugs.gentoo.org/375967

Signed-off-by: Matt Turner <mattst88@gmail.com>
---
 utils/cpuid.h |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/utils/cpuid.h b/utils/cpuid.h
index 2bac69a..53da789 100644
--- a/utils/cpuid.h
+++ b/utils/cpuid.h
@@ -5,9 +5,21 @@ static inline void __cpuid(unsigned int *eax, unsigned int *ebx,
 				unsigned int *ecx, unsigned int *edx)
 {
 	/* ecx is often an input as well as an output. */
-	asm volatile("cpuid"
+	asm volatile(
+#if defined(__i386__) && defined(__PIC__)
+	    "push %%ebx\n"
+	    "cpuid\n"
+	    "movl %%ebx, %1\n"
+	    "pop %%ebx\n"
+#else
+	    "cpuid\n"
+#endif
 	    : "=a" (*eax),
+#if defined(__i386__) && defined(__PIC__)
+	      "=r" (*ebx),
+#else
 	      "=b" (*ebx),
+#endif
 	      "=c" (*ecx),
 	      "=d" (*edx)
 	    : "0" (*eax), "2" (*ecx));
-- 
1.7.3.4