aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Horman <nhorman@tuxdriver.com>2009-06-17 19:28:17 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-06-18 16:03:59 -0400
commitd6580a9f15238b87e618310c862231ae3f352d2d (patch)
treed7e6c1ed8a0d5fe143e4f5b90dee899be26d54f7
parentc8a06c1ef0bc45915fc45a170c7c60426971304c (diff)
kexec: sysrq: simplify sysrq-c handler
Currently the sysrq-c handler is bit over-engineered. Its behavior is dependent on a few compile time and run time factors that alter its behavior which is really unnecessecary. If CONFIG_KEXEC is not configured, sysrq-c, crashes the system with a NULL pointer dereference. If CONFIG_KEXEC is configured, it calls crash_kexec directly, which implies that the kexec kernel will either be booted (if its been previously loaded), or it will simply do nothing (the no kexec kernel has been loaded). It would be much easier to just simplify the whole thing to dereference a NULL pointer all the time regardless of configuration. That way, it will always try to crash the system, and if a kexec kernel has been loaded into reserved space, it will still boot from the page fault trap handler (assuming panic_on_oops is set appropriately). [akpm@linux-foundation.org: build fix] Signed-off-by: Neil Horman <nhorman@tuxdriver.com> Acked-by: Vivek Goyal <vgoyal@redhat.com> Cc: Brayan Arraes <brayan@yack.com.br> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/char/sysrq.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c
index 39a05b5fa9cb..0db35857e4d8 100644
--- a/drivers/char/sysrq.c
+++ b/drivers/char/sysrq.c
@@ -121,20 +121,17 @@ static struct sysrq_key_op sysrq_unraw_op = {
121#define sysrq_unraw_op (*(struct sysrq_key_op *)0) 121#define sysrq_unraw_op (*(struct sysrq_key_op *)0)
122#endif /* CONFIG_VT */ 122#endif /* CONFIG_VT */
123 123
124#ifdef CONFIG_KEXEC 124static void sysrq_handle_crash(int key, struct tty_struct *tty)
125static void sysrq_handle_crashdump(int key, struct tty_struct *tty)
126{ 125{
127 crash_kexec(get_irq_regs()); 126 char *killer = NULL;
127 *killer = 1;
128} 128}
129static struct sysrq_key_op sysrq_crashdump_op = { 129static struct sysrq_key_op sysrq_crashdump_op = {
130 .handler = sysrq_handle_crashdump, 130 .handler = sysrq_handle_crash,
131 .help_msg = "Crashdump", 131 .help_msg = "Crash",
132 .action_msg = "Trigger a crashdump", 132 .action_msg = "Trigger a crash",
133 .enable_mask = SYSRQ_ENABLE_DUMP, 133 .enable_mask = SYSRQ_ENABLE_DUMP,
134}; 134};
135#else
136#define sysrq_crashdump_op (*(struct sysrq_key_op *)0)
137#endif
138 135
139static void sysrq_handle_reboot(int key, struct tty_struct *tty) 136static void sysrq_handle_reboot(int key, struct tty_struct *tty)
140{ 137{