diff options
-rw-r--r-- | arch/s390/boot/head.S | 11 | ||||
-rw-r--r-- | arch/s390/include/asm/kexec.h | 7 | ||||
-rw-r--r-- | arch/s390/include/asm/setup.h | 10 | ||||
-rw-r--r-- | arch/s390/kernel/kexec_elf.c | 1 | ||||
-rw-r--r-- | arch/s390/kernel/kexec_image.c | 1 | ||||
-rw-r--r-- | arch/s390/kernel/machine_kexec_file.c | 23 |
6 files changed, 28 insertions, 25 deletions
diff --git a/arch/s390/boot/head.S b/arch/s390/boot/head.S index ce2cbbc41742..d585c4dbdac7 100644 --- a/arch/s390/boot/head.S +++ b/arch/s390/boot/head.S | |||
@@ -323,13 +323,14 @@ ENTRY(startup_kdump) | |||
323 | 323 | ||
324 | # | 324 | # |
325 | # params at 10400 (setup.h) | 325 | # params at 10400 (setup.h) |
326 | # Must be keept in sync with struct parmarea in setup.h | ||
326 | # | 327 | # |
327 | .org PARMAREA | 328 | .org PARMAREA |
328 | .long 0,0 # IPL_DEVICE | 329 | .quad 0 # IPL_DEVICE |
329 | .long 0,0 # INITRD_START | 330 | .quad 0 # INITRD_START |
330 | .long 0,0 # INITRD_SIZE | 331 | .quad 0 # INITRD_SIZE |
331 | .long 0,0 # OLDMEM_BASE | 332 | .quad 0 # OLDMEM_BASE |
332 | .long 0,0 # OLDMEM_SIZE | 333 | .quad 0 # OLDMEM_SIZE |
333 | 334 | ||
334 | .org COMMAND_LINE | 335 | .org COMMAND_LINE |
335 | .byte "root=/dev/ram0 ro" | 336 | .byte "root=/dev/ram0 ro" |
diff --git a/arch/s390/include/asm/kexec.h b/arch/s390/include/asm/kexec.h index 825dd0f7f221..08dc2b74858d 100644 --- a/arch/s390/include/asm/kexec.h +++ b/arch/s390/include/asm/kexec.h | |||
@@ -11,6 +11,7 @@ | |||
11 | 11 | ||
12 | #include <asm/processor.h> | 12 | #include <asm/processor.h> |
13 | #include <asm/page.h> | 13 | #include <asm/page.h> |
14 | #include <asm/setup.h> | ||
14 | /* | 15 | /* |
15 | * KEXEC_SOURCE_MEMORY_LIMIT maximum page get_free_page can return. | 16 | * KEXEC_SOURCE_MEMORY_LIMIT maximum page get_free_page can return. |
16 | * I.e. Maximum page that is mapped directly into kernel memory, | 17 | * I.e. Maximum page that is mapped directly into kernel memory, |
@@ -51,11 +52,11 @@ struct s390_load_data { | |||
51 | /* Pointer to the kernel buffer. Used to register cmdline etc.. */ | 52 | /* Pointer to the kernel buffer. Used to register cmdline etc.. */ |
52 | void *kernel_buf; | 53 | void *kernel_buf; |
53 | 54 | ||
55 | /* Parmarea in the kernel buffer. */ | ||
56 | struct parmarea *parm; | ||
57 | |||
54 | /* Total size of loaded segments in memory. Used as an offset. */ | 58 | /* Total size of loaded segments in memory. Used as an offset. */ |
55 | size_t memsz; | 59 | size_t memsz; |
56 | |||
57 | /* Load address of initrd. Used to register INITRD_START in kernel. */ | ||
58 | unsigned long initrd_load_addr; | ||
59 | }; | 60 | }; |
60 | 61 | ||
61 | int kexec_file_add_purgatory(struct kimage *image, | 62 | int kexec_file_add_purgatory(struct kimage *image, |
diff --git a/arch/s390/include/asm/setup.h b/arch/s390/include/asm/setup.h index efda97804aa4..b603cc09c895 100644 --- a/arch/s390/include/asm/setup.h +++ b/arch/s390/include/asm/setup.h | |||
@@ -65,6 +65,16 @@ | |||
65 | #define OLDMEM_SIZE (*(unsigned long *) (OLDMEM_SIZE_OFFSET)) | 65 | #define OLDMEM_SIZE (*(unsigned long *) (OLDMEM_SIZE_OFFSET)) |
66 | #define COMMAND_LINE ((char *) (COMMAND_LINE_OFFSET)) | 66 | #define COMMAND_LINE ((char *) (COMMAND_LINE_OFFSET)) |
67 | 67 | ||
68 | struct parmarea { | ||
69 | unsigned long ipl_device; /* 0x10400 */ | ||
70 | unsigned long initrd_start; /* 0x10408 */ | ||
71 | unsigned long initrd_size; /* 0x10410 */ | ||
72 | unsigned long oldmem_base; /* 0x10418 */ | ||
73 | unsigned long oldmem_size; /* 0x10420 */ | ||
74 | char pad1[0x10480 - 0x10428]; /* 0x10428 - 0x10480 */ | ||
75 | char command_line[ARCH_COMMAND_LINE_SIZE]; /* 0x10480 */ | ||
76 | }; | ||
77 | |||
68 | extern int noexec_disabled; | 78 | extern int noexec_disabled; |
69 | extern int memory_end_set; | 79 | extern int memory_end_set; |
70 | extern unsigned long memory_end; | 80 | extern unsigned long memory_end; |
diff --git a/arch/s390/kernel/kexec_elf.c b/arch/s390/kernel/kexec_elf.c index 5cf340b778f1..1cdf90767cba 100644 --- a/arch/s390/kernel/kexec_elf.c +++ b/arch/s390/kernel/kexec_elf.c | |||
@@ -42,6 +42,7 @@ static int kexec_file_add_elf_kernel(struct kimage *image, | |||
42 | 42 | ||
43 | if (entry - phdr->p_paddr < phdr->p_memsz) { | 43 | if (entry - phdr->p_paddr < phdr->p_memsz) { |
44 | data->kernel_buf = buf.buffer; | 44 | data->kernel_buf = buf.buffer; |
45 | data->parm = buf.buffer + PARMAREA; | ||
45 | data->memsz += STARTUP_NORMAL_OFFSET; | 46 | data->memsz += STARTUP_NORMAL_OFFSET; |
46 | 47 | ||
47 | buf.buffer += STARTUP_NORMAL_OFFSET; | 48 | buf.buffer += STARTUP_NORMAL_OFFSET; |
diff --git a/arch/s390/kernel/kexec_image.c b/arch/s390/kernel/kexec_image.c index 3800852595e8..d9025adc2bbb 100644 --- a/arch/s390/kernel/kexec_image.c +++ b/arch/s390/kernel/kexec_image.c | |||
@@ -32,6 +32,7 @@ static int kexec_file_add_image_kernel(struct kimage *image, | |||
32 | ret = kexec_add_buffer(&buf); | 32 | ret = kexec_add_buffer(&buf); |
33 | 33 | ||
34 | data->kernel_buf = kernel; | 34 | data->kernel_buf = kernel; |
35 | data->parm = (void *)kernel + PARMAREA; | ||
35 | data->memsz += buf.memsz + STARTUP_NORMAL_OFFSET; | 36 | data->memsz += buf.memsz + STARTUP_NORMAL_OFFSET; |
36 | 37 | ||
37 | return ret; | 38 | return ret; |
diff --git a/arch/s390/kernel/machine_kexec_file.c b/arch/s390/kernel/machine_kexec_file.c index 32023b4f9dc0..8a85ecd8428c 100644 --- a/arch/s390/kernel/machine_kexec_file.c +++ b/arch/s390/kernel/machine_kexec_file.c | |||
@@ -25,24 +25,12 @@ int *kexec_file_update_kernel(struct kimage *image, | |||
25 | if (image->cmdline_buf_len >= ARCH_COMMAND_LINE_SIZE) | 25 | if (image->cmdline_buf_len >= ARCH_COMMAND_LINE_SIZE) |
26 | return ERR_PTR(-EINVAL); | 26 | return ERR_PTR(-EINVAL); |
27 | 27 | ||
28 | if (image->cmdline_buf_len) | 28 | memcpy(data->parm->command_line, image->cmdline_buf, |
29 | memcpy(data->kernel_buf + COMMAND_LINE_OFFSET, | 29 | image->cmdline_buf_len); |
30 | image->cmdline_buf, image->cmdline_buf_len); | ||
31 | 30 | ||
32 | if (image->type == KEXEC_TYPE_CRASH) { | 31 | if (image->type == KEXEC_TYPE_CRASH) { |
33 | loc = (unsigned long *)(data->kernel_buf + OLDMEM_BASE_OFFSET); | 32 | data->parm->oldmem_base = crashk_res.start; |
34 | *loc = crashk_res.start; | 33 | data->parm->oldmem_size = crashk_res.end - crashk_res.start + 1; |
35 | |||
36 | loc = (unsigned long *)(data->kernel_buf + OLDMEM_SIZE_OFFSET); | ||
37 | *loc = crashk_res.end - crashk_res.start + 1; | ||
38 | } | ||
39 | |||
40 | if (image->initrd_buf) { | ||
41 | loc = (unsigned long *)(data->kernel_buf + INITRD_START_OFFSET); | ||
42 | *loc = data->initrd_load_addr; | ||
43 | |||
44 | loc = (unsigned long *)(data->kernel_buf + INITRD_SIZE_OFFSET); | ||
45 | *loc = image->initrd_buf_len; | ||
46 | } | 34 | } |
47 | 35 | ||
48 | return NULL; | 36 | return NULL; |
@@ -127,7 +115,8 @@ int kexec_file_add_initrd(struct kimage *image, struct s390_load_data *data, | |||
127 | buf.mem += crashk_res.start; | 115 | buf.mem += crashk_res.start; |
128 | buf.memsz = buf.bufsz; | 116 | buf.memsz = buf.bufsz; |
129 | 117 | ||
130 | data->initrd_load_addr = buf.mem; | 118 | data->parm->initrd_start = buf.mem; |
119 | data->parm->initrd_size = buf.memsz; | ||
131 | data->memsz += buf.memsz; | 120 | data->memsz += buf.memsz; |
132 | 121 | ||
133 | ret = kexec_add_buffer(&buf); | 122 | ret = kexec_add_buffer(&buf); |