aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/syscall.c
diff options
context:
space:
mode:
authorRohan McLure <rmclure@linux.ibm.com>2022-09-21 16:56:00 +1000
committerMichael Ellerman <mpe@ellerman.id.au>2022-09-28 19:22:09 +1000
commitf8971c627b14040e533768985a99f4fd6ffa420f (patch)
treeb13a12041449c8ac129cc0479be77ded55e82f9e /arch/powerpc/kernel/syscall.c
parentpowerpc: Use common syscall handler type (diff)
downloadlinux-dev-f8971c627b14040e533768985a99f4fd6ffa420f.tar.xz
linux-dev-f8971c627b14040e533768985a99f4fd6ffa420f.zip
powerpc: Change system_call_exception calling convention
Change system_call_exception arguments to pass a pointer to a stack frame container caller state, as well as the original r0, which determines the number of the syscall. This has been observed to yield improved performance to passing them by registers, circumventing the need to allocate a stack frame. Signed-off-by: Rohan McLure <rmclure@linux.ibm.com> Reviewed-by: Nicholas Piggin <npiggin@gmail.com> [mpe: Retain clearing of high bits of args for compat tasks] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20220921065605.1051927-21-rmclure@linux.ibm.com
Diffstat (limited to 'arch/powerpc/kernel/syscall.c')
-rw-r--r--arch/powerpc/kernel/syscall.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/arch/powerpc/kernel/syscall.c b/arch/powerpc/kernel/syscall.c
index 9875486f6168..2c002cbbc676 100644
--- a/arch/powerpc/kernel/syscall.c
+++ b/arch/powerpc/kernel/syscall.c
@@ -13,10 +13,9 @@
/* Has to run notrace because it is entered not completely "reconciled" */
-notrace long system_call_exception(long r3, long r4, long r5,
- long r6, long r7, long r8,
- unsigned long r0, struct pt_regs *regs)
+notrace long system_call_exception(struct pt_regs *regs, unsigned long r0)
{
+ unsigned long r3, r4, r5, r6, r7, r8;
long ret;
syscall_fn f;
@@ -136,12 +135,6 @@ notrace long system_call_exception(long r3, long r4, long r5,
r0 = do_syscall_trace_enter(regs);
if (unlikely(r0 >= NR_syscalls))
return regs->gpr[3];
- r3 = regs->gpr[3];
- r4 = regs->gpr[4];
- r5 = regs->gpr[5];
- r6 = regs->gpr[6];
- r7 = regs->gpr[7];
- r8 = regs->gpr[8];
} else if (unlikely(r0 >= NR_syscalls)) {
if (unlikely(trap_is_unsupported_scv(regs))) {
@@ -152,6 +145,13 @@ notrace long system_call_exception(long r3, long r4, long r5,
return -ENOSYS;
}
+ r3 = regs->gpr[3];
+ r4 = regs->gpr[4];
+ r5 = regs->gpr[5];
+ r6 = regs->gpr[6];
+ r7 = regs->gpr[7];
+ r8 = regs->gpr[8];
+
/* May be faster to do array_index_nospec? */
barrier_nospec();