machine_kexec.c revision f481f1edee77b3d623457685add1c6b507c25d6f
1/*
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
17void machine_crash_shutdown(struct pt_regs *regs)
18{
19	if (ppc_md.machine_crash_shutdown)
20		ppc_md.machine_crash_shutdown(regs);
21}
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}
62