diff --git a/x86_64/cpuid.asm b/x86_64/cpuid.asm new file mode 100644 index 0000000000000000000000000000000000000000..17686dc7fdc6ae4f99fa206da9aefed8c462eb1a --- /dev/null +++ b/x86_64/cpuid.asm @@ -0,0 +1,27 @@ +%include "cpuid.inc" + +required_features: + .edx equ features_edx.fpu | features_edx.sse | features_edx.pae | features_edx.pse | features_edx.pge | features_edx.fxsr + .ecx equ features_ecx.xsave + +check_cpuid: + mov eax, 1 + cpuid + + and edx, required_features.edx + cmp edx, required_features.edx + jne .error + + and ecx, required_features.ecx + cmp ecx, required_features.ecx + jne .error + + ret + +.error: + mov si, .err_features + call print +.halt: + jmp .halt + +.err_features: db "Required CPU features are not present",13,10,0 diff --git a/x86_64/cpuid.inc b/x86_64/cpuid.inc new file mode 100644 index 0000000000000000000000000000000000000000..1c2c62b3bc635e0d8a612f907586e9bff0af73ef --- /dev/null +++ b/x86_64/cpuid.inc @@ -0,0 +1,64 @@ +features_edx: + .fpu equ 1 << 0 + .vme equ 1 << 1 + .de equ 1 << 2 + .pse equ 1 << 3 + .tsc equ 1 << 4 + .msr equ 1 << 5 + .pae equ 1 << 6 + .mce equ 1 << 7 + .cx8 equ 1 << 8 + .apic equ 1 << 9 + .sep equ 1 << 11 + .mtrr equ 1 << 12 + .pge equ 1 << 13 + .mca equ 1 << 14 + .cmov equ 1 << 15 + .pat equ 1 << 16 + .pse_36 equ 1 << 17 + .psn equ 1 << 18 + .clfsh equ 1 << 19 + .ds equ 1 << 21 + .acpi equ 1 << 22 + .mmx equ 1 << 23 + .fxsr equ 1 << 24 + .sse equ 1 << 25 + .sse2 equ 1 << 26 + .ss equ 1 << 27 + .htt equ 1 << 28 + .tm equ 1 << 29 + .ia64 equ 1 << 30 + .pbe equ 1 << 31 + +features_ecx: + .sse3 equ 1 << 0 + .pclmulqdq equ 1 << 1 + .dtes64 equ 1 << 2 + .monitor equ 1 << 3 + .ds_cpl equ 1 << 4 + .vmx equ 1 << 5 + .smx equ 1 << 6 + .est equ 1 << 7 + .tm2 equ 1 << 8 + .ssse3 equ 1 << 9 + .cnxt_id equ 1 << 10 + .sdbg equ 1 << 11 + .fma equ 1 << 12 + .cmpxchg16b equ 1 << 13 + .xtpr equ 1 << 14 + .pdcm equ 1 << 15 + .pcid equ 1 << 17 + .dca equ 1 << 18 + .sse4_1 equ 1 << 19 + .sse4_2 equ 1 << 20 + .x2apic equ 1 << 21 + .movbe equ 1 << 22 + .popcnt equ 1 << 23 + .tsc_deadline equ 1 << 24 + .aes equ 1 << 25 + .xsave equ 1 << 26 + .osxsave equ 1 << 27 + .avx equ 1 << 28 + .f16c equ 1 << 29 + .rdrand equ 1 << 30 + .hypervisor equ 1 << 31 diff --git a/x86_64/startup-common.asm b/x86_64/startup-common.asm index 53c317867b6e8e2c8124043cf4afd39d1c6bdf82..34c8189c44a22e3881d9112119189fab911add50 100644 --- a/x86_64/startup-common.asm +++ b/x86_64/startup-common.asm @@ -42,6 +42,8 @@ startup: jmp .loaded_kernel .loaded_kernel: + call check_cpuid + call memory_map call vesa @@ -139,6 +141,7 @@ load_extent: %include "memory_map.asm" %include "vesa.asm" %include "initialize.asm" +%include "cpuid.asm" %ifndef KERNEL %include "redoxfs.asm" %ifndef FILESYSTEM