xtensa: clean up system_call/xtensa_rt_sigreturn interaction
authorMax Filippov <jcmvbkbc@gmail.com>
Fri, 29 Nov 2019 09:25:20 +0000 (01:25 -0800)
committerMax Filippov <jcmvbkbc@gmail.com>
Sat, 30 Nov 2019 03:37:12 +0000 (19:37 -0800)
system_call assembly code always pushes pointer to struct pt_regs as the
last additional parameter for all system calls. The only user of this
feature is xtensa_rt_sigreturn.
Avoid this special case. Define xtensa_rt_sigreturn as accepting no
argiments. Use current_pt_regs to get pointer to struct pt_regs in
xtensa_rt_sigreturn. Don't pass additional parameter from system_call
code.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
arch/xtensa/include/asm/syscall.h
arch/xtensa/kernel/entry.S
arch/xtensa/kernel/signal.c

index c90fb944f9d8b61eeb4f6a4a1bd5d34bf13e798a..f9a671cbf9338003704de9c2daf006219b1b8eb9 100644 (file)
@@ -79,7 +79,7 @@ static inline void syscall_set_arguments(struct task_struct *task,
                regs->areg[reg[i]] = args[i];
 }
 
-asmlinkage long xtensa_rt_sigreturn(struct pt_regs*);
+asmlinkage long xtensa_rt_sigreturn(void);
 asmlinkage long xtensa_shmat(int, char __user *, int);
 asmlinkage long xtensa_fadvise64_64(int, int,
                                    unsigned long long, unsigned long long);
index 138469e265609cb7a17a7145679c74a2742338d5..be897803834a48a3734ccd021780ba82b992a932 100644 (file)
@@ -1876,8 +1876,7 @@ ENDPROC(fast_store_prohibited)
 
 ENTRY(system_call)
 
-       /* reserve 4 bytes on stack for function parameter */
-       abi_entry(4)
+       abi_entry_default
 
        /* regs->syscall = regs->areg[2] */
 
@@ -1915,9 +1914,6 @@ ENTRY(system_call)
        l32i    a10, a2, PT_AREG8
        l32i    a11, a2, PT_AREG9
 
-       /* Pass one additional argument to the syscall: pt_regs (on stack) */
-       s32i    a2, a1, 0
-
        callx4  a4
 
 1:     /* regs->areg[2] = return_value */
@@ -1925,12 +1921,12 @@ ENTRY(system_call)
        s32i    a6, a2, PT_AREG2
        bnez    a3, 1f
 .Lsyscall_exit:
-       abi_ret(4)
+       abi_ret_default
 
 1:
        mov     a6, a2
        call4   do_syscall_trace_leave
-       abi_ret(4)
+       abi_ret_default
 
 ENDPROC(system_call)
 
index dae83cddd6ca2d09b16d77656da1a0adf87c4556..76cee341507b7330b3955bf71a2aa4be887d351b 100644 (file)
@@ -236,9 +236,9 @@ restore_sigcontext(struct pt_regs *regs, struct rt_sigframe __user *frame)
  * Do a signal return; undo the signal stack.
  */
 
-asmlinkage long xtensa_rt_sigreturn(long a0, long a1, long a2, long a3,
-                                   long a4, long a5, struct pt_regs *regs)
+asmlinkage long xtensa_rt_sigreturn(void)
 {
+       struct pt_regs *regs = current_pt_regs();
        struct rt_sigframe __user *frame;
        sigset_t set;
        int ret;