diff --git a/Kernel/Arch/aarch64/Processor.cpp b/Kernel/Arch/aarch64/Processor.cpp index 16b51619e8..df80acb4d7 100644 --- a/Kernel/Arch/aarch64/Processor.cpp +++ b/Kernel/Arch/aarch64/Processor.cpp @@ -241,7 +241,7 @@ FlatPtr Processor::init_context(Thread& thread, bool leave_crit) // x30 is the Link Register for the aarch64 ABI, so this will return to exit_kernel_thread when main thread function returns. eretframe.x[30] = FlatPtr(&exit_kernel_thread); eretframe.elr_el1 = thread_regs.elr_el1; - eretframe.sp_el0 = kernel_stack_top; + eretframe.sp_el0 = thread_regs.sp_el0; eretframe.tpidr_el0 = 0; // FIXME: Correctly initialize this when aarch64 has support for thread local storage. eretframe.spsr_el1 = thread_regs.spsr_el1; diff --git a/Kernel/Arch/aarch64/ThreadRegisters.h b/Kernel/Arch/aarch64/ThreadRegisters.h index 1ae9c0c5a7..217f446c99 100644 --- a/Kernel/Arch/aarch64/ThreadRegisters.h +++ b/Kernel/Arch/aarch64/ThreadRegisters.h @@ -39,10 +39,10 @@ struct ThreadRegisters { void set_exec_state(FlatPtr entry_ip, FlatPtr userspace_sp, Memory::AddressSpace& space) { - (void)entry_ip; - (void)userspace_sp; - (void)space; - TODO_AARCH64(); + set_ip(entry_ip); + set_sp(userspace_sp); + ttbr0_el1 = space.page_directory().ttbr0(); + set_spsr_el1(false); } void set_spsr_el1(bool is_kernel_process)