[Krafton Jungle] PintOS 2.0.0
크래프톤 정글 PintOS
 
Loading...
Searching...
No Matches
intrinsic.h
Go to the documentation of this file.
1#ifndef INSTRINSIC_H
2#include "threads/mmu.h"
3
4/* Store the physical address of the page directory into CR3
5 aka PDBR (page directory base register). This activates our
6 new page tables immediately. See [IA32-v2a] "MOV--Move
7 to/from Control Registers" and [IA32-v3a] 3.7.5 "Base Address
8 of the Page Directory". */
9__attribute__((always_inline))
10static __inline void lcr3(uint64_t val) {
11 __asm __volatile("movq %0, %%cr3" : : "r" (val));
12}
13
14__attribute__((always_inline))
15static __inline void lgdt(const struct desc_ptr *dtr) {
16 __asm __volatile("lgdt %0" : : "m" (*dtr));
17}
18
19__attribute__((always_inline))
20static __inline void lldt(uint16_t sel) {
21 __asm __volatile("lldt %0" : : "r" (sel));
22}
23
24__attribute__((always_inline))
25static __inline void ltr(uint16_t sel) {
26 __asm __volatile("ltr %0" : : "r" (sel));
27}
28
29__attribute__((always_inline))
30static __inline void lidt(const struct desc_ptr *dtr) {
31 __asm __volatile("lidt %0" : : "m" (*dtr));
32}
33
34__attribute__((always_inline))
35static __inline void invlpg(uint64_t addr) {
36 __asm __volatile("invlpg (%0)" : : "r" (addr) : "memory");
37}
38
39__attribute__((always_inline))
40static __inline uint64_t read_eflags(void) {
41 uint64_t rflags;
42 __asm __volatile("pushfq; popq %0" : "=r" (rflags));
43 return rflags;
44}
45
46__attribute__((always_inline))
47static __inline uint64_t rcr3(void) {
49 __asm __volatile("movq %%cr3,%0" : "=r" (val));
50 return val;
51}
52
53__attribute__((always_inline))
54static __inline uint64_t rrax(void) {
56 __asm __volatile("movq %%rax,%0" : "=r" (val));
57 return val;
58}
59
60__attribute__((always_inline))
61static __inline uint64_t rrdi(void) {
63 __asm __volatile("movq %%rdi,%0" : "=r" (val));
64 return val;
65}
66
67__attribute__((always_inline))
68static __inline uint64_t rrsi(void) {
70 __asm __volatile("movq %%rsi,%0" : "=r" (val));
71 return val;
72}
73
74__attribute__((always_inline))
75static __inline uint64_t rrdx(void) {
77 __asm __volatile("movq %%rdx,%0" : "=r" (val));
78 return val;
79}
80
81__attribute__((always_inline))
82static __inline uint64_t rr10(void) {
84 __asm __volatile("movq %%r10,%0" : "=r" (val));
85 return val;
86}
87
88__attribute__((always_inline))
89static __inline uint64_t rr8(void) {
91 __asm __volatile("movq %%r8,%0" : "=r" (val));
92 return val;
93}
94
95__attribute__((always_inline))
96static __inline uint64_t rr9(void) {
98 __asm __volatile("movq %%r9,%0" : "=r" (val));
99 return val;
100}
101
102__attribute__((always_inline))
103static __inline uint64_t rrcx(void) {
105 __asm __volatile("movq %%rcx,%0" : "=r" (val));
106 return val;
107}
108
109__attribute__((always_inline))
110static __inline uint64_t rrsp(void) {
112 __asm __volatile("movq %%rsp,%0" : "=r" (val));
113 return val;
114}
115__attribute__((always_inline))
116static __inline uint64_t rcr2(void) {
118 __asm __volatile("movq %%cr2,%0" : "=r" (val));
119 return val;
120}
121
122__attribute__((always_inline))
123static __inline void write_msr(uint32_t ecx, uint64_t val) {
126 edx = (uint32_t) (val >> 32);
127 __asm __volatile("wrmsr"
128 :: "c" (ecx), "d" (edx), "a" (eax) );
129}
130
131#endif /* intrinsic.h */
eax
Definition: intrinsic.h:125
__asm __volatile("wrmsr" ::"c"(ecx), "d"(edx), "a"(eax))
uint64_t val
Definition: intrinsic.h:123
__attribute__((always_inline)) static __inline void lcr3(uint64_t val)
Definition: intrinsic.h:9
edx
Definition: intrinsic.h:126
unsigned int uint32_t
Definition: stdint.h:26
unsigned long long int uint64_t
Definition: stdint.h:29
unsigned short int uint16_t
Definition: stdint.h:23
Definition: mmu.h:30