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.
This commit is contained in:
parent
2702323f7d
commit
db7e6366cd
|
@ -59,9 +59,16 @@
|
||||||
void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx);
|
void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx);
|
||||||
#else
|
#else
|
||||||
static inline void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx){
|
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__
|
__asm__ __volatile__
|
||||||
("cpuid": "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "a" (op) : "cc");
|
("cpuid": "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "a" (op) : "cc");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue