;=----------------------------------------------------------------------------=; ; GNU GPL OS/K ; ; ; ; Authors: spectral` ; ; NeoX ; ; ; ; Desc: Basic realmode CPU Detection ; ; (x86_64 architecture only) ; ;=----------------------------------------------------------------------------=; [BITS 16] ;; GLOBAL DATA NoLongMode db 0x0A, 0x0D, "ERROR : Your computer is not designed for x64 OS", 0 ;; TEXT Is64bits: ;-----------------------------------------------------------------------; ; Checks if the CPU is compatible with 64-bits operating systems ; ; If the 21th bit of the eax register is set, then CPUID is supported ; ; We then test CPUID's result to see if long mode is supported ; ;-----------------------------------------------------------------------; pushfd ; recovering the flags in eax pop eax mov ecx, eax xor eax, 0x200000 push eax popfd pushfd pop eax xor eax, ecx shr eax, 21 and eax, 1 ; magical spell of murta push ecx popfd test eax, eax jz .NonCompat ; if (CPUID non supporté) goto NonCompat mov eax, 0x80000000 cpuid cmp eax, 0x80000001 jb .NonCompat ; if (eax <= 0x80000001) goto NonCompat mov eax, 0x80000001 cpuid test edx, 1 << 29 jz .NonCompat ; if (edx != 1 << 29) goto NonCompat ret ; back to mbr.s .NonCompat: stc ret