Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Fixed crash - need to save and restore rbx around cpuid, since the co…
Browse files Browse the repository at this point in the history
…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 7ab8e4e
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions src/cpuinfo/SDL_cpuinfo.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down

0 comments on commit 7ab8e4e

Please sign in to comment.