Unifying the Lunaix's Physical Memory Model (#28)
[lunaix-os.git] / lunaix-os / includes / lunaix / mm / vmm.h
1 #ifndef __LUNAIX_VMM_H
2 #define __LUNAIX_VMM_H
3
4 #include <lunaix/mm/pagetable.h>
5 #include <lunaix/mm/vmtlb.h>
6 #include <lunaix/process.h>
7 #include <lunaix/types.h>
8
9 /**
10  * @brief 初始化虚拟内存管理器
11  *
12  */
13 void
14 vmm_init();
15
16 static inline void 
17 vmm_set_ptes_contig(pte_t* ptep, pte_t pte, size_t lvl_size, size_t n)
18 {
19     do {
20         set_pte(ptep, pte);
21         pte_val(pte) += lvl_size;
22         ptep++;
23     } while (--n > 0);
24 }
25
26 static inline void 
27 vmm_set_ptes(pte_t* ptep, pte_t pte, size_t n)
28 {
29     do {
30         set_pte(ptep, pte);
31         ptep++;
32     } while (--n > 0);
33 }
34
35
36 static inline void 
37 vmm_unset_ptes(pte_t* ptep, size_t n)
38 {
39     do {
40         set_pte(ptep, null_pte);
41         ptep++;
42     } while (--n > 0);
43 }
44
45 pte_t
46 vmm_tryptep(pte_t* ptep, size_t lvl_size);
47
48 /**
49  * @brief 在指定的虚拟地址空间里查找一个映射
50  *
51  * @param mnt 地址空间锚定点
52  * @param va 虚拟地址
53  * @param mapping 映射相关属性
54  * @return int
55  */
56 static inline bool
57 vmm_lookupat(ptr_t mnt, ptr_t va, pte_t* pte_out)
58 {
59     pte_t pte = vmm_tryptep(mkptep_va(mnt, va), LFT_SIZE);
60     *pte_out = pte;
61
62     return !pte_isnull(pte);
63 }
64
65 /**
66  * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
67  *
68  * @param pde 页目录的物理地址
69  * @return ptr_t
70  */
71 ptr_t
72 vms_mount(ptr_t mnt, ptr_t pde);
73
74 /**
75  * @brief 卸载已挂载的虚拟地址空间
76  *
77  */
78 ptr_t
79 vms_unmount(ptr_t mnt);
80
81 static inline ptr_t 
82 mount_page(ptr_t mnt, ptr_t pa) {
83     assert(pa);
84     pte_t* ptep = mkptep_va(VMS_SELF, mnt);
85     set_pte(ptep, mkpte(pa, KERNEL_DATA));
86
87     tlb_flush_kernel(mnt);
88     return mnt;
89 }
90
91 static inline ptr_t 
92 unmount_page(ptr_t mnt) {
93     pte_t* ptep = mkptep_va(VMS_SELF, mnt);
94     set_pte(ptep, null_pte);
95
96     tlb_flush_kernel(mnt);
97     return mnt;
98 }
99
100 /**
101  * @brief 将当前地址空间的虚拟地址转译为物理地址。
102  *
103  * @param va 虚拟地址
104  * @return void*
105  */
106 static inline ptr_t
107 vmm_v2p(ptr_t va)
108 {
109     pte_t* ptep = mkptep_va(VMS_SELF, va);
110     return pte_paddr(pte_at(ptep)) + va_offset(va);
111 }
112
113 void
114 vmap_set_start(ptr_t start_addr);
115
116 #endif /* __LUNAIX_VMM_H */