vserver 1.9.3
[linux-2.6.git] / arch / s390 / kernel / signal.c
index d5b6481..179db7e 100644 (file)
@@ -358,9 +358,7 @@ static void setup_frame(int sig, struct k_sigaction *ka,
        return;
 
 give_sigsegv:
-       if (sig == SIGSEGV)
-               ka->sa.sa_handler = SIG_DFL;
-       force_sig(SIGSEGV, current);
+       force_sigsegv(sig, current);
 }
 
 static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
@@ -414,9 +412,7 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        return;
 
 give_sigsegv:
-       if (sig == SIGSEGV)
-               ka->sa.sa_handler = SIG_DFL;
-       force_sig(SIGSEGV, current);
+       force_sigsegv(sig, current);
 }
 
 /*
@@ -424,20 +420,15 @@ give_sigsegv:
  */    
 
 static void
-handle_signal(unsigned long sig, siginfo_t *info, sigset_t *oldset,
-       struct pt_regs * regs)
+handle_signal(unsigned long sig, struct k_sigaction *ka,
+             siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
 {
-       struct k_sigaction *ka = &current->sighand->action[sig-1];
-
        /* Set up the stack frame */
        if (ka->sa.sa_flags & SA_SIGINFO)
                setup_rt_frame(sig, ka, info, oldset, regs);
        else
                setup_frame(sig, ka, oldset, regs);
 
-       if (ka->sa.sa_flags & SA_ONESHOT)
-               ka->sa.sa_handler = SIG_DFL;
-
        if (!(ka->sa.sa_flags & SA_NODEFER)) {
                spin_lock_irq(&current->sighand->siglock);
                sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
@@ -461,6 +452,7 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
        unsigned long retval = 0, continue_addr = 0, restart_addr = 0;
        siginfo_t info;
        int signr;
+       struct k_sigaction ka;
 
        /*
         * We want the common case to go fast, which
@@ -494,7 +486,7 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
 
        /* Get signal to deliver.  When running under ptrace, at this point
           the debugger may change all our registers ... */
-       signr = get_signal_to_deliver(&info, regs, NULL);
+       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
 
        /* Depending on the signal settings we may need to revert the
           decision to restart the system call. */
@@ -513,14 +505,15 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
 #ifdef CONFIG_S390_SUPPORT
                if (test_thread_flag(TIF_31BIT)) {
                        extern void handle_signal32(unsigned long sig,
+                                                   struct k_sigaction *ka,
                                                    siginfo_t *info,
                                                    sigset_t *oldset,
                                                    struct pt_regs *regs);
-                       handle_signal32(signr, &info, oldset, regs);
+                       handle_signal32(signr, &ka, &info, oldset, regs);
                        return 1;
                }
 #endif
-               handle_signal(signr, &info, oldset, regs);
+               handle_signal(signr, &ka, &info, oldset, regs);
                return 1;
        }