[kvm-unit-tests PATCH v1 1/7] arm64: drop to EL1 if booted at EL2

Joey Gouly
2025-02-20T14:14:11Z

EL2 is not currently supported, drop to EL1 to conitnue booting.

Signed-off-by: Joey Gouly <joey.gouly@arm.com>
---
arm/cstart64.S | 27 +++++++++++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/arm/cstart64.S b/arm/cstart64.S
index b480a552..3a305ad0 100644
--- a/arm/cstart64.S
+++ b/arm/cstart64.S
@@ -57,14 +57,25 @@ start:
add x6, x6, :lo12:reloc_end
1:
cmp x5, x6
- b.hs 1f
+ b.hs reloc_done
ldr x7, [x5] // r_offset
ldr x8, [x5, #16] // r_addend
add x8, x8, x4 // val = base + r_addend
str x8, [x4, x7] // base[r_offset] = val
add x5, x5, #24
b 1b
-
+reloc_done:
+ mrs x4, CurrentEL
+ cmp x4, CurrentEL_EL2
+ b.ne 1f
+drop_to_el1:
+ mov x4, 4
+ msr spsr_el2, x4
+ adrp x4, 1f
+ add x4, x4, :lo12:1f
+ msr elr_el2, x4
+ isb
+ eret
1:
/* zero BSS */
adrp x4, bss
@@ -186,6 +197,18 @@ get_mmu_off:

.globl secondary_entry
secondary_entry:
+ mrs x0, CurrentEL
+ cmp x0, CurrentEL_EL2
+ b.ne 1f
+drop_to_el1_secondary:
+ mov x0, 4
+ msr spsr_el2, x0
+ adrp x0, 1f
+ add x0, x0, :lo12:1f
+ msr elr_el2, x0
+ isb
+ eret
+1:
/* enable FP/ASIMD and SVE */
mov x0, #(3 << 20)
orr x0, x0, #(3 << 16)
--
2.25.1