From 0dc5c499387440497d93c9902a2fdc66d4ba5a02 Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Sun, 2 Apr 2023 03:36:23 +0300 Subject: [PATCH] Kernel: Call exit_trap in AArch64 restore_context_and_eret This matches x86_64's behaviour in common_trap_exit. (called from thread_context_first_enter) Currently thread_context_first_enter is only called when creating new processes from scratch, in which case this doesn't change the actual behaviour. But once thread_context_first_enter is called as part of execve support, this will ensure the Thread's m_current_trap is set correctly to the new trap frame. --- Kernel/Arch/aarch64/TrapFrame.cpp | 18 ++++++++++++++++++ Kernel/Arch/aarch64/TrapFrame.h | 2 ++ Kernel/Arch/aarch64/vector_table.S | 2 ++ Kernel/CMakeLists.txt | 1 + 4 files changed, 23 insertions(+) create mode 100644 Kernel/Arch/aarch64/TrapFrame.cpp diff --git a/Kernel/Arch/aarch64/TrapFrame.cpp b/Kernel/Arch/aarch64/TrapFrame.cpp new file mode 100644 index 00000000000..6455dcbfbad --- /dev/null +++ b/Kernel/Arch/aarch64/TrapFrame.cpp @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2023, Idan Horowitz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Kernel { + +extern "C" void exit_trap(TrapFrame* trap) +{ + return Processor::current().exit_trap(*trap); +} + +} diff --git a/Kernel/Arch/aarch64/TrapFrame.h b/Kernel/Arch/aarch64/TrapFrame.h index d3cf9c94a68..b6172cbf24e 100644 --- a/Kernel/Arch/aarch64/TrapFrame.h +++ b/Kernel/Arch/aarch64/TrapFrame.h @@ -24,4 +24,6 @@ struct TrapFrame { TrapFrame& operator=(TrapFrame&&) = delete; }; +extern "C" void exit_trap(TrapFrame*) __attribute__((used)); + } diff --git a/Kernel/Arch/aarch64/vector_table.S b/Kernel/Arch/aarch64/vector_table.S index 026f934ac5e..b284962bc78 100644 --- a/Kernel/Arch/aarch64/vector_table.S +++ b/Kernel/Arch/aarch64/vector_table.S @@ -208,5 +208,7 @@ system_error_lower_el: .global restore_context_and_eret restore_context_and_eret: + mov x0, sp + bl exit_trap restore_previous_context eret diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 03aa968da20..eb2b580486b 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -471,6 +471,7 @@ elseif("${SERENITY_ARCH}" STREQUAL "aarch64") Arch/aarch64/Processor.cpp Arch/aarch64/SafeMem.cpp Arch/aarch64/SmapDisabler.cpp + Arch/aarch64/TrapFrame.cpp Arch/aarch64/vector_table.S )