Merge branch 'master' into signal-dev
[lunaix-os.git] / lunaix-os / kernel / mm / cow.c
1 #include <lunaix/mm/vmm.h>
2
3 void* vmm_dup_page(pid_t pid, void* pa) {    
4     void* new_ppg = pmm_alloc_page(pid, 0);
5     vmm_fmap_page(pid, PG_MOUNT_3, new_ppg, PG_PREM_RW);
6     vmm_fmap_page(pid, PG_MOUNT_4, pa, PG_PREM_RW);
7
8     asm volatile (
9         "movl %1, %%edi\n"
10         "movl %2, %%esi\n"
11         "rep movsl\n"
12         :: "c"(1024), "r"(PG_MOUNT_3), "r"(PG_MOUNT_4)
13         : "memory", "%edi", "%esi");
14
15     vmm_unset_mapping(PG_MOUNT_3);
16     vmm_unset_mapping(PG_MOUNT_4);
17
18     return new_ppg;
19 }