fix typos, some refinements
[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     src_va = leaflet_mount(leaflet);
14     dest_va = vmap(new_leaflet, KERNEL_DATA);
15
16     size_t cnt_wordsz = leaflet_size(new_leaflet) / sizeof(ptr_t);
17
18 #ifdef CONFIG_ARCH_X86_64
19     asm volatile("movq %1, %%rdi\n"
20                  "movq %2, %%rsi\n"
21                  "rep movsq\n" ::"c"(cnt_wordsz),
22                  "r"(dest_va),
23                  "r"(src_va)
24                  : "memory", "%edi", "%esi");
25
26 #else
27     asm volatile("movl %1, %%edi\n"
28                  "movl %2, %%esi\n"
29                  "rep movsl\n" ::"c"(cnt_wordsz),
30                  "r"(dest_va),
31                  "r"(src_va)
32                  : "memory", "%edi", "%esi");
33
34 #endif
35
36     leaflet_unmount(leaflet);
37     vunmap(dest_va, new_leaflet);
38
39     return new_leaflet;
40 }
41
42 pte_t
43 translate_vmr_prot(unsigned int vmr_prot, pte_t pte)
44 {
45     pte = pte_mkuser(pte);
46
47     if ((vmr_prot & PROT_WRITE)) {
48         pte = pte_mkwritable(pte);
49     }
50
51     if ((vmr_prot & PROT_EXEC)) {
52         pte = pte_mkexec(pte);
53     }
54     else {
55         pte = pte_mknonexec(pte);
56     }
57
58     return pte;
59 }