diff --git a/Kernel/Arch/aarch64/TrapFrame.cpp b/Kernel/Arch/aarch64/TrapFrame.cpp new file mode 100644 index 0000000000..6455dcbfba --- /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 d3cf9c94a6..b6172cbf24 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 026f934ac5..b284962bc7 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 03aa968da2..eb2b580486 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 )