ARM: sunxi_defconfig: enable CONFIG_REGULATOR
[cascardo/linux.git] / kernel / signal.c
index 40b76e3..8f0876f 100644 (file)
@@ -2170,8 +2170,7 @@ static int ptrace_signal(int signr, siginfo_t *info)
        return signr;
 }
 
-int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka,
-                         struct pt_regs *regs, void *cookie)
+int get_signal(struct ksignal *ksig)
 {
        struct sighand_struct *sighand = current->sighand;
        struct signal_struct *signal = current->signal;
@@ -2241,13 +2240,13 @@ relock:
                        goto relock;
                }
 
-               signr = dequeue_signal(current, &current->blocked, info);
+               signr = dequeue_signal(current, &current->blocked, &ksig->info);
 
                if (!signr)
                        break; /* will return 0 */
 
                if (unlikely(current->ptrace) && signr != SIGKILL) {
-                       signr = ptrace_signal(signr, info);
+                       signr = ptrace_signal(signr, &ksig->info);
                        if (!signr)
                                continue;
                }
@@ -2255,13 +2254,13 @@ relock:
                ka = &sighand->action[signr-1];
 
                /* Trace actually delivered signals. */
-               trace_signal_deliver(signr, info, ka);
+               trace_signal_deliver(signr, &ksig->info, ka);
 
                if (ka->sa.sa_handler == SIG_IGN) /* Do nothing.  */
                        continue;
                if (ka->sa.sa_handler != SIG_DFL) {
                        /* Run the handler.  */
-                       *return_ka = *ka;
+                       ksig->ka = *ka;
 
                        if (ka->sa.sa_flags & SA_ONESHOT)
                                ka->sa.sa_handler = SIG_DFL;
@@ -2311,7 +2310,7 @@ relock:
                                spin_lock_irq(&sighand->siglock);
                        }
 
-                       if (likely(do_signal_stop(info->si_signo))) {
+                       if (likely(do_signal_stop(ksig->info.si_signo))) {
                                /* It released the siglock.  */
                                goto relock;
                        }
@@ -2332,7 +2331,7 @@ relock:
 
                if (sig_kernel_coredump(signr)) {
                        if (print_fatal_signals)
-                               print_fatal_signal(info->si_signo);
+                               print_fatal_signal(ksig->info.si_signo);
                        proc_coredump_connector(current);
                        /*
                         * If it was able to dump core, this kills all
@@ -2342,34 +2341,32 @@ relock:
                         * first and our do_group_exit call below will use
                         * that value and ignore the one we pass it.
                         */
-                       do_coredump(info);
+                       do_coredump(&ksig->info);
                }
 
                /*
                 * Death signals, no core dump.
                 */
-               do_group_exit(info->si_signo);
+               do_group_exit(ksig->info.si_signo);
                /* NOTREACHED */
        }
        spin_unlock_irq(&sighand->siglock);
-       return signr;
+
+       ksig->sig = signr;
+       return ksig->sig > 0;
 }
 
 /**
  * signal_delivered - 
- * @sig:               number of signal being delivered
- * @info:              siginfo_t of signal being delivered
- * @ka:                        sigaction setting that chose the handler
- * @regs:              user register state
+ * @ksig:              kernel signal struct
  * @stepping:          nonzero if debugger single-step or block-step in use
  *
  * This function should be called when a signal has successfully been
- * delivered. It updates the blocked signals accordingly (@ka->sa.sa_mask
+ * delivered. It updates the blocked signals accordingly (@ksig->ka.sa.sa_mask
  * is always blocked, and the signal itself is blocked unless %SA_NODEFER
- * is set in @ka->sa.sa_flags.  Tracing is notified.
+ * is set in @ksig->ka.sa.sa_flags.  Tracing is notified.
  */
-void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka,
-                       struct pt_regs *regs, int stepping)
+static void signal_delivered(struct ksignal *ksig, int stepping)
 {
        sigset_t blocked;
 
@@ -2379,11 +2376,11 @@ void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka,
           simply clear the restore sigmask flag.  */
        clear_restore_sigmask();
 
-       sigorsets(&blocked, &current->blocked, &ka->sa.sa_mask);
-       if (!(ka->sa.sa_flags & SA_NODEFER))
-               sigaddset(&blocked, sig);
+       sigorsets(&blocked, &current->blocked, &ksig->ka.sa.sa_mask);
+       if (!(ksig->ka.sa.sa_flags & SA_NODEFER))
+               sigaddset(&blocked, ksig->sig);
        set_current_blocked(&blocked);
-       tracehook_signal_handler(sig, info, ka, regs, stepping);
+       tracehook_signal_handler(stepping);
 }
 
 void signal_setup_done(int failed, struct ksignal *ksig, int stepping)
@@ -2391,8 +2388,7 @@ void signal_setup_done(int failed, struct ksignal *ksig, int stepping)
        if (failed)
                force_sigsegv(ksig->sig, current);
        else
-               signal_delivered(ksig->sig, &ksig->info, &ksig->ka,
-                       signal_pt_regs(), stepping);
+               signal_delivered(ksig, stepping);
 }
 
 /*