diff options
-rw-r--r-- | arch/mips/kernel/machine_kexec.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/mips/kernel/machine_kexec.c b/arch/mips/kernel/machine_kexec.c index 8f42fa85ac9e..22960d67cf07 100644 --- a/arch/mips/kernel/machine_kexec.c +++ b/arch/mips/kernel/machine_kexec.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <asm/page.h> | 14 | #include <asm/page.h> |
15 | 15 | ||
16 | extern const unsigned char relocate_new_kernel[]; | 16 | extern const unsigned char relocate_new_kernel[]; |
17 | extern const unsigned int relocate_new_kernel_size; | 17 | extern const size_t relocate_new_kernel_size; |
18 | 18 | ||
19 | extern unsigned long kexec_start_address; | 19 | extern unsigned long kexec_start_address; |
20 | extern unsigned long kexec_indirection_page; | 20 | extern unsigned long kexec_indirection_page; |
@@ -40,6 +40,8 @@ machine_crash_shutdown(struct pt_regs *regs) | |||
40 | { | 40 | { |
41 | } | 41 | } |
42 | 42 | ||
43 | typedef void (*noretfun_t)(void) __attribute__((noreturn)); | ||
44 | |||
43 | void | 45 | void |
44 | machine_kexec(struct kimage *image) | 46 | machine_kexec(struct kimage *image) |
45 | { | 47 | { |
@@ -51,7 +53,8 @@ machine_kexec(struct kimage *image) | |||
51 | (unsigned long)page_address(image->control_code_page); | 53 | (unsigned long)page_address(image->control_code_page); |
52 | 54 | ||
53 | kexec_start_address = image->start; | 55 | kexec_start_address = image->start; |
54 | kexec_indirection_page = phys_to_virt(image->head & PAGE_MASK); | 56 | kexec_indirection_page = |
57 | (unsigned long) phys_to_virt(image->head & PAGE_MASK); | ||
55 | 58 | ||
56 | memcpy((void*)reboot_code_buffer, relocate_new_kernel, | 59 | memcpy((void*)reboot_code_buffer, relocate_new_kernel, |
57 | relocate_new_kernel_size); | 60 | relocate_new_kernel_size); |
@@ -67,7 +70,7 @@ machine_kexec(struct kimage *image) | |||
67 | phys_to_virt(entry & PAGE_MASK) : ptr + 1) { | 70 | phys_to_virt(entry & PAGE_MASK) : ptr + 1) { |
68 | if (*ptr & IND_SOURCE || *ptr & IND_INDIRECTION || | 71 | if (*ptr & IND_SOURCE || *ptr & IND_INDIRECTION || |
69 | *ptr & IND_DESTINATION) | 72 | *ptr & IND_DESTINATION) |
70 | *ptr = phys_to_virt(*ptr); | 73 | *ptr = (unsigned long) phys_to_virt(*ptr); |
71 | } | 74 | } |
72 | 75 | ||
73 | /* | 76 | /* |
@@ -78,8 +81,8 @@ machine_kexec(struct kimage *image) | |||
78 | flush_icache_range(reboot_code_buffer, | 81 | flush_icache_range(reboot_code_buffer, |
79 | reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE); | 82 | reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE); |
80 | 83 | ||
81 | printk("Will call new kernel at %08x\n", image->start); | 84 | printk("Will call new kernel at %08lx\n", image->start); |
82 | printk("Bye ...\n"); | 85 | printk("Bye ...\n"); |
83 | flush_cache_all(); | 86 | flush_cache_all(); |
84 | ((void (*)(void))reboot_code_buffer)(); | 87 | ((noretfun_t) reboot_code_buffer)(); |
85 | } | 88 | } |