Initial commit
This commit is contained in:
111
Torque/SDK/engine/platform/platformCPUInfo.asm
Normal file
111
Torque/SDK/engine/platform/platformCPUInfo.asm
Normal file
@@ -0,0 +1,111 @@
|
||||
;-----------------------------------------------------------------------------
|
||||
; Torque Game Engine
|
||||
; Copyright (C) GarageGames.com, Inc.
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
segment .text
|
||||
|
||||
; syntax: export_fn <function name>
|
||||
%macro export_fn 1
|
||||
%ifdef LINUX
|
||||
; No underscore needed for ELF object files
|
||||
global %1
|
||||
%1:
|
||||
%else
|
||||
global _%1
|
||||
_%1:
|
||||
%endif
|
||||
%endmacro
|
||||
|
||||
; push registers
|
||||
%macro pushreg 0
|
||||
; pushad
|
||||
push ebx
|
||||
push ebp
|
||||
push esi
|
||||
push edi
|
||||
%endmacro
|
||||
|
||||
; pop registers
|
||||
%macro popreg 0
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebp
|
||||
pop ebx
|
||||
; popad
|
||||
%endmacro
|
||||
|
||||
; void detectX86CPUInfo(char *vendor, U32 *processor, U32 *properties);
|
||||
export_fn detectX86CPUInfo
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
|
||||
pushreg
|
||||
|
||||
push edx
|
||||
push ecx
|
||||
pushfd
|
||||
pushfd ; save EFLAGS to stack
|
||||
pop eax ; move EFLAGS into EAX
|
||||
mov ebx, eax
|
||||
xor eax, 0x200000 ; flip bit 21
|
||||
push eax
|
||||
popfd ; restore EFLAGS
|
||||
pushfd
|
||||
pop eax
|
||||
cmp eax, ebx
|
||||
jz EXIT ; doesn't support CPUID instruction
|
||||
|
||||
;
|
||||
; get vendor information using CPUID eax == 0
|
||||
xor eax, eax
|
||||
cpuid
|
||||
|
||||
; store the vendor tag (12 bytes in ebx, edx, ecx) in the first parameter,
|
||||
; which should be a char[13]
|
||||
push eax ; save eax
|
||||
mov eax, [ebp+8] ; store the char* address in eax
|
||||
mov [eax], ebx ; move ebx into the first 4 bytes
|
||||
add eax, 4 ; advance the char* 4 bytes
|
||||
mov [eax], edx ; move edx into the next 4 bytes
|
||||
add eax, 4 ; advance the char* 4 bytes
|
||||
mov [eax], ecx ; move ecx into the last 4 bytes
|
||||
pop eax ; restore eax
|
||||
|
||||
; get generic extended CPUID info
|
||||
mov eax, 1
|
||||
cpuid ; eax=1, so cpuid queries feature information
|
||||
|
||||
and eax, 0x0FF0
|
||||
push ecx
|
||||
mov ecx, [ebp+12]
|
||||
mov [ecx], eax ; just store the model bits in processor param
|
||||
mov ecx, [ebp+16]
|
||||
mov [ecx], edx ; set properties param
|
||||
pop ecx
|
||||
|
||||
; want to check for 3DNow(tm).
|
||||
; need to see if extended cpuid functions present.
|
||||
mov eax, 0x80000000
|
||||
cpuid
|
||||
cmp eax, 0x80000000
|
||||
jbe MAYBE_3DLATER
|
||||
mov eax, 0x80000001
|
||||
cpuid
|
||||
; 3DNow if bit 31 set -> put bit in our properties
|
||||
and edx, 0x80000000
|
||||
push eax
|
||||
mov eax, [ebp+16]
|
||||
or [eax], edx
|
||||
pop eax
|
||||
MAYBE_3DLATER:
|
||||
EXIT:
|
||||
popfd
|
||||
pop ecx
|
||||
pop edx
|
||||
|
||||
popreg
|
||||
|
||||
pop ebp
|
||||
ret
|
||||
Reference in New Issue
Block a user