diff options
Diffstat (limited to 'arch/m68k/kernel/machine_kexec.c')
-rw-r--r-- | arch/m68k/kernel/machine_kexec.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/arch/m68k/kernel/machine_kexec.c b/arch/m68k/kernel/machine_kexec.c new file mode 100644 index 000000000000..d4affc917d9d --- /dev/null +++ b/arch/m68k/kernel/machine_kexec.c | |||
@@ -0,0 +1,58 @@ | |||
1 | /* | ||
2 | * machine_kexec.c - handle transition of Linux booting another kernel | ||
3 | */ | ||
4 | #include <linux/compiler.h> | ||
5 | #include <linux/kexec.h> | ||
6 | #include <linux/mm.h> | ||
7 | #include <linux/delay.h> | ||
8 | |||
9 | #include <asm/cacheflush.h> | ||
10 | #include <asm/page.h> | ||
11 | #include <asm/setup.h> | ||
12 | |||
13 | extern const unsigned char relocate_new_kernel[]; | ||
14 | extern const size_t relocate_new_kernel_size; | ||
15 | |||
16 | int machine_kexec_prepare(struct kimage *kimage) | ||
17 | { | ||
18 | return 0; | ||
19 | } | ||
20 | |||
21 | void machine_kexec_cleanup(struct kimage *kimage) | ||
22 | { | ||
23 | } | ||
24 | |||
25 | void machine_shutdown(void) | ||
26 | { | ||
27 | } | ||
28 | |||
29 | void machine_crash_shutdown(struct pt_regs *regs) | ||
30 | { | ||
31 | } | ||
32 | |||
33 | typedef void (*relocate_kernel_t)(unsigned long ptr, | ||
34 | unsigned long start, | ||
35 | unsigned long cpu_mmu_flags) __noreturn; | ||
36 | |||
37 | void machine_kexec(struct kimage *image) | ||
38 | { | ||
39 | void *reboot_code_buffer; | ||
40 | unsigned long cpu_mmu_flags; | ||
41 | |||
42 | reboot_code_buffer = page_address(image->control_code_page); | ||
43 | |||
44 | memcpy(reboot_code_buffer, relocate_new_kernel, | ||
45 | relocate_new_kernel_size); | ||
46 | |||
47 | /* | ||
48 | * we do not want to be bothered. | ||
49 | */ | ||
50 | local_irq_disable(); | ||
51 | |||
52 | pr_info("Will call new kernel at 0x%08lx. Bye...\n", image->start); | ||
53 | __flush_cache_all(); | ||
54 | cpu_mmu_flags = m68k_cputype | m68k_mmutype << 8; | ||
55 | ((relocate_kernel_t) reboot_code_buffer)(image->head & PAGE_MASK, | ||
56 | image->start, | ||
57 | cpu_mmu_flags); | ||
58 | } | ||