Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

um: print info about fatal segfaults

Print a short info about fatal segfaults like other archs do.

Signed-off-by: Richard Weinberger <richard@nod.at>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Richard Weinberger and committed by
Linus Torvalds
3ef6130a 4ff4d8d3

+24
+24
arch/um/kernel/trap.c
··· 113 113 return 0; 114 114 } 115 115 116 + static void show_segv_info(struct uml_pt_regs *regs) 117 + { 118 + struct task_struct *tsk = current; 119 + struct faultinfo *fi = UPT_FAULTINFO(regs); 120 + 121 + if (!unhandled_signal(tsk, SIGSEGV)) 122 + return; 123 + 124 + if (!printk_ratelimit()) 125 + return; 126 + 127 + printk("%s%s[%d]: segfault at %lx ip %p sp %p error %x", 128 + task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG, 129 + tsk->comm, task_pid_nr(tsk), FAULT_ADDRESS(*fi), 130 + (void *)UPT_IP(regs), (void *)UPT_SP(regs), 131 + fi->error_code); 132 + 133 + print_vma_addr(KERN_CONT " in ", UPT_IP(regs)); 134 + printk(KERN_CONT "\n"); 135 + } 136 + 116 137 static void bad_segv(struct faultinfo fi, unsigned long ip) 117 138 { 118 139 struct siginfo si; ··· 162 141 struct faultinfo * fi = UPT_FAULTINFO(regs); 163 142 164 143 if (UPT_IS_USER(regs) && !SEGV_IS_FIXABLE(fi)) { 144 + show_segv_info(regs); 165 145 bad_segv(*fi, UPT_IP(regs)); 166 146 return; 167 147 } ··· 223 201 panic("Kernel mode fault at addr 0x%lx, ip 0x%lx", 224 202 address, ip); 225 203 } 204 + 205 + show_segv_info(regs); 226 206 227 207 if (err == -EACCES) { 228 208 si.si_signo = SIGBUS;