Make copy_data a syscall

This commit is contained in:
pjht 2019-05-06 08:35:59 -05:00
parent 3856a5dc0a
commit 2497befcea
6 changed files with 19 additions and 2 deletions

View File

@ -1,6 +1,6 @@
#include "paging.h" #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; uint32_t old_cr3;
asm volatile("movl %%cr3, %%eax; movl %%eax, %0;":"=m"(old_cr3)::"%eax"); asm volatile("movl %%cr3, %%eax; movl %%eax, %0;":"=m"(old_cr3)::"%eax");
void* phys_addr=virt_to_phys(data); void* phys_addr=virt_to_phys(data);

View File

@ -3,6 +3,6 @@
#include <stdint.h> #include <stdint.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);
#endif #endif

View File

@ -7,6 +7,7 @@
#include "../../drivers/vga.h" #include "../../drivers/vga.h"
#include "../tasking.h" #include "../tasking.h"
#include "interrupt.h" #include "interrupt.h"
#include "address_spaces.h"
#include <string.h> #include <string.h>
#include <stdint.h> #include <stdint.h>
void irq_handler(registers_t r); void irq_handler(registers_t r);
@ -187,6 +188,8 @@ void isr_handler(registers_t r) {
r.ebx=(uint32_t)paging_new_address_space(); r.ebx=(uint32_t)paging_new_address_space();
} else if (r.eax==9) { } else if (r.eax==9) {
tasking_createTaskCr3((void*)r.ebx,(void*)r.ecx); 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; break;
} }

Binary file not shown.

View File

@ -24,3 +24,16 @@ void* new_address_space() {
":"=b"(cr3)); ":"=b"(cr3));
return 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);
}

View File

@ -8,5 +8,6 @@
void* alloc_memory(uint32_t num_pages); void* alloc_memory(uint32_t num_pages);
void alloc_memory_virt(uint32_t num_pages,void* addr); void alloc_memory_virt(uint32_t num_pages,void* addr);
void* new_address_space(); void* new_address_space();
void copy_data(void* cr3, void* data,uint32_t size,void* virt_addr);
#endif #endif