Commit a5b43a87 authored by Mark Rutland's avatar Mark Rutland Committed by Will Deacon

arm64: entry: template the entry asm functions

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: default avatarMark Rutland <mark.rutland@arm.com>
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Acked-by: default avatarMarc Zyngier <maz@kernel.org>
Reviewed-by: default avatarJoey 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.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
parent ca0c2647
...@@ -604,102 +604,43 @@ SYM_CODE_START_LOCAL(el1_error_invalid) ...@@ -604,102 +604,43 @@ SYM_CODE_START_LOCAL(el1_error_invalid)
inv_entry 1, BAD_ERROR inv_entry 1, BAD_ERROR
SYM_CODE_END(el1_error_invalid) SYM_CODE_END(el1_error_invalid)
/* .macro entry_handler el:req, regsize:req, label:req
* EL1 mode handlers. SYM_CODE_START_LOCAL(el\el\()_\label)
*/ kernel_entry \el, \regsize
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
mov x0, sp mov x0, sp
bl el1_error_handler bl el\el\()_\label\()_handler
.if \el == 0
b ret_to_user
.else
b ret_to_kernel b ret_to_kernel
SYM_CODE_END(el1_error) .endif
SYM_CODE_END(el\el\()_\label)
SYM_CODE_START_LOCAL(ret_to_kernel) .endm
kernel_exit 1
SYM_CODE_END(ret_to_kernel)
/* /*
* EL0 mode handlers. * Early exception handlers
*/ */
SYM_CODE_START_LOCAL(el0_sync) entry_handler 1, 64, sync
kernel_entry 0 entry_handler 1, 64, irq
mov x0, sp entry_handler 1, 64, fiq
bl el0_sync_handler entry_handler 1, 64, error
b ret_to_user
SYM_CODE_END(el0_sync)
SYM_CODE_START_LOCAL(el0_irq) entry_handler 0, 64, sync
kernel_entry 0 entry_handler 0, 64, irq
mov x0, sp entry_handler 0, 64, fiq
bl el0_irq_handler entry_handler 0, 64, error
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)
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
SYM_CODE_START_LOCAL(el0_sync_compat) entry_handler 0, 32, sync_compat
kernel_entry 0, 32 entry_handler 0, 32, irq_compat
mov x0, sp entry_handler 0, 32, fiq_compat
bl el0_sync_compat_handler entry_handler 0, 32, error_compat
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)
#endif #endif
SYM_CODE_START_LOCAL(ret_to_kernel)
kernel_exit 1
SYM_CODE_END(ret_to_kernel)
/* /*
* "slow" syscall return path. * "slow" syscall return path.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment