From 40e5975f9ad7a545b85d2430d6517d8d3d18e87d Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 2 Dec 2014 13:17:30 -0700 Subject: [PATCH] bootm: Move compression progress/error messages into a function This code is repeated in several places, and does not detect a common fault where the image is too large. Move it into its own function and provide a more helpful messages in this case, for compression schemes which support this. Signed-off-by: Simon Glass --- common/bootm.c | 71 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/common/bootm.c b/common/bootm.c index 6b3ea8c..915d537 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -264,7 +264,30 @@ static int bootm_find_other(cmd_tbl_t *cmdtp, int flag, int argc, return 0; } -#endif /* USE_HOSTCC */ +#endif /* USE_HOSTC */ + +#if defined(CONFIG_GZIP) || defined(CONFIG_GZIP) || defined(CONFIG_BZIP2) || \ + defined(CONFIG_LZMA) || defined(CONFIG_LZO) +static void print_decomp_msg(const char *type_name) +{ + printf(" Uncompressing %s ... ", type_name); +} + +static int handle_decomp_error(const char *algo, size_t size, size_t unc_len, + int ret) +{ + if (size >= unc_len) + puts("Image too large: increase CONFIG_SYS_BOOTM_LEN\n"); + else + printf("%s: uncompress or overwrite error %d\n", algo, ret); + puts("Must RESET board to recover\n"); +#ifndef USE_HOSTCC + bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE); +#endif + + return BOOTM_ERR_RESET; +} +#endif /** * decomp_image() - decompress the operating system @@ -296,19 +319,25 @@ static int decomp_image(int comp, ulong load, ulong image_start, int type, *load_end = load + image_len; break; #ifdef CONFIG_GZIP - case IH_COMP_GZIP: - printf(" Uncompressing %s ... ", type_name); - if (gunzip(load_buf, unc_len, image_buf, &image_len) != 0) { - puts("GUNZIP: uncompress, out-of-mem or overwrite error - must RESET board to recover\n"); - return BOOTM_ERR_RESET; + case IH_COMP_GZIP: { + int ret; + + print_decomp_msg(type_name); + ret = gunzip(load_buf, unc_len, image_buf, &image_len); + if (ret != 0) { + return handle_decomp_error("GUNZIP", image_len, + unc_len, ret); } *load_end = load + image_len; break; + } #endif /* CONFIG_GZIP */ #ifdef CONFIG_BZIP2 - case IH_COMP_BZIP2: - printf(" Uncompressing %s ... ", type_name); + case IH_COMP_BZIP2: { + size_t size = unc_len; + + print_decomp_msg(type_name); /* * If we've got less than 4 MB of malloc() space, * use slower decompression algorithm which requires @@ -318,30 +347,27 @@ static int decomp_image(int comp, ulong load, ulong image_start, int type, image_buf, image_len, CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0); if (i != BZ_OK) { - printf("BUNZIP2: uncompress or overwrite error %d - must RESET board to recover\n", - i); - return BOOTM_ERR_RESET; + return handle_decomp_error("BUNZIP2", size, unc_len, + i); } *load_end = load + unc_len; break; + } #endif /* CONFIG_BZIP2 */ #ifdef CONFIG_LZMA case IH_COMP_LZMA: { SizeT lzma_len = unc_len; int ret; - printf(" Uncompressing %s ... ", type_name); - + print_decomp_msg(type_name); ret = lzmaBuffToBuffDecompress(load_buf, &lzma_len, image_buf, image_len); - unc_len = lzma_len; if (ret != SZ_OK) { - printf("LZMA: uncompress or overwrite error %d - must RESET board to recover\n", - ret); - bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE); - return BOOTM_ERR_RESET; + return handle_decomp_error("LZMA", lzma_len, unc_len, + ret); } + unc_len = lzma_len; *load_end = load + unc_len; break; } @@ -351,14 +377,11 @@ static int decomp_image(int comp, ulong load, ulong image_start, int type, size_t size = unc_len; int ret; - printf(" Uncompressing %s ... ", type_name); + print_decomp_msg(type_name); ret = lzop_decompress(image_buf, image_len, load_buf, &size); - if (ret != LZO_E_OK) { - printf("LZO: uncompress or overwrite error %d - must RESET board to recover\n", - ret); - return BOOTM_ERR_RESET; - } + if (ret != LZO_E_OK) + return handle_decomp_error("LZO", size, unc_len, ret); *load_end = load + size; break;