Commit ad626856 authored by Christoph Mallon's avatar Christoph Mallon
Browse files

Do not use b (ebx) as asm constraint, when compiling with __PIC__. GCC cannot handle this.

[r28247]
parent c8a000c8
...@@ -740,10 +740,21 @@ typedef union { ...@@ -740,10 +740,21 @@ typedef union {
static void x86_cpuid(cpuid_registers *regs, unsigned level) static void x86_cpuid(cpuid_registers *regs, unsigned level)
{ {
#if defined(__GNUC__) #if defined(__GNUC__)
# ifdef __PIC__ // GCC cannot handle EBX in PIC
__asm (
"pushl %%ebx\n\t"
"cpuid\n\t"
"movl %%ebx, %1\n\t"
"popl %%ebx"
: "=a" (regs->r.eax), "=r" (regs->r.ebx), "=c" (regs->r.ecx), "=d" (regs->r.edx)
: "a" (level)
);
# else
__asm ("cpuid\n\t" __asm ("cpuid\n\t"
: "=a" (regs->r.eax), "=b" (regs->r.ebx), "=c" (regs->r.ecx), "=d" (regs->r.edx) : "=a" (regs->r.eax), "=b" (regs->r.ebx), "=c" (regs->r.ecx), "=d" (regs->r.edx)
: "a" (level) : "a" (level)
); );
# endif
#elif defined(_MSC_VER) #elif defined(_MSC_VER)
__cpuid(regs->bulk, level); __cpuid(regs->bulk, level);
#endif #endif
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment