refactor: striped more arch-related code from the kernel code base
[lunaix-os.git] / lunaix-os / kernel / mm / cow.c
1 #include <lunaix/mm/pmm.h>
2 #include <lunaix/mm/vmm.h>
3
4 ptr_t
5 vmm_dup_page(pid_t pid, ptr_t pa)
6 {
7     ptr_t new_ppg = pmm_alloc_page(pid, 0);
8     vmm_set_mapping(VMS_SELF, PG_MOUNT_3, new_ppg, PG_PREM_RW, VMAP_NULL);
9     vmm_set_mapping(VMS_SELF, PG_MOUNT_4, pa, PG_PREM_RW, VMAP_NULL);
10
11     asm volatile("movl %1, %%edi\n"
12                  "movl %2, %%esi\n"
13                  "rep movsl\n" ::"c"(1024),
14                  "r"(PG_MOUNT_3),
15                  "r"(PG_MOUNT_4)
16                  : "memory", "%edi", "%esi");
17
18     vmm_del_mapping(VMS_SELF, PG_MOUNT_3);
19     vmm_del_mapping(VMS_SELF, PG_MOUNT_4);
20
21     return new_ppg;
22 }