diff --git a/source/lib/sysdep/arch/x86_x64/x86_x64.cpp b/source/lib/sysdep/arch/x86_x64/x86_x64.cpp index ca039421a8..be0c20775e 100644 --- a/source/lib/sysdep/arch/x86_x64/x86_x64.cpp +++ b/source/lib/sysdep/arch/x86_x64/x86_x64.cpp @@ -79,7 +79,24 @@ static void cpuid(x86_x64_CpuidRegs* regs) cassert(sizeof(*regs) == 4*sizeof(int)); __cpuidex((int*)regs, regs->eax, regs->ecx); #elif GCC_VERSION - __asm__ __volatile__ ("cpuid": "=a" (regs->eax), "=b" (regs->ebx), "=c" (regs->ecx), "=d" (regs->edx) : "a" (regs->eax), "c" (regs->ecx)); +// Need to preserve the PIC register (ebx/rbx) in case GCC is using it +# if ARCH_AMD64 + __asm__ __volatile__ ( + "pushq %%rbx\n" + "cpuid\n" + "movl %%ebx, %1\n" + "popq %%rbx\n" + : "=a" (regs->eax), "=m" (regs->ebx), "=c" (regs->ecx), "=d" (regs->edx) + : "a" (regs->eax), "c" (regs->ecx)); +# else + __asm__ __volatile__ ( + "pushl %%ebx\n" + "cpuid\n" + "movl %%ebx, %1\n" + "popl %%ebx\n" + : "=a" (regs->eax), "=m" (regs->ebx), "=c" (regs->ecx), "=d" (regs->edx) + : "a" (regs->eax), "c" (regs->ecx)); +# endif #else # if ARCH_AMD64 amd64_asm_cpuid(regs);