linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / x86_64 / ia32 / ia32_signal.c
index bddaefd..e0a9243 100644 (file)
@@ -6,6 +6,8 @@
  *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
  *  2000-06-20  Pentium III FXSR, SSE support by Gareth Hughes
  *  2000-12-*   x86-64 compatibility mode signal handling by Andi Kleen
+ * 
+ *  $Id: ia32_signal.c,v 1.22 2002/07/29 10:34:03 ak Exp $
  */
 
 #include <linux/sched.h>
@@ -113,19 +115,25 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
 }
 
 asmlinkage long
-sys32_sigsuspend(int history0, int history1, old_sigset_t mask)
+sys32_sigsuspend(int history0, int history1, old_sigset_t mask,
+                struct pt_regs *regs)
 {
+       sigset_t saveset;
+
        mask &= _BLOCKABLE;
        spin_lock_irq(&current->sighand->siglock);
-       current->saved_sigmask = current->blocked;
+       saveset = current->blocked;
        siginitset(&current->blocked, mask);
        recalc_sigpending();
        spin_unlock_irq(&current->sighand->siglock);
 
-       current->state = TASK_INTERRUPTIBLE;
-       schedule();
-       set_thread_flag(TIF_RESTORE_SIGMASK);
-       return -ERESTARTNOHAND;
+       regs->rax = -EINTR;
+       while (1) {
+               current->state = TASK_INTERRUPTIBLE;
+               schedule();
+               if (do_signal(regs, &saveset))
+                       return -EINTR;
+       }
 }
 
 asmlinkage long
@@ -502,11 +510,11 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
                current->comm, current->pid, frame, regs->rip, frame->pretcode);
 #endif
 
-       return 0;
+       return 1;
 
 give_sigsegv:
        force_sigsegv(sig, current);
-       return -EFAULT;
+       return 0;
 }
 
 int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
@@ -598,9 +606,9 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                current->comm, current->pid, frame, regs->rip, frame->pretcode);
 #endif
 
-       return 0;
+       return 1;
 
 give_sigsegv:
        force_sigsegv(sig, current);
-       return -EFAULT;
+       return 0;
 }