|
|
@@ -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;
|
|
|
|