diff --git a/src/kernel/io.cpp b/src/kernel/io.cpp index c75949a..ac3cb59 100644 --- a/src/kernel/io.cpp +++ b/src/kernel/io.cpp @@ -14,3 +14,19 @@ outb(uint16_t port, uint8_t val) __asm__ __volatile__ ( "outb %0, %1" :: "a"(val), "Nd"(port) ); } +uint64_t +rdmsr(uint64_t addr) +{ + uint32_t low, high; + __asm__ __volatile__ ("rdmsr" : "=a"(low), "=d"(high) : "c"(addr)); + return (static_cast(high) << 32) | low; +} + +void +wrmsr(uint64_t addr, uint64_t value) +{ + uint32_t low = value & 0xffffffff; + uint32_t high = value >> 32; + __asm__ __volatile__ ("wrmsr" :: "c"(addr), "a"(low), "d"(high)); +} + diff --git a/src/kernel/io.h b/src/kernel/io.h index da34a07..6e77085 100644 --- a/src/kernel/io.h +++ b/src/kernel/io.h @@ -14,6 +14,16 @@ uint8_t inb(uint16_t port); /// \arg val The byte to write void outb(uint16_t port, uint8_t val); +/// Read the value of a MSR +/// \arg addr The MSR address +/// \returns The current value of the MSR +uint64_t rdmsr(uint64_t addr); + +/// Write to a MSR +/// \arg addr The MSR address +/// \arg value The value to write +void wrmsr(uint64_t addr, uint64_t value); + } const uint16_t COM1 = 0x03f8;