summaryrefslogtreecommitdiff
path: root/msr.h
blob: ad901a697c29028a04d7914230413c188da33636 (plain)
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
// SYSCALL and SYSRET registers
#define MSR_STAR        0xc0000081
#define MSR_LSTAR       0xc0000082
#define MSR_CSTAR       0xc0000083
#define MSR_SFMASK      0xc0000084

// GS
#define MSR_GS_BASE     0xc0000101
#define MSR_GS_KERNBASE 0xc0000102

static inline uint64
readmsr(uint32 msr)
{
  uint32 hi, lo;
  __asm volatile("rdmsr" : "=d" (hi), "=a" (lo) : "c" (msr));
  return ((uint64) lo) | (((uint64) hi) << 32);
}

static inline void
writemsr(uint64 msr, uint64 val)
{
  uint32 lo = val & 0xffffffff;
  uint32 hi = val >> 32;
  __asm volatile("wrmsr" : : "c" (msr), "a" (lo), "d" (hi) : "memory");
}