6#define XCR0_XSAVE_SAVE_X87 (1 << 0)
7#define XCR0_XSAVE_SAVE_SSE (1 << 1)
8#define XCR0_AVX_ENABLE (1 << 2)
9#define XCR0_AVX512_ENABLE (1 << 5)
10#define XCR0_ZMM0_15_ENABLE (1 << 6)
11#define XCR0_ZMM16_32_ENABLE (1 << 7)
14#define MSR_TSC_AUX 0xC0000103
15#define MSR_EFER 0xC0000080
16#define MSR_STAR 0xC0000081
17#define MSR_LSTAR 0xC0000082
18#define MSR_SYSCALL_FLAG_MASK 0xC0000084
19#define MSR_FS_BASE 0xC0000100
20#define MSR_GS_BASE 0xC0000101
21#define MSR_KERNEL_GS_BASE 0xc0000102
23#define EFER_SYSCALL_ENABLE 1
25#define RFLAGS_CARRY (1 << 0)
26#define RFLAGS_ALWAYS_SET (1 << 1)
27#define RFLAGS_PARITY (1 << 2)
28#define RFLAGS_RESERVED1 (1 << 3)
29#define RFLAGS_AUX_CARRY (1 << 4)
30#define RFLAGS_RESERVED2 (1 << 5)
31#define RFLAGS_ZERO (1 << 6)
32#define RFLAGS_SIGN (1 << 7)
33#define RFLAGS_TRAP (1 << 8)
34#define RFLAGS_INTERRUPT_ENABLE (1 << 9)
35#define RFLAGS_DIRECTION (1 << 10)
36#define RFLAGS_OVERFLOW (1 << 11)
37#define RFLAGS_IOPL (1 << 12 | 1 << 13)
38#define RFLAGS_NESTED_TASK (1 << 14)
39#define RFLAGS_MODE (1 << 15)
41#define CR0_PROTECTED_MODE_ENABLE (1 << 0)
42#define CR0_MONITOR_CO_PROCESSOR (1 << 1)
43#define CR0_EMULATION (1 << 2)
44#define CR0_TASK_SWITCHED (1 << 3)
45#define CR0_EXTENSION_TYPE (1 << 4)
46#define CR0_NUMERIC_ERROR_ENABLE (1 << 5)
47#define CR0_WRITE_PROTECT (1 << 16)
48#define CR0_ALIGNMENT_MASK (1 << 18)
49#define CR0_NOT_WRITE_THROUGH (1 << 29)
50#define CR0_CACHE_DISABLE (1 << 30)
51#define CR0_PAGING_ENABLE (1 << 31)
53#define CR4_PAGE_GLOBAL_ENABLE (1 << 7)
54#define CR4_FXSR_ENABLE (1 << 9)
55#define CR4_SIMD_EXCEPTION (1 << 10)
56#define CR4_XSAVE_ENABLE (1 << 18)
62 ASM(
"xsetbv" : :
"a"(eax),
"d"(edx),
"c"(xcr) :
"memory");
69 ASM(
"rdmsr" :
"=a"(low),
"=d"(high) :
"c"(msr));
77 ASM(
"wrmsr" : :
"c"(msr),
"a"(low),
"d"(high));
83 ASM(
"pushfq; pop %0" :
"=r"(rflags));
89 ASM(
"push %0; popfq" : :
"r"(value));
95 ASM(
"mov %%cr4, %0" :
"=r"(cr4));
101 ASM(
"mov %0, %%cr4" : :
"r"(value));
107 ASM(
"mov %%cr3, %0" :
"=r"(cr3));
113 ASM(
"mov %0, %%cr3" : :
"r"(value));
119 ASM(
"mov %%cr2, %0" :
"=r"(cr2));
125 ASM(
"mov %0, %%cr2" : :
"r"(value));
131 ASM(
"mov %%cr0, %0" :
"=r"(cr0));
137 ASM(
"mov %0, %%cr0" : :
"r"(value));
143 ASM(
"mov %%rsp, %0" :
"=r"(rsp));
149 ASM(
"mov %0, %%rsp" : :
"r"(value));
155 ASM(
"mov %%rbp, %0" :
"=r"(rbp));
161 ASM(
"mov %0, %%rbp" : :
"r"(value));
#define ASM(...)
Inline assembly macro.
static uint64_t cr0_read(void)
static void cr3_write(uint64_t value)
static uint64_t rsp_read(void)
static void cr2_write(uint64_t value)
static void msr_write(uint32_t msr, uint64_t value)
static void rflags_write(uint64_t value)
static uint64_t cr4_read(void)
static uint64_t rflags_read(void)
static uint64_t cr3_read(void)
static uint64_t msr_read(uint32_t msr)
static uint64_t rbp_read(void)
static void rbp_write(uint64_t value)
static void rsp_write(uint64_t value)
static void cr4_write(uint64_t value)
static void cr0_write(uint64_t value)
static void xcr0_write(uint32_t xcr, uint64_t value)
static uint64_t cr2_read(void)