From db7e6366cd86b57cd0712293968938058288bde0 Mon Sep 17 00:00:00 2001 From: Isaac Dunham Date: Thu, 28 Aug 2014 13:05:07 -0700 Subject: [PATCH] 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. --- cpuid_x86.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cpuid_x86.c b/cpuid_x86.c index 53016e1e7..f9df7221b 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