diff --git a/Kernel/Prekernel/Arch/aarch64/Aarch64_asm_utils.S b/Kernel/Prekernel/Arch/aarch64/Aarch64_asm_utils.S new file mode 100644 index 0000000000..334848f9e7 --- /dev/null +++ b/Kernel/Prekernel/Arch/aarch64/Aarch64_asm_utils.S @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2021, Marcin Undak + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +.global get_current_exception_level +get_current_exception_level: + mrs x0, CurrentEL + lsr x0, x0, #2 + and x0, x0, #0x3 + ret diff --git a/Kernel/Prekernel/Arch/aarch64/Aarch64_asm_utils.h b/Kernel/Prekernel/Arch/aarch64/Aarch64_asm_utils.h new file mode 100644 index 0000000000..e3d4b54ce6 --- /dev/null +++ b/Kernel/Prekernel/Arch/aarch64/Aarch64_asm_utils.h @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2021, Marcin Undak + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +extern "C" uint8_t get_current_exception_level(); diff --git a/Kernel/Prekernel/Arch/aarch64/init.cpp b/Kernel/Prekernel/Arch/aarch64/init.cpp index 85662770c5..a478bd98c4 100644 --- a/Kernel/Prekernel/Arch/aarch64/init.cpp +++ b/Kernel/Prekernel/Arch/aarch64/init.cpp @@ -1,10 +1,12 @@ /* * Copyright (c) 2021, Nico Weber + * Copyright (c) 2021, Marcin Undak * * SPDX-License-Identifier: BSD-2-Clause */ #include +#include #include #include #include @@ -25,6 +27,11 @@ extern "C" [[noreturn]] void init() uart.print_num(firmware_version); uart.print_str("\r\n"); + auto exception_level = get_current_exception_level(); + uart.print_str("Current CPU exception level: EL"); + uart.print_num(exception_level); + uart.print_str("\r\n"); + auto& timer = Prekernel::Timer::the(); u64 start_musec = 0; for (;;) { diff --git a/Kernel/Prekernel/CMakeLists.txt b/Kernel/Prekernel/CMakeLists.txt index e370e2ad59..c156ae4447 100644 --- a/Kernel/Prekernel/CMakeLists.txt +++ b/Kernel/Prekernel/CMakeLists.txt @@ -11,6 +11,7 @@ if ("${SERENITY_ARCH}" STREQUAL "aarch64") Arch/aarch64/MMIO.cpp Arch/aarch64/Timer.cpp Arch/aarch64/UART.cpp + Arch/aarch64/Aarch64_asm_utils.S Arch/aarch64/boot.S Arch/aarch64/init.cpp )