From e989a1a23efb3449c6033e8457aac0cd3c8647c9 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 30 Nov 2009 19:52:34 +0000 Subject: [PATCH] Fixed crash - need to save and restore rbx around cpuid, since the compiler may be assuming the stack pointer isn't being modified when filling in %0. I did it around each call to cpuid which isn't strictly necessary, but is definitely future proof. :) --- src/cpuinfo/SDL_cpuinfo.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/cpuinfo/SDL_cpuinfo.c b/src/cpuinfo/SDL_cpuinfo.c index 1f7d94867..6978877a5 100644 --- a/src/cpuinfo/SDL_cpuinfo.c +++ b/src/cpuinfo/SDL_cpuinfo.c @@ -170,17 +170,19 @@ CPU_getCPUIDFeatures(void) ); #elif defined(__GNUC__) && defined(__x86_64__) __asm__ ( -" pushq %%rbx\n" " xorl %%eax,%%eax # Set up for CPUID instruction \n" +" pushq %%rbx\n" " cpuid # Get and save vendor ID \n" +" popq %%rbx\n" " cmpl $1,%%eax # Make sure 1 is valid input for CPUID\n" " jl 1f # We dont have the CPUID instruction\n" " xorl %%eax,%%eax \n" " incl %%eax \n" +" pushq %%rbx\n" " cpuid # Get family/model/stepping/features\n" +" popq %%rbx\n" " movl %%edx,%0 \n" "1: \n" -" popq %%rbx\n" : "=m" (features) : : "%rax", "%rcx", "%rdx" @@ -242,16 +244,18 @@ CPU_getCPUIDFeaturesExt(void) ); #elif defined(__GNUC__) && defined (__x86_64__) __asm__ ( -" pushq %%rbx\n" " movl $0x80000000,%%eax # Query for extended functions \n" +" pushq %%rbx\n" " cpuid # Get extended function limit \n" +" popq %%rbx\n" " cmpl $0x80000001,%%eax \n" " jl 1f # Nope, we dont have function 800000001h\n" " movl $0x80000001,%%eax # Setup extended function 800000001h\n" +" pushq %%rbx\n" " cpuid # and get the information \n" +" popq %%rbx\n" " movl %%edx,%0 \n" "1: \n" -" popq %%rbx\n" : "=m" (features) : : "%rax", "%rcx", "%rdx"