blob: 1891126b203cdcf23ee052b634c8cbcdcf1eb56d (
plain) (
tree)
|
|
#include "arch/x86_64/msr.h"
void
msr_write(uint32_t msr, uint64_t v)
{
__asm__ volatile("wrmsr":: "a"(v), "d"(v >> 32), "c"(msr));
}
uint64_t
msr_read(uint32_t msr)
{
uint32_t lo, hi;
__asm__ volatile("rdmsr": "=a"(lo), "=d"(hi): "c"(msr));
uint64_t v = hi;
v = (v << 32) | lo;
return v;
}
void
msr_efer_write(msr_efer_t v)
{
msr_write(MSR_EFER, *((uintptr_t*)&v));
}
msr_efer_t
msr_efer_read(void)
{
uint64_t rawv = msr_read(MSR_EFER);
return *((msr_efer_t*)&rawv);
}
void
msr_star_write(msr_star_t v)
{
msr_write(MSR_STAR, *((uintptr_t*)&v));
}
msr_star_t
msr_star_read(void)
{
uint64_t rawv = msr_read(MSR_STAR);
return *((msr_star_t*)&rawv);
}
void
msr_lstar_write(msr_lstar_t v)
{
msr_write(MSR_LSTAR, v);
}
msr_lstar_t
msr_lstar_read(void)
{
return msr_read(MSR_LSTAR);
}
void
msr_gsbase_write(uintptr_t gsbase)
{
msr_write(MSR_GSBASE, gsbase);
}
uintptr_t
msr_gsbase_read(void)
{
return msr_read(MSR_GSBASE);
}
|