vserver 1.9.5.x5
[linux-2.6.git] / arch / mips / kernel / irixsig.c
index 15ae6af..298af99 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/smp_lock.h>
 #include <linux/time.h>
 #include <linux/ptrace.h>
-#include <linux/suspend.h>
 
 #include <asm/ptrace.h>
 #include <asm/uaccess.h>
@@ -100,7 +99,7 @@ static void setup_irix_frame(struct k_sigaction *ka, struct pt_regs *regs,
        __put_user((u64) regs->hi, &ctx->hi);
        __put_user((u64) regs->lo, &ctx->lo);
        __put_user((u64) regs->cp0_epc, &ctx->pc);
-       __put_user(current->used_math, &ctx->usedfp);
+       __put_user(!!used_math(), &ctx->usedfp);
        __put_user((u64) regs->cp0_cause, &ctx->cp0_cause);
        __put_user((u64) regs->cp0_badvaddr, &ctx->cp0_badvaddr);
 
@@ -133,10 +132,8 @@ setup_irix_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,
 }
 
 static inline void handle_signal(unsigned long sig, siginfo_t *info,
-       sigset_t *oldset, struct pt_regs * regs)
+       struct k_sigaction *ka, sigset_t *oldset, struct pt_regs * regs)
 {
-       struct k_sigaction *ka = &current->sighand->action[sig-1];
-
        switch(regs->regs[0]) {
        case ERESTARTNOHAND:
                regs->regs[2] = EINTR;
@@ -158,8 +155,6 @@ static inline void handle_signal(unsigned long sig, siginfo_t *info,
        else
                setup_irix_frame(ka, regs, sig, oldset);
 
-       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);
@@ -171,6 +166,7 @@ static inline void handle_signal(unsigned long sig, siginfo_t *info,
 
 asmlinkage int do_irix_signal(sigset_t *oldset, struct pt_regs *regs)
 {
+       struct k_sigaction ka;
        siginfo_t info;
        int signr;
 
@@ -182,17 +178,15 @@ asmlinkage int do_irix_signal(sigset_t *oldset, struct pt_regs *regs)
        if (!user_mode(regs))
                return 1;
 
-       if (current->flags & PF_FREEZE) {
-               refrigerator(0);
+       if (try_to_freeze(0))
                goto no_signal;
-       }
 
        if (!oldset)
                oldset = &current->blocked;
 
-       signr = get_signal_to_deliver(&info, regs, NULL);
+       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
        if (signr > 0) {
-               handle_signal(signr, &info, oldset, regs);
+               handle_signal(signr, &info, &ka, oldset, regs);
                return 1;
        }
 
@@ -543,9 +537,9 @@ out:
 }
 
 /* This is here because of irix5_siginfo definition. */
-#define P_PID    0
-#define P_PGID   2
-#define P_ALL    7
+#define IRIX_P_PID    0
+#define IRIX_P_PGID   2
+#define IRIX_P_ALL    7
 
 extern int getrusage(struct task_struct *, int, struct rusage __user *);
 
@@ -582,11 +576,11 @@ asmlinkage int irix_waitsys(int type, int pid, struct irix5_siginfo *info,
                retval = -EINVAL;
                goto out;
        }
-       if (type != P_PID && type != P_PGID && type != P_ALL) {
+       if (type != IRIX_P_PID && type != IRIX_P_PGID && type != IRIX_P_ALL) {
                retval = -EINVAL;
                goto out;
        }
-       add_wait_queue(&current->wait_chldexit, &wait);
+       add_wait_queue(&current->signal->wait_chldexit, &wait);
 repeat:
        flag = 0;
        current->state = TASK_INTERRUPTIBLE;
@@ -594,9 +588,9 @@ repeat:
        tsk = current;
        list_for_each(_p,&tsk->children) {
                p = list_entry(_p,struct task_struct,sibling);
-               if ((type == P_PID) && p->pid != pid)
+               if ((type == IRIX_P_PID) && p->pid != pid)
                        continue;
-               if ((type == P_PGID) && process_group(p) != pid)
+               if ((type == IRIX_P_PGID) && process_group(p) != pid)
                        continue;
                if ((p->exit_signal != SIGCHLD))
                        continue;
@@ -630,9 +624,9 @@ repeat:
                        }
                        goto end_waitsys;
 
-               case TASK_ZOMBIE:
-                       current->cutime += p->utime + p->cutime;
-                       current->cstime += p->stime + p->cstime;
+               case EXIT_ZOMBIE:
+                       current->signal->cutime += p->utime + p->signal->cutime;
+                       current->signal->cstime += p->stime + p->signal->cstime;
                        if (ru != NULL)
                                getrusage(p, RUSAGE_BOTH, ru);
                        __put_user(SIGCHLD, &info->sig);
@@ -675,7 +669,7 @@ repeat:
        retval = -ECHILD;
 end_waitsys:
        current->state = TASK_RUNNING;
-       remove_wait_queue(&current->wait_chldexit, &wait);
+       remove_wait_queue(&current->signal->wait_chldexit, &wait);
 
 out:
        return retval;
@@ -731,7 +725,7 @@ asmlinkage int irix_getcontext(struct pt_regs *regs)
        __put_user(regs->cp0_epc, &ctx->regs[35]);
 
        flags = 0x0f;
-       if(!current->used_math) {
+       if(!used_math()) {
                flags &= ~(0x08);
        } else {
                /* XXX wheee... */