- ptr_t ptd_pp = pmm_alloc_page(PP_FGPERSIST);
- vmm_set_mapping(VMS_SELF, PG_MOUNT_1, ptd_pp, PG_PREM_RW, VMAP_NULL);
-
- x86_page_table* ptd = (x86_page_table*)PG_MOUNT_1;
- x86_page_table* pptd = (x86_page_table*)(mount_point | (0x3FF << 12));
-
- size_t kspace_l1inx = L1_INDEX(KERNEL_EXEC);
- size_t i = 1; // skip first 4MiB, to avoid bring other thread's stack
+ pte_t* ptep_dest = mkl0tep(mkptep_va(dest_mnt, 0));
+ pte_t* ptep = mkl0tep(mkptep_va(src_mnt, 0));
+ pte_t* ptepd_kernel = mkl0tep(mkptep_va(dest_mnt, KERNEL_RESIDENT));
+ pte_t* ptep_kernel = mkl0tep(mkptep_va(src_mnt, KERNEL_RESIDENT));
+
+ // Build the self-reference on dest vms
+ pte_t* ptep_sms = mkptep_va(VMS_SELF, (ptr_t)ptep_dest);
+ pte_t* ptep_ssm = mkptep_va(VMS_SELF, (ptr_t)ptep_sms);
+ pte_t pte_sms = mkpte_prot(KERNEL_DATA);
+
+ pte_sms = vmm_alloc_page(ptep_ssm, pte_sms);
+ set_pte(ptep_sms, pte_sms);
+
+ cpu_flush_page((ptr_t)dest_mnt);