From 18eb4a59d6d41af599f0d2fba2d6a81ad5cccbe4 Mon Sep 17 00:00:00 2001 From: Marcin Undak Date: Thu, 7 Oct 2021 15:54:48 -0400 Subject: [PATCH] Kernel: Print current CPU exception level after booting on Aarch64 This is a first step to switch to exception level 1. This is also my first patch for SerenityOS :) --- Kernel/Prekernel/Arch/aarch64/Aarch64_asm_utils.S | 12 ++++++++++++ Kernel/Prekernel/Arch/aarch64/Aarch64_asm_utils.h | 9 +++++++++ Kernel/Prekernel/Arch/aarch64/init.cpp | 7 +++++++ Kernel/Prekernel/CMakeLists.txt | 1 + 4 files changed, 29 insertions(+) create mode 100644 Kernel/Prekernel/Arch/aarch64/Aarch64_asm_utils.S create mode 100644 Kernel/Prekernel/Arch/aarch64/Aarch64_asm_utils.h 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 )