Skip to content

Commit

Permalink
s390/kexec_file: move kernel image size check
Browse files Browse the repository at this point in the history
In preparation of adding support for command lines with variable
sizes on s390, the check whether the new kernel image is at least HEAD_END
bytes long isn't correct. Move the check to kexec_file_add_components()
so we can get the size of the parm area and check the size there.

The '.org HEAD_END' directive can now also be removed from head.S. This
was used in the past to reserve space for the early sccb buffer, but with
commit 9a5131b87cac1 ("s390/boot: move sclp early buffer from fixed address
in asm to C") this is no longer required.

Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
  • Loading branch information
Sven Schnelle authored and Vasily Gorbik committed Oct 26, 2021
1 parent 6aefbf1 commit 277c838
Show file tree
Hide file tree
Showing 3 changed files with 2 additions and 18 deletions.
2 changes: 0 additions & 2 deletions arch/s390/boot/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -400,5 +400,3 @@ SYM_DATA_START(parmarea)
.byte 0
.org PARMAREA+__PARMAREA_SIZE
SYM_DATA_END(parmarea)

.org HEAD_END
1 change: 0 additions & 1 deletion arch/s390/include/asm/setup.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include <linux/build_bug.h>

#define PARMAREA 0x10400
#define HEAD_END 0x11000

/*
* Machine features detected in early.c
Expand Down
17 changes: 2 additions & 15 deletions arch/s390/kernel/machine_kexec_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,8 @@ void *kexec_file_add_components(struct kimage *image,
if (ret)
goto out;

if (image->cmdline_buf_len >= ARCH_COMMAND_LINE_SIZE) {
if (image->kernel_buf_len < PARMAREA + sizeof(struct parmarea) ||
image->cmdline_buf_len >= ARCH_COMMAND_LINE_SIZE) {
ret = -EINVAL;
goto out;
}
Expand Down Expand Up @@ -307,17 +308,3 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
}
return 0;
}

int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
unsigned long buf_len)
{
/* A kernel must be at least large enough to contain head.S. During
* load memory in head.S will be accessed, e.g. to register the next
* command line. If the next kernel were smaller the current kernel
* will panic at load.
*/
if (buf_len < HEAD_END)
return -ENOEXEC;

return kexec_image_probe_default(image, buf, buf_len);
}

0 comments on commit 277c838

Please sign in to comment.