PatchworkOS  19e446b
A non-POSIX operating system.
Loading...
Searching...
No Matches
regs.h
Go to the documentation of this file.
1#pragma once
2
3#include <stdint.h>
4#include <sys/defs.h>
5
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)
12
13#define MSR_LAPIC 0x1B
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
22
23#define EFER_SYSCALL_ENABLE 1
24
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)
40
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)
52
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)
57
58static inline void xcr0_write(uint32_t xcr, uint64_t value)
59{
60 uint32_t eax = (uint32_t)value;
61 uint32_t edx = value >> 32;
62 ASM("xsetbv" : : "a"(eax), "d"(edx), "c"(xcr) : "memory");
63}
64
65static inline uint64_t msr_read(uint32_t msr)
66{
67 uint32_t low;
68 uint32_t high;
69 ASM("rdmsr" : "=a"(low), "=d"(high) : "c"(msr));
70 return ((uint64_t)high << 32) | (uint64_t)low;
71}
72
73static inline void msr_write(uint32_t msr, uint64_t value)
74{
75 uint32_t low = (uint32_t)(value & 0xFFFFFFFF);
76 uint32_t high = (uint32_t)(value >> 32);
77 ASM("wrmsr" : : "c"(msr), "a"(low), "d"(high));
78}
79
80static inline uint64_t rflags_read(void)
81{
82 uint64_t rflags;
83 ASM("pushfq; pop %0" : "=r"(rflags));
84 return rflags;
85}
86
87static inline void rflags_write(uint64_t value)
88{
89 ASM("push %0; popfq" : : "r"(value));
90}
91
92static inline uint64_t cr4_read(void)
93{
94 uint64_t cr4;
95 ASM("mov %%cr4, %0" : "=r"(cr4));
96 return cr4;
97}
98
99static inline void cr4_write(uint64_t value)
100{
101 ASM("mov %0, %%cr4" : : "r"(value));
102}
103
104static inline uint64_t cr3_read(void)
105{
106 uint64_t cr3;
107 ASM("mov %%cr3, %0" : "=r"(cr3));
108 return cr3;
109}
110
111static inline void cr3_write(uint64_t value)
112{
113 ASM("mov %0, %%cr3" : : "r"(value));
114}
115
116static inline uint64_t cr2_read(void)
117{
118 uint64_t cr2;
119 ASM("mov %%cr2, %0" : "=r"(cr2));
120 return cr2;
121}
122
123static inline void cr2_write(uint64_t value)
124{
125 ASM("mov %0, %%cr2" : : "r"(value));
126}
127
128static inline uint64_t cr0_read(void)
129{
130 uint64_t cr0;
131 ASM("mov %%cr0, %0" : "=r"(cr0));
132 return cr0;
133}
134
135static inline void cr0_write(uint64_t value)
136{
137 ASM("mov %0, %%cr0" : : "r"(value));
138}
139
140static inline uint64_t rsp_read(void)
141{
142 uint64_t rsp;
143 ASM("mov %%rsp, %0" : "=r"(rsp));
144 return rsp;
145}
146
147static inline void rsp_write(uint64_t value)
148{
149 ASM("mov %0, %%rsp" : : "r"(value));
150}
151
152static inline uint64_t rbp_read(void)
153{
154 uint64_t rbp;
155 ASM("mov %%rbp, %0" : "=r"(rbp));
156 return rbp;
157}
158
159static inline void rbp_write(uint64_t value)
160{
161 ASM("mov %0, %%rbp" : : "r"(value));
162}
#define ASM(...)
Inline assembly macro.
Definition defs.h:160
static uint64_t cr0_read(void)
Definition regs.h:128
static void cr3_write(uint64_t value)
Definition regs.h:111
static uint64_t rsp_read(void)
Definition regs.h:140
static void cr2_write(uint64_t value)
Definition regs.h:123
static void msr_write(uint32_t msr, uint64_t value)
Definition regs.h:73
static void rflags_write(uint64_t value)
Definition regs.h:87
static uint64_t cr4_read(void)
Definition regs.h:92
static uint64_t rflags_read(void)
Definition regs.h:80
static uint64_t cr3_read(void)
Definition regs.h:104
static uint64_t msr_read(uint32_t msr)
Definition regs.h:65
static uint64_t rbp_read(void)
Definition regs.h:152
static void rbp_write(uint64_t value)
Definition regs.h:159
static void rsp_write(uint64_t value)
Definition regs.h:147
static void cr4_write(uint64_t value)
Definition regs.h:99
static void cr0_write(uint64_t value)
Definition regs.h:135
static void xcr0_write(uint32_t xcr, uint64_t value)
Definition regs.h:58
static uint64_t cr2_read(void)
Definition regs.h:116
__UINT32_TYPE__ uint32_t
Definition stdint.h:15
__UINT64_TYPE__ uint64_t
Definition stdint.h:17