1 #include <klibc/string.h>
2 #include <lunaix/mm/pmm.h>
3 #include <lunaix/mm/vmm.h>
4 #include <lunaix/spike.h>
5 #include <lunaix/syslog.h>
8 #include <sys/mm/mm_defs.h>
15 // XXX: something here?
19 vmm_alloc_page(pte_t* ptep, pte_t pte)
21 ptr_t pa = pmm_alloc_page(PP_FGPERSIST);
26 pte = pte_setpaddr(pte, pa);
27 pte = pte_mkloaded(pte);
30 mount_page(PG_MOUNT_1, pa);
31 memset((void*)PG_MOUNT_1, 0, LFT_SIZE);
32 unmount_page(PG_MOUNT_1);
34 cpu_flush_page((ptr_t)ptep);
40 vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pte_attr_t prot)
42 assert(!va_offset(va));
44 pte_t* ptep = mkptep_va(mnt, va);
45 pte_t pte = mkpte(pa, prot);
53 vmm_del_mapping(ptr_t mnt, ptr_t va)
55 assert(!va_offset(va));
57 pte_t* ptep = mkptep_va(mnt, va);
61 set_pte(ptep, null_pte);
63 return pte_paddr(old);
67 vmm_tryptep(pte_t* ptep, size_t lvl_size)
69 ptr_t va = ptep_va(ptep, lvl_size);
70 pte_t* _ptep = mkl0tep(ptep);
73 if (pte_isnull(pte = *_ptep) || _ptep == ptep)
77 _ptep = getl1tep(_ptep, va);
78 if (_ptep == ptep || pte_isnull(pte = *_ptep))
82 _ptep = getl2tep(_ptep, va);
83 if (_ptep == ptep || pte_isnull(pte = *_ptep))
87 _ptep = getl3tep(_ptep, va);
88 if (_ptep == ptep || pte_isnull(pte = *_ptep))
91 _ptep = getlftep(_ptep, va);
96 vmm_v2pat(ptr_t mnt, ptr_t va)
98 ptr_t va_off = va_offset(va);
99 pte_t* ptep = mkptep_va(mnt, va);
101 return pte_paddr(pte_at(ptep)) + va_off;
105 vms_mount(ptr_t mnt, ptr_t vms_root)
109 pte_t* ptep = mkl0tep_va(VMS_SELF, mnt);
110 set_pte(ptep, mkpte(vms_root, KERNEL_DATA));
116 vms_unmount(ptr_t mnt)
118 pte_t* ptep = mkl0tep_va(VMS_SELF, mnt);
119 set_pte(ptep, null_pte);
126 ptep_alloc_hierarchy(pte_t* ptep, ptr_t va, pte_attr_t prot)
130 _ptep = mkl0tep(ptep);
135 _ptep = mkl1t(_ptep, va, prot);
140 _ptep = mkl2t(_ptep, va, prot);
145 _ptep = mkl3t(_ptep, va, prot);
150 _ptep = mklft(_ptep, va, prot);
151 assert(_ptep == ptep);