Before : 347 cycles on null_syscall
After  : 327 cycles on null_syscall

Signed-off-by: Christophe Leroy <christophe.le...@c-s.fr>
---
 arch/powerpc/kernel/entry_32.S | 15 +++++++++++++++
 arch/powerpc/kernel/head_32.h  |  3 +--
 arch/powerpc/kernel/syscall.c  |  2 +-
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index 103f5158bc44..b5113593e57f 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -315,13 +315,28 @@ stack_ovf:
        RFI
 #endif
 
+save_nvgprs:
+       lwz     r11, _TRAP(r1)
+       andi.   r12, r11, 1
+       rlwinm  r11, r11, 0, ~1
+       beqlr
+       SAVE_NVGPRS(r1)
+       stw     r11, _TRAP(r1)
+       blr
+
        .globl  transfer_to_syscall
 transfer_to_syscall:
+       lwz     r10, TI_FLAGS(r2)
        mr      r9, r0
+       andi.   r10, r10, _TIF_SYSCALL_DOTRACE
        addi    r10, r1, STACK_FRAME_OVERHEAD
+       bnel-   save_nvgprs
        bl      system_call_exception
 ret_from_syscall:
+       lwz     r9, TI_FLAGS(r2)
        addi    r4, r1, STACK_FRAME_OVERHEAD
+       andi.   r0, r9, _TIF_SYSCALL_DOTRACE | _TIF_SINGLESTEP | 
_TIF_USER_WORK_MASK
+       bnel-   save_nvgprs
        bl      syscall_exit_prepare
        lwz     r2, _CCR(r1)
        lwz     r4, _NIP(r1)
diff --git a/arch/powerpc/kernel/head_32.h b/arch/powerpc/kernel/head_32.h
index c301d666a3e5..1cc9a67cb42c 100644
--- a/arch/powerpc/kernel/head_32.h
+++ b/arch/powerpc/kernel/head_32.h
@@ -174,13 +174,12 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
        stw     r2,GPR2(r11)
        addi    r10,r10,STACK_FRAME_REGS_MARKER@l
        stw     r9,_MSR(r11)
-       li      r2, \trapno
+       li      r2, \trapno + 1
        stw     r10,8(r11)
        stw     r2,_TRAP(r11)
        SAVE_GPR(0, r11)
        SAVE_4GPRS(3, r11)
        SAVE_2GPRS(7, r11)
-       SAVE_NVGPRS(r11)
        addi    r11,r1,STACK_FRAME_OVERHEAD
        addi    r2,r12,-THREAD
        stw     r11,PT_REGS(r12)
diff --git a/arch/powerpc/kernel/syscall.c b/arch/powerpc/kernel/syscall.c
index 630c423e089a..34fd66fd11a2 100644
--- a/arch/powerpc/kernel/syscall.c
+++ b/arch/powerpc/kernel/syscall.c
@@ -39,7 +39,7 @@ notrace long system_call_exception(long r3, long r4, long r5,
        if (!IS_ENABLED(CONFIG_PPC_BOOK3E))
                BUG_ON(!(regs->msr & MSR_RI));
        BUG_ON(IS_ENABLED(CONFIG_PPC64) && !(regs->msr & MSR_PR));
-       BUG_ON(!FULL_REGS(regs));
+       BUG_ON(IS_ENABLED(CONFIG_PPC64) && !FULL_REGS(regs));
 #ifdef CONFIG_PPC64
        BUG_ON(regs->softe != IRQS_ENABLED);
 #endif
-- 
2.25.0

Reply via email to