35 lines
724 B
C++
35 lines
724 B
C++
#include "common/cpu.h"
|
|
|
|
#include <cpuid.h>
|
|
|
|
#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");
|
|
}
|