+
+ cont:
+ if (ptep_vfn(ptep) == MAX_PTEN - 1) {
+ assert(level > 0);
+ ptep = ptep_step_out(ptep);
+ ptep_dest = ptep_step_out(ptep_dest);
+ level--;
+ }
+
+ ptep++;
+ ptep_dest++;
+ }
+
+ // Ensure we step back to L0T
+ assert(!level);
+ assert(ptep_dest == ptepd_kernel);
+
+ // Carry over the kernel (exclude last two entry)
+ while (ptep_vfn(ptep) < MAX_PTEN - 2) {
+ pte_t pte = *ptep;
+ assert(!pte_isnull(pte));
+
+ set_pte(ptep_dest, pte);
+ pmm_ref_page(pte_paddr(pte));
+
+ ptep++;
+ ptep_dest++;
+ }
+
+ return pte_paddr(*(ptep_dest + 1));
+}
+
+static void optimize("O0")
+vmsfree(ptr_t vm_mnt)
+{
+ pte_t* ptep_head = mkl0tep(mkptep_va(vm_mnt, 0));
+ pte_t* ptep_kernel = mkl0tep(mkptep_va(vm_mnt, KERNEL_RESIDENT));
+
+ int level = 0;
+ volatile pte_t* ptep = ptep_head;
+ while (ptep < ptep_kernel)
+ {
+ pte_t pte = *ptep;
+ ptr_t pa = pte_paddr(pte);
+
+ if (pte_isnull(pte)) {
+ goto cont;
+ }