+ va -= base_sz * _n;
+
+ prev_va = va;
+ return mkptep_va(ptep_vm_mnt(ptep), va);
+}
+
+ptr_t
+vmap_ptes_at(pte_t pte, size_t lvl_size, int n)
+{
+ pte_t* ptep = mkptep_va(VMS_SELF, start);
+ ptep = __alloc_contig_ptes(ptep, lvl_size, n);
+
+ if (!ptep) {
+ return 0;
+ }
+
+ vmm_set_ptes_contig(ptep, pte, lvl_size, n);
+
+ ptr_t va = page_addr(ptep_pfn(ptep));
+
+ tlb_flush_kernel_ranged(va, n);
+
+ return va;
+}
+
+void
+vunmap(ptr_t ptr, struct leaflet* leaflet)
+{
+ pte_t* ptep;
+ unsigned int npages;
+
+ assert(start <= ptr && ptr <= VMAP_END);
+
+ npages = leaflet_nfold(leaflet);
+ ptep = mkptep_va(VMS_SELF, ptr);
+
+ vmm_unset_ptes(ptep, npages);
+
+ tlb_flush_kernel_ranged(ptr, npages);