[BOOT-WRAPPER v2 03/10] aarch64: Always enter kernel via exception return

Andre Przywara andre.przywara at arm.com
Tue Aug 13 10:14:08 PDT 2024


On Mon, 12 Aug 2024 11:15:48 +0100
Mark Rutland <mark.rutland at arm.com> wrote:

> When the boot-wrapper is entered at EL3 it will enter the kernel via
> ERET, and when entered at EL2 it will branch to the kernel directly.
> This is an artifact of the way the boot-wrapper was originally written
> in assembly, and it would be preferable to always enter the kernel via
> ERET so that PSTATE is always initialized to a known-good value.
> 
> Rework jump_kernel() to always enter the kernel via ERET.

That looks fine and still boots when entered in EL2 or EL3. Just one nit
below, with that:

Reviewed-by: Andre Przywara <andre.przywara at arm.com>

> 
> Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> Acked-by: Marc Zyngier <maz at kernel.org>
> Cc: Akos Denke <akos.denke at arm.com>
> Cc: Andre Przywara <andre.przywara at arm.com>
> Cc: Luca Fancellu <luca.fancellu at arm.com>
> ---
>  arch/aarch64/boot.S | 30 +++++++++++++-----------------
>  1 file changed, 13 insertions(+), 17 deletions(-)
> 
> diff --git a/arch/aarch64/boot.S b/arch/aarch64/boot.S
> index 52c617d..0ac0c98 100644
> --- a/arch/aarch64/boot.S
> +++ b/arch/aarch64/boot.S
> @@ -76,10 +76,6 @@ reset_at_el2:
>  	b.eq	err_invalid_id
>  	bl	setup_stack
>  
> -	mov	w0, #1
> -	ldr	x1, =flag_no_el3
> -	str	w0, [x1]
> -
>  	bl	cpu_init_bootwrapper
>  
>  	bl	cpu_init_arch
> @@ -111,18 +107,11 @@ ASM_FUNC(jump_kernel)
>  	bl	find_logical_id
>  	bl	setup_stack		// Reset stack pointer
>  
> -	ldr	w0, flag_no_el3
> -	cmp	w0, #0			// Prepare Z flag
> -
>  	mov	x0, x20
>  	mov	x1, x21
>  	mov	x2, x22
>  	mov	x3, x23
> -
> -	b.eq	1f
> -	br	x19			// No EL3
> -
> -1:	mov	x4, #SPSR_KERNEL
> +	mov	x4, #SPSR_KERNEL
>  
>  	/*
>  	 * If bit 0 of the kernel address is set, we're entering in AArch32
> @@ -130,13 +119,20 @@ ASM_FUNC(jump_kernel)
>  	 */
>  	bfi	x4, x19, #5, #1
>  
> +	mrs	x5, CurrentEL
> +	cmp	x5, #CURRENTEL_EL3
> +	b.eq	eret_at_el3
> +	cmp	x5, #CURRENTEL_EL2
> +	b.eq	eret_at_el2
> +	b	.			// Not possible
> +
> +eret_at_el3:
>  	msr	elr_el3, x19
>  	msr	spsr_el3, x4
>  	eret
> +eret_at_el2:
> +	msr	elr_el2, x19
> +	msr	spsr_el2, x4
> +	eret
>  
>  	.ltorg

Looks like we don't need this directive anymore.

Cheers,
Andre

> -
> -	.data
> -	.align 3
> -flag_no_el3:
> -	.long 0




More information about the linux-arm-kernel mailing list