26 lines
608 B
C
26 lines
608 B
C
// 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");
|
|
}
|