Skip to content

Commit b799a09

Browse files
AKASHI Takahirotorvalds
AKASHI Takahiro
authored andcommitted
kexec_file: make use of purgatory optional
Patch series "kexec_file, x86, powerpc: refactoring for other architecutres", v2. This is a preparatory patchset for adding kexec_file support on arm64. It was originally included in a arm64 patch set[1], but Philipp is also working on their kexec_file support on s390[2] and some changes are now conflicting. So these common parts were extracted and put into a separate patch set for better integration. What's more, my original patch#4 was split into a few small chunks for easier review after Dave's comment. As such, the resulting code is basically identical with my original, and the only *visible* differences are: - renaming of _kexec_kernel_image_probe() and _kimage_file_post_load_cleanup() - change one of types of arguments at prepare_elf64_headers() Those, unfortunately, require a couple of trivial changes on the rest (#1, #6 to #13) of my arm64 kexec_file patch set[1]. Patch #1 allows making a use of purgatory optional, particularly useful for arm64. Patch #2 commonalizes arch_kexec_kernel_{image_probe, image_load, verify_sig}() and arch_kimage_file_post_load_cleanup() across architectures. Patches #3-#7 are also intended to generalize parse_elf64_headers(), along with exclude_mem_range(), to be made best re-use of. [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-February/561182.html [2] http://lkml.iu.edu//hypermail/linux/kernel/1802.1/02596.html This patch (of 7): On arm64, crash dump kernel's usable memory is protected by *unmapping* it from kernel virtual space unlike other architectures where the region is just made read-only. It is highly unlikely that the region is accidentally corrupted and this observation rationalizes that digest check code can also be dropped from purgatory. The resulting code is so simple as it doesn't require a bit ugly re-linking/relocation stuff, i.e. arch_kexec_apply_relocations_add(). Please see: http://lists.infradead.org/pipermail/linux-arm-kernel/2017-December/545428.html All that the purgatory does is to shuffle arguments and jump into a new kernel, while we still need to have some space for a hash value (purgatory_sha256_digest) which is never checked against. As such, it doesn't make sense to have trampline code between old kernel and new kernel on arm64. This patch introduces a new configuration, ARCH_HAS_KEXEC_PURGATORY, and allows related code to be compiled in only if necessary. [[email protected]: fix trivial screwup] Link: http://lkml.kernel.org/r/[email protected] Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: AKASHI Takahiro <[email protected]> Acked-by: Dave Young <[email protected]> Tested-by: Dave Young <[email protected]> Cc: Vivek Goyal <[email protected]> Cc: Baoquan He <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 1da4d37 commit b799a09

File tree

3 files changed

+11
-0
lines changed

3 files changed

+11
-0
lines changed

arch/powerpc/Kconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,9 @@ config KEXEC_FILE
552552
for kernel and initramfs as opposed to a list of segments as is the
553553
case for the older kexec call.
554554

555+
config ARCH_HAS_KEXEC_PURGATORY
556+
def_bool KEXEC_FILE
557+
555558
config RELOCATABLE
556559
bool "Build a relocatable kernel"
557560
depends on PPC64 || (FLATMEM && (44x || FSL_BOOKE))

arch/x86/Kconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,6 +2008,9 @@ config KEXEC_FILE
20082008
for kernel and initramfs as opposed to list of segments as
20092009
accepted by previous system call.
20102010

2011+
config ARCH_HAS_KEXEC_PURGATORY
2012+
def_bool KEXEC_FILE
2013+
20112014
config KEXEC_VERIFY_SIG
20122015
bool "Verify kernel signature during kexec_file_load() syscall"
20132016
depends on KEXEC_FILE

kernel/kexec_file.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,9 @@ static int kexec_calculate_store_digests(struct kimage *image)
532532
struct kexec_sha_region *sha_regions;
533533
struct purgatory_info *pi = &image->purgatory_info;
534534

535+
if (!IS_ENABLED(CONFIG_ARCH_HAS_KEXEC_PURGATORY))
536+
return 0;
537+
535538
zero_buf = __va(page_to_pfn(ZERO_PAGE(0)) << PAGE_SHIFT);
536539
zero_buf_sz = PAGE_SIZE;
537540

@@ -633,6 +636,7 @@ static int kexec_calculate_store_digests(struct kimage *image)
633636
return ret;
634637
}
635638

639+
#ifdef CONFIG_ARCH_HAS_KEXEC_PURGATORY
636640
/* Actually load purgatory. Lot of code taken from kexec-tools */
637641
static int __kexec_load_purgatory(struct kimage *image, unsigned long min,
638642
unsigned long max, int top_down)
@@ -1022,3 +1026,4 @@ int kexec_purgatory_get_set_symbol(struct kimage *image, const char *name,
10221026

10231027
return 0;
10241028
}
1029+
#endif /* CONFIG_ARCH_HAS_KEXEC_PURGATORY */

0 commit comments

Comments
 (0)