aboutsummaryrefslogtreecommitdiff
path: root/arch/powerpc/kernel/interrupt_64.S
diff options
context:
space:
mode:
authorGravatar Rohan McLure <rmclure@linux.ibm.com> 2022-09-21 16:56:00 +1000
committerGravatar Michael Ellerman <mpe@ellerman.id.au> 2022-09-28 19:22:09 +1000
commitf8971c627b14040e533768985a99f4fd6ffa420f (patch)
treeb13a12041449c8ac129cc0479be77ded55e82f9e /arch/powerpc/kernel/interrupt_64.S
parentpowerpc: Use common syscall handler type (diff)
downloadlinux-f8971c627b14040e533768985a99f4fd6ffa420f.tar.gz
linux-f8971c627b14040e533768985a99f4fd6ffa420f.tar.bz2
linux-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/interrupt_64.S')
-rw-r--r--arch/powerpc/kernel/interrupt_64.S20
1 files changed, 10 insertions, 10 deletions
diff --git a/arch/powerpc/kernel/interrupt_64.S b/arch/powerpc/kernel/interrupt_64.S
index 931f984b02b1..90dbd6a8d4da 100644
--- a/arch/powerpc/kernel/interrupt_64.S
+++ b/arch/powerpc/kernel/interrupt_64.S
@@ -60,7 +60,7 @@ _ASM_NOKPROBE_SYMBOL(system_call_vectored_\name)
ld r2,PACATOC(r13)
mfcr r12
li r11,0
- /* Can we avoid saving r3-r8 in common case? */
+ /* Save syscall parameters in r3-r8 */
SAVE_GPRS(3, 8, r1)
/* Zero r9-r12, this should only be required when restoring all GPRs */
std r11,GPR9(r1)
@@ -77,9 +77,11 @@ _ASM_NOKPROBE_SYMBOL(system_call_vectored_\name)
std r11,_TRAP(r1)
std r12,_CCR(r1)
std r3,ORIG_GPR3(r1)
- addi r10,r1,STACK_FRAME_OVERHEAD
+ /* Calling convention has r3 = regs, r4 = orig r0 */
+ addi r3,r1,STACK_FRAME_OVERHEAD
+ mr r4,r0
ld r11,exception_marker@toc(r2)
- std r11,-16(r10) /* "regshere" marker */
+ std r11,-16(r3) /* "regshere" marker */
BEGIN_FTR_SECTION
HMT_MEDIUM
@@ -94,8 +96,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
* but this is the best we can do.
*/
- /* Calling convention has r9 = orig r0, r10 = regs */
- mr r9,r0
bl system_call_exception
.Lsyscall_vectored_\name\()_exit:
@@ -227,7 +227,7 @@ END_BTB_FLUSH_SECTION
ld r2,PACATOC(r13)
mfcr r12
li r11,0
- /* Can we avoid saving r3-r8 in common case? */
+ /* Save syscall parameters in r3-r8 */
SAVE_GPRS(3, 8, r1)
/* Zero r9-r12, this should only be required when restoring all GPRs */
std r11,GPR9(r1)
@@ -250,9 +250,11 @@ END_BTB_FLUSH_SECTION
std r11,_TRAP(r1)
std r12,_CCR(r1)
std r3,ORIG_GPR3(r1)
- addi r10,r1,STACK_FRAME_OVERHEAD
+ /* Calling convention has r3 = regs, r4 = orig r0 */
+ addi r3,r1,STACK_FRAME_OVERHEAD
+ mr r4,r0
ld r11,exception_marker@toc(r2)
- std r11,-16(r10) /* "regshere" marker */
+ std r11,-16(r3) /* "regshere" marker */
#ifdef CONFIG_PPC_BOOK3S
li r11,1
@@ -273,8 +275,6 @@ END_BTB_FLUSH_SECTION
wrteei 1
#endif
- /* Calling convention has r9 = orig r0, r10 = regs */
- mr r9,r0
bl system_call_exception
.Lsyscall_exit: