On Thu, Nov 30, 2017 at 04:39:40PM +0000, Will Deacon wrote:
> We will need to treat exceptions from EL0 differently in kernel_ventry,
> so rework the macro to take the exception level as an argument and
> construct the branch target using that.
> 
> Signed-off-by: Will Deacon <will.dea...@arm.com>
> ---
>  arch/arm64/kernel/entry.S | 46 +++++++++++++++++++++++-----------------------
>  1 file changed, 23 insertions(+), 23 deletions(-)
> 
> diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
> index dea196f287a0..688e52f65a8d 100644
> --- a/arch/arm64/kernel/entry.S
> +++ b/arch/arm64/kernel/entry.S
> @@ -71,7 +71,7 @@
>  #define BAD_FIQ              2
>  #define BAD_ERROR    3
>  
> -     .macro kernel_ventry    label
> +     .macro kernel_ventry, el, label, regsize = 64
>       .align 7
>       sub     sp, sp, #S_FRAME_SIZE
>  #ifdef CONFIG_VMAP_STACK
> @@ -84,7 +84,7 @@
>       tbnz    x0, #THREAD_SHIFT, 0f
>       sub     x0, sp, x0                      // x0'' = sp' - x0' = (sp + x0) 
> - sp = x0
>       sub     sp, sp, x0                      // sp'' = sp' - x0 = (sp + x0) 
> - x0 = sp
> -     b       \label
> +     b       el\()\el\()_\label
>  
>  0:
>       /*
> @@ -116,7 +116,7 @@
>       sub     sp, sp, x0
>       mrs     x0, tpidrro_el0
>  #endif
> -     b       \label
> +     b       el\()\el\()_\label
>       .endm
>  
>       .macro  kernel_entry, el, regsize = 64
> @@ -369,31 +369,31 @@ tsk     .req    x28             // current thread_info
>  
>       .align  11
>  ENTRY(vectors)
> -     kernel_ventry   el1_sync_invalid                // Synchronous EL1t
> -     kernel_ventry   el1_irq_invalid                 // IRQ EL1t
> -     kernel_ventry   el1_fiq_invalid                 // FIQ EL1t
> -     kernel_ventry   el1_error_invalid               // Error EL1t
> +     kernel_ventry   1, sync_invalid                 // Synchronous EL1t
> +     kernel_ventry   1, irq_invalid                  // IRQ EL1t
> +     kernel_ventry   1, fiq_invalid                  // FIQ EL1t
> +     kernel_ventry   1, error_invalid                // Error EL1t

Using the el paramter to build the branch name has the unfortunate
property of obscuring the branch name. For example, that makes it
difficult to jump around the entry asm with ctags, which is somewhat
painful.

Could we leave the full branch name in place, e.g.

        kernel_ventry   1, el1_sync_invalid             // Synchronous EL1t
        kernel_ventry   1, el1_irq_invalid              // IRQ EL1t
        kernel_ventry   1, el1_fiq_invalid              // FIQ EL1t
        kernel_ventry   1, el1_error_invalid            // Error EL1t

... or have separate kernel_ventry and user_ventry macros that
implicitly encoded the source EL, also leaving the label name as-is.

Otherwise, this looks fine to me.

Thanks,
Mark.

Reply via email to