diff --git a/kernel/arch/core_ring.cc b/kernel/arch/core_ring.cc index fb4a9b5..b21a448 100644 --- a/kernel/arch/core_ring.cc +++ b/kernel/arch/core_ring.cc @@ -17,6 +17,10 @@ void switchToUsermode(void *stackpointer, void *kickoff, constexpr uint16_t user_ds = 4 << 3 | 3; asm volatile ( \ + "mov %[user_data], %%ds \n" \ + "mov %[user_data], %%es \n" \ + "mov %[user_data], %%fs \n" \ + "mov %[user_data], %%gs \n" \ "pushq %[user_data] \n" \ "pushq %[user_stack] \n" \ "pushq %[user_eflags] \n" \ diff --git a/kernel/arch/gdt.cc b/kernel/arch/gdt.cc index a1cdd28..90bb39b 100644 --- a/kernel/arch/gdt.cc +++ b/kernel/arch/gdt.cc @@ -3,8 +3,6 @@ #include "core.h" #include "tss.h" -TSS::Entry mytss; - namespace GDT { // The static 32-bit Global Descriptor Table (GDT) diff --git a/kernel/arch/tss.h b/kernel/arch/tss.h index c2daa76..646a619 100644 --- a/kernel/arch/tss.h +++ b/kernel/arch/tss.h @@ -47,3 +47,5 @@ void init(); void setStackpointer(void* ptr); } // namespace TSS +extern TSS::Entry mytss; + diff --git a/kernel/thread/dispatcher.cc b/kernel/thread/dispatcher.cc index 65d6ccc..caa446f 100644 --- a/kernel/thread/dispatcher.cc +++ b/kernel/thread/dispatcher.cc @@ -1,6 +1,8 @@ // vim: set noet ts=4 sw=4: #include "dispatcher.h" +#include "../arch/tss.h" +#include "thread.h" #include "../arch/core.h" #include "../debug/output.h" // IWYU pragma: keep @@ -12,6 +14,7 @@ Thread *Dispatcher::active() const { return life; } void Dispatcher::go(Thread *first) { assert(active() == nullptr); setActive(first); + mytss.sp0 = first->StackPointer.isr; first->go(); } @@ -20,7 +23,7 @@ void Dispatcher::dispatch(Thread *next) { assert(current != nullptr); if (current != next) { setActive(next); - + mytss.sp0 = next->StackPointer.isr; current->resume(next); } } diff --git a/kernel/thread/thread.cc b/kernel/thread/thread.cc index 72b7751..fdf11df 100644 --- a/kernel/thread/thread.cc +++ b/kernel/thread/thread.cc @@ -41,10 +41,11 @@ Thread::Thread (bool kernel, void * start): queue_link(nullptr), isKernel(kerne prepareContext(StackPointer.isr, context, kickoff, reinterpret_cast(this), 0, 0); } -Thread::Thread() : queue_link(nullptr), id(idCounter++), kill_flag(false) { - void *tos = reinterpret_cast(reserved_stack_space_isr + STACK_SIZE); - prepareContext(tos, context, kickoff, reinterpret_cast(this), 0, 0); -} +Thread::Thread() : Thread(false, 0) {} +//Thread::Thread() : queue_link(nullptr), id(idCounter++), kill_flag(false) { +// void *tos = reinterpret_cast(reserved_stack_space_isr + STACK_SIZE); +// prepareContext(tos, context, kickoff, reinterpret_cast(this), 0, 0); +//} void Thread::resume(Thread *next) { assert(next != nullptr && "Pointer to next Thread must not be nullptr!"); diff --git a/kernel/thread/thread.h b/kernel/thread/thread.h index 765c435..b5af4fc 100644 --- a/kernel/thread/thread.h +++ b/kernel/thread/thread.h @@ -28,7 +28,7 @@ class Thread { /*! \brief pointer to the next element of the readylist */ Thread* queue_link; - bool isKernel = true; + bool isKernel; void* start; friend class Queue; @@ -38,11 +38,6 @@ class Thread { alignas(16) char reserved_stack_space_user[STACK_SIZE]; alignas(16) char reserved_stack_space_isr[STACK_SIZE]; - struct{ - void* user; - void* isr; - } StackPointer; - protected: /*! \brief Context of the thread, used for saving and restoring the register * values when context switching. @@ -70,6 +65,11 @@ class Thread { static void kickoffUsermode (Thread *object); public: + struct{ + void* user; + void* isr; + } StackPointer; + /*! \brief Unique thread id */ const size_t id; diff --git a/kernel/user/app1/appl.cc b/kernel/user/app1/appl.cc index 99791d8..79247c7 100644 --- a/kernel/user/app1/appl.cc +++ b/kernel/user/app1/appl.cc @@ -15,7 +15,6 @@ extern TextStream kout; extern Application apps[]; void Application::action() { // NOLINT - // Thread 1 may be an auxiliary thread unsigned id = 0; while (&apps[id++] != this);