[U-Boot] [PATCH] fit: Do not automatically decompress ramdisk images
Simon Goldschmidt
simon.k.r.goldschmidt at gmail.com
Mon Aug 5 05:31:24 UTC 2019
On Sat, Aug 3, 2019 at 12:52 AM Julius Werner <jwerner at chromium.org> wrote:
>
> The Linux ramdisk should always be decompressed by the kernel itself,
> not by U-Boot. Therefore, the 'compression' node in the FIT image should
> always be set to "none" for ramdisk images, since the only point of
> using that node is if you want U-Boot to do the decompression itself.
>
> Yet some systems populate the node to the compression algorithm used by
> the kernel instead. This used to be ignored, but now that we support
> decompression of all image types it becomes a problem. Since ramdisks
> should never be decompressed by U-Boot anyway, this patch adds a special
> exception for them to avoid these issues. Still, setting the
> 'compression' node like that is wrong in the first place, so we still
> want to print out a warning so that third-party distributions doing this
> can notice and fix it.
>
> Signed-off-by: Julius Werner <jwerner at chromium.org>
Reviewed-by: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
> ---
> common/image-fit.c | 13 +++++++++----
> test/py/tests/test_fit.py | 10 +++++++++-
> 2 files changed, 18 insertions(+), 5 deletions(-)
>
> diff --git a/common/image-fit.c b/common/image-fit.c
> index e346fed550..5c63c769de 100644
> --- a/common/image-fit.c
> +++ b/common/image-fit.c
> @@ -1998,10 +1998,11 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
> comp = IH_COMP_NONE;
> loadbuf = buf;
> /* Kernel images get decompressed later in bootm_load_os(). */
> - if (!(image_type == IH_TYPE_KERNEL ||
> - image_type == IH_TYPE_KERNEL_NOLOAD) &&
> - !fit_image_get_comp(fit, noffset, &comp) &&
> - comp != IH_COMP_NONE) {
> + if (!fit_image_get_comp(fit, noffset, &comp) &&
> + comp != IH_COMP_NONE &&
> + !(image_type == IH_TYPE_KERNEL ||
> + image_type == IH_TYPE_KERNEL_NOLOAD ||
> + image_type == IH_TYPE_RAMDISK)) {
> ulong max_decomp_len = len * 20;
> if (load == data) {
> loadbuf = malloc(max_decomp_len);
> @@ -2021,6 +2022,10 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
> memcpy(loadbuf, buf, len);
> }
>
> + if (image_type == IH_TYPE_RAMDISK && comp != IH_COMP_NONE)
> + puts("WARNING: 'compression' nodes for ramdisks are deprecated,"
> + " please fix your .its file!\n");
> +
> /* verify that image data is a proper FDT blob */
> if (image_type == IH_TYPE_FLATDT && fdt_check_header(loadbuf)) {
> puts("Subimage data is not a FDT");
> diff --git a/test/py/tests/test_fit.py b/test/py/tests/test_fit.py
> index 8009d2907b..e3210ed43f 100755
> --- a/test/py/tests/test_fit.py
> +++ b/test/py/tests/test_fit.py
> @@ -269,6 +269,11 @@ def test_fit(u_boot_console):
> def check_equal(expected_fname, actual_fname, failure_msg):
> """Check that a file matches its expected contents
>
> + This is always used on out-buffers whose size is decided by the test
> + script anyway, which in some cases may be larger than what we're
> + actually looking for. So it's safe to truncate it to the size of the
> + expected data.
> +
> Args:
> expected_fname: Filename containing expected contents
> actual_fname: Filename containing actual contents
> @@ -276,6 +281,8 @@ def test_fit(u_boot_console):
> """
> expected_data = read_file(expected_fname)
> actual_data = read_file(actual_fname)
> + if len(expected_data) < len(actual_data):
> + actual_data = actual_data[:len(expected_data)]
> assert expected_data == actual_data, failure_msg
>
> def check_not_equal(expected_fname, actual_fname, failure_msg):
> @@ -435,7 +442,8 @@ def test_fit(u_boot_console):
> output = cons.run_command_list(cmd.splitlines())
> check_equal(kernel, kernel_out, 'Kernel not loaded')
> check_equal(control_dtb, fdt_out, 'FDT not loaded')
> - check_equal(ramdisk, ramdisk_out, 'Ramdisk not loaded')
> + check_not_equal(ramdisk, ramdisk_out, 'Ramdisk got decompressed?')
> + check_equal(ramdisk + '.gz', ramdisk_out, 'Ramdist not loaded')
>
>
> cons = u_boot_console
> --
> 2.20.1
>
More information about the U-Boot
mailing list