From 50864eda021b97534697e4d7374ccbcaa519e142 Mon Sep 17 00:00:00 2001 From: Travis Geiselbrecht Date: Tue, 14 Oct 2025 00:45:03 -0700 Subject: [PATCH] [arch][arm64] add routine to read the boot EL --- arch/arm64/arch.c | 9 +++++++++ arch/arm64/include/arch/arm64.h | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/arch/arm64/arch.c b/arch/arm64/arch.c index 6af6d993..aee19772 100644 --- a/arch/arm64/arch.c +++ b/arch/arm64/arch.c @@ -25,6 +25,9 @@ #define LOCAL_TRACE 0 +/* Defined in start.S. */ +extern uint64_t arm64_boot_el; + // initial setup per cpu immediately after entering C code void arm64_early_init_percpu(void) { // set the vector base @@ -76,6 +79,12 @@ void arch_early_init(void) { // called after the kernel has been initialized and threading is enabled on the boot cpu void arch_init(void) { arm64_mp_init(); + + dprintf(INFO, "ARM64: boot EL%llu\n", arm64_get_boot_el()); +} + +uint64_t arm64_get_boot_el(void) { + return arm64_boot_el >> 2; } void arch_quiesce(void) { diff --git a/arch/arm64/include/arch/arm64.h b/arch/arm64/include/arch/arm64.h index a7c56fcb..5b9caf53 100644 --- a/arch/arm64/include/arch/arm64.h +++ b/arch/arm64/include/arch/arm64.h @@ -34,6 +34,8 @@ __BEGIN_CDECLS void arm64_context_switch(vaddr_t *old_sp, vaddr_t new_sp); +uint64_t arm64_get_boot_el(void); + /* exception handling */ struct arm64_iframe_long { uint64_t r[30]; @@ -81,5 +83,14 @@ void arm64_local_invalidate_cache_all(void); void arm64_local_clean_invalidate_cache_all(void); void arm64_local_clean_cache_all(void); +/* Current Exception Level values, as contained in CurrentEL */ +#define CurrentEL_EL1 (1 << 2) +#define CurrentEL_EL2 (2 << 2) + +static inline bool arm64_is_kernel_in_hyp_mode(void) { + return ARM64_READ_SYSREG(CURRENTEL) == CurrentEL_EL2; +} + + __END_CDECLS