aboutsummaryrefslogtreecommitdiffstats
path: root/testing/openblas/00-cpuid.patch
blob: 7758b4691a06e24cfbcbf3f2da97726475dde570 (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
commit db7e6366cd86b57cd0712293968938058288bde0
Author: Isaac Dunham <ibid.ag@gmail.com>
Date:   Thu Aug 28 13:05:07 2014 -0700

    Workaround PIC limitations in cpuid.
    
    cpuid uses register ebx, but ebx is reserved in PIC.
    So save ebx, swap ebx & edi, and return edi.
    
    Copied from Igor Pavlov's equivalent fix for 7zip (in CpuArch.c),
    which is public domain and thus OK license-wise.

diff --git a/cpuid_x86.c b/cpuid_x86.c
index 53016e1..f9df722 100644
--- a/cpuid_x86.c
+++ b/cpuid_x86.c
@@ -59,9 +59,16 @@
 void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx);
 #else
 static inline void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx){
+#if defined(__i386__) && defined(__PIC__)
+  __asm__ __volatile__
+    ("mov %%ebx, %%edi;"
+     "cpuid;"
+     "xchgl %%ebx, %%edi;"
+     : "=a" (*eax), "=D" (*ebx), "=c" (*ecx), "=d" (*edx) : "a" (op) : "cc");
+#else
   __asm__ __volatile__
     ("cpuid": "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "a" (op) : "cc");
-
+#endif
 }
 #endif