diff --git a/kernel/arch/core_ring.cc b/kernel/arch/core_ring.cc index b21a448..2d7d474 100644 --- a/kernel/arch/core_ring.cc +++ b/kernel/arch/core_ring.cc @@ -26,7 +26,7 @@ void switchToUsermode(void *stackpointer, void *kickoff, "pushq %[user_eflags] \n" \ "pushq %[user_code] \n" \ "pushq %[user_function] \n" \ - "mov %[user_parameter], %%rdi\n" \ + "mov %[user_parameter], %%rax\n" \ "iretq \n" \ : \ : [user_data] "r"((uint64_t)user_ds), diff --git a/kernel/interrupt/handlers.cc b/kernel/interrupt/handlers.cc index 145ab9c..d385f2c 100644 --- a/kernel/interrupt/handlers.cc +++ b/kernel/interrupt/handlers.cc @@ -65,13 +65,13 @@ static void printContext(const InterruptContext *context) { uint64_t pf_number = uint64_t (pf >> 12 ); if(PageFrameAllocator::PageFrames[pf_number].ref_count==1){ - setMapping(virt, (void*) pf , paging_tree, 1); + setMapping(virt, (void*) pf , paging_tree, true); }else{ uintptr_t page = (uintptr_t) PageFrameAllocator::alloc(false); //Syscall::Skeleton::map(page, 4096); - setMapping(virt, (void*) page , paging_tree, 1); + setMapping(virt, (void*) page , paging_tree, true); memcpy( (void*)page, (void*)virt, 4096); Syscall::Skeleton::invlpg(virt); diff --git a/kernel/memory/pagetable.cc b/kernel/memory/pagetable.cc index a4f98e3..cb8c2a6 100644 --- a/kernel/memory/pagetable.cc +++ b/kernel/memory/pagetable.cc @@ -160,7 +160,7 @@ void* getFreeVirtSpace(four_lvl_paging_t* search_table, uint8_t num_pages){ } -void setMapping(uintptr_t vaddr, void* frame, four_lvl_paging_t* flpt, uint8_t writeable){ +void setMapping(uintptr_t vaddr, void* frame, four_lvl_paging_t* flpt, bool write){ uint16_t l4Index = (vaddr>>39) & 0x1FF; uint16_t l3Index = (vaddr>>30) & 0x1FF; uint16_t l2Index = (vaddr>>21) & 0x1FF; @@ -195,7 +195,7 @@ void setMapping(uintptr_t vaddr, void* frame, four_lvl_paging_t* flpt, uint8_t w memset(newl1, 0, 4096); lvl2->entries[l2Index] = { .present = 1, - .write = 1, + .write = write, .user = 1, .address = (uintptr_t)newl1 >> 12 }; diff --git a/kernel/memory/pagetable.h b/kernel/memory/pagetable.h index 4c0cea2..c32f6d2 100644 --- a/kernel/memory/pagetable.h +++ b/kernel/memory/pagetable.h @@ -50,7 +50,7 @@ typedef struct { void write_identity_map(pagetable_t* identity_table, uint64_t size); void create_basic_page_table(four_lvl_paging_t* table, pagetable_t* kernel_identity); void load_cr3(void* cr3_value); -void setMapping(uintptr_t vaddr, void* frame, four_lvl_paging_t* flpt, uint8_t writeable =1); +void setMapping(uintptr_t vaddr, void* frame, four_lvl_paging_t* flpt, bool write=true); uintptr_t isMapped(uintptr_t vaddr, four_lvl_paging_t* flpt); void* getFreeVirtSpace(four_lvl_paging_t* search_table, uint8_t num_pages); void copy_pagetable(four_lvl_paging_t* parent_table, four_lvl_paging_t* child_table); diff --git a/kernel/syscall/skeleton.cc b/kernel/syscall/skeleton.cc index d75499b..061eb6d 100644 --- a/kernel/syscall/skeleton.cc +++ b/kernel/syscall/skeleton.cc @@ -296,10 +296,14 @@ int fork(Vault &vault, InterruptContext *user_context) { copy_stack(parent, child); child->StackPointer.user = (void*)user_context->sp; + vault.thread_list[child->id] = child; + //return parent pid to child + prepareContext(child->StackPointer.isr, child->context, Thread::kickoff, reinterpret_cast(child), parent->id, 0); vault.scheduler.ready(child); - return 0; + // return child pid to parent + return child->id; } diff --git a/kernel/thread/thread.cc b/kernel/thread/thread.cc index 1a48754..6be4eb1 100644 --- a/kernel/thread/thread.cc +++ b/kernel/thread/thread.cc @@ -16,13 +16,12 @@ extern pagetable_t identity_table; void Thread::kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3) { Thread *thread = reinterpret_cast(param1); assert(thread != nullptr && "Kickoff got nullptr pointer to Thread"); - (void)param2; // will be used later (void)param3; // will be used later // The core must have entered level 1/2 to cause a thread to be scheduled. Guard::leave(); if(!thread->isKernel) - Core::Ring::switchToUsermode(thread->StackPointer.user, thread->start, 0); + Core::Ring::switchToUsermode(thread->StackPointer.user, thread->start, (void*)param2); else if(thread->start == nullptr) thread->action(); diff --git a/kernel/thread/thread.h b/kernel/thread/thread.h index 4b22188..7007933 100644 --- a/kernel/thread/thread.h +++ b/kernel/thread/thread.h @@ -75,11 +75,11 @@ class Thread { * \param param3 Third parameter (will be used later) * */ - static void kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3); static void kickoffUsermode (Thread *object); void map_app(void* code_paddr, uint16_t code_page_num, void* stack_vaddr, uint16_t stack_page_num); public: + static void kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3); struct{ void* user; void* isr; diff --git a/user/app1/appl.cc b/user/app1/appl.cc index 7103a29..ae799f5 100644 --- a/user/app1/appl.cc +++ b/user/app1/appl.cc @@ -45,19 +45,26 @@ extern "C" void main() { //sys_test(1,2,3,4,5); - fork(); + uint8_t ret = fork(); + //ret = fork(); unsigned id = sys_getpid(); + char text[] = "appX"; text[3] = 0x30+id; - write(1, text, sizeof(text), 0, (int)id); + write(1, text, strlen(text), 0, (int)id); + + char msg[] = "forked pid: "; + msg[12] = 0x30+ret; + write(1, msg, strlen(msg), 6, (int)id); + uint8_t cnt = 0; while(1){ cnt = (cnt+1)%100; char msg[12]; char* num = itoa(cnt, msg); - write(1, num, strlen(num), 10, (int)id); + write(1, num, strlen(num), 25, (int)id); sleep(100); }