Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files
Fixed crash - need to save and restore rbx around cpuid, since the co…
…mpiler 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. :)
  • Loading branch information
slouken committed Nov 30, 2009
1 parent e2554f4 commit 7ab8e4e970d1f4d630af2e260c62dbcf7bc150e6
Showing with 8 additions and 4 deletions.
  1. +8 −4 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"

0 comments on commit 7ab8e4e

Please sign in to comment.