aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/cpu_info.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/cpu_info.c')
-rw-r--r--kernel/cpu_info.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/kernel/cpu_info.c b/kernel/cpu_info.c
new file mode 100644
index 0000000..aeb5a60
--- /dev/null
+++ b/kernel/cpu_info.c
@@ -0,0 +1,98 @@
+#include "cpu_info.h"
+#include "asm_inline.h"
+
+enum LEAF1_ECX {
+ SSE3 = 1<<0,
+ PCLMULQDQ = 1<<1,
+ DTES64 = 1<<2,
+ MONITOR = 1<<3,
+ DS_CPL = 1<<4,
+ VMX = 1<<5,
+ SMX = 1<<6,
+ EIST = 1<<7, // Intel ?
+ TM2 = 1<<8,
+ SSSE3 = 1<<9,
+ L1_CONTEXT_ID = 1<<10,
+ DEBUG_INTERFACE = 1<<11,
+ FMA = 1<<12,
+ CMPXCHG16B = 1<<13,
+ XTPR_UPDATE_CONTROL = 1<<14,
+ PERF_CAPABILITIES = 1<<15,
+ // Reserved
+ PCID = 1<<17,
+ DCA = 1<<18,
+ SSE4_1 = 1<<19,
+ SSE4_2 = 1<<20,
+ X2APIC = 1<<21,
+ MOVBE = 1<<22,
+ POPCNT = 1<<23,
+ TSC_DEADLINE = 1<<24,
+ AESNI = 1<<25,
+ XSAVE = 1<<26,
+ OSXSAVE = 1<<27,
+ AVX = 1<<28,
+ F16C = 1<<29,
+ RDRAND = 1<<30
+};
+
+enum LEAF1_EDX {
+ FPU = 1<<0,
+ VME = 1<<1,
+ DE = 1<<2,
+ PSE = 1<<3,
+ TSC = 1<<4,
+ MSR = 1<<5,
+ PAE = 1<<6,
+ MCE = 1<<7,
+ CMPXCHG8B = 1<<8,
+ APIC = 1<<9,
+ // Reserved
+ SEP = 1<<11,
+ MTRR = 1<<12,
+ PGE = 1<<13,
+ MCA = 1<<14,
+ CMOV = 1<<15,
+ PAT = 1<<16,
+ PSE_36 = 1<<17,
+ PSN = 1<<18,
+ CLFLUSH = 1<<19,
+ // Reserved
+ DS = 1<<21,
+ ACPI = 1<<22,
+ MMX = 1<<23,
+ FXSR = 1<<24,
+ SSE = 1<<25,
+ SSE2 = 1<<26,
+ SELF_SNOOP = 1<<27,
+ HTT = 1<<28,
+ TM = 1<<29,
+ // Reserved
+ PBE = 1<<31,
+};
+
+cpu_info info;
+
+void init_cpu_info()
+{
+ uint32_t rax, rbx, rcx, rdx;
+ cpuid(1, 0, &rax, &rbx, &rcx, &rdx);
+
+ info.FPU = (rcx & FPU) == 1;
+ info.ACPI = (rcx & ACPI) == 1;
+ info.MMX = (rcx & MMX) == 1;
+ info.SSE = (rcx & SSE) == 1;
+ info.SSE2 = (rcx & SSE2) == 1;
+
+ info.SSE3 = (rdx & SSE3) == 1;
+ info.SSSE3 = (rdx & SSSE3) == 1;
+ info.SSE41 = (rdx & SSE4_1) == 1;
+ info.SSE42 = (rdx & SSE4_2) == 1;
+ info.VMX = (rdx & VMX) == 1;
+ info.FMA = (rdx & FMA) == 1;
+ info.AVX = (rdx & AVX) == 1;
+}
+
+const cpu_info* get_cpu_info()
+{
+ return &info;
+}