;=----------------------------------------------------------------------------=; ; GNU GPL OS/K ; ; ; ; Desc: Basic realmode CPU Detection ; ; (x86_64 architecture only) ; ; ; ; ; ; Copyright © 2018-2019 The OS/K Team ; ; ; ; This file is part of OS/K. ; ; ; ; OS/K is free software: you can redistribute it and/or modify ; ; it under the terms of the GNU General Public License as published by ; ; the Free Software Foundation, either version 3 of the License, or ; ; (at your option) any later version. ; ; ; ; OS/K is distributed in the hope that it will be useful, ; ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; ; GNU General Public License for more details. ; ; ; ; You should have received a copy of the GNU General Public License ; ; along with OS/K. If not, see . ; ;=----------------------------------------------------------------------------=; [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