blob: c621187bfc7fbc13e4ea95b343e5b255f487beef [file] [log] [blame]
Andrew Geissler9347dd42023-03-03 12:38:41 -06001From 252cbd36e51414b60ab68306f9c38e358709494d Mon Sep 17 00:00:00 2001
Brad Bishopbec4ebc2022-08-03 09:55:16 -04002From: Jaxson Han <jaxson.han@arm.com>
3Date: Tue, 25 May 2021 07:25:00 +0100
4Subject: [PATCH] aarch64: Prepare for lower EL booting
5
6Save SPSR_KERNEL into spsr_to_elx during el3_init.
7The jump_kernel will load spsr_to_elx into spsr_el3.
8
9This change will make it easier to control whether drop to lower EL
10before jumping to the kernel.
11
12Upstream-Status: Pending
13Signed-off-by: Jaxson Han <jaxson.han@arm.com>
14Reviewed-by: Andre Przywara <andre.przywara@arm.com>
15---
16 arch/aarch64/boot.S | 15 +++++++++++++--
17 1 file changed, 13 insertions(+), 2 deletions(-)
18
19diff --git a/arch/aarch64/boot.S b/arch/aarch64/boot.S
Andrew Geissler9347dd42023-03-03 12:38:41 -060020index 5105b41..243198d 100644
Brad Bishopbec4ebc2022-08-03 09:55:16 -040021--- a/arch/aarch64/boot.S
22+++ b/arch/aarch64/boot.S
Andrew Geissler9347dd42023-03-03 12:38:41 -060023@@ -151,7 +151,16 @@ el3_init:
24 mov x0, #ZCR_EL3_LEN_MAX // SVE: Enable full vector len
Brad Bishopbec4ebc2022-08-03 09:55:16 -040025 msr ZCR_EL3, x0 // for EL2.
26
27-1:
28+ /*
29+ * Save SPSR_KERNEL into spsr_to_elx.
30+ * The jump_kernel will load spsr_to_elx into spsr_el3
31+ */
32+1: mov w0, #SPSR_KERNEL
33+ ldr x1, =spsr_to_elx
34+ str w0, [x1]
35+ b el_max_init
36+
37+el_max_init:
38 ldr x0, =COUNTER_FREQ
39 msr cntfrq_el0, x0
40
Andrew Geissler9347dd42023-03-03 12:38:41 -060041@@ -199,7 +208,7 @@ ASM_FUNC(jump_kernel)
Brad Bishopbec4ebc2022-08-03 09:55:16 -040042 b.eq 1f
43 br x19 // Keep current EL
44
45-1: mov x4, #SPSR_KERNEL
46+1: ldr w4, spsr_to_elx
47
48 /*
49 * If bit 0 of the kernel address is set, we're entering in AArch32
Andrew Geissler9347dd42023-03-03 12:38:41 -060050@@ -217,3 +226,5 @@ ASM_FUNC(jump_kernel)
Brad Bishopbec4ebc2022-08-03 09:55:16 -040051 .align 3
52 flag_keep_el:
53 .long 0
54+spsr_to_elx:
55+ .long 0