X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/32b9a6d76790c73d3d2d36d9081a2581cc65d184..28c176b668c841a3b7fb093faccf0efa39257603:/lunaix-os/arch/x86/mm/vmutils.c diff --git a/lunaix-os/arch/x86/mm/vmutils.c b/lunaix-os/arch/x86/mm/vmutils.c new file mode 100644 index 0000000..df831c2 --- /dev/null +++ b/lunaix-os/arch/x86/mm/vmutils.c @@ -0,0 +1,39 @@ +#include +#include + +struct leaflet* +dup_leaflet(struct leaflet* leaflet) +{ + ptr_t dest_va, src_va; + struct leaflet* new_leaflet; + + new_leaflet = alloc_leaflet(leaflet_order(leaflet)); + + src_va = leaflet_mount(leaflet); + dest_va = vmap(new_leaflet, KERNEL_DATA); + + size_t cnt_wordsz = leaflet_size(new_leaflet) / sizeof(ptr_t); + +#ifdef CONFIG_ARCH_X86_64 + asm volatile("movq %1, %%rdi\n" + "movq %2, %%rsi\n" + "rep movsq\n" ::"c"(cnt_wordsz), + "r"(dest_va), + "r"(src_va) + : "memory", "%edi", "%esi"); + +#else + asm volatile("movl %1, %%edi\n" + "movl %2, %%esi\n" + "rep movsl\n" ::"c"(cnt_wordsz), + "r"(dest_va), + "r"(src_va) + : "memory", "%edi", "%esi"); + +#endif + + leaflet_unmount(leaflet); + vunmap(dest_va, new_leaflet); + + return new_leaflet; +} \ No newline at end of file