#include #include #include "cpu.h" #include "vmm.h" #include "pmm/pmm.h" #include "hal/hal.h" #include "bootinfo/bootinfo.h" LocalCpuData HAL_CPUS[HAL_CPUS_MAX]; uint64_t hal_cpu_rdmsr(uint32_t id) { uint32_t lo, hi; asm volatile("rdmsr" : "=a"(lo), "=d"(hi) : "c"(id)); return ((uint64_t)lo) | ((uint64_t)hi << 32); } uint64_t hal_cpu_wrmsr(uint32_t id, uint64_t val) { uint32_t lo = val & 0xFFFFFFFF; uint32_t hi = val >> 32; asm volatile("wrmsr" :: "c"(id), "a"(lo), "d"(hi)); return val; } void hal_cpu_init(uint32_t cpu) { void *addr = pmm_alloc(16) + (16 * HAL_PAGE_SIZE); HAL_CPUS[cpu].syscall_kstack = (uint64_t *)VIRT(addr); HAL_CPUS[cpu].kcr3 = hal_vmm_current_cr3(); }