]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
s390/kexec_file: Fix detection of text segment in ELF loader
authorPhilipp Rudo <prudo@linux.ibm.com>
Mon, 1 Apr 2019 10:48:43 +0000 (12:48 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 29 Apr 2019 08:43:46 +0000 (10:43 +0200)
To register data for the next kernel (command line, oldmem_base, etc.) the
current kernel needs to find the ELF segment that contains head.S. This is
currently done by checking ifor 'phdr->p_paddr == 0'. This works fine for
the current kernel build but in theory the first few pages could be
skipped. Make the detection more robust by checking if the entry point lies
within the segment.

Signed-off-by: Philipp Rudo <prudo@linux.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/kexec_elf.c

index 1d1c77c647d25923dd4362606e5e16f6ff1e3a3d..5cf340b778f188928e799db4c1ac773074797521 100644 (file)
@@ -19,10 +19,15 @@ static int kexec_file_add_elf_kernel(struct kimage *image,
        struct kexec_buf buf;
        const Elf_Ehdr *ehdr;
        const Elf_Phdr *phdr;
+       Elf_Addr entry;
        int i, ret;
 
        ehdr = (Elf_Ehdr *)kernel;
        buf.image = image;
+       if (image->type == KEXEC_TYPE_CRASH)
+               entry = STARTUP_KDUMP_OFFSET;
+       else
+               entry = ehdr->e_entry;
 
        phdr = (void *)ehdr + ehdr->e_phoff;
        for (i = 0; i < ehdr->e_phnum; i++, phdr++) {
@@ -35,7 +40,7 @@ static int kexec_file_add_elf_kernel(struct kimage *image,
                buf.mem = ALIGN(phdr->p_paddr, phdr->p_align);
                buf.memsz = phdr->p_memsz;
 
-               if (phdr->p_paddr == 0) {
+               if (entry - phdr->p_paddr < phdr->p_memsz) {
                        data->kernel_buf = buf.buffer;
                        data->memsz += STARTUP_NORMAL_OFFSET;