rework parsing of interupt-map in interrupt node.
[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 <asm/cpu.h>
7 #include <asm/mm_defs.h>
8
9 LOG_MODULE("VM")
10
11 pte_t
12 vmm_tryptep(pte_t* ptep, size_t lvl_size)
13 {
14     ptr_t va = ptep_va(ptep, lvl_size);
15     pte_t* _ptep = mkl0tep(ptep);
16     pte_t pte;
17
18     if (pte_isnull(pte = *_ptep) || _ptep == ptep) 
19         return pte;
20
21 #if LnT_ENABLED(1)
22     _ptep = getl1tep(_ptep, va);
23     if (_ptep == ptep || pte_isnull(pte = *_ptep)) 
24         return pte;
25 #endif
26 #if LnT_ENABLED(2)
27     _ptep = getl2tep(_ptep, va);
28     if (_ptep == ptep || pte_isnull(pte = *_ptep)) 
29         return pte;
30 #endif
31 #if LnT_ENABLED(3)
32     _ptep = getl3tep(_ptep, va);
33     if (_ptep == ptep || pte_isnull(pte = *_ptep)) 
34         return pte;
35 #endif
36     _ptep = getlftep(_ptep, va);
37     return *_ptep;
38 }
39
40 ptr_t
41 vms_mount(ptr_t mnt, ptr_t vms_root)
42 {
43     assert(vms_root);
44
45     pte_t* ptep = mkl0tep_va(VMS_SELF, mnt);
46     set_pte(ptep, mkpte(vms_root, KERNEL_PGTAB));
47     tlb_flush_kernel(mnt);
48     return mnt;
49 }
50
51 ptr_t
52 vms_unmount(ptr_t mnt)
53 {
54     pte_t* ptep = mkl0tep_va(VMS_SELF, mnt);
55     set_pte(ptep, null_pte);
56     tlb_flush_kernel(mnt);
57     return mnt;
58 }
59
60
61 void
62 ptep_alloc_hierarchy(pte_t* ptep, ptr_t va, pte_attr_t prot)
63 {
64     pte_t* _ptep;
65     
66     _ptep = mkl0tep(ptep);
67     if (_ptep == ptep) {
68         return;
69     }
70
71     _ptep = mkl1t(_ptep, va, prot);
72     if (_ptep == ptep) {
73         return;
74     }
75
76     _ptep = mkl2t(_ptep, va, prot);
77     if (_ptep == ptep) {
78         return;
79     }
80
81     _ptep = mkl3t(_ptep, va, prot);
82     if (_ptep == ptep) {
83         return;
84     }
85
86     _ptep = mklft(_ptep, va, prot);
87     assert(_ptep == ptep);
88 }