wip on fork
minimal example works
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
#include "../thread/scheduler.h"
|
||||
#include "../memory/pageframealloc.h"
|
||||
#include "../memory/pagetable.h"
|
||||
#include "../arch/idt.h"
|
||||
void *operator new(size_t, void *);
|
||||
|
||||
//#include "../user/app1/appl.h"
|
||||
@@ -175,8 +176,6 @@ namespace Syscall {
|
||||
|
||||
|
||||
bool copy_from_phys(Vault& vault, uintptr_t phys_ptr, void* virt_ptr, size_t size) {
|
||||
Thread* current_thread = vault.scheduler.active();
|
||||
|
||||
size_t offset = Page::offset(phys_ptr);
|
||||
size_t total_size = size + offset;
|
||||
four_lvl_paging_t* search_table = vault.scheduler.active()->paging_tree;
|
||||
@@ -185,10 +184,10 @@ bool copy_from_phys(Vault& vault, uintptr_t phys_ptr, void* virt_ptr, size_t siz
|
||||
if (virt_addr == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for(uint8_t i =0; i<size/4096 +1; i++){
|
||||
setMapping((uintptr_t)virt_addr, (void*)phys_ptr, vault.scheduler.active()->paging_tree);
|
||||
}
|
||||
|
||||
for(uint8_t i =0; i<size/4096 +1; i++){
|
||||
setMapping((uintptr_t)virt_addr, (void*)phys_ptr, vault.scheduler.active()->paging_tree);
|
||||
}
|
||||
|
||||
memcpy(virt_ptr, (void*)((uintptr_t)(virt_addr)+ (uintptr_t)offset), size);
|
||||
setMapping((uintptr_t)(virt_addr), 0, search_table);
|
||||
@@ -280,9 +279,25 @@ bool reply(Vault& v, const void* buffer, size_t size) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void copy_stack(Thread* parent, Thread* child){
|
||||
uintptr_t dest_frame = isMapped((uintptr_t)child->StackPointer.user, child->paging_tree);
|
||||
void* dest_vaddr = getFreeVirtSpace(parent->paging_tree, 1);
|
||||
setMapping((uintptr_t)dest_vaddr, (void*)dest_frame, parent->paging_tree);
|
||||
|
||||
memcpy(dest_vaddr, (void*)0x6000000/*((uintptr_t)parent->StackPointer.user & ~0xFFF)*/, 4096);
|
||||
|
||||
setMapping((uintptr_t)dest_vaddr, 0, parent->paging_tree);
|
||||
}
|
||||
|
||||
int fork(Vault &vault, InterruptContext *user_context) {
|
||||
Thread* parent = vault.scheduler.active();
|
||||
//Thread* child = new Thread(false,
|
||||
Thread* child = new Thread(false, (void*)user_context->ip, parent->code_paddr, parent->code_pagenum);
|
||||
copy_pagetable(parent->paging_tree, child->paging_tree);
|
||||
copy_stack(parent, child);
|
||||
|
||||
child->StackPointer.user = (void*)user_context->sp;
|
||||
|
||||
vault.scheduler.ready(child);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user