From 33cf9e2f47067c6545c12a0876af5eb9ce116455 Mon Sep 17 00:00:00 2001 From: Jonathan Lennox <jonathan@vidyo.com> Date: Mon, 3 Aug 2015 17:04:23 -0400 Subject: [PATCH] Fix cpuid asm on 32-bit PIC. --- celt/x86/x86cpu.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/celt/x86/x86cpu.c b/celt/x86/x86cpu.c index c82a4b7b8..090e23df0 100644 --- a/celt/x86/x86cpu.c +++ b/celt/x86/x86cpu.c @@ -48,14 +48,28 @@ static void cpuid(unsigned int CPUInfo[4], unsigned int InfoType) { #if defined(CPU_INFO_BY_ASM) +#if defined(__i386__) && defined(__PIC__) +/* %ebx is PIC register in 32-bit, so mustn't clobber it. */ + __asm__ __volatile__ ( + "xchg %%ebx, %1\n" + "cpuid\n" + "xchg %%ebx, %1\n": + "=a" (CPUInfo[0]), + "=r" (CPUInfo[1]), + "=c" (CPUInfo[2]), + "=d" (CPUInfo[3]) : + "0" (InfoType) + ); +#else __asm__ __volatile__ ( "cpuid": "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : - "a" (InfoType), "c" (0) + "0" (InfoType) ); +#endif #elif defined(CPU_INFO_BY_C) __get_cpuid(InfoType, &(CPUInfo[0]), &(CPUInfo[1]), &(CPUInfo[2]), &(CPUInfo[3])); #endif -- GitLab