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

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.com


Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent ca0c2647
Loading
Loading
Loading
Loading
+27 −86
Original line number Diff line number Diff line
@@ -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.
 */