diff mbox

[2/8] powerpc/pseries: syscall remove trampoline

Message ID 20160913030846.29790-3-npiggin@gmail.com (mailing list archive)
State Accepted
Headers show

Commit Message

Nicholas Piggin Sept. 13, 2016, 3:08 a.m. UTC
The syscall trampoline is not required, remove it.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 arch/powerpc/kernel/exceptions-64s.S | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

Comments

Michael Ellerman Sept. 25, 2016, 3 a.m. UTC | #1
On Tue, 2016-13-09 at 03:08:40 UTC, Nicholas Piggin wrote:
> The syscall trampoline is not required, remove it.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/a24553dd02dc6c7d2912af0b4b

I rewrote the change log to be:

    powerpc/pseries: Remove unnecessary syscall trampoline

    When we originally added the ability to split the exception vectors from
    the kernel (commit 1f6a93e4c35e ("powerpc: Make it possible to move the
    interrupt handlers away from the kernel" 2008-09-15)), the LOAD_HANDLER() macro
    used an addi instruction to compute the offset of the common handler
    from the kernel base address.

    Using addi meant the handler had to be within 32K of the kernel base
    address, due to the addi instruction taking a signed immediate value.
    That necessitated creating a trampoline for the system call handler,
    because system_call_common (in entry64.S) is not linked within 32K of
    the kernel base address.

    Later in commit 61e2390ede3c ("powerpc: Make load_hander handle upto 64k
    offset" 2012-11-15) we changed LOAD_HANDLER to take a 64K offset, by
    changing it to use ori.

    Although system_call_common is not in head_64.S or exceptions-64s.S, it
    is included in head-y, which causes it to be linked early in the kernel
    text, so in practice it ends up below 64K. Additionally if it can't be
    placed below 64K the linker will fail to build with a "relocation
    truncated to fit" error.

    So remove the trampoline.

    Newer toolchains are able to work out that the ori in LOAD_HANDLER only
    takes a 16 bit offset, and so they generate a 16 bit relocation. Older
    toolchains (binutils 2.22 at least) are not so smart, so we have to add
    the @l annotation to tell the assembler to generate a 16 bit relocation.

cheers
diff mbox

Patch

diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 4015f71..ea57a2c 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -42,7 +42,7 @@  END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE)				\
 #define SYSCALL_PSERIES_2_RFID 					\
 	mfspr	r12,SPRN_SRR1 ;					\
 	ld	r10,PACAKBASE(r13) ; 				\
-	LOAD_HANDLER(r10, system_call_entry) ; 			\
+	LOAD_HANDLER(r10, system_call_common) ; 		\
 	mtspr	SPRN_SRR0,r10 ; 				\
 	ld	r10,PACAKMSR(r13) ;				\
 	mtspr	SPRN_SRR1,r10 ; 				\
@@ -65,7 +65,7 @@  END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE)				\
 #define SYSCALL_PSERIES_2_DIRECT				\
 	mflr	r10 ;						\
 	ld	r12,PACAKBASE(r13) ; 				\
-	LOAD_HANDLER(r12, system_call_entry) ;			\
+	LOAD_HANDLER(r12, system_call_common) ;			\
 	mtctr	r12 ;						\
 	mfspr	r12,SPRN_SRR1 ;					\
 	/* Re-use of r13... No spare regs to do this */	\
@@ -910,10 +910,6 @@  hv_facility_unavailable_relon_trampoline:
 #endif
 	STD_RELON_EXCEPTION_PSERIES(0x5700, 0x1700, altivec_assist)
 
-	.align	7
-system_call_entry:
-	b	system_call_common
-
 ppc64_runlatch_on_trampoline:
 	b	__ppc64_runlatch_on