aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/kernel/machine_kexec_64.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c
index 022d2f613b7b..a0bcec3614e1 100644
--- a/arch/powerpc/kernel/machine_kexec_64.c
+++ b/arch/powerpc/kernel/machine_kexec_64.c
@@ -15,6 +15,7 @@
15#include <linux/thread_info.h> 15#include <linux/thread_info.h>
16#include <linux/init_task.h> 16#include <linux/init_task.h>
17#include <linux/errno.h> 17#include <linux/errno.h>
18#include <linux/kernel.h>
18 19
19#include <asm/page.h> 20#include <asm/page.h>
20#include <asm/current.h> 21#include <asm/current.h>
@@ -184,7 +185,20 @@ static void kexec_prepare_cpus_wait(int wait_state)
184 185
185 hw_breakpoint_disable(); 186 hw_breakpoint_disable();
186 my_cpu = get_cpu(); 187 my_cpu = get_cpu();
187 /* Make sure each CPU has atleast made it to the state we need */ 188 /* Make sure each CPU has at least made it to the state we need.
189 *
190 * FIXME: There is a (slim) chance of a problem if not all of the CPUs
191 * are correctly onlined. If somehow we start a CPU on boot with RTAS
192 * start-cpu, but somehow that CPU doesn't write callin_cpu_map[] in
193 * time, the boot CPU will timeout. If it does eventually execute
194 * stuff, the secondary will start up (paca[].cpu_start was written) and
195 * get into a peculiar state. If the platform supports
196 * smp_ops->take_timebase(), the secondary CPU will probably be spinning
197 * in there. If not (i.e. pseries), the secondary will continue on and
198 * try to online itself/idle/etc. If it survives that, we need to find
199 * these possible-but-not-online-but-should-be CPUs and chaperone them
200 * into kexec_smp_wait().
201 */
188 for_each_online_cpu(i) { 202 for_each_online_cpu(i) {
189 if (i == my_cpu) 203 if (i == my_cpu)
190 continue; 204 continue;
@@ -192,9 +206,9 @@ static void kexec_prepare_cpus_wait(int wait_state)
192 while (paca[i].kexec_state < wait_state) { 206 while (paca[i].kexec_state < wait_state) {
193 barrier(); 207 barrier();
194 if (i != notified) { 208 if (i != notified) {
195 printk( "kexec: waiting for cpu %d (physical" 209 printk(KERN_INFO "kexec: waiting for cpu %d "
196 " %d) to enter %i state\n", 210 "(physical %d) to enter %i state\n",
197 i, paca[i].hw_cpu_id, wait_state); 211 i, paca[i].hw_cpu_id, wait_state);
198 notified = i; 212 notified = i;
199 } 213 }
200 } 214 }
@@ -218,7 +232,10 @@ static void kexec_prepare_cpus(void)
218 if (ppc_md.kexec_cpu_down) 232 if (ppc_md.kexec_cpu_down)
219 ppc_md.kexec_cpu_down(0, 0); 233 ppc_md.kexec_cpu_down(0, 0);
220 234
221 /* Before removing MMU mapings make sure all CPUs have entered real mode */ 235 /*
236 * Before removing MMU mappings make sure all CPUs have entered real
237 * mode:
238 */
222 kexec_prepare_cpus_wait(KEXEC_STATE_REAL_MODE); 239 kexec_prepare_cpus_wait(KEXEC_STATE_REAL_MODE);
223 240
224 put_cpu(); 241 put_cpu();
@@ -287,6 +304,8 @@ void default_machine_kexec(struct kimage *image)
287 if (crashing_cpu == -1) 304 if (crashing_cpu == -1)
288 kexec_prepare_cpus(); 305 kexec_prepare_cpus();
289 306
307 pr_debug("kexec: Starting switchover sequence.\n");
308
290 /* switch to a staticly allocated stack. Based on irq stack code. 309 /* switch to a staticly allocated stack. Based on irq stack code.
291 * XXX: the task struct will likely be invalid once we do the copy! 310 * XXX: the task struct will likely be invalid once we do the copy!
292 */ 311 */