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/kexec-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/kexec-arm64.c')
-rw-r--r-- | kexec/arch/arm64/kexec-arm64.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/kexec/arch/arm64/kexec-arm64.c b/kexec/arch/arm64/kexec-arm64.c index 153c96f..6c21756 100644 --- a/kexec/arch/arm64/kexec-arm64.c +++ b/kexec/arch/arm64/kexec-arm64.c @@ -308,12 +308,27 @@ unsigned long arm64_locate_kernel_segment(struct kexec_info *info) { unsigned long hole; - hole = locate_hole(info, - arm64_mem.text_offset + arm64_mem.image_size, - MiB(2), 0, ULONG_MAX, 1); + if (info->kexec_flags & KEXEC_ON_CRASH) { + unsigned long hole_end; + + hole = (crash_reserved_mem.start < mem_min ? + mem_min : crash_reserved_mem.start); + hole = _ALIGN_UP(hole, MiB(2)); + hole_end = hole + arm64_mem.text_offset + arm64_mem.image_size; + + if ((hole_end > mem_max) || + (hole_end > crash_reserved_mem.end)) { + dbgprintf("%s: Crash kernel out of range\n", __func__); + hole = ULONG_MAX; + } + } else { + hole = locate_hole(info, + arm64_mem.text_offset + arm64_mem.image_size, + MiB(2), 0, ULONG_MAX, 1); - if (hole == ULONG_MAX) - dbgprintf("%s: locate_hole failed\n", __func__); + if (hole == ULONG_MAX) + dbgprintf("%s: locate_hole failed\n", __func__); + } return hole; } |