arm64: entry: template the entry asm functions
authorMark Rutland <mark.rutland@arm.com>
Mon, 7 Jun 2021 09:46:17 +0000 (10:46 +0100)
committerWill Deacon <will@kernel.org>
Mon, 7 Jun 2021 10:35:55 +0000 (11:35 +0100)
Now that the majority of the exception triage logic has been converted
to C, the entry assembly functions all have a uniform structure.

Let's generate them all with an assembly macro to reduce the amount of
code and to ensure they all remain in sync if we make changes in future.

There should be no functional change as a result of this patch.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Joey Gouly <joey.gouly@arm.com>
Cc: James Morse <james.morse@arm.com>
Cc: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20210607094624.34689-14-mark.rutland@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/kernel/entry.S

index 54986d488983bacd5a32c36fda2f87bb69ed6370..b719ac26f7d13b4db57a8536f438074e8bd2ee25 100644 (file)
@@ -604,102 +604,43 @@ SYM_CODE_START_LOCAL(el1_error_invalid)
        inv_entry 1, BAD_ERROR
 SYM_CODE_END(el1_error_invalid)
 
-/*
- * EL1 mode handlers.
- */
-SYM_CODE_START_LOCAL(el1_sync)
-       kernel_entry 1
-       mov     x0, sp
-       bl      el1_sync_handler
-       b       ret_to_kernel
-SYM_CODE_END(el1_sync)
-
-SYM_CODE_START_LOCAL(el1_irq)
-       kernel_entry 1
-       mov     x0, sp
-       bl      el1_irq_handler
-       b       ret_to_kernel
-SYM_CODE_END(el1_irq)
-
-SYM_CODE_START_LOCAL(el1_fiq)
-       kernel_entry 1
-       mov     x0, sp
-       bl      el1_fiq_handler
-       b       ret_to_kernel
-SYM_CODE_END(el1_fiq)
-
-SYM_CODE_START_LOCAL(el1_error)
-       kernel_entry 1
+       .macro entry_handler el:req, regsize:req, label:req
+SYM_CODE_START_LOCAL(el\el\()_\label)
+       kernel_entry \el, \regsize
        mov     x0, sp
-       bl      el1_error_handler
+       bl      el\el\()_\label\()_handler
+       .if \el == 0
+       b       ret_to_user
+       .else
        b       ret_to_kernel
-SYM_CODE_END(el1_error)
-
-SYM_CODE_START_LOCAL(ret_to_kernel)
-       kernel_exit 1
-SYM_CODE_END(ret_to_kernel)
+       .endif
+SYM_CODE_END(el\el\()_\label)
+       .endm
 
 /*
- * EL0 mode handlers.
+ * Early exception handlers
  */
-SYM_CODE_START_LOCAL(el0_sync)
-       kernel_entry 0
-       mov     x0, sp
-       bl      el0_sync_handler
-       b       ret_to_user
-SYM_CODE_END(el0_sync)
+       entry_handler   1, 64, sync
+       entry_handler   1, 64, irq
+       entry_handler   1, 64, fiq
+       entry_handler   1, 64, error
 
-SYM_CODE_START_LOCAL(el0_irq)
-       kernel_entry 0
-       mov     x0, sp
-       bl      el0_irq_handler
-       b       ret_to_user
-SYM_CODE_END(el0_irq)
-
-SYM_CODE_START_LOCAL(el0_fiq)
-       kernel_entry 0
-       mov     x0, sp
-       bl      el0_fiq_handler
-       b       ret_to_user
-SYM_CODE_END(el0_fiq)
-
-SYM_CODE_START_LOCAL(el0_error)
-       kernel_entry 0
-       mov     x0, sp
-       bl      el0_error_handler
-       b       ret_to_user
-SYM_CODE_END(el0_error)
+       entry_handler   0, 64, sync
+       entry_handler   0, 64, irq
+       entry_handler   0, 64, fiq
+       entry_handler   0, 64, error
 
 #ifdef CONFIG_COMPAT
-SYM_CODE_START_LOCAL(el0_sync_compat)
-       kernel_entry 0, 32
-       mov     x0, sp
-       bl      el0_sync_compat_handler
-       b       ret_to_user
-SYM_CODE_END(el0_sync_compat)
-
-SYM_CODE_START_LOCAL(el0_irq_compat)
-       kernel_entry 0, 32
-       mov     x0, sp
-       bl      el0_irq_compat_handler
-       b       ret_to_user
-SYM_CODE_END(el0_irq_compat)
-
-SYM_CODE_START_LOCAL(el0_fiq_compat)
-       kernel_entry 0, 32
-       mov     x0, sp
-       bl      el0_fiq_compat_handler
-       b       ret_to_user
-SYM_CODE_END(el0_fiq_compat)
-
-SYM_CODE_START_LOCAL(el0_error_compat)
-       kernel_entry 0, 32
-       mov     x0, sp
-       bl      el0_error_compat_handler
-       b       ret_to_user
-SYM_CODE_END(el0_error_compat)
+       entry_handler   0, 32, sync_compat
+       entry_handler   0, 32, irq_compat
+       entry_handler   0, 32, fiq_compat
+       entry_handler   0, 32, error_compat
 #endif
 
+SYM_CODE_START_LOCAL(ret_to_kernel)
+       kernel_exit 1
+SYM_CODE_END(ret_to_kernel)
+
 /*
  * "slow" syscall return path.
  */