MIPS: Use per-mm page to execute branch delay slot instructions
[cascardo/linux.git] / arch / mips / kernel / signal.c
index ab04229..9383635 100644 (file)
@@ -770,15 +770,15 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
        sigset_t *oldset = sigmask_to_save();
        int ret;
        struct mips_abi *abi = current->thread.abi;
-#ifdef CONFIG_CPU_MICROMIPS
-       void *vdso;
-       unsigned long tmp = (unsigned long)current->mm->context.vdso;
-
-       set_isa16_mode(tmp);
-       vdso = (void *)tmp;
-#else
        void *vdso = current->mm->context.vdso;
-#endif
+
+       /*
+        * If we were emulating a delay slot instruction, exit that frame such
+        * that addresses in the sigframe are as expected for userland and we
+        * don't have a problem if we reuse the thread's frame for an
+        * instruction within the signal handler.
+        */
+       dsemul_thread_rollback(regs);
 
        if (regs->regs[0]) {
                switch(regs->regs[2]) {