diff options
Diffstat (limited to 'kernel/panic.c')
-rw-r--r-- | kernel/panic.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/kernel/panic.c b/kernel/panic.c index d10c340c43b0..f121e6ba7e11 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
@@ -46,6 +46,13 @@ int panic_on_warn __read_mostly; | |||
46 | int panic_timeout = CONFIG_PANIC_TIMEOUT; | 46 | int panic_timeout = CONFIG_PANIC_TIMEOUT; |
47 | EXPORT_SYMBOL_GPL(panic_timeout); | 47 | EXPORT_SYMBOL_GPL(panic_timeout); |
48 | 48 | ||
49 | #define PANIC_PRINT_TASK_INFO 0x00000001 | ||
50 | #define PANIC_PRINT_MEM_INFO 0x00000002 | ||
51 | #define PANIC_PRINT_TIMER_INFO 0x00000004 | ||
52 | #define PANIC_PRINT_LOCK_INFO 0x00000008 | ||
53 | #define PANIC_PRINT_FTRACE_INFO 0x00000010 | ||
54 | unsigned long panic_print; | ||
55 | |||
49 | ATOMIC_NOTIFIER_HEAD(panic_notifier_list); | 56 | ATOMIC_NOTIFIER_HEAD(panic_notifier_list); |
50 | 57 | ||
51 | EXPORT_SYMBOL(panic_notifier_list); | 58 | EXPORT_SYMBOL(panic_notifier_list); |
@@ -125,6 +132,24 @@ void nmi_panic(struct pt_regs *regs, const char *msg) | |||
125 | } | 132 | } |
126 | EXPORT_SYMBOL(nmi_panic); | 133 | EXPORT_SYMBOL(nmi_panic); |
127 | 134 | ||
135 | static void panic_print_sys_info(void) | ||
136 | { | ||
137 | if (panic_print & PANIC_PRINT_TASK_INFO) | ||
138 | show_state(); | ||
139 | |||
140 | if (panic_print & PANIC_PRINT_MEM_INFO) | ||
141 | show_mem(0, NULL); | ||
142 | |||
143 | if (panic_print & PANIC_PRINT_TIMER_INFO) | ||
144 | sysrq_timer_list_show(); | ||
145 | |||
146 | if (panic_print & PANIC_PRINT_LOCK_INFO) | ||
147 | debug_show_all_locks(); | ||
148 | |||
149 | if (panic_print & PANIC_PRINT_FTRACE_INFO) | ||
150 | ftrace_dump(DUMP_ALL); | ||
151 | } | ||
152 | |||
128 | /** | 153 | /** |
129 | * panic - halt the system | 154 | * panic - halt the system |
130 | * @fmt: The text string to print | 155 | * @fmt: The text string to print |
@@ -254,6 +279,8 @@ void panic(const char *fmt, ...) | |||
254 | debug_locks_off(); | 279 | debug_locks_off(); |
255 | console_flush_on_panic(); | 280 | console_flush_on_panic(); |
256 | 281 | ||
282 | panic_print_sys_info(); | ||
283 | |||
257 | if (!panic_blink) | 284 | if (!panic_blink) |
258 | panic_blink = no_blink; | 285 | panic_blink = no_blink; |
259 | 286 | ||
@@ -658,6 +685,7 @@ void refcount_error_report(struct pt_regs *regs, const char *err) | |||
658 | #endif | 685 | #endif |
659 | 686 | ||
660 | core_param(panic, panic_timeout, int, 0644); | 687 | core_param(panic, panic_timeout, int, 0644); |
688 | core_param(panic_print, panic_print, ulong, 0644); | ||
661 | core_param(pause_on_oops, pause_on_oops, int, 0644); | 689 | core_param(pause_on_oops, pause_on_oops, int, 0644); |
662 | core_param(panic_on_warn, panic_on_warn, int, 0644); | 690 | core_param(panic_on_warn, panic_on_warn, int, 0644); |
663 | core_param(crash_kexec_post_notifiers, crash_kexec_post_notifiers, bool, 0644); | 691 | core_param(crash_kexec_post_notifiers, crash_kexec_post_notifiers, bool, 0644); |