summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/Kconfig10
-rw-r--r--include/linux/syscalls.h8
-rw-r--r--kernel/signal.c17
3 files changed, 35 insertions, 0 deletions
diff --git a/arch/Kconfig b/arch/Kconfig
index c612b5ccfd84..6b1df95ffefc 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -387,4 +387,14 @@ config ODD_RT_SIGACTION
help
Architecture has unusual rt_sigaction(2) arguments
+config OLD_SIGSUSPEND
+ bool
+ help
+ Architecture has old sigsuspend(2) syscall, of one-argument variety
+
+config OLD_SIGSUSPEND3
+ bool
+ help
+ Even weirder antique ABI - three-argument sigsuspend(2)
+
source "kernel/gcov/Kconfig"
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 75defcd1c276..d2dd2f63d220 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -377,6 +377,14 @@ asmlinkage long sys_init_module(void __user *umod, unsigned long len,
asmlinkage long sys_delete_module(const char __user *name_user,
unsigned int flags);
+#ifdef CONFIG_OLD_SIGSUSPEND
+asmlinkage long sys_sigsuspend(old_sigset_t mask);
+#endif
+
+#ifdef CONFIG_OLD_SIGSUSPEND3
+asmlinkage long sys_sigsuspend(int unused1, int unused2, old_sigset_t mask);
+#endif
+
#ifndef CONFIG_ODD_RT_SIGACTION
asmlinkage long sys_rt_sigaction(int,
const struct sigaction __user *,
diff --git a/kernel/signal.c b/kernel/signal.c
index 6cd3023cc66b..93fd4b83d866 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -3454,6 +3454,23 @@ COMPAT_SYSCALL_DEFINE2(rt_sigsuspend, compat_sigset_t __user *, unewset, compat_
#endif
#endif
+#ifdef CONFIG_OLD_SIGSUSPEND
+SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask)
+{
+ sigset_t blocked;
+ siginitset(&blocked, mask);
+ return sigsuspend(&blocked);
+}
+#endif
+#ifdef CONFIG_OLD_SIGSUSPEND3
+SYSCALL_DEFINE3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask)
+{
+ sigset_t blocked;
+ siginitset(&blocked, mask);
+ return sigsuspend(&blocked);
+}
+#endif
+
__attribute__((weak)) const char *arch_vma_name(struct vm_area_struct *vma)
{
return NULL;