Re: [PATCH v2 18/21] arm64: entry: Split up kernel_ventry macro into separate helper macros
From: Jinjie Ruan
Date: Thu Oct 08 2026 - 05:00:31 EST
在 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@xxxxxxxxxx>
> ---
> 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@xxxxxxxxxx>
> .endm
>
--
Best regards,
Jinjie