physical page list mapping
[lunaix-os.git] / lunaix-os / includes / lunaix / mm / page.h
index 23d5c646dd5e13b6da907e45c8a1b00d90a82ca1..772ff75365a397802e8f8365d2c79bafb490cb12 100644 (file)
@@ -145,6 +145,15 @@ pin_leaflet(struct leaflet* leaflet)
     change_page_type(get_ppage(leaflet), PP_FGLOCKED);
 }
 
+static inline int
+to_napot_order(int nr_pages)
+{
+    int order;
+    
+    order = ilog2(nr_pages);
+    return is_pot(nr_pages) ? order : order + 1;
+}
+
 /**
  * @brief Map a leaflet
  * 
@@ -284,6 +293,13 @@ vmap_range(pfn_t start, size_t npages, pte_attr_t prot)
     return vmap_ptes_at(_pte, LFT_SIZE, npages);
 }
 
+static inline void
+vunmap_range(pfn_t start, size_t npages)
+{
+    pte_t* ptep = mkptep_va(VMS_SELF, start);
+    vmm_set_ptes_contig(ptep, null_pte, LFT_SIZE, npages);
+}
+
 
 /**
  * @brief Allocate a page in kernel space.
@@ -296,4 +312,22 @@ vmap_range(pfn_t start, size_t npages, pte_attr_t prot)
 pte_t 
 alloc_kpage_at(pte_t* ptep, pte_t pte, int order);
 
+static inline void*
+vmalloc_page(int order)
+{
+    struct leaflet* leaf = alloc_leaflet(0);
+    if (!leaf) {
+        return NULL;
+    }
+
+    return (void*)vmap(leaf, KERNEL_DATA);
+}
+
+static inline void
+vmfree(void* ptr)
+{
+    struct leaflet* leaf = ppfn_leaflet(pfn((ptr_t)ptr));
+    leaflet_return(leaf);
+}
+
 #endif /* __LUNAIX_PAGE_H */