s390/kexec_file: Simplify parmarea access
authorPhilipp Rudo <prudo@linux.ibm.com>
Wed, 6 Mar 2019 16:36:26 +0000 (17:36 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 29 Apr 2019 08:43:57 +0000 (10:43 +0200)
Access the parmarea in head.S via a struct instead of individual offsets.

While at it make the fields in the parmarea .quads.

Signed-off-by: Philipp Rudo <prudo@linux.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/boot/head.S
arch/s390/include/asm/kexec.h
arch/s390/include/asm/setup.h
arch/s390/kernel/kexec_elf.c
arch/s390/kernel/kexec_image.c
arch/s390/kernel/machine_kexec_file.c

index ce2cbbc417428f6a0a813c04d53cc4037f493cf6..d585c4dbdac7ce60f67f6c36a3c5e93a45238019 100644 (file)
@@ -323,13 +323,14 @@ ENTRY(startup_kdump)
 
 #
 # params at 10400 (setup.h)
+# Must be keept in sync with struct parmarea in setup.h
 #
        .org    PARMAREA
-       .long   0,0                     # IPL_DEVICE
-       .long   0,0                     # INITRD_START
-       .long   0,0                     # INITRD_SIZE
-       .long   0,0                     # OLDMEM_BASE
-       .long   0,0                     # OLDMEM_SIZE
+       .quad   0                       # IPL_DEVICE
+       .quad   0                       # INITRD_START
+       .quad   0                       # INITRD_SIZE
+       .quad   0                       # OLDMEM_BASE
+       .quad   0                       # OLDMEM_SIZE
 
        .org    COMMAND_LINE
        .byte   "root=/dev/ram0 ro"
index 825dd0f7f2211863a5b127c193220f4c6556dfa4..08dc2b74858d5498ebb912cb56ca95309ae36590 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <asm/processor.h>
 #include <asm/page.h>
+#include <asm/setup.h>
 /*
  * KEXEC_SOURCE_MEMORY_LIMIT maximum page get_free_page can return.
  * I.e. Maximum page that is mapped directly into kernel memory,
@@ -51,11 +52,11 @@ struct s390_load_data {
        /* Pointer to the kernel buffer. Used to register cmdline etc.. */
        void *kernel_buf;
 
+       /* Parmarea in the kernel buffer. */
+       struct parmarea *parm;
+
        /* Total size of loaded segments in memory. Used as an offset. */
        size_t memsz;
-
-       /* Load address of initrd. Used to register INITRD_START in kernel. */
-       unsigned long initrd_load_addr;
 };
 
 int kexec_file_add_purgatory(struct kimage *image,
index efda97804aa4a5dcedba8a2512c3c890411c587d..b603cc09c895c9d5b386c4be15b361034b3bcc01 100644 (file)
 #define OLDMEM_SIZE    (*(unsigned long *)  (OLDMEM_SIZE_OFFSET))
 #define COMMAND_LINE   ((char *)            (COMMAND_LINE_OFFSET))
 
+struct parmarea {
+       unsigned long ipl_device;                       /* 0x10400 */
+       unsigned long initrd_start;                     /* 0x10408 */
+       unsigned long initrd_size;                      /* 0x10410 */
+       unsigned long oldmem_base;                      /* 0x10418 */
+       unsigned long oldmem_size;                      /* 0x10420 */
+       char pad1[0x10480 - 0x10428];                   /* 0x10428 - 0x10480 */
+       char command_line[ARCH_COMMAND_LINE_SIZE];      /* 0x10480 */
+};
+
 extern int noexec_disabled;
 extern int memory_end_set;
 extern unsigned long memory_end;
index 5cf340b778f188928e799db4c1ac773074797521..1cdf90767cba5c7d7625d1f62fdc6f73b90854b1 100644 (file)
@@ -42,6 +42,7 @@ static int kexec_file_add_elf_kernel(struct kimage *image,
 
                if (entry - phdr->p_paddr < phdr->p_memsz) {
                        data->kernel_buf = buf.buffer;
+                       data->parm = buf.buffer + PARMAREA;
                        data->memsz += STARTUP_NORMAL_OFFSET;
 
                        buf.buffer += STARTUP_NORMAL_OFFSET;
index 3800852595e8a194387d91df4cb767f35a3c7687..d9025adc2bbbc6db5af38957752627aa3aaa40b6 100644 (file)
@@ -32,6 +32,7 @@ static int kexec_file_add_image_kernel(struct kimage *image,
        ret = kexec_add_buffer(&buf);
 
        data->kernel_buf = kernel;
+       data->parm = (void *)kernel + PARMAREA;
        data->memsz += buf.memsz + STARTUP_NORMAL_OFFSET;
 
        return ret;
index 32023b4f9dc00153aba7085e73e151b7156e573a..8a85ecd8428cd1d3ba82d50ab5f387f9bef0626a 100644 (file)
@@ -25,24 +25,12 @@ int *kexec_file_update_kernel(struct kimage *image,
        if (image->cmdline_buf_len >= ARCH_COMMAND_LINE_SIZE)
                return ERR_PTR(-EINVAL);
 
-       if (image->cmdline_buf_len)
-               memcpy(data->kernel_buf + COMMAND_LINE_OFFSET,
-                      image->cmdline_buf, image->cmdline_buf_len);
+       memcpy(data->parm->command_line, image->cmdline_buf,
+              image->cmdline_buf_len);
 
        if (image->type == KEXEC_TYPE_CRASH) {
-               loc = (unsigned long *)(data->kernel_buf + OLDMEM_BASE_OFFSET);
-               *loc = crashk_res.start;
-
-               loc = (unsigned long *)(data->kernel_buf + OLDMEM_SIZE_OFFSET);
-               *loc = crashk_res.end - crashk_res.start + 1;
-       }
-
-       if (image->initrd_buf) {
-               loc = (unsigned long *)(data->kernel_buf + INITRD_START_OFFSET);
-               *loc = data->initrd_load_addr;
-
-               loc = (unsigned long *)(data->kernel_buf + INITRD_SIZE_OFFSET);
-               *loc = image->initrd_buf_len;
+               data->parm->oldmem_base = crashk_res.start;
+               data->parm->oldmem_size = crashk_res.end - crashk_res.start + 1;
        }
 
        return NULL;
@@ -127,7 +115,8 @@ int kexec_file_add_initrd(struct kimage *image, struct s390_load_data *data,
                buf.mem += crashk_res.start;
        buf.memsz = buf.bufsz;
 
-       data->initrd_load_addr = buf.mem;
+       data->parm->initrd_start = buf.mem;
+       data->parm->initrd_size = buf.memsz;
        data->memsz += buf.memsz;
 
        ret = kexec_add_buffer(&buf);