diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2019-11-29 12:25:20 +0300 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gmail.com> | 2019-11-30 06:37:12 +0300 |
commit | 9d9043f6a81713248d82d88983c06b1eaedda287 (patch) | |
tree | 07e43db996f00f85a7ef86fcc2858c4e71895349 /arch/xtensa | |
parent | 02ce94c229251555ac726ecfebe3458ef5905fa9 (diff) | |
download | linux-9d9043f6a81713248d82d88983c06b1eaedda287.tar.xz |
xtensa: clean up system_call/xtensa_rt_sigreturn interaction
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>
Diffstat (limited to 'arch/xtensa')
-rw-r--r-- | arch/xtensa/include/asm/syscall.h | 2 | ||||
-rw-r--r-- | arch/xtensa/kernel/entry.S | 10 | ||||
-rw-r--r-- | arch/xtensa/kernel/signal.c | 4 |
3 files changed, 6 insertions, 10 deletions
diff --git a/arch/xtensa/include/asm/syscall.h b/arch/xtensa/include/asm/syscall.h index c90fb944f9d8..f9a671cbf933 100644 --- a/arch/xtensa/include/asm/syscall.h +++ b/arch/xtensa/include/asm/syscall.h @@ -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); diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S index 138469e26560..be897803834a 100644 --- a/arch/xtensa/kernel/entry.S +++ b/arch/xtensa/kernel/entry.S @@ -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) diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c index dae83cddd6ca..76cee341507b 100644 --- a/arch/xtensa/kernel/signal.c +++ b/arch/xtensa/kernel/signal.c @@ -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; |