fix page mounting contention (close #57)
[lunaix-os.git] / lunaix-os / arch / x86 / mm / vmutils.c
1 #include <lunaix/mm/page.h>
2
3 #include <asm/mm_defs.h>
4
5 struct leaflet*
6 dup_leaflet(struct leaflet* leaflet)
7 {
8     ptr_t dest_va, src_va;
9     struct leaflet* new_leaflet;
10     
11     new_leaflet = alloc_leaflet(leaflet_order(leaflet));
12
13     // TODO need a proper long term fix for the contention of page mount point
14     dest_va = vmap(new_leaflet, KERNEL_DATA);
15     src_va = leaflet_mount(leaflet);
16
17     size_t cnt_wordsz = leaflet_size(new_leaflet) / sizeof(ptr_t);
18
19 #ifdef CONFIG_ARCH_X86_64
20     asm volatile("movq %1, %%rdi\n"
21                  "movq %2, %%rsi\n"
22                  "rep movsq\n" ::"c"(cnt_wordsz),
23                  "r"(dest_va),
24                  "r"(src_va)
25                  : "memory", "%edi", "%esi");
26
27 #else
28     asm volatile("movl %1, %%edi\n"
29                  "movl %2, %%esi\n"
30                  "rep movsl\n" ::"c"(cnt_wordsz),
31                  "r"(dest_va),
32                  "r"(src_va)
33                  : "memory", "%edi", "%esi");
34
35 #endif
36
37     leaflet_unmount(leaflet);
38     vunmap(dest_va, new_leaflet);
39
40     return new_leaflet;
41 }
42
43 pte_t
44 translate_vmr_prot(unsigned int vmr_prot, pte_t pte)
45 {
46     pte = pte_mkuser(pte);
47
48     if ((vmr_prot & PROT_WRITE)) {
49         pte = pte_mkwritable(pte);
50     }
51
52     if ((vmr_prot & PROT_EXEC)) {
53         pte = pte_mkexec(pte);
54     }
55     else {
56         pte = pte_mknonexec(pte);
57     }
58
59     return pte;
60 }