1 #include <lunaix/mm/page.h>
2 #include <lunaix/mm/valloc.h>
3 #include <lunaix/spike.h>
4 #include <lunaix/syslog.h>
6 #include <asm/mempart.h>
8 static ptr_t start = VMAP;
9 static volatile ptr_t prev_va = 0;
12 vmap_set_start(ptr_t start_addr) {
17 __alloc_contig_ptes(pte_t* ptep, size_t base_sz, int n)
21 ptr_t va = page_addr(ptep_pfn(ptep));
25 while (_n < n && va < VMAP_END) {
27 if (pte_isnull(pte)) {
30 else if ((sz / LEVEL_SIZE) < base_sz) {
35 ptep = ptep_step_into(ptep);
39 if (ptep_vfn(ptep) + 1 == LEVEL_SIZE) {
40 ptep = ptep_step_out(++ptep);
58 return mkptep_va(ptep_vm_mnt(ptep), va);
62 vmap_ptes_at(pte_t pte, size_t lvl_size, int n)
64 pte_t* ptep = mkptep_va(VMS_SELF, start);
65 ptep = __alloc_contig_ptes(ptep, lvl_size, n);
71 vmm_set_ptes_contig(ptep, pte, lvl_size, n);
73 ptr_t va = page_addr(ptep_pfn(ptep));
75 tlb_flush_kernel_ranged(va, n);
81 vunmap(ptr_t ptr, struct leaflet* leaflet)
86 assert(start <= ptr && ptr <= VMAP_END);
88 npages = leaflet_nfold(leaflet);
89 ptep = mkptep_va(VMS_SELF, ptr);
91 vmm_unset_ptes(ptep, npages);
93 tlb_flush_kernel_ranged(ptr, npages);