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