diff options
| author | 2014-11-19 21:32:12 +1100 | |
|---|---|---|
| committer | 2014-11-19 21:32:12 +1100 | |
| commit | b10778a00d40b3d9fdaaf5891e802794781ff71c (patch) | |
| tree | 6ba4cbac86eecedc3f30650e7f764ecf00c83898 /arch/tile/kernel/signal.c | |
| parent | integrity: do zero padding of the key id (diff) | |
| parent | Linux 3.17 (diff) | |
| download | wireguard-linux-b10778a00d40b3d9fdaaf5891e802794781ff71c.tar.xz wireguard-linux-b10778a00d40b3d9fdaaf5891e802794781ff71c.zip | |
Merge commit 'v3.17' into next
Diffstat (limited to '')
| -rw-r--r-- | arch/tile/kernel/signal.c | 54 | 
1 files changed, 24 insertions, 30 deletions
| diff --git a/arch/tile/kernel/signal.c b/arch/tile/kernel/signal.c index d1d026f01267..7c2fecc52177 100644 --- a/arch/tile/kernel/signal.c +++ b/arch/tile/kernel/signal.c @@ -153,18 +153,18 @@ static inline void __user *get_sigframe(struct k_sigaction *ka,  	return (void __user *) sp;  } -static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, -			   sigset_t *set, struct pt_regs *regs) +static int setup_rt_frame(struct ksignal *ksig, sigset_t *set, +			  struct pt_regs *regs)  {  	unsigned long restorer;  	struct rt_sigframe __user *frame; -	int err = 0; +	int err = 0, sig = ksig->sig;  	int usig; -	frame = get_sigframe(ka, regs, sizeof(*frame)); +	frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));  	if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) -		goto give_sigsegv; +		goto err;  	usig = current_thread_info()->exec_domain  		&& current_thread_info()->exec_domain->signal_invmap @@ -173,12 +173,12 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  		: sig;  	/* Always write at least the signal number for the stack backtracer. */ -	if (ka->sa.sa_flags & SA_SIGINFO) { +	if (ksig->ka.sa.sa_flags & SA_SIGINFO) {  		/* At sigreturn time, restore the callee-save registers too. */ -		err |= copy_siginfo_to_user(&frame->info, info); +		err |= copy_siginfo_to_user(&frame->info, &ksig->info);  		regs->flags |= PT_FLAGS_RESTORE_REGS;  	} else { -		err |= __put_user(info->si_signo, &frame->info.si_signo); +		err |= __put_user(ksig->info.si_signo, &frame->info.si_signo);  	}  	/* Create the ucontext.  */ @@ -189,11 +189,11 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	err |= setup_sigcontext(&frame->uc.uc_mcontext, regs);  	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));  	if (err) -		goto give_sigsegv; +		goto err;  	restorer = VDSO_SYM(&__vdso_rt_sigreturn); -	if (ka->sa.sa_flags & SA_RESTORER) -		restorer = (unsigned long) ka->sa.sa_restorer; +	if (ksig->ka.sa.sa_flags & SA_RESTORER) +		restorer = (unsigned long) ksig->ka.sa.sa_restorer;  	/*  	 * Set up registers for signal handler. @@ -202,7 +202,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	 * We always pass siginfo and mcontext, regardless of SA_SIGINFO,  	 * since some things rely on this (e.g. glibc's debug/segfault.c).  	 */ -	regs->pc = (unsigned long) ka->sa.sa_handler; +	regs->pc = (unsigned long) ksig->ka.sa.sa_handler;  	regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */  	regs->sp = (unsigned long) frame;  	regs->lr = restorer; @@ -212,8 +212,9 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,  	regs->flags |= PT_FLAGS_CALLER_SAVES;  	return 0; -give_sigsegv: -	signal_fault("bad setup frame", regs, frame, sig); +err: +	trace_unhandled_signal("bad sigreturn frame", regs, +			      (unsigned long)frame, SIGSEGV);  	return -EFAULT;  } @@ -221,9 +222,7 @@ give_sigsegv:   * OK, we're invoking a handler   */ -static void handle_signal(unsigned long sig, siginfo_t *info, -			 struct k_sigaction *ka, -			 struct pt_regs *regs) +static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)  {  	sigset_t *oldset = sigmask_to_save();  	int ret; @@ -238,7 +237,7 @@ static void handle_signal(unsigned long sig, siginfo_t *info,  			break;  		case -ERESTARTSYS: -			if (!(ka->sa.sa_flags & SA_RESTART)) { +			if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {  				regs->regs[0] = -EINTR;  				break;  			} @@ -254,14 +253,12 @@ static void handle_signal(unsigned long sig, siginfo_t *info,  	/* Set up the stack frame */  #ifdef CONFIG_COMPAT  	if (is_compat_task()) -		ret = compat_setup_rt_frame(sig, ka, info, oldset, regs); +		ret = compat_setup_rt_frame(ksig, oldset, regs);  	else  #endif -		ret = setup_rt_frame(sig, ka, info, oldset, regs); -	if (ret) -		return; -	signal_delivered(sig, info, ka, regs, -			test_thread_flag(TIF_SINGLESTEP)); +		ret = setup_rt_frame(ksig, oldset, regs); + +	signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));  }  /* @@ -271,9 +268,7 @@ static void handle_signal(unsigned long sig, siginfo_t *info,   */  void do_signal(struct pt_regs *regs)  { -	siginfo_t info; -	int signr; -	struct k_sigaction ka; +	struct ksignal ksig;  	/*  	 * i386 will check if we're coming from kernel mode and bail out @@ -282,10 +277,9 @@ void do_signal(struct pt_regs *regs)  	 * helpful, we can reinstate the check on "!user_mode(regs)".  	 */ -	signr = get_signal_to_deliver(&info, &ka, regs, NULL); -	if (signr > 0) { +	if (get_signal(&ksig)) {  		/* Whee! Actually deliver the signal.  */ -		handle_signal(signr, &info, &ka, regs); +		handle_signal(&ksig, regs);  		goto done;  	} | 
