{
        struct rt_sigframe __user *rt_sf;
        struct mcontext __user *frame;
+       void __user *addr;
        unsigned long newsp = 0;
 
        /* Set up Signal Frame */
        /* Put a Real Time Context onto stack */
        rt_sf = get_sigframe(ka, regs, sizeof(*rt_sf));
+       addr = rt_sf;
        if (unlikely(rt_sf == NULL))
                goto badframe;
 
 
        /* Save user registers on the stack */
        frame = &rt_sf->uc.uc_mcontext;
+       addr = frame;
        if (vdso32_rt_sigtramp && current->mm->context.vdso_base) {
                if (save_user_regs(regs, frame, 0))
                        goto badframe;
 
        /* create a stack frame for the caller of the handler */
        newsp = ((unsigned long)rt_sf) - (__SIGNAL_FRAMESIZE + 16);
+       addr = (void __user *)regs->gpr[1];
        if (put_user(regs->gpr[1], (u32 __user *)newsp))
                goto badframe;
 
        printk("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n",
               regs, frame, newsp);
 #endif
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(KERN_INFO "%s[%d]: bad frame in handle_rt_signal32: "
+                       "%p nip %08lx lr %08lx\n",
+                       current->comm, current->pid,
+                       addr, regs->nip, regs->link);
+
        force_sigsegv(sig, current);
        return 0;
 }
        return 0;
 
  bad:
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(KERN_INFO "%s[%d]: bad frame in sys_rt_sigreturn: "
+                       "%p nip %08lx lr %08lx\n",
+                       current->comm, current->pid,
+                       rt_sf, regs->nip, regs->link);
+
        force_sig(SIGSEGV, current);
        return 0;
 }
         * We kill the task with a SIGSEGV in this situation.
         */
        if (do_setcontext(ctx, regs, 1)) {
+               if (show_unhandled_signals && printk_ratelimit())
+                       printk(KERN_INFO "%s[%d]: bad frame in "
+                               "sys_debug_setcontext: %p nip %08lx "
+                               "lr %08lx\n",
+                               current->comm, current->pid,
+                               ctx, regs->nip, regs->link);
+
                force_sig(SIGSEGV, current);
                goto out;
        }
        printk("badframe in handle_signal, regs=%p frame=%p newsp=%lx\n",
               regs, frame, newsp);
 #endif
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(KERN_INFO "%s[%d]: bad frame in handle_signal32: "
+                       "%p nip %08lx lr %08lx\n",
+                       current->comm, current->pid,
+                       frame, regs->nip, regs->link);
+
        force_sigsegv(sig, current);
        return 0;
 }
        struct sigcontext __user *sc;
        struct sigcontext sigctx;
        struct mcontext __user *sr;
+       void __user *addr;
        sigset_t set;
 
        /* Always make any pending restarted system calls return -EINTR */
        current_thread_info()->restart_block.fn = do_no_restart_syscall;
 
        sc = (struct sigcontext __user *)(regs->gpr[1] + __SIGNAL_FRAMESIZE);
+       addr = sc;
        if (copy_from_user(&sigctx, sc, sizeof(sigctx)))
                goto badframe;
 
        restore_sigmask(&set);
 
        sr = (struct mcontext __user *)from_user_ptr(sigctx.regs);
+       addr = sr;
        if (!access_ok(VERIFY_READ, sr, sizeof(*sr))
            || restore_user_regs(regs, sr, 1))
                goto badframe;
        return 0;
 
 badframe:
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(KERN_INFO "%s[%d]: bad frame in sys_sigreturn: "
+                       "%p nip %08lx lr %08lx\n",
+                       current->comm, current->pid,
+                       addr, regs->nip, regs->link);
+
        force_sig(SIGSEGV, current);
        return 0;
 }
 
        char abigap[288];
 } __attribute__ ((aligned (16)));
 
+static const char fmt32[] = KERN_INFO \
+       "%s[%d]: bad frame in %s: %08lx nip %08lx lr %08lx\n";
+static const char fmt64[] = KERN_INFO \
+       "%s[%d]: bad frame in %s: %016lx nip %016lx lr %016lx\n";
+
 /*
  * Set up the sigcontext for the signal frame.
  */
        printk("badframe in sys_rt_sigreturn, regs=%p uc=%p &uc->uc_mcontext=%p\n",
               regs, uc, &uc->uc_mcontext);
 #endif
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(regs->msr & MSR_SF ? fmt64 : fmt32,
+                       current->comm, current->pid, "rt_sigreturn",
+                       (long)uc, regs->nip, regs->link);
+
        force_sig(SIGSEGV, current);
        return 0;
 }
        printk("badframe in setup_rt_frame, regs=%p frame=%p newsp=%lx\n",
               regs, frame, newsp);
 #endif
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(regs->msr & MSR_SF ? fmt64 : fmt32,
+                       current->comm, current->pid, "setup_rt_frame",
+                       (long)frame, regs->nip, regs->link);
+
        force_sigsegv(signr, current);
        return 0;
 }
 
 void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
 {
        siginfo_t info;
+       const char fmt32[] = KERN_INFO "%s[%d]: unhandled signal %d " \
+                       "at %08lx nip %08lx lr %08lx code %x\n";
+       const char fmt64[] = KERN_INFO "%s[%d]: unhandled signal %d " \
+                       "at %016lx nip %016lx lr %016lx code %x\n";
 
        if (!user_mode(regs)) {
                if (die("Exception in kernel mode", regs, signr))
                        return;
-       }
+       } else if (show_unhandled_signals &&
+                   unhandled_signal(current, signr) &&
+                   printk_ratelimit()) {
+                       printk(regs->msr & MSR_SF ? fmt64 : fmt32,
+                               current->comm, current->pid, signr,
+                               addr, regs->nip, regs->link, code);
+               }
 
        memset(&info, 0, sizeof(info));
        info.si_signo = signr;