Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
[linux-2.6] / arch / powerpc / kernel / machine_kexec.c
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
17 /*
18  * Provide a dummy crash_notes definition until crash dump is implemented.
19  * This prevents breakage of crash_notes attribute in kernel/ksysfs.c.
20  */
21 note_buf_t crash_notes[NR_CPUS];
22
23 void machine_crash_shutdown(struct pt_regs *regs)
24 {
25         if (ppc_md.machine_crash_shutdown)
26                 ppc_md.machine_crash_shutdown(regs);
27 }
28
29 /*
30  * Do what every setup is needed on image and the
31  * reboot code buffer to allow us to avoid allocations
32  * later.
33  */
34 int machine_kexec_prepare(struct kimage *image)
35 {
36         if (ppc_md.machine_kexec_prepare)
37                 return ppc_md.machine_kexec_prepare(image);
38         /*
39          * Fail if platform doesn't provide its own machine_kexec_prepare
40          * implementation.
41          */
42         return -ENOSYS;
43 }
44
45 void machine_kexec_cleanup(struct kimage *image)
46 {
47         if (ppc_md.machine_kexec_cleanup)
48                 ppc_md.machine_kexec_cleanup(image);
49 }
50
51 /*
52  * Do not allocate memory (or fail in any way) in machine_kexec().
53  * We are past the point of no return, committed to rebooting now.
54  */
55 NORET_TYPE void machine_kexec(struct kimage *image)
56 {
57         if (ppc_md.machine_kexec)
58                 ppc_md.machine_kexec(image);
59         else {
60                 /*
61                  * Fall back to normal restart if platform doesn't provide
62                  * its own kexec function, and user insist to kexec...
63                  */
64                 machine_restart(NULL);
65         }
66         for(;;);
67 }