diff options
author | Bhupesh Sharma <bhsharma@redhat.com> | 2019-07-15 11:32:56 +0530 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2019-07-16 13:45:30 +0200 |
commit | f4c1caaa97a2e019ccc00ab63e390c60d1c9454c (patch) | |
tree | e3d8d838b0d49e4a02f11190e451f4e6050c1bbb /kexec/kexec.c | |
parent | 0e709571bfe7e3b8160044970e2084194f9a963b (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.c | 12 |
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) { |