| From d8ab1c4a4d6079006056823de937ac36ad775d85 Mon Sep 17 00:00:00 2001 |
| From: Philipp Rudo <prudo@linux.ibm.com> |
| Date: Mon, 1 Apr 2019 12:48:43 +0200 |
| Subject: s390/kexec_file: Fix detection of text segment in ELF loader |
| |
| [ Upstream commit 729829d775c9a5217abc784b2f16087d79c4eec8 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/s390/kernel/kexec_elf.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| diff --git a/arch/s390/kernel/kexec_elf.c b/arch/s390/kernel/kexec_elf.c |
| index 5a286b012043b..602e7cc26d118 100644 |
| --- a/arch/s390/kernel/kexec_elf.c |
| +++ b/arch/s390/kernel/kexec_elf.c |
| @@ -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; |
| |
| -- |
| 2.20.1 |
| |