1 #include <lunaix/mm/page.h>
3 #include <asm/mm_defs.h>
6 dup_leaflet(struct leaflet* leaflet)
9 struct leaflet* new_leaflet;
11 new_leaflet = alloc_leaflet(leaflet_order(leaflet));
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);
17 size_t cnt_wordsz = leaflet_size(new_leaflet) / sizeof(ptr_t);
19 #ifdef CONFIG_ARCH_X86_64
20 asm volatile("movq %1, %%rdi\n"
22 "rep movsq\n" ::"c"(cnt_wordsz),
25 : "memory", "%edi", "%esi");
28 asm volatile("movl %1, %%edi\n"
30 "rep movsl\n" ::"c"(cnt_wordsz),
33 : "memory", "%edi", "%esi");
37 leaflet_unmount(leaflet);
38 vunmap(dest_va, new_leaflet);
44 translate_vmr_prot(unsigned int vmr_prot, pte_t pte)
46 pte = pte_mkuser(pte);
48 if ((vmr_prot & PROT_WRITE)) {
49 pte = pte_mkwritable(pte);
52 if ((vmr_prot & PROT_EXEC)) {
53 pte = pte_mkexec(pte);
56 pte = pte_mknonexec(pte);