diff --git a/repos/base-hw/src/core/kernel/kernel.cc b/repos/base-hw/src/core/kernel/kernel.cc index 4cfa7602c..c8171ba7b 100644 --- a/repos/base-hw/src/core/kernel/kernel.cc +++ b/repos/base-hw/src/core/kernel/kernel.cc @@ -234,8 +234,13 @@ extern "C" void kernel() Kernel::Cpu_context::Cpu_context(Genode::Translation_table * const table) { - _init(STACK_SIZE, (addr_t)table); sp = (addr_t)kernel_stack; ip = (addr_t)kernel; core_pd()->admit(this); + + /* + * platform specific initialization, has to be done after + * setting the registers by now + */ + _init(STACK_SIZE, (addr_t)table); } diff --git a/repos/base-hw/src/core/spec/x86_64/kernel/thread_base.cc b/repos/base-hw/src/core/spec/x86_64/kernel/thread_base.cc index 585302055..36116ab82 100644 --- a/repos/base-hw/src/core/spec/x86_64/kernel/thread_base.cc +++ b/repos/base-hw/src/core/spec/x86_64/kernel/thread_base.cc @@ -87,7 +87,14 @@ void Thread::_mmu_exception() *************************/ void Kernel::Cpu_context::_init(size_t const stack_size, addr_t const table) -{ } +{ + /* + * the stack pointer already contains the stack base address + * of all CPU's kernel stacks, on this uni-processor platform + * it is sufficient to increase it by the stack's size + */ + sp = sp + stack_size; +} /*************************