Excerpts from Christophe Leroy's message of February 9, 2021 1:10 am: > Only PPC64 has scv. No need to check the 0x7ff0 trap on PPC32. > For that, add a helper trap_is_unsupported_scv() similar to > trap_is_scv(). > > And ignore the scv parameter in syscall_exit_prepare (Save 14 cycles > 346 => 332 cycles) > > Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu> > --- > v5: Added a helper trap_is_unsupported_scv() > --- > arch/powerpc/include/asm/ptrace.h | 5 +++++ > arch/powerpc/kernel/entry_32.S | 1 - > arch/powerpc/kernel/interrupt.c | 7 +++++-- > 3 files changed, 10 insertions(+), 3 deletions(-) > > diff --git a/arch/powerpc/include/asm/ptrace.h > b/arch/powerpc/include/asm/ptrace.h > index 58f9dc060a7b..2c842b11a924 100644 > --- a/arch/powerpc/include/asm/ptrace.h > +++ b/arch/powerpc/include/asm/ptrace.h > @@ -229,6 +229,11 @@ static inline bool trap_is_scv(struct pt_regs *regs) > return (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && TRAP(regs) == 0x3000); > } > > +static inline bool trap_is_unsupported_scv(struct pt_regs *regs) > +{ > + return (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && TRAP(regs) == 0x7ff0); > +}
This change is good. > + > static inline bool trap_is_syscall(struct pt_regs *regs) > { > return (trap_is_scv(regs) || TRAP(regs) == 0xc00); > diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S > index cffe58e63356..7c824e8928d0 100644 > --- a/arch/powerpc/kernel/entry_32.S > +++ b/arch/powerpc/kernel/entry_32.S > @@ -344,7 +344,6 @@ transfer_to_syscall: > > ret_from_syscall: > addi r4,r1,STACK_FRAME_OVERHEAD > - li r5,0 > bl syscall_exit_prepare For this one, I think it would be nice to do the "right" thing and make the function prototypes different on !64S. They could then declare a local const bool scv = 0. We could have syscall_exit_prepare and syscall_exit_prepare_maybe_scv or something like that, 64s can use the latter one and the former can be a wrapper that passes constant 0 for scv. Then we don't have different prototypes for the same function, but you just have to make the 32-bit version static inline and the 64-bit version exported to asm. Thanks, Nick > #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) > /* If the process has its own DBCR0 value, load it up. The internal > diff --git a/arch/powerpc/kernel/interrupt.c b/arch/powerpc/kernel/interrupt.c > index 205902052112..8fafca727b8b 100644 > --- a/arch/powerpc/kernel/interrupt.c > +++ b/arch/powerpc/kernel/interrupt.c > @@ -88,7 +88,7 @@ notrace long system_call_exception(long r3, long r4, long > r5, > local_irq_enable(); > > if (unlikely(current_thread_info()->flags & _TIF_SYSCALL_DOTRACE)) { > - if (unlikely(regs->trap == 0x7ff0)) { > + if (unlikely(trap_is_unsupported_scv(regs))) { > /* Unsupported scv vector */ > _exception(SIGILL, regs, ILL_ILLOPC, regs->nip); > return regs->gpr[3]; > @@ -111,7 +111,7 @@ notrace long system_call_exception(long r3, long r4, long > r5, > r8 = regs->gpr[8]; > > } else if (unlikely(r0 >= NR_syscalls)) { > - if (unlikely(regs->trap == 0x7ff0)) { > + if (unlikely(trap_is_unsupported_scv(regs))) { > /* Unsupported scv vector */ > _exception(SIGILL, regs, ILL_ILLOPC, regs->nip); > return regs->gpr[3]; > @@ -224,6 +224,9 @@ notrace unsigned long syscall_exit_prepare(unsigned long > r3, > unsigned long ti_flags; > unsigned long ret = 0; > > + if (IS_ENABLED(CONFIG_PPC32)) > + scv = 0; > + > CT_WARN_ON(ct_state() == CONTEXT_USER); > > #ifdef CONFIG_PPC64 > -- > 2.25.0 > >