mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
s390/kexec_file: Fix detection of text segment in ELF loader
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>
This commit is contained in:
parent
6339a3889a
commit
729829d775
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user