aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhileas Fogg <phileas-fogg@mail.ru>2013-02-22 18:32:19 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2013-02-23 11:49:28 -0500
commit8520e443aa56cc157b015205ea53e7b9fc831291 (patch)
tree8458559715449fbd77e09c1f52954602e944e49a
parentdffff02a6b10f25f879e1e523733770c0a492e76 (diff)
powerpc/kexec: Disable hard IRQ before kexec
Disable hard IRQ before kexec a new kernel image. Not doing it can result in corrupted data in the memory segments reserved for the new kernel. Signed-off-by: Phileas Fogg <phileas-fogg@mail.ru> CC: <stable@vger.kernel.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r--arch/powerpc/kernel/machine_kexec_64.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c
index 7206701b1ff1..466a2908bb63 100644
--- a/arch/powerpc/kernel/machine_kexec_64.c
+++ b/arch/powerpc/kernel/machine_kexec_64.c
@@ -162,6 +162,8 @@ static int kexec_all_irq_disabled = 0;
162static void kexec_smp_down(void *arg) 162static void kexec_smp_down(void *arg)
163{ 163{
164 local_irq_disable(); 164 local_irq_disable();
165 hard_irq_disable();
166
165 mb(); /* make sure our irqs are disabled before we say they are */ 167 mb(); /* make sure our irqs are disabled before we say they are */
166 get_paca()->kexec_state = KEXEC_STATE_IRQS_OFF; 168 get_paca()->kexec_state = KEXEC_STATE_IRQS_OFF;
167 while(kexec_all_irq_disabled == 0) 169 while(kexec_all_irq_disabled == 0)
@@ -244,6 +246,8 @@ static void kexec_prepare_cpus(void)
244 wake_offline_cpus(); 246 wake_offline_cpus();
245 smp_call_function(kexec_smp_down, NULL, /* wait */0); 247 smp_call_function(kexec_smp_down, NULL, /* wait */0);
246 local_irq_disable(); 248 local_irq_disable();
249 hard_irq_disable();
250
247 mb(); /* make sure IRQs are disabled before we say they are */ 251 mb(); /* make sure IRQs are disabled before we say they are */
248 get_paca()->kexec_state = KEXEC_STATE_IRQS_OFF; 252 get_paca()->kexec_state = KEXEC_STATE_IRQS_OFF;
249 253
@@ -281,6 +285,7 @@ static void kexec_prepare_cpus(void)
281 if (ppc_md.kexec_cpu_down) 285 if (ppc_md.kexec_cpu_down)
282 ppc_md.kexec_cpu_down(0, 0); 286 ppc_md.kexec_cpu_down(0, 0);
283 local_irq_disable(); 287 local_irq_disable();
288 hard_irq_disable();
284} 289}
285 290
286#endif /* SMP */ 291#endif /* SMP */