diff --git a/kernel/thread/thread.cc b/kernel/thread/thread.cc index 7436362..5fb3068 100644 --- a/kernel/thread/thread.cc +++ b/kernel/thread/thread.cc @@ -20,7 +20,7 @@ void Thread::kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3) { Guard::leave(); if(!thread->isKernel) - Core::Ring::switchToUsermode(thread->StackPointer.user, thread->start, 0); + Core::Ring::switchToUsermode(thread->StackPointer.user, (void*)0x4000000, 0); else if(thread->start == nullptr) thread->action(); @@ -38,21 +38,24 @@ void Thread::load_paging(Thread* t){ load_cr3((void*)&paging_tree.l4); } -Thread::Thread (bool kernel, void * start): queue_link(nullptr), isKernel(kernel), start(start), id(idCounter++), kill_flag(false){ +Thread::Thread (bool kernel, void * startframe, int num_pages): queue_link(nullptr), isKernel(kernel), start(startframe), 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); + StackPointer.user = (void*)(0x4100000+STACK_SIZE); subtable = (pagetable_t*) PageFrameAllocator::alloc(true); - subtable->entries[0] = { - .present = 1, - .user = 1, - .address = (uintptr_t)start >> 12 - }; - subtable->entries[1] = { + for(uint8_t i=0; ientries[i] = { + .present = 1, + .user = 1, + .address = ((uintptr_t)startframe >> 12) + i + }; + } + uintptr_t user_stackframe_p = ((uintptr_t)PageFrameAllocator::alloc(false)); + subtable->entries[256] = { .present = 1, .write = 1, .user = 1, - .address = (uintptr_t)StackPointer.user >> 12 + .address = user_stackframe_p >> 12 }; //map_pageframe(&paging_tree, (uintptr_t)StackPointer.user, 0x4001000); diff --git a/kernel/thread/thread.h b/kernel/thread/thread.h index 4f76f79..b7a0a82 100644 --- a/kernel/thread/thread.h +++ b/kernel/thread/thread.h @@ -99,7 +99,7 @@ class Thread { * */ explicit Thread(); - explicit Thread(bool kernel, void * start = nullptr); + explicit Thread(bool kernel, void * startframe = nullptr, int num_pages=1); /*! \brief Activates the first thread on this CPU. * diff --git a/user/app2/kappl.cc b/user/app2/kappl.cc index 572143a..ed6e396 100644 --- a/user/app2/kappl.cc +++ b/user/app2/kappl.cc @@ -9,30 +9,29 @@ extern "C" void main() { char cmd_buff[100]; uint8_t bufferpos = 0; while(1){ - write(1, "kappl", 5); - //char msg[11]; - //int len; - //len = read(0, msg, 1); - //if(len){ - // write(0, msg, len); - // memcpy(&cmd_buff[bufferpos], msg, len); - // bufferpos+=len; - // for(uint8_t i=0; i