#include "common/cpu.h" #include #include "debug/debug.h" void ProbeCpuAndEnableFeatures() { dbgln("CPUID"); uint32_t eax, ebx, ecx, edx; __get_cpuid(1, &eax, &ebx, &ecx, &edx); if (!(edx & (0x3 << 25))) { panic("SSE & SSE2 not available."); } if (!(ecx & (0x1 | (0x1 << 9)))) { panic("SSE3, SSSE3 not available."); } if (!(ecx & (0x3 << 19))) { dbgln("SSE4 not available."); } dbgln("Setting SSE"); asm volatile( "mov %%cr0, %%rax;" "and $0xFFFB, %%ax;" // Clear EM "or $0x2, %%ax;" // Set MP "mov %%rax, %%cr0;" "mov %%cr4, %%rax;" "or $0x600, %%ax;" // Set OSFXSR, OSXMMEXCPT "mov %%rax, %%cr4;" :: : "rax"); }