fix dependency check logic cause config always disabled
[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 static inline void 
10 vmm_set_ptes_contig(pte_t* ptep, pte_t pte, size_t lvl_size, size_t n)
11 {
12     do {
13         set_pte(ptep, pte);
14         pte = pte_advance(pte, lvl_size);
15         ptep++;
16     } while (--n > 0);
17 }
18
19 static inline void 
20 vmm_set_ptes(pte_t* ptep, pte_t pte, size_t n)
21 {
22     do {
23         set_pte(ptep, pte);
24         ptep++;
25     } while (--n > 0);
26 }
27
28
29 static inline void 
30 vmm_unset_ptes(pte_t* ptep, size_t n)
31 {
32     do {
33         set_pte(ptep, null_pte);
34         ptep++;
35     } while (--n > 0);
36 }
37
38 pte_t
39 vmm_tryptep(pte_t* ptep, size_t lvl_size);
40
41 /**
42  * @brief 在指定的虚拟地址空间里查找一个映射
43  *
44  * @param mnt 地址空间锚定点
45  * @param va 虚拟地址
46  * @param mapping 映射相关属性
47  * @return int
48  */
49 static inline bool
50 vmm_lookupat(ptr_t mnt, ptr_t va, pte_t* pte_out)
51 {
52     pte_t pte = vmm_tryptep(mkptep_va(mnt, va), LFT_SIZE);
53     *pte_out = pte;
54
55     return !pte_isnull(pte);
56 }
57
58 /**
59  * @brief 挂载另一个虚拟地址空间至当前虚拟地址空间
60  *
61  * @param pde 页目录的物理地址
62  * @return ptr_t
63  */
64 ptr_t
65 vms_mount(ptr_t mnt, ptr_t pde);
66
67 /**
68  * @brief 卸载已挂载的虚拟地址空间
69  *
70  */
71 ptr_t
72 vms_unmount(ptr_t mnt);
73
74 static inline ptr_t 
75 mount_page(ptr_t mnt, ptr_t pa) {
76     assert(pa);
77     pte_t* ptep = mkptep_va(VMS_SELF, mnt);
78     set_pte(ptep, mkpte(pa, KERNEL_DATA));
79
80     tlb_flush_kernel(mnt);
81     return mnt;
82 }
83
84 static inline ptr_t 
85 unmount_page(ptr_t mnt) {
86     pte_t* ptep = mkptep_va(VMS_SELF, mnt);
87     set_pte(ptep, null_pte);
88
89     tlb_flush_kernel(mnt);
90     return mnt;
91 }
92
93 /**
94  * @brief 将当前地址空间的虚拟地址转译为物理地址。
95  *
96  * @param va 虚拟地址
97  * @return void*
98  */
99 static inline ptr_t
100 vmm_v2p(ptr_t va)
101 {
102     pte_t* ptep = mkptep_va(VMS_SELF, va);
103     return pte_paddr(pte_at(ptep)) + va_offset(va);
104 }
105
106 void
107 vmap_set_start(ptr_t start_addr);
108
109 #endif /* __LUNAIX_VMM_H */