From: Eric W. Biederman Date: Sat, 25 Jun 2005 21:58:00 +0000 (-0700) Subject: [PATCH] kexec: x86 shutdown APICs during crash_shutdown X-Git-Tag: v2.6.13-rc1~68^2~111 X-Git-Url: http://www.pilppa.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=63d30298efc387c72557d11e2a7b467554c05a64;p=linux-2.6-omap-h63xx.git [PATCH] kexec: x86 shutdown APICs during crash_shutdown In the case of a crash/panic an architecture specific function machine_crash_shutdown is called. This patch adds to the x86 machine_crash function the standard kernel code for shutting down apics. Every line of code added to that function increases the risk that we will call code after a kernel panic that is not safe. This patch should not make it to the stable kernel without a being reviewed a lot more. It is unclear how much a hardned kernel can take when it comes to misconfigured apics. So since a normal kernel has problems this patch does a clean shutdown. It is my expectation this patch will be dropped from future generations of the kexec work. But for the moment it is a crutch to keep from breaking everything. Signed-off-by: Eric Biederman Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/arch/i386/kernel/crash.c b/arch/i386/kernel/crash.c index 1bb5dd98d1d..59b92d21746 100644 --- a/arch/i386/kernel/crash.c +++ b/arch/i386/kernel/crash.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #define MAX_NOTE_BYTES 1024 @@ -115,6 +116,7 @@ static int crash_nmi_callback(struct pt_regs *regs, int cpu) { local_irq_disable(); crash_save_this_cpu(regs, cpu); + disable_local_APIC(); atomic_dec(&waiting_for_crash_ipi); /* Assume hlt works */ __asm__("hlt"); @@ -153,6 +155,7 @@ static void nmi_shootdown_cpus(void) } /* Leave the nmi callback set */ + disable_local_APIC(); } #else static void nmi_shootdown_cpus(void) @@ -174,5 +177,9 @@ void machine_crash_shutdown(void) /* The kernel is broken so disable interrupts */ local_irq_disable(); nmi_shootdown_cpus(); + lapic_shutdown(); +#if defined(CONFIG_X86_IO_APIC) + disable_IO_APIC(); +#endif crash_save_self(); }