summaryrefslogtreecommitdiff
path: root/kexec/kexec.c
diff options
context:
space:
mode:
authorBhupesh Sharma <bhsharma@redhat.com>2019-07-15 11:32:56 +0530
committerSimon Horman <horms@verge.net.au>2019-07-16 13:45:30 +0200
commitf4c1caaa97a2e019ccc00ab63e390c60d1c9454c (patch)
treee3d8d838b0d49e4a02f11190e451f4e6050c1bbb /kexec/kexec.c
parent0e709571bfe7e3b8160044970e2084194f9a963b (diff)
kexec/arm64: Add support for handling zlib compressed (Image.gz) image
Currently the kexec_file_load() support for arm64 doesn't allow handling zlib compressed (i.e. Image.gz) image. Since most distributions use 'make zinstall' rule inside 'arch/arm64/boot/Makefile' to install the arm64 Image.gz compressed file inside the boot destination directory (for e.g. /boot), currently we cannot use kexec_file_load() to load vmlinuz (or Image.gz): # file /boot/vmlinuz /boot/vmlinuz: gzip compressed data, was "Image", <..snip..>, max compression, from Unix, original size 21945120 Now, since via kexec_file_load() we pass the 'fd' of Image.gz (compressed file) via the following command line ... # kexec -s -l /boot/vmlinuz-`uname -r` --initrd=/boot/initramfs-`uname -r`.img --reuse-cmdline ... kernel returns -EINVAL error value, as it is not able to locate the magic number =0x644d5241, which is expected in the 64-byte header of the decompressed kernel image. We can fix this in user-space kexec-tools, which handles an 'Image.gz' being passed via kexec_file_load(), using an approach as follows: a). Copy the contents of Image.gz to a temporary file. b). Decompress (gunzip-decompress) the contents inside the temporary file. c). Pass the 'fd' of the temporary file to the kernel space. So basically the kernel space still gets a decompressed kernel image to load via kexec-tools I tested this patch for the following three use-cases: 1. Uncompressed Image file: #kexec -s -l Image --initrd=/boot/initramfs-`uname -r`.img --reuse-cmdline 2. Signed Image file: #kexec -s -l Image.signed --initrd=/boot/initramfs-`uname -r`.img --reuse-cmdline 3. zlib compressed Image.gz file: #kexec -s -l /boot/vmlinuz-`uname -r` --initrd=/boot/initramfs-`uname -r`.img --reuse-cmdline Signed-off-by: Bhupesh Sharma <bhsharma@redhat.com> Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'kexec/kexec.c')
-rw-r--r--kexec/kexec.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/kexec/kexec.c b/kexec/kexec.c
index 8ca3b45..bc6ab3d 100644
--- a/kexec/kexec.c
+++ b/kexec/kexec.c
@@ -1206,8 +1206,20 @@ static int do_kexec_file_load(int fileind, int argc, char **argv,
kernel_buf = slurp_decompress_file(kernel, &kernel_size);
for (i = 0; i < file_types; i++) {
+#ifdef __aarch64__
+ /* handle Image.gz like cases */
+ if (is_zlib_file(kernel, &kernel_size)) {
+ if ((ret = file_type[i].probe(kernel, kernel_size)) >= 0) {
+ kernel_fd = ret;
+ break;
+ }
+ } else
+ if (file_type[i].probe(kernel_buf, kernel_size) >= 0)
+ break;
+#else
if (file_type[i].probe(kernel_buf, kernel_size) >= 0)
break;
+#endif
}
if (i == file_types) {