5#define XCR0_XSAVE_SAVE_X87 (1 << 0)
6#define XCR0_XSAVE_SAVE_SSE (1 << 1)
7#define XCR0_AVX_ENABLE (1 << 2)
8#define XCR0_AVX512_ENABLE (1 << 5)
9#define XCR0_ZMM0_15_ENABLE (1 << 6)
10#define XCR0_ZMM16_32_ENABLE (1 << 7)
13#define MSR_CPU_ID 0xC0000103
14#define MSR_EFER 0xC0000080
15#define MSR_STAR 0xC0000081
16#define MSR_LSTAR 0xC0000082
17#define MSR_SYSCALL_FLAG_MASK 0xC0000084
18#define MSR_GS_BASE 0xC0000101
19#define MSR_KERNEL_GS_BASE 0xc0000102
21#define EFER_SYSCALL_ENABLE 1
23#define RFLAGS_CARRY (1 << 0)
24#define RFLAGS_ALWAYS_SET (1 << 1)
25#define RFLAGS_PARITY (1 << 2)
26#define RFLAGS_RESERVED1 (1 << 3)
27#define RFLAGS_AUX_CARRY (1 << 4)
28#define RFLAGS_RESERVED2 (1 << 5)
29#define RFLAGS_ZERO (1 << 6)
30#define RFLAGS_SIGN (1 << 7)
31#define RFLAGS_TRAP (1 << 8)
32#define RFLAGS_INTERRUPT_ENABLE (1 << 9)
33#define RFLAGS_DIRECTION (1 << 10)
34#define RFLAGS_OVERFLOW (1 << 11)
35#define RFLAGS_IOPL (1 << 12 | 1 << 13)
36#define RFLAGS_NESTED_TASK (1 << 14)
37#define RFLAGS_MODE (1 << 15)
39#define CR0_PROTECTED_MODE_ENABLE (1 << 0)
40#define CR0_MONITOR_CO_PROCESSOR (1 << 1)
41#define CR0_EMULATION (1 << 2)
42#define CR0_TASK_SWITCHED (1 << 3)
43#define CR0_EXTENSION_TYPE (1 << 4)
44#define CR0_NUMERIC_ERROR_ENABLE (1 << 5)
45#define CR0_WRITE_PROTECT (1 << 16)
46#define CR0_ALIGNMENT_MASK (1 << 18)
47#define CR0_NOT_WRITE_THROUGH (1 << 29)
48#define CR0_CACHE_DISABLE (1 << 30)
49#define CR0_PAGING_ENABLE (1 << 31)
51#define CR4_PAGE_GLOBAL_ENABLE (1 << 7)
52#define CR4_FXSR_ENABLE (1 << 9)
53#define CR4_SIMD_EXCEPTION (1 << 10)
54#define CR4_XSAVE_ENABLE (1 << 18)
60 asm volatile(
"xsetbv" : :
"a"(eax),
"d"(edx),
"c"(xcr) :
"memory");
67 asm volatile(
"rdmsr" :
"=a"(low),
"=d"(high) :
"c"(msr));
75 asm volatile(
"wrmsr" : :
"c"(msr),
"a"(low),
"d"(high));
81 asm volatile(
"pushfq; pop %0" :
"=r"(rflags));
87 asm volatile(
"push %0; popfq" : :
"r"(value));
93 asm volatile(
"mov %%cr4, %0" :
"=r"(cr4));
99 asm volatile(
"mov %0, %%cr4" : :
"r"(value));
105 asm volatile(
"mov %%cr3, %0" :
"=r"(cr3));
111 asm volatile(
"mov %0, %%cr3" : :
"r"(value));
117 asm volatile(
"mov %%cr2, %0" :
"=r"(cr2));
123 asm volatile(
"mov %0, %%cr2" : :
"r"(value));
129 asm volatile(
"mov %%cr0, %0" :
"=r"(cr0));
135 asm volatile(
"mov %0, %%cr0" : :
"r"(value));
141 asm volatile(
"mov %%rsp, %0" :
"=r"(rsp));
147 asm volatile(
"mov %0, %%rsp" : :
"r"(value));
153 asm volatile(
"mov %%rbp, %0" :
"=r"(rbp));
159 asm volatile(
"mov %0, %%rbp" : :
"r"(value));
static void cr3_write(uint64_t value)
static uint64_t rbp_read()
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 cr2_read()
static uint64_t msr_read(uint32_t msr)
static void rbp_write(uint64_t value)
static uint64_t cr3_read()
static void rsp_write(uint64_t value)
static void cr4_write(uint64_t value)
static void cr0_write(uint64_t value)
static uint64_t rsp_read()
static void xcr0_write(uint32_t xcr, uint64_t value)
static uint64_t rflags_read()
static uint64_t cr0_read()
static uint64_t cr4_read()