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