diff --git a/src/x86/msr.c b/src/x86/msr.c new file mode 100644 index 0000000..4182a2d --- /dev/null +++ b/src/x86/msr.c @@ -0,0 +1,17 @@ +#include "msr.h" + +void read_msr(enum msr_id_t msr_addr, uint64_t *value) +{ + uint64_t v; + asm volatile("rdmsr" + : "=edx:eax" (v) + : "ecx" (msr_addr)); + *value = v; +} + +void write_msr(enum msr_id_t msr_addr, uint64_t *value) +{ + uint64_t v = *value; + asm volatile("wrmsr" + :: "ecx"(msr_addr), "A"(v)); +} diff --git a/src/x86/msr.h b/src/x86/msr.h new file mode 100644 index 0000000..ea09f03 --- /dev/null +++ b/src/x86/msr.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +enum msr_id_t +{ + MSR_APIC_BASE = 0x1B +}; + +struct msr_apic_base_t +{ + uint64_t reserved_1 : 8; + uint64_t bsp : 1; + uint64_t reserved_2 : 1; + uint64_t x2apic_enable : 1; + uint64_t apic_global_enable : 1; + uint64_t apic_base : 52; +}; + +void read_msr(enum msr_id_t msr_addr, uint64_t *value); + +void write_msr(enum msr_id_t msr_addr, uint64_t *value);