Andrew Geissler | 9347dd4 | 2023-03-03 12:38:41 -0600 | [diff] [blame^] | 1 | From 252cbd36e51414b60ab68306f9c38e358709494d Mon Sep 17 00:00:00 2001 |
Brad Bishop | bec4ebc | 2022-08-03 09:55:16 -0400 | [diff] [blame] | 2 | From: Jaxson Han <jaxson.han@arm.com> |
| 3 | Date: Tue, 25 May 2021 07:25:00 +0100 |
| 4 | Subject: [PATCH] aarch64: Prepare for lower EL booting |
| 5 | |
| 6 | Save SPSR_KERNEL into spsr_to_elx during el3_init. |
| 7 | The jump_kernel will load spsr_to_elx into spsr_el3. |
| 8 | |
| 9 | This change will make it easier to control whether drop to lower EL |
| 10 | before jumping to the kernel. |
| 11 | |
| 12 | Upstream-Status: Pending |
| 13 | Signed-off-by: Jaxson Han <jaxson.han@arm.com> |
| 14 | Reviewed-by: Andre Przywara <andre.przywara@arm.com> |
| 15 | --- |
| 16 | arch/aarch64/boot.S | 15 +++++++++++++-- |
| 17 | 1 file changed, 13 insertions(+), 2 deletions(-) |
| 18 | |
| 19 | diff --git a/arch/aarch64/boot.S b/arch/aarch64/boot.S |
Andrew Geissler | 9347dd4 | 2023-03-03 12:38:41 -0600 | [diff] [blame^] | 20 | index 5105b41..243198d 100644 |
Brad Bishop | bec4ebc | 2022-08-03 09:55:16 -0400 | [diff] [blame] | 21 | --- a/arch/aarch64/boot.S |
| 22 | +++ b/arch/aarch64/boot.S |
Andrew Geissler | 9347dd4 | 2023-03-03 12:38:41 -0600 | [diff] [blame^] | 23 | @@ -151,7 +151,16 @@ el3_init: |
| 24 | mov x0, #ZCR_EL3_LEN_MAX // SVE: Enable full vector len |
Brad Bishop | bec4ebc | 2022-08-03 09:55:16 -0400 | [diff] [blame] | 25 | 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 Geissler | 9347dd4 | 2023-03-03 12:38:41 -0600 | [diff] [blame^] | 41 | @@ -199,7 +208,7 @@ ASM_FUNC(jump_kernel) |
Brad Bishop | bec4ebc | 2022-08-03 09:55:16 -0400 | [diff] [blame] | 42 | 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 Geissler | 9347dd4 | 2023-03-03 12:38:41 -0600 | [diff] [blame^] | 50 | @@ -217,3 +226,5 @@ ASM_FUNC(jump_kernel) |
Brad Bishop | bec4ebc | 2022-08-03 09:55:16 -0400 | [diff] [blame] | 51 | .align 3 |
| 52 | flag_keep_el: |
| 53 | .long 0 |
| 54 | +spsr_to_elx: |
| 55 | + .long 0 |