summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/msr.c
blob: 1891126b203cdcf23ee052b634c8cbcdcf1eb56d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#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);
}