Fixes cpuid to work with i386 CPUs and PIE/PIC, based on old GCC cpuid.h source and patch by pstumpf, fixes #2675
This was SVN commit r15886.
This commit is contained in:
parent
1631b8de14
commit
03eaf9b461
@ -49,10 +49,21 @@ namespace x86_x64 {
|
||||
#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 150030729
|
||||
// VC10+ and VC9 SP1: __cpuidex is already available
|
||||
#elif GCC_VERSION
|
||||
# define __cpuidex(regsArray, level, index)\
|
||||
__asm__ __volatile__ ("cpuid"\
|
||||
: "=a" ((regsArray)[0]), "=b" ((regsArray)[1]), "=c" ((regsArray)[2]), "=d" ((regsArray)[3])\
|
||||
: "0" (level), "2" (index));
|
||||
// Adapted from GPLv2 version of GCC's cpuid.h
|
||||
# if ARCH_IA32 && defined(__PIC__)
|
||||
// %ebx may be the PIC register
|
||||
# define __cpuidex(regsArray, level, index)\
|
||||
__asm__ ("xchgl\t%%ebx, %1\n\t"\
|
||||
"cpuid\n\t"\
|
||||
"xchgl\t%%ebx, %1\n\t"\
|
||||
: "=a" ((regsArray)[0]), "=r" ((regsArray)[1]), "=c" ((regsArray)[2]), "=d" ((regsArray)[3])\
|
||||
: "0" (level), "2" (index));
|
||||
# else
|
||||
# define __cpuidex(regsArray, level, index)\
|
||||
__asm__ ("cpuid\n\t"\
|
||||
: "=a" ((regsArray)[0]), "=b" ((regsArray)[1]), "=c" ((regsArray)[2]), "=d" ((regsArray)[3])\
|
||||
: "0" (level), "2" (index));
|
||||
# endif
|
||||
#else
|
||||
# error "compiler not supported"
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user