diff options
Diffstat (limited to 'kernel/signal.c')
| -rw-r--r-- | kernel/signal.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index f9405609774e..39d122753bac 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
| @@ -718,6 +718,37 @@ out_set: | |||
| 718 | #define LEGACY_QUEUE(sigptr, sig) \ | 718 | #define LEGACY_QUEUE(sigptr, sig) \ |
| 719 | (((sig) < SIGRTMIN) && sigismember(&(sigptr)->signal, (sig))) | 719 | (((sig) < SIGRTMIN) && sigismember(&(sigptr)->signal, (sig))) |
| 720 | 720 | ||
| 721 | int print_fatal_signals; | ||
| 722 | |||
| 723 | static void print_fatal_signal(struct pt_regs *regs, int signr) | ||
| 724 | { | ||
| 725 | printk("%s/%d: potentially unexpected fatal signal %d.\n", | ||
| 726 | current->comm, current->pid, signr); | ||
| 727 | |||
| 728 | #ifdef __i386__ | ||
| 729 | printk("code at %08lx: ", regs->eip); | ||
| 730 | { | ||
| 731 | int i; | ||
| 732 | for (i = 0; i < 16; i++) { | ||
| 733 | unsigned char insn; | ||
| 734 | |||
| 735 | __get_user(insn, (unsigned char *)(regs->eip + i)); | ||
| 736 | printk("%02x ", insn); | ||
| 737 | } | ||
| 738 | } | ||
| 739 | #endif | ||
| 740 | printk("\n"); | ||
| 741 | show_regs(regs); | ||
| 742 | } | ||
| 743 | |||
| 744 | static int __init setup_print_fatal_signals(char *str) | ||
| 745 | { | ||
| 746 | get_option (&str, &print_fatal_signals); | ||
| 747 | |||
| 748 | return 1; | ||
| 749 | } | ||
| 750 | |||
| 751 | __setup("print-fatal-signals=", setup_print_fatal_signals); | ||
| 721 | 752 | ||
| 722 | static int | 753 | static int |
| 723 | specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t) | 754 | specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t) |
| @@ -1855,6 +1886,8 @@ relock: | |||
| 1855 | * Anything else is fatal, maybe with a core dump. | 1886 | * Anything else is fatal, maybe with a core dump. |
| 1856 | */ | 1887 | */ |
| 1857 | current->flags |= PF_SIGNALED; | 1888 | current->flags |= PF_SIGNALED; |
| 1889 | if ((signr != SIGKILL) && print_fatal_signals) | ||
| 1890 | print_fatal_signal(regs, signr); | ||
| 1858 | if (sig_kernel_coredump(signr)) { | 1891 | if (sig_kernel_coredump(signr)) { |
| 1859 | /* | 1892 | /* |
| 1860 | * If it was able to dump core, this kills all | 1893 | * If it was able to dump core, this kills all |
