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