Merge branch 'integration' into for-linus
[firefly-linux-kernel-4.4.55.git] / arch / um / kernel / trap.c
index 637c6505dc00de1ce482335023bff8227aedaaa1..8c7b8823d1f0e1257f3a410620048bbd3556d95b 100644 (file)
@@ -113,6 +113,27 @@ out_of_memory:
        return 0;
 }
 
+static void show_segv_info(struct uml_pt_regs *regs)
+{
+       struct task_struct *tsk = current;
+       struct faultinfo *fi = UPT_FAULTINFO(regs);
+
+       if (!unhandled_signal(tsk, SIGSEGV))
+               return;
+
+       if (!printk_ratelimit())
+               return;
+
+       printk("%s%s[%d]: segfault at %lx ip %p sp %p error %x",
+               task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG,
+               tsk->comm, task_pid_nr(tsk), FAULT_ADDRESS(*fi),
+               (void *)UPT_IP(regs), (void *)UPT_SP(regs),
+               fi->error_code);
+
+       print_vma_addr(KERN_CONT " in ", UPT_IP(regs));
+       printk(KERN_CONT "\n");
+}
+
 static void bad_segv(struct faultinfo fi, unsigned long ip)
 {
        struct siginfo si;
@@ -141,6 +162,7 @@ void segv_handler(int sig, struct uml_pt_regs *regs)
        struct faultinfo * fi = UPT_FAULTINFO(regs);
 
        if (UPT_IS_USER(regs) && !SEGV_IS_FIXABLE(fi)) {
+               show_segv_info(regs);
                bad_segv(*fi, UPT_IP(regs));
                return;
        }
@@ -202,6 +224,8 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user,
                      address, ip);
        }
 
+       show_segv_info(regs);
+
        if (err == -EACCES) {
                si.si_signo = SIGBUS;
                si.si_errno = 0;