|
@@ -35,6 +35,7 @@
|
|
|
#include <linux/spinlock.h>
|
|
|
#include <linux/vt_kern.h>
|
|
|
#include <linux/workqueue.h>
|
|
|
+#include <linux/kexec.h>
|
|
|
|
|
|
#include <asm/ptrace.h>
|
|
|
|
|
@@ -94,6 +95,21 @@ static struct sysrq_key_op sysrq_unraw_op = {
|
|
|
};
|
|
|
#endif /* CONFIG_VT */
|
|
|
|
|
|
+#ifdef CONFIG_KEXEC
|
|
|
+/* crashdump sysrq handler */
|
|
|
+static void sysrq_handle_crashdump(int key, struct pt_regs *pt_regs,
|
|
|
+ struct tty_struct *tty)
|
|
|
+{
|
|
|
+ crash_kexec();
|
|
|
+}
|
|
|
+static struct sysrq_key_op sysrq_crashdump_op = {
|
|
|
+ .handler = sysrq_handle_crashdump,
|
|
|
+ .help_msg = "Crashdump",
|
|
|
+ .action_msg = "Trigger a crashdump",
|
|
|
+ .enable_mask = SYSRQ_ENABLE_DUMP,
|
|
|
+};
|
|
|
+#endif
|
|
|
+
|
|
|
/* reboot sysrq handler */
|
|
|
static void sysrq_handle_reboot(int key, struct pt_regs *pt_regs,
|
|
|
struct tty_struct *tty)
|
|
@@ -273,8 +289,12 @@ static struct sysrq_key_op *sysrq_key_table[SYSRQ_KEY_TABLE_LENGTH] = {
|
|
|
it is handled specially on the sparc
|
|
|
and will never arrive */
|
|
|
/* b */ &sysrq_reboot_op,
|
|
|
-/* c */ NULL,
|
|
|
-/* d */ NULL,
|
|
|
+#ifdef CONFIG_KEXEC
|
|
|
+/* c */ &sysrq_crashdump_op,
|
|
|
+#else
|
|
|
+/* c */ NULL,
|
|
|
+#endif
|
|
|
+/* d */ NULL,
|
|
|
/* e */ &sysrq_term_op,
|
|
|
/* f */ &sysrq_moom_op,
|
|
|
/* g */ NULL,
|