[PATCH v2 18/21] arm64: entry: Split up kernel_ventry macro into separate helper macros

Jinjie Ruan ruanjinjie at huawei.com
Thu Oct 8 01:53:36 PDT 2026



在 2026/9/19 0:14, Will Deacon 写道:
> Handling entry from EL0, EL1h and EL1t in the 'kernel_ventry' assembly
> macro is getting a bit unwieldy as the control flow becomes increasingly
> dependent on the macro arguments.
> 
> Split 'kernel_ventry' into three leaf helper macros for EL0, EL1h and
> EL1t, which are then dispatched by simple wrappers.
> 
> Signed-off-by: Will Deacon <will at kernel.org>
> ---
>  arch/arm64/kernel/entry.S | 29 +++++++++++++++++++----------
>  1 file changed, 19 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
> index b4df2f23ebe7..38f9327e6a0a 100644
> --- a/arch/arm64/kernel/entry.S
> +++ b/arch/arm64/kernel/entry.S
> @@ -36,10 +36,7 @@
>  	.endr
>  	.endm
>  
> -	.macro kernel_ventry, el:req, ht:req, regsize:req, label:req
> -	.align 7
> -.Lventry_start\@:
> -	.if	\el == 0
> +	.macro kernel_ventry_el0, ht:req, regsize:req, label:req
>  	/*
>  	 * This must be the first instruction of the EL0 vector entries. It is
>  	 * skipped by the trampoline vectors, to trigger the cleanup.
> @@ -52,8 +49,10 @@
>  	.endif
>  .Lskip_tramp_vectors_cleanup\@:
>  	sub	sp, sp, #PT_REGS_SIZE
> -	.else	/* \el == 1 */
> -	.ifc	\ht, h
> +	b	el0\ht\()_\regsize\()_\label
> +	.endm
> +
> +	.macro kernel_ventry_el1h, regsize:req, label:req
>  	sub	sp, sp, #PT_REGS_SIZE
>  
>  	/*
> @@ -66,13 +65,23 @@
>  	tbnz	x0, #THREAD_SHIFT, __bad_stack
>  	sub	x0, sp, x0			// x0'' = sp' - x0' = (sp + x0) - sp = x0
>  	sub	sp, sp, x0			// sp'' = sp' - x0 = (sp + x0) - x0 = sp
> -	.else	/* EL1t */
> +	b	el1h_\regsize\()_\label
> +	.endm
> +
> +	.macro kernel_ventry_el1t, regsize:req, label:req
>  	msr	spsel, #0			// Stay on the overflow stack
>  	sub	sp, sp, #PT_REGS_SIZE
> -	.endif
> -	.endif
> +	b	el1t_\regsize\()_\label
> +	.endm
>  
> -	b	el\el\ht\()_\regsize\()_\label
> +	.macro kernel_ventry, el:req, ht:req, regsize:req, label:req
> +	.align 7
> +.Lventry_start\@:
> +	.if	\el == 0
> +	kernel_ventry_el0	\ht, \regsize, \label
> +	.else
> +	kernel_ventry_el1\ht	\regsize, \label
> +	.endif
>  .org .Lventry_start\@ + 128	// Did we overflow the ventry slot?

Looks much clearer now.

Reviewed-by: Jinjie Ruan <ruanjinjie at huawei.com>

>  	.endm
>  

-- 
Best regards,
Jinjie




More information about the linux-arm-kernel mailing list