43 lines
832 B
C++
43 lines
832 B
C++
#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);
|
|
} |