[PATCH 3/6] kexec_file: Allow skipping checksum calculation for some segments.
Adds checksum argument to kexec_add_buffer specifying whether the given segment should be part of the checksum calculation. The next patch will add a way to update segments after a kimage is loaded. Segments that will be updated in this way should not be checksummed, otherwise they will cause the purgatory checksum verification to fail when the machine is rebooted. As a bonus, we don't need to special-case the purgatory segment anymore to avoid checksumming it. Adjust call sites for the new argument. Signed-off-by: Thiago Jung Bauermann--- arch/powerpc/kernel/kexec_elf_64.c | 6 +++--- arch/x86/kernel/crash.c| 4 ++-- arch/x86/kernel/kexec-bzimage64.c | 6 +++--- include/linux/kexec.h | 7 +-- kernel/kexec_file.c| 22 +++--- 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/arch/powerpc/kernel/kexec_elf_64.c b/arch/powerpc/kernel/kexec_elf_64.c index 5d2b7036fee7..abbad484d7b2 100644 --- a/arch/powerpc/kernel/kexec_elf_64.c +++ b/arch/powerpc/kernel/kexec_elf_64.c @@ -311,7 +311,7 @@ static int elf_exec_load(struct kimage *image, struct elfhdr *ehdr, (char *) elf_info->buffer + phdr->p_offset, size, phdr->p_memsz, phdr->p_align, phdr->p_paddr + base, ppc64_rma_size, - false, _addr); + false, true, _addr); if (ret) goto out; @@ -487,7 +487,7 @@ void *elf64_load(struct kimage *image, char *kernel_buf, if (initrd != NULL) { ret = kexec_add_buffer(image, initrd, initrd_len, initrd_len, PAGE_SIZE, 0, ppc64_rma_size, false, - _load_addr); + true, _load_addr); if (ret) goto out; @@ -564,7 +564,7 @@ void *elf64_load(struct kimage *image, char *kernel_buf, fdt_pack(fdt); ret = kexec_add_buffer(image, fdt, fdt_size, fdt_size, PAGE_SIZE, 0, - ppc64_rma_size, true, _load_addr); + ppc64_rma_size, true, true, _load_addr); if (ret) goto out; diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c index 9ef978d69c22..c8b16f2ca321 100644 --- a/arch/x86/kernel/crash.c +++ b/arch/x86/kernel/crash.c @@ -643,7 +643,7 @@ int crash_load_segments(struct kimage *image) */ ret = kexec_add_buffer(image, (char *)_zero_bytes, sizeof(crash_zero_bytes), src_sz, - PAGE_SIZE, 0, -1, 0, + PAGE_SIZE, 0, -1, false, true, >arch.backup_load_addr); if (ret) return ret; @@ -660,7 +660,7 @@ int crash_load_segments(struct kimage *image) image->arch.elf_headers_sz = elf_sz; ret = kexec_add_buffer(image, (char *)elf_addr, elf_sz, elf_sz, - ELF_CORE_HEADER_ALIGN, 0, -1, 0, + ELF_CORE_HEADER_ALIGN, 0, -1, false, true, >arch.elf_load_addr); if (ret) { vfree((void *)image->arch.elf_headers); diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c index f2356bda2b05..f9016be44da6 100644 --- a/arch/x86/kernel/kexec-bzimage64.c +++ b/arch/x86/kernel/kexec-bzimage64.c @@ -420,7 +420,7 @@ static void *bzImage64_load(struct kimage *image, char *kernel, ret = kexec_add_buffer(image, (char *)params, params_misc_sz, params_misc_sz, 16, MIN_BOOTPARAM_ADDR, - ULONG_MAX, 1, _load_addr); + ULONG_MAX, true, true, _load_addr); if (ret) goto out_free_params; pr_debug("Loaded boot_param, command line and misc at 0x%lx bufsz=0x%lx memsz=0x%lx\n", @@ -434,7 +434,7 @@ static void *bzImage64_load(struct kimage *image, char *kernel, ret = kexec_add_buffer(image, kernel_buf, kernel_bufsz, kernel_memsz, kernel_align, - MIN_KERNEL_LOAD_ADDR, ULONG_MAX, 1, + MIN_KERNEL_LOAD_ADDR, ULONG_MAX, true, true, _load_addr); if (ret) goto out_free_params; @@ -446,7 +446,7 @@ static void *bzImage64_load(struct kimage *image, char *kernel, if (initrd) { ret = kexec_add_buffer(image, initrd, initrd_len, initrd_len, PAGE_SIZE, MIN_INITRD_LOAD_ADDR, - ULONG_MAX, 1, _load_addr); + ULONG_MAX,
[PATCH 3/6] kexec_file: Allow skipping checksum calculation for some segments.
Adds checksum argument to kexec_add_buffer specifying whether the given segment should be part of the checksum calculation. The next patch will add a way to update segments after a kimage is loaded. Segments that will be updated in this way should not be checksummed, otherwise they will cause the purgatory checksum verification to fail when the machine is rebooted. As a bonus, we don't need to special-case the purgatory segment anymore to avoid checksumming it. Adjust call sites for the new argument. Signed-off-by: Thiago Jung Bauermann --- arch/powerpc/kernel/kexec_elf_64.c | 6 +++--- arch/x86/kernel/crash.c| 4 ++-- arch/x86/kernel/kexec-bzimage64.c | 6 +++--- include/linux/kexec.h | 7 +-- kernel/kexec_file.c| 22 +++--- 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/arch/powerpc/kernel/kexec_elf_64.c b/arch/powerpc/kernel/kexec_elf_64.c index 5d2b7036fee7..abbad484d7b2 100644 --- a/arch/powerpc/kernel/kexec_elf_64.c +++ b/arch/powerpc/kernel/kexec_elf_64.c @@ -311,7 +311,7 @@ static int elf_exec_load(struct kimage *image, struct elfhdr *ehdr, (char *) elf_info->buffer + phdr->p_offset, size, phdr->p_memsz, phdr->p_align, phdr->p_paddr + base, ppc64_rma_size, - false, _addr); + false, true, _addr); if (ret) goto out; @@ -487,7 +487,7 @@ void *elf64_load(struct kimage *image, char *kernel_buf, if (initrd != NULL) { ret = kexec_add_buffer(image, initrd, initrd_len, initrd_len, PAGE_SIZE, 0, ppc64_rma_size, false, - _load_addr); + true, _load_addr); if (ret) goto out; @@ -564,7 +564,7 @@ void *elf64_load(struct kimage *image, char *kernel_buf, fdt_pack(fdt); ret = kexec_add_buffer(image, fdt, fdt_size, fdt_size, PAGE_SIZE, 0, - ppc64_rma_size, true, _load_addr); + ppc64_rma_size, true, true, _load_addr); if (ret) goto out; diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c index 9ef978d69c22..c8b16f2ca321 100644 --- a/arch/x86/kernel/crash.c +++ b/arch/x86/kernel/crash.c @@ -643,7 +643,7 @@ int crash_load_segments(struct kimage *image) */ ret = kexec_add_buffer(image, (char *)_zero_bytes, sizeof(crash_zero_bytes), src_sz, - PAGE_SIZE, 0, -1, 0, + PAGE_SIZE, 0, -1, false, true, >arch.backup_load_addr); if (ret) return ret; @@ -660,7 +660,7 @@ int crash_load_segments(struct kimage *image) image->arch.elf_headers_sz = elf_sz; ret = kexec_add_buffer(image, (char *)elf_addr, elf_sz, elf_sz, - ELF_CORE_HEADER_ALIGN, 0, -1, 0, + ELF_CORE_HEADER_ALIGN, 0, -1, false, true, >arch.elf_load_addr); if (ret) { vfree((void *)image->arch.elf_headers); diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c index f2356bda2b05..f9016be44da6 100644 --- a/arch/x86/kernel/kexec-bzimage64.c +++ b/arch/x86/kernel/kexec-bzimage64.c @@ -420,7 +420,7 @@ static void *bzImage64_load(struct kimage *image, char *kernel, ret = kexec_add_buffer(image, (char *)params, params_misc_sz, params_misc_sz, 16, MIN_BOOTPARAM_ADDR, - ULONG_MAX, 1, _load_addr); + ULONG_MAX, true, true, _load_addr); if (ret) goto out_free_params; pr_debug("Loaded boot_param, command line and misc at 0x%lx bufsz=0x%lx memsz=0x%lx\n", @@ -434,7 +434,7 @@ static void *bzImage64_load(struct kimage *image, char *kernel, ret = kexec_add_buffer(image, kernel_buf, kernel_bufsz, kernel_memsz, kernel_align, - MIN_KERNEL_LOAD_ADDR, ULONG_MAX, 1, + MIN_KERNEL_LOAD_ADDR, ULONG_MAX, true, true, _load_addr); if (ret) goto out_free_params; @@ -446,7 +446,7 @@ static void *bzImage64_load(struct kimage *image, char *kernel, if (initrd) { ret = kexec_add_buffer(image, initrd, initrd_len, initrd_len, PAGE_SIZE, MIN_INITRD_LOAD_ADDR, - ULONG_MAX, 1, _load_addr); + ULONG_MAX, true, true, _load_addr);