Boot framework rework (#45)
[lunaix-os.git] / lunaix-os / arch / x86 / mm / vmutils.c
1 #include <lunaix/mm/page.h>
2 #include <sys/mm/mm_defs.h>
3
4 struct leaflet*
5 dup_leaflet(struct leaflet* leaflet)
6 {
7     ptr_t dest_va, src_va;
8     struct leaflet* new_leaflet;
9     
10     new_leaflet = alloc_leaflet(leaflet_order(leaflet));
11
12     src_va = leaflet_mount(leaflet);
13     dest_va = vmap(new_leaflet, KERNEL_DATA);
14
15     size_t cnt_wordsz = leaflet_size(new_leaflet) / sizeof(ptr_t);
16
17 #ifdef CONFIG_ARCH_X86_64
18     asm volatile("movq %1, %%rdi\n"
19                  "movq %2, %%rsi\n"
20                  "rep movsq\n" ::"c"(cnt_wordsz),
21                  "r"(dest_va),
22                  "r"(src_va)
23                  : "memory", "%edi", "%esi");
24
25 #else
26     asm volatile("movl %1, %%edi\n"
27                  "movl %2, %%esi\n"
28                  "rep movsl\n" ::"c"(cnt_wordsz),
29                  "r"(dest_va),
30                  "r"(src_va)
31                  : "memory", "%edi", "%esi");
32
33 #endif
34
35     leaflet_unmount(leaflet);
36     vunmap(dest_va, new_leaflet);
37
38     return new_leaflet;
39 }