diff --git a/kernel/main.cc b/kernel/main.cc index 375a530..4249027 100644 --- a/kernel/main.cc +++ b/kernel/main.cc @@ -58,7 +58,7 @@ extern "C" int main() { memset(&paging_tree, 0, sizeof(four_lvl_paging_t)); create_basic_page_table(&paging_tree); - load_cr3((void*)&paging_tree.l4); + //load_cr3((void*)&paging_tree.l4); tout.reset(); tout.setPos(33, 0); @@ -87,6 +87,7 @@ extern "C" int main() { // g.vault().scheduler.ready(new Thread(false, p)); //} g.vault().scheduler.ready(new Thread(false, (void*)0x4001000)); + load_cr3((void*)&paging_tree.l4); //for (uint32_t i = 0; i < NUM_APPS; ++i) { // g.vault().scheduler.ready(&(apps[i])); diff --git a/kernel/thread/dispatcher.cc b/kernel/thread/dispatcher.cc index b6ca7a6..b2432f5 100644 --- a/kernel/thread/dispatcher.cc +++ b/kernel/thread/dispatcher.cc @@ -16,7 +16,6 @@ void Dispatcher::go(Thread *first) { assert(active() == nullptr); setActive(first); mytss.sp0 = first->StackPointer.isr; - load_cr3((void*)&paging_tree.l4); first->go(); } @@ -26,7 +25,6 @@ void Dispatcher::dispatch(Thread *next) { if (current != next) { setActive(next); mytss.sp0 = next->StackPointer.isr; - load_cr3((void*)&paging_tree.l4); current->resume(next); } } diff --git a/kernel/thread/thread.cc b/kernel/thread/thread.cc index 0d2c62f..03ee90f 100644 --- a/kernel/thread/thread.cc +++ b/kernel/thread/thread.cc @@ -9,6 +9,7 @@ #include "debug/output.h" static int idCounter = 1; // counter for task IDs +extern four_lvl_paging_t paging_tree; void Thread::kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3) { Thread *thread = reinterpret_cast(param1); @@ -27,30 +28,33 @@ void Thread::kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3) { ((void(*)())thread->start)(); } -extern four_lvl_paging_t paging_tree; +void Thread::load_paging(){ + paging_tree.l2.entries[32] = { + .present = 1, + .write = 1, + .user = 1, + .address = (uintptr_t)(this->subtable) >> 12 + }; + load_cr3((void*)&paging_tree.l4); +} + Thread::Thread (bool kernel, void * start): queue_link(nullptr), isKernel(kernel), start(start), id(idCounter++), kill_flag(false){ StackPointer.isr = reinterpret_cast((uintptr_t)PageFrameAllocator::alloc(true)+STACK_SIZE);//(reserved_stack_space_isr + STACK_SIZE); StackPointer.user = reinterpret_cast((uintptr_t)PageFrameAllocator::alloc(false)+STACK_SIZE); subtable = (pagetable_t*) PageFrameAllocator::alloc(true); - subtable->entries[0] = { .present = 1, .user = 1, .address = (uintptr_t)start >> 12 }; - subtable->entries[1] = { .present = 1, + .write = 1, .user = 1, .address = (uintptr_t)StackPointer.user >> 12 }; - paging_tree.l2.entries[32] = { - .present = 1, - .user = 1, - .address = (uintptr_t)subtable >> 12 - }; //map_pageframe(&paging_tree, (uintptr_t)StackPointer.user, 0x4001000); prepareContext(StackPointer.isr, context, kickoff, reinterpret_cast(this), 0, 0); @@ -63,13 +67,7 @@ Thread::Thread() : Thread(false, 0) {} //} void Thread::resume(Thread *next) { - assert(next != nullptr && "Pointer to next Thread must not be nullptr!"); - paging_tree.l2.entries[32] = { - .present = 1, - .user = 1, - .address = (uintptr_t)&next->subtable>>12 - }; - load_cr3((void*)&paging_tree.l4); + load_paging(); context_switch(&next->context, &context); } @@ -84,12 +82,7 @@ void* Thread::operator new(size_t sz) noexcept void Thread::go() { - paging_tree.l2.entries[32] = { - .present = 1, - .user = 1, - .address = (uintptr_t)&subtable>>12 - }; - load_cr3((void*)&paging_tree.l4); + load_paging(); context_launch(&context); } diff --git a/kernel/thread/thread.h b/kernel/thread/thread.h index f3bc247..b30619c 100644 --- a/kernel/thread/thread.h +++ b/kernel/thread/thread.h @@ -109,6 +109,8 @@ class Thread { */ void go(); + void load_paging(); + /*! \brief Switches from the currently running thread to the `next` one. * * The values currently present in the callee-saved registers will be