blob: a81ca1b841ec89a0c5eff398b676dac5a3ae85fc [file] [log] [blame]
Michael Ellerman3d1229d2005-11-14 23:35:00 +11001/*
2 * Code to handle transition of Linux booting another kernel.
3 *
4 * Copyright (C) 2002-2003 Eric Biederman <ebiederm@xmission.com>
5 * GameCube/ppc32 port Copyright (C) 2004 Albert Herranz
6 * Copyright (C) 2005 IBM Corporation.
7 *
8 * This source code is licensed under the GNU General Public License,
9 * Version 2. See the file COPYING for more details.
10 */
11
12#include <linux/kexec.h>
13#include <linux/reboot.h>
14#include <linux/threads.h>
15#include <asm/machdep.h>
16
Michael Ellerman3d1229d2005-11-14 23:35:00 +110017void machine_crash_shutdown(struct pt_regs *regs)
18{
19 if (ppc_md.machine_crash_shutdown)
Michael Ellermancd0ca2c2005-12-04 18:39:12 +110020 ppc_md.machine_crash_shutdown(regs);
Michael Ellerman3d1229d2005-11-14 23:35:00 +110021}
22
23/*
24 * Do what every setup is needed on image and the
25 * reboot code buffer to allow us to avoid allocations
26 * later.
27 */
28int machine_kexec_prepare(struct kimage *image)
29{
30 if (ppc_md.machine_kexec_prepare)
31 return ppc_md.machine_kexec_prepare(image);
32 /*
33 * Fail if platform doesn't provide its own machine_kexec_prepare
34 * implementation.
35 */
36 return -ENOSYS;
37}
38
39void machine_kexec_cleanup(struct kimage *image)
40{
41 if (ppc_md.machine_kexec_cleanup)
42 ppc_md.machine_kexec_cleanup(image);
43}
44
45/*
46 * Do not allocate memory (or fail in any way) in machine_kexec().
47 * We are past the point of no return, committed to rebooting now.
48 */
49NORET_TYPE void machine_kexec(struct kimage *image)
50{
51 if (ppc_md.machine_kexec)
52 ppc_md.machine_kexec(image);
53 else {
54 /*
55 * Fall back to normal restart if platform doesn't provide
56 * its own kexec function, and user insist to kexec...
57 */
58 machine_restart(NULL);
59 }
60 for(;;);
61}