|
29 | 29 | #include <asm/nmi.h> |
30 | 30 | #include <asm/sclp.h> |
31 | 31 |
|
32 | | -typedef void (*relocate_kernel_t)(kimage_entry_t *, unsigned long, |
33 | | - unsigned long); |
| 32 | +typedef void (*relocate_kernel_t)(unsigned long, unsigned long, unsigned long); |
34 | 33 |
|
35 | 34 | extern const unsigned char relocate_kernel[]; |
36 | 35 | extern const unsigned long long relocate_kernel_len; |
@@ -58,7 +57,7 @@ static void __do_machine_kdump(void *image) |
58 | 57 | * prefix register of this CPU to zero |
59 | 58 | */ |
60 | 59 | memcpy(absolute_pointer(__LC_FPREGS_SAVE_AREA), |
61 | | - (void *)(prefix + __LC_FPREGS_SAVE_AREA), 512); |
| 60 | + phys_to_virt(prefix + __LC_FPREGS_SAVE_AREA), 512); |
62 | 61 |
|
63 | 62 | __load_psw_mask(PSW_MASK_BASE | PSW_DEFAULT_KEY | PSW_MASK_EA | PSW_MASK_BA); |
64 | 63 | start_kdump = (void *)((struct kimage *) image)->start; |
@@ -209,7 +208,7 @@ int machine_kexec_prepare(struct kimage *image) |
209 | 208 | return -EINVAL; |
210 | 209 |
|
211 | 210 | /* Get the destination where the assembler code should be copied to.*/ |
212 | | - reboot_code_buffer = (void *) page_to_phys(image->control_code_page); |
| 211 | + reboot_code_buffer = page_to_virt(image->control_code_page); |
213 | 212 |
|
214 | 213 | /* Then copy it */ |
215 | 214 | memcpy(reboot_code_buffer, relocate_kernel, relocate_kernel_len); |
@@ -249,18 +248,18 @@ void machine_crash_shutdown(struct pt_regs *regs) |
249 | 248 | */ |
250 | 249 | static void __do_machine_kexec(void *data) |
251 | 250 | { |
252 | | - unsigned long diag308_subcode; |
253 | | - relocate_kernel_t data_mover; |
| 251 | + unsigned long data_mover, entry, diag308_subcode; |
254 | 252 | struct kimage *image = data; |
255 | 253 |
|
256 | | - data_mover = (relocate_kernel_t) page_to_phys(image->control_code_page); |
| 254 | + data_mover = page_to_phys(image->control_code_page); |
| 255 | + entry = virt_to_phys(&image->head); |
257 | 256 | diag308_subcode = DIAG308_CLEAR_RESET; |
258 | 257 | if (sclp.has_iplcc) |
259 | 258 | diag308_subcode |= DIAG308_FLAG_EI; |
260 | 259 | s390_reset_system(); |
261 | 260 |
|
262 | 261 | __arch_local_irq_stnsm(0xfb); /* disable DAT - avoid no-execute */ |
263 | | - (*data_mover)(&image->head, image->start, diag308_subcode); |
| 262 | + (*(relocate_kernel_t)data_mover)(entry, image->start, diag308_subcode); |
264 | 263 |
|
265 | 264 | /* Die if kexec returns */ |
266 | 265 | disabled_wait(); |
|
0 commit comments