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