[PATCH 3/6] kexec_file: Allow skipping checksum calculation for some segments.

2016-06-20 Thread Thiago Jung Bauermann
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.

2016-06-20 Thread Thiago Jung Bauermann
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);