#include "misc/MSR.h" void MSR::write_to(uint32_t msr_num, uint64_t value) { uint32_t lo = value & 0xFFFFFFFF; uint32_t hi = value << 32; asm volatile("wrmsr" : : "a"(lo), "d"(hi), "c"(msr_num)); } uint64_t MSR::read_from(uint32_t msr_num) { uint32_t lo; uint32_t hi; asm volatile("rdmsr" : "=a"(lo), "=d"(hi) : "c"(msr_num)); return (uint64_t)hi << 32 | (uint64_t)lo; } void MSR::write(uint64_t value) { write_to(m_msr_num, value); } uint64_t MSR::read() { return read_from(m_msr_num); } MSR::MSR(uint32_t msr_num) : m_msr_num(msr_num) { } void MSR::with_value_of(uint32_t msr_num, void (*callback)(uint64_t&)) { MSR msr(msr_num); msr.with_value(callback); } void MSR::with_value(void (*callback)(uint64_t&)) { uint64_t value = read(); callback(value); write(value); }