diff options
author | AKASHI Takahiro <takahiro.akashi@linaro.org> | 2017-05-17 14:51:47 +0900 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2017-05-22 13:36:18 +0200 |
commit | 1591926df5a602ffcbf55e99aa8a96fbebd0bafe (patch) | |
tree | b2258f0d6721c5b1a26e0a5748e380443949b2b8 /kexec/arch/arm64/crashdump-arm64.c | |
parent | 0bd5219da953639276cd17e067c030ac97feca97 (diff) |
arm64: kdump: set up kernel image segment
On arm64, we can use the same kernel image as 1st kernel, but
we have to modify the entry point as well as segments' addresses
in the kernel's elf header in order to load them into correct places.
Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Tested-by: David Woodhouse <dwmw@amazon.co.uk>
Tested-by: Pratyush Anand <panand@redhat.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'kexec/arch/arm64/crashdump-arm64.c')
-rw-r--r-- | kexec/arch/arm64/crashdump-arm64.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/kexec/arch/arm64/crashdump-arm64.c b/kexec/arch/arm64/crashdump-arm64.c index d142435..4fd7aa8 100644 --- a/kexec/arch/arm64/crashdump-arm64.c +++ b/kexec/arch/arm64/crashdump-arm64.c @@ -211,6 +211,30 @@ int load_crashdump_segments(struct kexec_info *info) return 0; } +/* + * e_entry and p_paddr are actually in virtual address space. + * Those values will be translated to physcal addresses by using + * virt_to_phys() in add_segment(). + * So let's fix up those values for later use so the memory base + * (arm64_mm.phys_offset) will be correctly replaced with + * crash_reserved_mem.start. + */ +void fixup_elf_addrs(struct mem_ehdr *ehdr) +{ + struct mem_phdr *phdr; + int i; + + ehdr->e_entry += - arm64_mem.phys_offset + crash_reserved_mem.start; + + for (i = 0; i < ehdr->e_phnum; i++) { + phdr = &ehdr->e_phdr[i]; + if (phdr->p_type != PT_LOAD) + continue; + phdr->p_paddr += + (-arm64_mem.phys_offset + crash_reserved_mem.start); + } +} + int get_crash_kernel_load_range(uint64_t *start, uint64_t *end) { if (!usablemem_rgns.size) |