From a022b64a05976d9770dfef82aad4666bc95810cc Mon Sep 17 00:00:00 2001 From: Tibor Nagy <xnagytibor@gmail.com> Date: Mon, 8 Jun 2020 00:21:45 +0200 Subject: [PATCH] Implement CPUID feature checks The bootloader now shows an error message instead of hanging with a black screen on incompatible CPUs. --- x86_64/cpuid.asm | 27 +++++++++++++++++ x86_64/cpuid.inc | 64 +++++++++++++++++++++++++++++++++++++++ x86_64/startup-common.asm | 3 ++ 3 files changed, 94 insertions(+) create mode 100644 x86_64/cpuid.asm create mode 100644 x86_64/cpuid.inc diff --git a/x86_64/cpuid.asm b/x86_64/cpuid.asm new file mode 100644 index 0000000..17686dc --- /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 0000000..1c2c62b --- /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 53c3178..34c8189 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 -- GitLab