compat_signal.c revision efee984c27b67e3ebef40410f35671997441b57c
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
254dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstens *  arch/s390/kernel/compat_signal.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
454dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstens *    Copyright (C) IBM Corp. 2000,2006
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *               Gerhard Tonn (ton@de.ibm.com)
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Copyright (C) 1991, 1992  Linus Torvalds
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/compat.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/smp.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/signal.h>
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/wait.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ptrace.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/unistd.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/stddef.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/tty.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/personality.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/binfmts.h>
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/ucontext.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/uaccess.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/lowcore.h>
30a0616cdebcfd575dcd4c46102d1b52fbb827fc29David Howells#include <asm/switch_to.h>
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "compat_linux.h"
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "compat_ptrace.h"
33a806170e29c5468b1d641a22518243bdf1b8d58bHeiko Carstens#include "entry.h"
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct sigcontext32 sc;
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	_sigregs32 sregs;
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int signo;
41ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	__u32 gprs_high[NUM_GPRS];
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8 retcode[S390_SYSCALL_SIZE];
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} sigframe32;
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8 retcode[S390_SYSCALL_SIZE];
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	compat_siginfo_t info;
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct ucontext32 uc;
51ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	__u32 gprs_high[NUM_GPRS];
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} rt_sigframe32;
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int err;
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EFAULT;
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* If you change siginfo_t structure, please be sure
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   this code is fixed accordingly.
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   It should never copy any pad contained in the structure
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   to avoid security leaks, but must copy the generic
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   3 ints plus the relevant union member.
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   This routine must convert siginfo from 64bit to 32bit as well
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   at the same time.  */
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err = __put_user(from->si_signo, &to->si_signo);
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= __put_user(from->si_errno, &to->si_errno);
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= __put_user((short)from->si_code, &to->si_code);
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (from->si_code < 0)
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else {
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (from->si_code >> 16) {
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_MESGQ >> 16:
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_int, &to->si_int);
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* fallthrough */
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_KILL >> 16:
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_pid, &to->si_pid);
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_uid, &to->si_uid);
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_CHLD >> 16:
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_pid, &to->si_pid);
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_uid, &to->si_uid);
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_utime, &to->si_utime);
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_stime, &to->si_stime);
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_status, &to->si_status);
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_FAULT >> 16:
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user((unsigned long) from->si_addr,
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					  &to->si_addr);
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_POLL >> 16:
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_band, &to->si_band);
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_fd, &to->si_fd);
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_TIMER >> 16:
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_tid, &to->si_tid);
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_overrun, &to->si_overrun);
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __put_user(from->si_int, &to->si_int);
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return err;
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int err;
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 tmp;
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!access_ok (VERIFY_READ, from, sizeof(compat_siginfo_t)))
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EFAULT;
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err = __get_user(to->si_signo, &from->si_signo);
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= __get_user(to->si_errno, &from->si_errno);
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= __get_user(to->si_code, &from->si_code);
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (to->si_code < 0)
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else {
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (to->si_code >> 16) {
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_MESGQ >> 16:
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_int, &from->si_int);
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* fallthrough */
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_KILL >> 16:
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_pid, &from->si_pid);
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_uid, &from->si_uid);
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_CHLD >> 16:
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_pid, &from->si_pid);
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_uid, &from->si_uid);
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_utime, &from->si_utime);
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_stime, &from->si_stime);
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_status, &from->si_status);
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_FAULT >> 16:
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(tmp, &from->si_addr);
1433c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky			to->si_addr = (void __force __user *)
1443c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky				(u64) (tmp & PSW32_ADDR_INSN);
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_POLL >> 16:
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_band, &from->si_band);
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_fd, &from->si_fd);
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case __SI_TIMER >> 16:
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_tid, &from->si_tid);
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_overrun, &from->si_overrun);
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			err |= __get_user(to->si_int, &from->si_int);
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return err;
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsasmlinkage long
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssys32_sigaction(int sig, const struct old_sigaction32 __user *act,
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 struct old_sigaction32 __user *oact)
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        struct k_sigaction new_ka, old_ka;
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long sa_handler, sa_restorer;
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        int ret;
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (act) {
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		compat_old_sigset_t mask;
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		    __get_user(sa_handler, &act->sa_handler) ||
17412bae23507129a7337378e6433bff6f8696bdb45Heiko Carstens		    __get_user(sa_restorer, &act->sa_restorer) ||
17512bae23507129a7337378e6433bff6f8696bdb45Heiko Carstens		    __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
17612bae23507129a7337378e6433bff6f8696bdb45Heiko Carstens		    __get_user(mask, &act->sa_mask))
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EFAULT;
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer;
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		siginitset(&new_ka.sa.sa_mask, mask);
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!ret && oact) {
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sa_handler = (unsigned long) old_ka.sa.sa_handler;
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sa_restorer = (unsigned long) old_ka.sa.sa_restorer;
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		    __put_user(sa_handler, &oact->sa_handler) ||
19012bae23507129a7337378e6433bff6f8696bdb45Heiko Carstens		    __put_user(sa_restorer, &oact->sa_restorer) ||
19112bae23507129a7337378e6433bff6f8696bdb45Heiko Carstens		    __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
19212bae23507129a7337378e6433bff6f8696bdb45Heiko Carstens		    __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EFAULT;
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ret;
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsasmlinkage long
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   struct sigaction32 __user *oact,  size_t sigsetsize)
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct k_sigaction new_ka, old_ka;
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long sa_handler;
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int ret;
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	compat_sigset_t set32;
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* XXX: Don't preclude handling different sized sigset_t's.  */
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (sigsetsize != sizeof(compat_sigset_t))
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EINVAL;
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (act) {
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = get_user(sa_handler, &act->sa_handler);
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret |= __copy_from_user(&set32, &act->sa_mask,
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					sizeof(compat_sigset_t));
216399c1d8dbfdcf46977fd2e2a833b02e18a284810Martin Schwidefsky		new_ka.sa.sa_mask.sig[0] =
217399c1d8dbfdcf46977fd2e2a833b02e18a284810Martin Schwidefsky			set32.sig[0] | (((long)set32.sig[1]) << 32);
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ret)
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EFAULT;
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!ret && oact) {
228399c1d8dbfdcf46977fd2e2a833b02e18a284810Martin Schwidefsky		set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
229399c1d8dbfdcf46977fd2e2a833b02e18a284810Martin Schwidefsky		set32.sig[0] = old_ka.sa.sa_mask.sig[0];
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler);
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret |= __copy_to_user(&oact->sa_mask, &set32,
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				      sizeof(compat_sigset_t));
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ret;
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsasmlinkage long
24003ff9a235a0602724fc54916469b6e0939c62c9bMartin Schwidefskysys32_sigaltstack(const stack_t32 __user *uss, stack_t32 __user *uoss)
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
24203ff9a235a0602724fc54916469b6e0939c62c9bMartin Schwidefsky	struct pt_regs *regs = task_pt_regs(current);
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	stack_t kss, koss;
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long ss_sp;
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int ret, err = 0;
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mm_segment_t old_fs = get_fs();
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (uss) {
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EFAULT;
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		err |= __get_user(ss_sp, &uss->ss_sp);
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		err |= __get_user(kss.ss_size, &uss->ss_size);
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		err |= __get_user(kss.ss_flags, &uss->ss_flags);
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (err)
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EFAULT;
256c28144763a7dcdceb2c16a5ac9c8e0022d547d28Al Viro		kss.ss_sp = (void __user *) ss_sp;
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_fs (KERNEL_DS);
2602b67fc46061b2171fb8fbb55d1ac717abd533569Heiko Carstens	ret = do_sigaltstack((stack_t __force __user *) (uss ? &kss : NULL),
2612b67fc46061b2171fb8fbb55d1ac717abd533569Heiko Carstens			     (stack_t __force __user *) (uoss ? &koss : NULL),
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			     regs->gprs[15]);
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_fs (old_fs);
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!ret && uoss) {
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EFAULT;
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ss_sp = (unsigned long) koss.ss_sp;
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		err |= __put_user(ss_sp, &uoss->ss_sp);
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		err |= __put_user(koss.ss_size, &uoss->ss_size);
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		err |= __put_user(koss.ss_flags, &uoss->ss_flags);
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (err)
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EFAULT;
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ret;
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs)
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	_s390_regs_common32 regs32;
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int err, i;
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
283b50511e41aa51a89b4176784a670582424bc7db6Martin Schwidefsky	regs32.psw.mask = psw32_user_bits |
284b50511e41aa51a89b4176784a670582424bc7db6Martin Schwidefsky		((__u32)(regs->psw.mask >> 32) & PSW32_MASK_USER);
285d4e81b35b882d96f059afdb0f98e5b6025973b09Martin Schwidefsky	regs32.psw.addr = (__u32) regs->psw.addr |
286d4e81b35b882d96f059afdb0f98e5b6025973b09Martin Schwidefsky		(__u32)(regs->psw.mask & PSW_MASK_BA);
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < NUM_GPRS; i++)
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		regs32.gprs[i] = (__u32) regs->gprs[i];
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	save_access_regs(current->thread.acrs);
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	memcpy(regs32.acrs, current->thread.acrs, sizeof(regs32.acrs));
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err = __copy_to_user(&sregs->regs, &regs32, sizeof(regs32));
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (err)
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return err;
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	save_fp_regs(&current->thread.fp_regs);
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* s390_fp_regs and _s390_fp_regs32 are the same ! */
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return __copy_to_user(&sregs->fpregs, &current->thread.fp_regs,
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			      sizeof(_s390_fp_regs32));
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs)
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	_s390_regs_common32 regs32;
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int err, i;
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Alwys make any pending restarted system call return -EINTR */
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	current_thread_info()->restart_block.fn = do_no_restart_syscall;
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err = __copy_from_user(&regs32, &sregs->regs, sizeof(regs32));
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (err)
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return err;
311b50511e41aa51a89b4176784a670582424bc7db6Martin Schwidefsky	regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) |
312d4e81b35b882d96f059afdb0f98e5b6025973b09Martin Schwidefsky		(__u64)(regs32.psw.mask & PSW32_MASK_USER) << 32 |
313d4e81b35b882d96f059afdb0f98e5b6025973b09Martin Schwidefsky		(__u64)(regs32.psw.addr & PSW32_ADDR_AMODE);
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	regs->psw.addr = (__u64)(regs32.psw.addr & PSW32_ADDR_INSN);
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < NUM_GPRS; i++)
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		regs->gprs[i] = (__u64) regs32.gprs[i];
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	memcpy(current->thread.acrs, regs32.acrs, sizeof(current->thread.acrs));
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	restore_access_regs(current->thread.acrs);
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err = __copy_from_user(&current->thread.fp_regs, &sregs->fpregs,
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			       sizeof(_s390_fp_regs32));
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	current->thread.fp_regs.fpc &= FPC_VALID_MASK;
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (err)
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return err;
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	restore_fp_regs(&current->thread.fp_regs);
327b6ef5bb3d93efb95ba855a628740375c2280a59eMartin Schwidefsky	clear_thread_flag(TIF_SYSCALL);	/* No longer in a system call */
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
331ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstensstatic int save_sigregs_gprs_high(struct pt_regs *regs, __u32 __user *uregs)
332ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens{
333ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	__u32 gprs_high[NUM_GPRS];
334ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	int i;
335ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens
336ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	for (i = 0; i < NUM_GPRS; i++)
337ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens		gprs_high[i] = regs->gprs[i] >> 32;
338ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens
339ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	return __copy_to_user(uregs, &gprs_high, sizeof(gprs_high));
340ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens}
341ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens
342ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstensstatic int restore_sigregs_gprs_high(struct pt_regs *regs, __u32 __user *uregs)
343ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens{
344ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	__u32 gprs_high[NUM_GPRS];
345ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	int err, i;
346ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens
347ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	err = __copy_from_user(&gprs_high, uregs, sizeof(gprs_high));
348ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	if (err)
349ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens		return err;
350ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	for (i = 0; i < NUM_GPRS; i++)
351ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens		*(__u32 *)&regs->gprs[i] = gprs_high[i];
352ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	return 0;
353ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens}
354ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens
35503ff9a235a0602724fc54916469b6e0939c62c9bMartin Schwidefskyasmlinkage long sys32_sigreturn(void)
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
35703ff9a235a0602724fc54916469b6e0939c62c9bMartin Schwidefsky	struct pt_regs *regs = task_pt_regs(current);
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sigframe32 __user *frame = (sigframe32 __user *)regs->gprs[15];
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sigset_t set;
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto badframe;
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto badframe;
365391c62feb1798b6d31bd88076eae649b091ad8bfHeiko Carstens	set_current_blocked(&set);
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (restore_sigregs32(regs, &frame->sregs))
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto badframe;
368ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	if (restore_sigregs_gprs_high(regs, frame->gprs_high))
369ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens		goto badframe;
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return regs->gprs[2];
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsbadframe:
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	force_sig(SIGSEGV, current);
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
37603ff9a235a0602724fc54916469b6e0939c62c9bMartin Schwidefskyasmlinkage long sys32_rt_sigreturn(void)
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
37803ff9a235a0602724fc54916469b6e0939c62c9bMartin Schwidefsky	struct pt_regs *regs = task_pt_regs(current);
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15];
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sigset_t set;
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	stack_t st;
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u32 ss_sp;
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int err;
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mm_segment_t old_fs = get_fs();
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto badframe;
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto badframe;
390391c62feb1798b6d31bd88076eae649b091ad8bfHeiko Carstens	set_current_blocked(&set);
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto badframe;
393ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	if (restore_sigregs_gprs_high(regs, frame->gprs_high))
394ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens		goto badframe;
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err = __get_user(ss_sp, &frame->uc.uc_stack.ss_sp);
396c28144763a7dcdceb2c16a5ac9c8e0022d547d28Al Viro	st.ss_sp = compat_ptr(ss_sp);
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size);
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags);
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (err)
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto badframe;
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_fs (KERNEL_DS);
4022b67fc46061b2171fb8fbb55d1ac717abd533569Heiko Carstens	do_sigaltstack((stack_t __force __user *)&st, NULL, regs->gprs[15]);
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_fs (old_fs);
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return regs->gprs[2];
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsbadframe:
40603ff9a235a0602724fc54916469b6e0939c62c9bMartin Schwidefsky	force_sig(SIGSEGV, current);
40703ff9a235a0602724fc54916469b6e0939c62c9bMartin Schwidefsky	return 0;
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Set up a signal frame.
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Determine which stack to use..
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void __user *
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsget_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long sp;
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Default to using normal stack */
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sp = (unsigned long) A(regs->gprs[15]);
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
426de553438eb6c487f72d46019eb3821f6687ce011Heiko Carstens	/* Overflow on alternate signal stack gives SIGSEGV. */
427de553438eb6c487f72d46019eb3821f6687ce011Heiko Carstens	if (on_sig_stack(sp) && !on_sig_stack((sp - frame_size) & -8UL))
428de553438eb6c487f72d46019eb3821f6687ce011Heiko Carstens		return (void __user *) -1UL;
429de553438eb6c487f72d46019eb3821f6687ce011Heiko Carstens
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* This is the X/Open sanctioned signal stack switching.  */
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ka->sa.sa_flags & SA_ONSTACK) {
43228f223782bca914ae65d08234c57c2175ecd7f5dLaurent Meyer		if (! sas_ss_flags(sp))
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			sp = current->sas_ss_sp + current->sas_ss_size;
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (void __user *)((sp - frame_size) & -8ul);
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int map_signal(int sig)
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (current_thread_info()->exec_domain
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	    && current_thread_info()->exec_domain->signal_invmap
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	    && sig < 32)
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return current_thread_info()->exec_domain->signal_invmap[sig];
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        else
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return sig;
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44954dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstensstatic int setup_frame32(int sig, struct k_sigaction *ka,
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			sigset_t *set, struct pt_regs * regs)
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(sigframe32));
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!access_ok(VERIFY_WRITE, frame, sizeof(sigframe32)))
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto give_sigsegv;
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
456de553438eb6c487f72d46019eb3821f6687ce011Heiko Carstens	if (frame == (void __user *) -1UL)
457de553438eb6c487f72d46019eb3821f6687ce011Heiko Carstens		goto give_sigsegv;
458de553438eb6c487f72d46019eb3821f6687ce011Heiko Carstens
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32))
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto give_sigsegv;
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (save_sigregs32(regs, &frame->sregs))
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto give_sigsegv;
464ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	if (save_sigregs_gprs_high(regs, frame->gprs_high))
465ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens		goto give_sigsegv;
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (__put_user((unsigned long) &frame->sregs, &frame->sc.sregs))
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto give_sigsegv;
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up to return from userspace.  If provided, use a stub
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   already in userspace.  */
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ka->sa.sa_flags & SA_RESTORER) {
472d4e81b35b882d96f059afdb0f98e5b6025973b09Martin Schwidefsky		regs->gprs[14] = (__u64) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
474d4e81b35b882d96f059afdb0f98e5b6025973b09Martin Schwidefsky		regs->gprs[14] = (__u64) frame->retcode | PSW32_ADDR_AMODE;
4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
4763c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky			       (u16 __force __user *)(frame->retcode)))
4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			goto give_sigsegv;
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up backchain. */
4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto give_sigsegv;
4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up registers for signal handler */
4853c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky	regs->gprs[15] = (__force __u64) frame;
486d4e81b35b882d96f059afdb0f98e5b6025973b09Martin Schwidefsky	regs->psw.mask |= PSW_MASK_BA;		/* force amode 31 */
4873c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky	regs->psw.addr = (__force __u64) ka->sa.sa_handler;
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	regs->gprs[2] = map_signal(sig);
4903c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky	regs->gprs[3] = (__force __u64) &frame->sc;
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* We forgot to include these in the sigcontext.
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   To avoid breaking binary compatibility, they are passed as args. */
494aa33c8cbbae2eb98489a3a363099b362146a8f4cMartin Schwidefsky	if (sig == SIGSEGV || sig == SIGBUS || sig == SIGILL ||
495aa33c8cbbae2eb98489a3a363099b362146a8f4cMartin Schwidefsky	    sig == SIGTRAP || sig == SIGFPE) {
496aa33c8cbbae2eb98489a3a363099b362146a8f4cMartin Schwidefsky		/* set extra registers only for synchronous signals */
497aa33c8cbbae2eb98489a3a363099b362146a8f4cMartin Schwidefsky		regs->gprs[4] = regs->int_code & 127;
498aa33c8cbbae2eb98489a3a363099b362146a8f4cMartin Schwidefsky		regs->gprs[5] = regs->int_parm_long;
499aa33c8cbbae2eb98489a3a363099b362146a8f4cMartin Schwidefsky	}
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Place signal number on stack to allow backtrace from handler.  */
5023c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky	if (__put_user(regs->gprs[2], (int __force __user *) &frame->signo))
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto give_sigsegv;
50454dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstens	return 0;
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsgive_sigsegv:
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	force_sigsegv(sig, current);
50854dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstens	return -EFAULT;
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51154dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstensstatic int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			   sigset_t *set, struct pt_regs * regs)
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int err = 0;
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	rt_sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!access_ok(VERIFY_WRITE, frame, sizeof(rt_sigframe32)))
5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto give_sigsegv;
5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
519de553438eb6c487f72d46019eb3821f6687ce011Heiko Carstens	if (frame == (void __user *) -1UL)
520de553438eb6c487f72d46019eb3821f6687ce011Heiko Carstens		goto give_sigsegv;
521de553438eb6c487f72d46019eb3821f6687ce011Heiko Carstens
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (copy_siginfo_to_user32(&frame->info, info))
5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto give_sigsegv;
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Create the ucontext.  */
526ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	err |= __put_user(UC_EXTENDED, &frame->uc.uc_flags);
5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= __put_user(0, &frame->uc.uc_link);
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= __put_user(sas_ss_flags(regs->gprs[15]),
5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	                  &frame->uc.uc_stack.ss_flags);
5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
533ea2a4d3a3a929ef494952bba57a0ef1a8a877881Heiko Carstens	err |= save_sigregs_gprs_high(regs, frame->gprs_high);
5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (err)
5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto give_sigsegv;
5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up to return from userspace.  If provided, use a stub
5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   already in userspace.  */
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ka->sa.sa_flags & SA_RESTORER) {
541207a05499bf11216ac96f76b38be728f4ee49304Martin Schwidefsky		regs->gprs[14] = (__u64) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
543207a05499bf11216ac96f76b38be728f4ee49304Martin Schwidefsky		regs->gprs[14] = (__u64) frame->retcode | PSW32_ADDR_AMODE;
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
5453c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky				  (u16 __force __user *)(frame->retcode));
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up backchain. */
5493c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky	if (__put_user(regs->gprs[15], (unsigned int __force __user *) frame))
5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto give_sigsegv;
5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up registers for signal handler */
5533c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky	regs->gprs[15] = (__force __u64) frame;
554d4e81b35b882d96f059afdb0f98e5b6025973b09Martin Schwidefsky	regs->psw.mask |= PSW_MASK_BA;		/* force amode 31 */
5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	regs->psw.addr = (__u64) ka->sa.sa_handler;
5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	regs->gprs[2] = map_signal(sig);
5583c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky	regs->gprs[3] = (__force __u64) &frame->info;
5593c52e49d7c81434e3d2ccb520b3a654c2cc7d03dMartin Schwidefsky	regs->gprs[4] = (__force __u64) &frame->uc;
56054dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstens	return 0;
5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsgive_sigsegv:
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	force_sigsegv(sig, current);
56454dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstens	return -EFAULT;
5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OK, we're invoking a handler
5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
571a610d6e672d6d3723e8da257ad4a8a288a8f2f89Al Virovoid handle_signal32(unsigned long sig, struct k_sigaction *ka,
572391c62feb1798b6d31bd88076eae649b091ad8bfHeiko Carstens		    siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
57454dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstens	int ret;
57554dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstens
5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up the stack frame */
5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ka->sa.sa_flags & SA_SIGINFO)
57854dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstens		ret = setup_rt_frame32(sig, ka, info, oldset, regs);
5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
58054dfe5dd9abc547f63060d132dad2c024a47de1eHeiko Carstens		ret = setup_frame32(sig, ka, oldset, regs);
581391c62feb1798b6d31bd88076eae649b091ad8bfHeiko Carstens	if (ret)
582a610d6e672d6d3723e8da257ad4a8a288a8f2f89Al Viro		return;
583efee984c27b67e3ebef40410f35671997441b57cAl Viro	signal_delivered(sig, info, ka, regs,
584a610d6e672d6d3723e8da257ad4a8a288a8f2f89Al Viro				 test_thread_flag(TIF_SINGLE_STEP));
5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
587