/* too late to fail here */ void default_machine_kexec(struct kimage *image) { /* prepare control code if any */ /* * If the kexec boot is the normal one, need to shutdown other cpus * into our wait loop and quiesce interrupts. * Otherwise, in the case of crashed mode (crashing_cpu >= 0), * stopping other CPUs and collecting their pt_regs is done before * using debugger IPI. */ if (crashing_cpu == -1) kexec_prepare_cpus(); /* switch to a staticly allocated stack. Based on irq stack code. * XXX: the task struct will likely be invalid once we do the copy! */ kexec_stack.thread_info.task = current_thread_info()->task; kexec_stack.thread_info.flags = 0; /* Some things are best done in assembly. Finding globals with * a toc is easier in C, so pass in what we can. */ kexec_sequence(&kexec_stack, image->start, image, page_address(image->control_code_page), ppc_md.hpte_clear_all); /* NOTREACHED */ }
/* too late to fail here */ void default_machine_kexec(struct kimage *image) { /* prepare control code if any */ /* * If the kexec boot is the normal one, need to shutdown other cpus * into our wait loop and quiesce interrupts. * Otherwise, in the case of crashed mode (crashing_cpu >= 0), * stopping other CPUs and collecting their pt_regs is done before * using debugger IPI. */ if (crashing_cpu == -1) kexec_prepare_cpus(); pr_debug("kexec: Starting switchover sequence.\n"); /* switch to a staticly allocated stack. Based on irq stack code. * XXX: the task struct will likely be invalid once we do the copy! */ kexec_stack.thread_info.task = current_thread_info()->task; kexec_stack.thread_info.flags = 0; /* We need a static PACA, too; copy this CPU's PACA over and switch to * it. Also poison per_cpu_offset to catch anyone using non-static * data. */ memcpy(&kexec_paca, get_paca(), sizeof(struct paca_struct)); kexec_paca.data_offset = 0xedeaddeadeeeeeeeUL; paca = (struct paca_struct *)RELOC_HIDE(&kexec_paca, 0) - kexec_paca.paca_index; setup_paca(&kexec_paca); /* XXX: If anyone does 'dynamic lppacas' this will also need to be * switched to a static version! */ /* Some things are best done in assembly. Finding globals with * a toc is easier in C, so pass in what we can. */ kexec_sequence(&kexec_stack, image->start, image, page_address(image->control_code_page), ppc_md.hpte_clear_all); /* NOTREACHED */ }