80
void signal_fault(const char *type, struct pt_regs *regs,
81
void __user *frame, int sig)
83
trace_unhandled_signal(type, regs, (unsigned long)frame, SIGSEGV);
84
force_sigsegv(sig, current);
81
87
/* The assembly shim for this function arranges to ignore the return value. */
82
88
SYSCALL_DEFINE1(rt_sigreturn, struct pt_regs *, regs)
363
368
/* Avoid double syscall restart if there are nested signals. */
364
369
regs->faultnum = INT_SWINT_1_SIGRETURN;
372
int show_unhandled_signals = 1;
374
static int __init crashinfo(char *str)
381
else if (*str != '=' || strict_strtoul(++str, 0, &val) != 0)
383
show_unhandled_signals = val;
384
switch (show_unhandled_signals) {
395
pr_info("%s crash reports will be generated on the console\n", word);
398
__setup("crashinfo", crashinfo);
400
static void dump_mem(void __user *address)
403
enum { region_size = 256, bytes_per_line = 16 };
405
int found_readable_mem = 0;
408
if (!access_ok(VERIFY_READ, address, 1)) {
409
pr_err("Not dumping at address 0x%lx (kernel address)\n",
410
(unsigned long)address);
414
addr = (void __user *)
415
(((unsigned long)address & -bytes_per_line) - region_size/2);
418
for (i = 0; i < region_size;
419
addr += bytes_per_line, i += bytes_per_line) {
420
unsigned char buf[bytes_per_line];
422
if (copy_from_user(buf, addr, bytes_per_line))
424
if (!found_readable_mem) {
425
pr_err("Dumping memory around address 0x%lx:\n",
426
(unsigned long)address);
427
found_readable_mem = 1;
429
j = sprintf(line, REGFMT":", (unsigned long)addr);
430
for (k = 0; k < bytes_per_line; ++k)
431
j += sprintf(&line[j], " %02x", buf[k]);
432
pr_err("%s\n", line);
434
if (!found_readable_mem)
435
pr_err("No readable memory around address 0x%lx\n",
436
(unsigned long)address);
439
void trace_unhandled_signal(const char *type, struct pt_regs *regs,
440
unsigned long address, int sig)
442
struct task_struct *tsk = current;
444
if (show_unhandled_signals == 0)
447
/* If the signal is handled, don't show it here. */
448
if (!is_global_init(tsk)) {
449
void __user *handler =
450
tsk->sighand->action[sig-1].sa.sa_handler;
451
if (handler != SIG_IGN && handler != SIG_DFL)
455
/* Rate-limit the one-line output, not the detailed output. */
456
if (show_unhandled_signals <= 1 && !printk_ratelimit())
459
printk("%s%s[%d]: %s at %lx pc "REGFMT" signal %d",
460
task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG,
461
tsk->comm, task_pid_nr(tsk), type, address, regs->pc, sig);
463
print_vma_addr(KERN_CONT " in ", regs->pc);
465
printk(KERN_CONT "\n");
467
if (show_unhandled_signals > 1) {
473
pr_err("User crash: signal %d,"
474
" trap %ld, address 0x%lx\n",
475
sig, regs->faultnum, address);
477
dump_mem((void __user *)address);
480
pr_err("User crash: signal %d, trap %ld\n",
481
sig, regs->faultnum);