diff options
Diffstat (limited to 'lib/asm/x86_64')
| -rw-r--r-- | lib/asm/x86_64/msr.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/asm/x86_64/msr.c b/lib/asm/x86_64/msr.c new file mode 100644 index 0000000..2dfdc44 --- /dev/null +++ b/lib/asm/x86_64/msr.c @@ -0,0 +1,30 @@ +#include <asm/x86_64/msr.h> + +void msr_write(uint32_t index, uint64_t value) +{ + uint32_t low = value & 0xffffffff; + uint32_t high = value >> 32; + + __asm__ volatile + ( + "wrmsr\n\t" + : + : "a"(low), "d"(high), "c"(index) + ); +} + +uint64_t msr_read(uint32_t index) +{ + uint32_t low; + uint32_t high; + + __asm__ volatile + ( + "rdmsr\n\t" + : "=a"(low), "=d"(high) + : "c"(index) + ); + + return ((uint64_t)high << 32)|low; +} + |
