Files
JPOS/src/bootload/longm.asm
Justus Wolff 115b4c88a1 first commit
2026-02-26 00:06:36 +01:00

56 lines
1.0 KiB
NASM

; DEPRECATED!
CPUID_EXTENSIONS equ 0x80000000
CPUID_EXT_FEATURES equ 0x80000001
EFLAGS_ID equ 1 << 21
CPUID_EDX_EXT_FEAT_LM equ 1 << 29
enterlong:
call .queryLongMode
.NoLongMode
cli
hlt
jmp .NoLongMode
.checkCPUID:
pushfd
pop eax
; The original value should be saved for comparison and restoration later
mov ecx, eax
xor eax, EFLAGS_ID
; storing the eflags and then retrieving it again will show whether or not
; the bit could successfully be flipped
push eax ; save to eflags
popfd
pushfd ; restore from eflags
pop eax
; Restore EFLAGS to its original value
push ecx
popfd
; if the bit in eax was successfully flipped (eax != ecx), CPUID is supported.
xor eax, ecx
jnz .NoLongMode
ret
.queryLongMode:
call .checkCPUID
mov eax, CPUID_EXTENSIONS
cpuid
cmp eax, CPUID_FEATURES
jb .NoLongMode
mov eax, CPUID_EXT_FEATURES
cpuid
test edx, CPUID_EDX_EXT_FEAT_LM
jz .NoLongMode
ret