1 #include <arch/i386/vectors.h>
4 #include <lunaix/types.h>
6 #define BRAND_LEAF 0x80000000UL
9 cpu_get_model(char* model_out)
11 u32_t* out = (u32_t*)model_out;
12 u32_t eax = 0, ebx = 0, edx = 0, ecx = 0;
14 __get_cpuid(0, &eax, &ebx, &ecx, &edx);
23 cpu_brand_string_supported()
25 u32_t supported = __get_cpuid_max(BRAND_LEAF, 0);
26 return (supported >= 0x80000004UL);
30 cpu_get_id(char* id_out)
32 if (!cpu_brand_string_supported()) {
36 u32_t* out = (u32_t*)id_out;
37 u32_t eax = 0, ebx = 0, edx = 0, ecx = 0;
38 for (u32_t i = 2, j = 0; i < 5; i++) {
39 __get_cpuid(BRAND_LEAF + i, &eax, &ebx, &ecx, &edx);
53 asm volatile("pushf\n"
63 asm volatile("movl %%cr0,%0" : "=r"(val));
68 cpu_chconfig(u32_t val)
70 asm("mov %0, %%cr0" ::"r"(val));
77 asm volatile("movl %%cr3,%0" : "=r"(val));
82 cpu_chvmspace(u32_t val)
84 asm("mov %0, %%cr3" ::"r"(val));
88 cpu_flush_page(ptr_t va)
90 asm volatile("invlpg (%0)" ::"r"(va) : "memory");
96 asm("movl %%cr3, %%eax\n"
97 "movl %%eax, %%cr3" ::
102 cpu_enable_interrupt()
108 cpu_disable_interrupt()
116 asm("int %0" ::"i"(LUNAIX_SCHED));
120 cpu_trap_panic(char* message)
122 asm("int %0" ::"i"(LUNAIX_SYS_PANIC), "D"(message));
135 asm volatile("movl %%cr2,%0" : "=r"(val));
140 cpu_rdmsr(u32_t msr_idx, u32_t* reg_high, u32_t* reg_low)
143 asm volatile("rdmsr" : "=d"(h), "=a"(l) : "c"(msr_idx));
150 cpu_wrmsr(u32_t msr_idx, u32_t reg_high, u32_t reg_low)
152 asm volatile("wrmsr" : : "d"(reg_high), "a"(reg_low), "c"(msr_idx));