aboutsummaryrefslogtreecommitdiffstats
path: root/arch/xtensa
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-12-23 03:54:43 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2013-02-03 18:16:27 -0500
commit0430f2f2764f9db5ee5200c3d24d1eac8a797e28 (patch)
treedc6add1a6517a1fa50b71d7d142ebc65ddafde38 /arch/xtensa
parent0aa0203fb43f04714004b2c4ad33b858e240555d (diff)
xtensa: switch to generic sigaltstack
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/xtensa')
-rw-r--r--arch/xtensa/Kconfig1
-rw-r--r--arch/xtensa/include/asm/syscall.h1
-rw-r--r--arch/xtensa/include/uapi/asm/unistd.h2
-rw-r--r--arch/xtensa/kernel/signal.c18
4 files changed, 4 insertions, 18 deletions
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index 5aab1acabf1c..23cc6ae35da0 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -16,6 +16,7 @@ config XTENSA
16 select ARCH_WANT_OPTIONAL_GPIOLIB 16 select ARCH_WANT_OPTIONAL_GPIOLIB
17 select CLONE_BACKWARDS 17 select CLONE_BACKWARDS
18 select IRQ_DOMAIN 18 select IRQ_DOMAIN
19 select GENERIC_SIGALTSTACK
19 help 20 help
20 Xtensa processors are 32-bit RISC machines designed by Tensilica 21 Xtensa processors are 32-bit RISC machines designed by Tensilica
21 primarily for embedded systems. These processors are both 22 primarily for embedded systems. These processors are both
diff --git a/arch/xtensa/include/asm/syscall.h b/arch/xtensa/include/asm/syscall.h
index 08a23ddac295..3673ff1f1bc5 100644
--- a/arch/xtensa/include/asm/syscall.h
+++ b/arch/xtensa/include/asm/syscall.h
@@ -12,7 +12,6 @@ struct pt_regs;
12asmlinkage long xtensa_ptrace(long, long, long, long); 12asmlinkage long xtensa_ptrace(long, long, long, long);
13asmlinkage long xtensa_sigreturn(struct pt_regs*); 13asmlinkage long xtensa_sigreturn(struct pt_regs*);
14asmlinkage long xtensa_rt_sigreturn(struct pt_regs*); 14asmlinkage long xtensa_rt_sigreturn(struct pt_regs*);
15asmlinkage long xtensa_sigaltstack(struct pt_regs *regs);
16asmlinkage long xtensa_shmat(int, char __user *, int); 15asmlinkage long xtensa_shmat(int, char __user *, int);
17asmlinkage long xtensa_fadvise64_64(int, int, 16asmlinkage long xtensa_fadvise64_64(int, int,
18 unsigned long long, unsigned long long); 17 unsigned long long, unsigned long long);
diff --git a/arch/xtensa/include/uapi/asm/unistd.h b/arch/xtensa/include/uapi/asm/unistd.h
index 5162418c5d90..19fac3f543a2 100644
--- a/arch/xtensa/include/uapi/asm/unistd.h
+++ b/arch/xtensa/include/uapi/asm/unistd.h
@@ -483,7 +483,7 @@ __SYSCALL(222, sys_ni_syscall, 0)
483#define __NR_restart_syscall 223 483#define __NR_restart_syscall 223
484__SYSCALL(223, sys_restart_syscall, 0) 484__SYSCALL(223, sys_restart_syscall, 0)
485#define __NR_sigaltstack 224 485#define __NR_sigaltstack 224
486__SYSCALL(224, xtensa_sigaltstack, 2) 486__SYSCALL(224, sys_sigaltstack, 2)
487#define __NR_rt_sigreturn 225 487#define __NR_rt_sigreturn 225
488__SYSCALL(225, xtensa_rt_sigreturn, 1) 488__SYSCALL(225, xtensa_rt_sigreturn, 1)
489#define __NR_rt_sigaction 226 489#define __NR_rt_sigaction 226
diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c
index de34d6be91cd..d7590dddd084 100644
--- a/arch/xtensa/kernel/signal.c
+++ b/arch/xtensa/kernel/signal.c
@@ -265,7 +265,7 @@ asmlinkage long xtensa_rt_sigreturn(long a0, long a1, long a2, long a3,
265 265
266 ret = regs->areg[2]; 266 ret = regs->areg[2];
267 267
268 if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->areg[1]) == -EFAULT) 268 if (restore_altstack(&frame->uc.uc_stack))
269 goto badframe; 269 goto badframe;
270 270
271 return ret; 271 return ret;
@@ -368,11 +368,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
368 368
369 err |= __put_user(0, &frame->uc.uc_flags); 369 err |= __put_user(0, &frame->uc.uc_flags);
370 err |= __put_user(0, &frame->uc.uc_link); 370 err |= __put_user(0, &frame->uc.uc_link);
371 err |= __put_user((void *)current->sas_ss_sp, 371 err |= __save_altstack(&frame->uc.uc_stack, regs->areg[1]);
372 &frame->uc.uc_stack.ss_sp);
373 err |= __put_user(sas_ss_flags(regs->areg[1]),
374 &frame->uc.uc_stack.ss_flags);
375 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
376 err |= setup_sigcontext(frame, regs); 372 err |= setup_sigcontext(frame, regs);
377 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); 373 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
378 374
@@ -424,16 +420,6 @@ give_sigsegv:
424 return -EFAULT; 420 return -EFAULT;
425} 421}
426 422
427asmlinkage long xtensa_sigaltstack(const stack_t __user *uss,
428 stack_t __user *uoss,
429 long a2, long a3, long a4, long a5,
430 struct pt_regs *regs)
431{
432 return do_sigaltstack(uss, uoss, regs->areg[1]);
433}
434
435
436
437/* 423/*
438 * Note that 'init' is a special process: it doesn't get signals it doesn't 424 * Note that 'init' is a special process: it doesn't get signals it doesn't
439 * want to handle. Thus you cannot kill init even with a SIGKILL even by 425 * want to handle. Thus you cannot kill init even with a SIGKILL even by