Linux Audio

Check our new training course

Open-source upstreaming

Need help get the support for your hardware in upstream Linux?
Loading...
Note: File does not exist in v3.1.
 1// SPDX-License-Identifier: GPL-2.0
 2/*
 3 * machine_kexec.c - handle transition of Linux booting another kernel
 4 */
 5#include <linux/compiler.h>
 6#include <linux/kexec.h>
 7#include <linux/mm.h>
 8#include <linux/delay.h>
 9
10#include <asm/cacheflush.h>
11#include <asm/page.h>
12#include <asm/setup.h>
13
14extern const unsigned char relocate_new_kernel[];
15extern const size_t relocate_new_kernel_size;
16
17int machine_kexec_prepare(struct kimage *kimage)
18{
19	return 0;
20}
21
22void machine_kexec_cleanup(struct kimage *kimage)
23{
24}
25
26void machine_shutdown(void)
27{
28}
29
30void machine_crash_shutdown(struct pt_regs *regs)
31{
32}
33
34typedef void (*relocate_kernel_t)(unsigned long ptr,
35				  unsigned long start,
36				  unsigned long cpu_mmu_flags) __noreturn;
37
38void machine_kexec(struct kimage *image)
39{
40	void *reboot_code_buffer;
41	unsigned long cpu_mmu_flags;
42
43	reboot_code_buffer = page_address(image->control_code_page);
44
45	memcpy(reboot_code_buffer, relocate_new_kernel,
46	       relocate_new_kernel_size);
47
48	/*
49	 * we do not want to be bothered.
50	 */
51	local_irq_disable();
52
53	pr_info("Will call new kernel at 0x%08lx. Bye...\n", image->start);
54	__flush_cache_all();
55	cpu_mmu_flags = m68k_cputype | m68k_mmutype << 8;
56	((relocate_kernel_t) reboot_code_buffer)(image->head & PAGE_MASK,
57						 image->start,
58						 cpu_mmu_flags);
59}