optimize the menuconfig redrawing
[lunaix-os.git] / lunaix-os / kernel / mm / vmm.c
1 #include <klibc/string.h>
2 #include <lunaix/mm/page.h>
3 #include <lunaix/spike.h>
4 #include <lunaix/syslog.h>
5
6 #include <sys/cpu.h>
7 #include <sys/mm/mm_defs.h>
8
9 LOG_MODULE("VM")
10
11 void
12 vmm_init()
13 {
14     // XXX: something here?
15 }
16
17 pte_t
18 vmm_tryptep(pte_t* ptep, size_t lvl_size)
19 {
20     ptr_t va = ptep_va(ptep, lvl_size);
21     pte_t* _ptep = mkl0tep(ptep);
22     pte_t pte;
23
24     if (pte_isnull(pte = *_ptep) || _ptep == ptep) 
25         return pte;
26
27 #if LnT_ENABLED(1)
28     _ptep = getl1tep(_ptep, va);
29     if (_ptep == ptep || pte_isnull(pte = *_ptep)) 
30         return pte;
31 #endif
32 #if LnT_ENABLED(2)
33     _ptep = getl2tep(_ptep, va);
34     if (_ptep == ptep || pte_isnull(pte = *_ptep)) 
35         return pte;
36 #endif
37 #if LnT_ENABLED(3)
38     _ptep = getl3tep(_ptep, va);
39     if (_ptep == ptep || pte_isnull(pte = *_ptep)) 
40         return pte;
41 #endif
42     _ptep = getlftep(_ptep, va);
43     return *_ptep;
44 }
45
46 ptr_t
47 vms_mount(ptr_t mnt, ptr_t vms_root)
48 {
49     assert(vms_root);
50
51     pte_t* ptep = mkl0tep_va(VMS_SELF, mnt);
52     set_pte(ptep, mkpte(vms_root, KERNEL_DATA));
53     tlb_flush_kernel(mnt);
54     return mnt;
55 }
56
57 ptr_t
58 vms_unmount(ptr_t mnt)
59 {
60     pte_t* ptep = mkl0tep_va(VMS_SELF, mnt);
61     set_pte(ptep, null_pte);
62     tlb_flush_kernel(mnt);
63     return mnt;
64 }
65
66
67 void
68 ptep_alloc_hierarchy(pte_t* ptep, ptr_t va, pte_attr_t prot)
69 {
70     pte_t* _ptep;
71     
72     _ptep = mkl0tep(ptep);
73     if (_ptep == ptep) {
74         return;
75     }
76
77     _ptep = mkl1t(_ptep, va, prot);
78     if (_ptep == ptep) {
79         return;
80     }
81
82     _ptep = mkl2t(_ptep, va, prot);
83     if (_ptep == ptep) {
84         return;
85     }
86
87     _ptep = mkl3t(_ptep, va, prot);
88     if (_ptep == ptep) {
89         return;
90     }
91
92     _ptep = mklft(_ptep, va, prot);
93     assert(_ptep == ptep);
94 }