From 41ba11229a80eb19d97c8052aff1861478ee2486 Mon Sep 17 00:00:00 2001 From: David Milosevic Date: Thu, 27 Apr 2023 02:12:31 +0200 Subject: arch/arm64: Add EL1/EL2/EL3 support for arm64 Currently, arch/arm64 requires coreboot to run on EL3 due to EL3 register access. This might be an issue when, for example, one boots into TF-A first and drops into EL2 for coreboot afterwards. This patch aims at making arch/arm64 more versatile by removing the current EL3 constraint and allowing arm64 coreboot to run on EL1, EL2 and EL3. The strategy here, is to add a Kconfig option (ARM64_CURRENT_EL) which lets us specify coreboot's EL upon entry. Based on that, we access the appropriate ELx registers. So, for example, when running coreboot on EL1, we would not access vbar_el3 or vbar_el2 but instead vbar_el1. This way, we don't generate faults when accessing higher-EL registers. Currently only tested on the qemu-aarch64 target. Exceptions were tested by enabling FATAL_ASSERTS. Signed-off-by: David Milosevic Change-Id: Iae1c57f0846c8d0585384f7e54102a837e701e7e Reviewed-on: https://review.coreboot.org/c/coreboot/+/74798 Reviewed-by: Werner Zeh Reviewed-by: ron minnich Tested-by: build bot (Jenkins) Reviewed-by: Julius Werner --- src/arch/arm64/boot.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/arch/arm64/boot.c') diff --git a/src/arch/arm64/boot.c b/src/arch/arm64/boot.c index 89668e85b9..7a8060fa49 100644 --- a/src/arch/arm64/boot.c +++ b/src/arch/arm64/boot.c @@ -18,8 +18,10 @@ static void run_payload(struct prog *prog) if (CONFIG(ARM64_USE_ARM_TRUSTED_FIRMWARE)) run_bl31((u64)doit, (u64)arg, payload_spsr); - else + else if (CONFIG_ARM64_CURRENT_EL == EL3) transition_to_el2(doit, arg, payload_spsr); + else + doit(arg); } void arch_prog_run(struct prog *prog) -- cgit v1.2.3