diff options
Diffstat (limited to 'arch/um/kernel/signal.c')
| -rw-r--r-- | arch/um/kernel/signal.c | 88 | 
1 files changed, 15 insertions, 73 deletions
diff --git a/arch/um/kernel/signal.c b/arch/um/kernel/signal.c index b5c094c4ade..f57e02e7910 100644 --- a/arch/um/kernel/signal.c +++ b/arch/um/kernel/signal.c @@ -9,29 +9,25 @@  #include <asm/siginfo.h>  #include <asm/signal.h>  #include <asm/unistd.h> -#include "frame_kern.h" -#include "kern_util.h" -#include <sysdep/sigcontext.h> +#include <frame_kern.h> +#include <kern_util.h>  EXPORT_SYMBOL(block_signals);  EXPORT_SYMBOL(unblock_signals); -#define _S(nr) (1<<((nr)-1)) - -#define _BLOCKABLE (~(_S(SIGKILL) | _S(SIGSTOP))) -  /*   * OK, we're invoking a handler   */ -static int handle_signal(struct pt_regs *regs, unsigned long signr, -			 struct k_sigaction *ka, siginfo_t *info, -			 sigset_t *oldset) +static void handle_signal(struct pt_regs *regs, unsigned long signr, +			 struct k_sigaction *ka, struct siginfo *info)  { +	sigset_t *oldset = sigmask_to_save(); +	int singlestep = 0;  	unsigned long sp;  	int err; -	/* Always make any pending restarted system calls return -EINTR */ -	current_thread_info()->restart_block.fn = do_no_restart_syscall; +	if ((current->ptrace & PT_DTRACE) && (current->ptrace & PT_PTRACED)) +		singlestep = 1;  	/* Did we come from a system call? */  	if (PT_REGS_SYSCALL_NR(regs) >= 0) { @@ -66,51 +62,22 @@ static int handle_signal(struct pt_regs *regs, unsigned long signr,  #endif  		err = setup_signal_stack_si(sp, signr, ka, regs, info, oldset); -	if (err) { -		spin_lock_irq(¤t->sighand->siglock); -		current->blocked = *oldset; -		recalc_sigpending(); -		spin_unlock_irq(¤t->sighand->siglock); +	if (err)  		force_sigsegv(signr, current); -	} else { -		spin_lock_irq(¤t->sighand->siglock); -		sigorsets(¤t->blocked, ¤t->blocked, -			  &ka->sa.sa_mask); -		if (!(ka->sa.sa_flags & SA_NODEFER)) -			sigaddset(¤t->blocked, signr); -		recalc_sigpending(); -		spin_unlock_irq(¤t->sighand->siglock); -	} - -	return err; +	else +		signal_delivered(signr, info, ka, regs, singlestep);  }  static int kern_do_signal(struct pt_regs *regs)  {  	struct k_sigaction ka_copy; -	siginfo_t info; -	sigset_t *oldset; +	struct siginfo info;  	int sig, handled_sig = 0; -	if (test_thread_flag(TIF_RESTORE_SIGMASK)) -		oldset = ¤t->saved_sigmask; -	else -		oldset = ¤t->blocked; -  	while ((sig = get_signal_to_deliver(&info, &ka_copy, regs, NULL)) > 0) {  		handled_sig = 1;  		/* Whee!  Actually deliver the signal.  */ -		if (!handle_signal(regs, sig, &ka_copy, &info, oldset)) { -			/* -			 * a signal was successfully delivered; the saved -			 * sigmask will have been stored in the signal frame, -			 * and will be restored by sigreturn, so we can simply -			 * clear the TIF_RESTORE_SIGMASK flag -			 */ -			if (test_thread_flag(TIF_RESTORE_SIGMASK)) -				clear_thread_flag(TIF_RESTORE_SIGMASK); -			break; -		} +		handle_signal(regs, sig, &ka_copy, &info);  	}  	/* Did we come from a system call? */ @@ -146,10 +113,8 @@ static int kern_do_signal(struct pt_regs *regs)  	 * if there's no signal to deliver, we just put the saved sigmask  	 * back  	 */ -	if (!handled_sig && test_thread_flag(TIF_RESTORE_SIGMASK)) { -		clear_thread_flag(TIF_RESTORE_SIGMASK); -		sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); -	} +	if (!handled_sig) +		restore_saved_sigmask();  	return handled_sig;  } @@ -157,26 +122,3 @@ int do_signal(void)  {  	return kern_do_signal(¤t->thread.regs);  } - -/* - * Atomically swap in the new signal mask, and wait for a signal. - */ -long sys_sigsuspend(int history0, int history1, old_sigset_t mask) -{ -	mask &= _BLOCKABLE; -	spin_lock_irq(¤t->sighand->siglock); -	current->saved_sigmask = current->blocked; -	siginitset(¤t->blocked, mask); -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); - -	current->state = TASK_INTERRUPTIBLE; -	schedule(); -	set_thread_flag(TIF_RESTORE_SIGMASK); -	return -ERESTARTNOHAND; -} - -long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) -{ -	return do_sigaltstack(uss, uoss, PT_REGS_SP(¤t->thread.regs)); -}  | 
