]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/ia64/kernel/signal.c
Merge with /shiny/git/linux-2.6/.git
[karo-tx-linux.git] / arch / ia64 / kernel / signal.c
index 6455574187257c5bb858a1926fce98bd29d2e41d..b8a0a7d257a9b3f427561faadb6d98eaf7b4648f 100644 (file)
@@ -94,7 +94,7 @@ sys_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, long arg2,
 static long
 restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
 {
-       unsigned long ip, flags, nat, um, cfm;
+       unsigned long ip, flags, nat, um, cfm, rsc;
        long err;
 
        /* Always make any pending restarted system calls return -EINTR */
@@ -106,7 +106,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
        err |= __get_user(ip, &sc->sc_ip);                      /* instruction pointer */
        err |= __get_user(cfm, &sc->sc_cfm);
        err |= __get_user(um, &sc->sc_um);                      /* user mask */
-       err |= __get_user(scr->pt.ar_rsc, &sc->sc_ar_rsc);
+       err |= __get_user(rsc, &sc->sc_ar_rsc);
        err |= __get_user(scr->pt.ar_unat, &sc->sc_ar_unat);
        err |= __get_user(scr->pt.ar_fpsr, &sc->sc_ar_fpsr);
        err |= __get_user(scr->pt.ar_pfs, &sc->sc_ar_pfs);
@@ -119,6 +119,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
        err |= __copy_from_user(&scr->pt.r15, &sc->sc_gr[15], 8);       /* r15 */
 
        scr->pt.cr_ifs = cfm | (1UL << 63);
+       scr->pt.ar_rsc = rsc | (3 << 2); /* force PL3 */
 
        /* establish new instruction pointer: */
        scr->pt.cr_iip = ip & ~0x3UL;
@@ -142,6 +143,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
 
                __copy_from_user(current->thread.fph, &sc->sc_fr[32], 96*16);
                psr->mfh = 0;   /* drop signal handler's fph contents... */
+               preempt_disable();
                if (psr->dfh)
                        ia64_drop_fpu(current);
                else {
@@ -149,6 +151,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
                        __ia64_load_fpu(current->thread.fph);
                        ia64_set_local_fpu_owner(current);
                }
+               preempt_enable();
        }
        return err;
 }
@@ -224,7 +227,7 @@ ia64_rt_sigreturn (struct sigscratch *scr)
         * could be corrupted.
         */
        retval = (long) &ia64_leave_kernel;
-       if (test_thread_flag(TIF_SYSCALL_TRACE) 
+       if (test_thread_flag(TIF_SYSCALL_TRACE)
            || test_thread_flag(TIF_SYSCALL_AUDIT))
                /*
                 * strace expects to be notified after sigreturn returns even though the