56 lines
1,000 B
ArmAsm
56 lines
1,000 B
ArmAsm
;; File: feat.s
|
|
%include "machdep.inc"
|
|
%include "sys/i386/registers.inc"
|
|
%include "sys/i386/cpuid.inc"
|
|
%include "sys/i386/mmu.inc"
|
|
|
|
section multiboot.text
|
|
|
|
extern machdep
|
|
|
|
;; Function: cpuid_detect
|
|
;; check if cpuid is avaible.
|
|
;;
|
|
;; ripped from <osdev wiki at https://wiki.osdev.org/CPUID#Checking_CPUID_availability>
|
|
cpuid_detect:
|
|
pushfd
|
|
pushfd
|
|
xor dword [esp], EFLAGS_ID
|
|
popfd
|
|
pushfd
|
|
pop eax
|
|
xor eax, [esp]
|
|
popfd
|
|
and eax, EFLAGS_ID
|
|
ret
|
|
|
|
;; Function: feat_detect
|
|
global feat_detect
|
|
feat_detect:
|
|
push ebp
|
|
mov ebp, esp
|
|
|
|
call cpuid_detect
|
|
test eax, eax
|
|
jz .has_cpuid
|
|
jmp .end
|
|
.has_cpuid:
|
|
mov byte [V2P(machdep) + machinfo.has_cpuid], 1
|
|
mov eax, CPUID_GETFEATURES
|
|
cpuid
|
|
|
|
;; test if PSE is available
|
|
mov eax, edx
|
|
and eax, CPUID_FEAT_EDX_PSE
|
|
jz .end
|
|
mov byte [V2P(machdep) + machinfo.has_pse], 1
|
|
|
|
;; test if PAE is available (we won't support PAE for now)
|
|
mov eax, edx
|
|
and eax, CPUID_FEAT_EDX_PAE
|
|
jz .end
|
|
mov byte [V2P(machdep) + machinfo.has_pae], 1
|
|
.end:
|
|
leave
|
|
ret
|