diff --git a/cpu/i386/address_spaces.c b/cpu/i386/address_spaces.c index 94b63dc..145450a 100644 --- a/cpu/i386/address_spaces.c +++ b/cpu/i386/address_spaces.c @@ -1,6 +1,6 @@ #include "paging.h" -void copy_data(void* cr3, void* data,uint32_t size,void* virt_addr) { +void address_spaces_copy_data(void* cr3, void* data,uint32_t size,void* virt_addr) { uint32_t old_cr3; asm volatile("movl %%cr3, %%eax; movl %%eax, %0;":"=m"(old_cr3)::"%eax"); void* phys_addr=virt_to_phys(data); diff --git a/cpu/i386/address_spaces.h b/cpu/i386/address_spaces.h index fb56f3d..3876137 100644 --- a/cpu/i386/address_spaces.h +++ b/cpu/i386/address_spaces.h @@ -3,6 +3,6 @@ #include -void copy_data(void* cr3, void* data,uint32_t size,void* virt_addr); +void address_spaces_copy_data(void* cr3, void* data,uint32_t size,void* virt_addr); #endif diff --git a/cpu/i386/isr.c b/cpu/i386/isr.c index 346c48c..53eff04 100644 --- a/cpu/i386/isr.c +++ b/cpu/i386/isr.c @@ -7,6 +7,7 @@ #include "../../drivers/vga.h" #include "../tasking.h" #include "interrupt.h" +#include "address_spaces.h" #include #include void irq_handler(registers_t r); @@ -187,6 +188,8 @@ void isr_handler(registers_t r) { r.ebx=(uint32_t)paging_new_address_space(); } else if (r.eax==9) { tasking_createTaskCr3((void*)r.ebx,(void*)r.ecx); + } else if (r.eax==10) { + address_spaces_copy_data((void*)r.ebx,(void*)r.ecx,r.edx,(void*)r.esi); } break; } diff --git a/initrd/init b/initrd/init index 5c0354b..a5c8644 100755 Binary files a/initrd/init and b/initrd/init differ diff --git a/libc/memory.c b/libc/memory.c index ae15b6b..4e2ab92 100644 --- a/libc/memory.c +++ b/libc/memory.c @@ -24,3 +24,16 @@ void* new_address_space() { ":"=b"(cr3)); return cr3; } + +void copy_data(void* cr3, void* data,uint32_t size,void* virt_addr) { + asm volatile(" \ + mov $10, %%eax; \ + int $80; \ + "::"b"(cr3),"c"(data),"d"(size),"S"(virt_addr)); + // uint32_t old_cr3; + // asm volatile("movl %%cr3, %%eax; movl %%eax, %0;":"=m"(old_cr3)::"%eax"); + // void* phys_addr=virt_to_phys(data); + // load_address_space(cr3); + // map_pages(virt_addr,phys_addr,(size/4096)+1,1,1); + // load_address_space(old_cr3); +} diff --git a/libc/memory.h b/libc/memory.h index 4a9195f..cbfcf06 100644 --- a/libc/memory.h +++ b/libc/memory.h @@ -8,5 +8,6 @@ void* alloc_memory(uint32_t num_pages); void alloc_memory_virt(uint32_t num_pages,void* addr); void* new_address_space(); +void copy_data(void* cr3, void* data,uint32_t size,void* virt_addr); #endif