diff options
author | Tom Rini <trini@konsulko.com> | 2019-02-19 20:48:11 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2019-02-19 20:48:11 -0500 |
commit | 97f9830849c64d60d0cf2fd69e87dfe4557d02a4 (patch) | |
tree | 7af7b4e87637a61be6ce762d2dc99bcdd503b9be /common/spl/spl.c | |
parent | b78a9e2212d4d15fd16af41ae33d05a5c33954de (diff) | |
parent | 06d01e6601203644b403cc8d909fe2a1990e5468 (diff) |
Merge branch '2019-02-19-master-imports'
- Convert some OMAP3 platforms to DM+SPL
- Various minor fixes
- Updates for hikey, DaVinci, am57xx platforms,
- Make FAT use less memory
Diffstat (limited to 'common/spl/spl.c')
-rw-r--r-- | common/spl/spl.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/common/spl/spl.c b/common/spl/spl.c index 35120b6efd1..2e2af1b28ee 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -239,6 +239,14 @@ int spl_parse_image_header(struct spl_image_info *spl_image, #ifdef CONFIG_SPL_LEGACY_IMAGE_SUPPORT u32 header_size = sizeof(struct image_header); +#ifdef CONFIG_SPL_LEGACY_IMAGE_CRC_CHECK + /* check uImage header CRC */ + if (!image_check_hcrc(header)) { + puts("SPL: Image header CRC check failed!\n"); + return -EINVAL; + } +#endif + if (spl_image->flags & SPL_COPY_PAYLOAD_ONLY) { /* * On some system (e.g. powerpc), the load-address and @@ -256,6 +264,13 @@ int spl_parse_image_header(struct spl_image_info *spl_image, spl_image->size = image_get_data_size(header) + header_size; } +#ifdef CONFIG_SPL_LEGACY_IMAGE_CRC_CHECK + /* store uImage data length and CRC to check later */ + spl_image->dcrc_data = image_get_load(header); + spl_image->dcrc_length = image_get_data_size(header); + spl_image->dcrc = image_get_dcrc(header); +#endif + spl_image->os = image_get_os(header); spl_image->name = image_get_name(header); debug(SPL_TPL_PROMPT @@ -495,12 +510,25 @@ static struct spl_image_loader *spl_ll_find_loader(uint boot_device) static int spl_load_image(struct spl_image_info *spl_image, struct spl_image_loader *loader) { + int ret; struct spl_boot_device bootdev; bootdev.boot_device = loader->boot_device; bootdev.boot_device_name = NULL; - return loader->load_image(spl_image, &bootdev); + ret = loader->load_image(spl_image, &bootdev); +#ifdef CONFIG_SPL_LEGACY_IMAGE_CRC_CHECK + if (!ret && spl_image->dcrc_length) { + /* check data crc */ + ulong dcrc = crc32_wd(0, (unsigned char *)spl_image->dcrc_data, + spl_image->dcrc_length, CHUNKSZ_CRC32); + if (dcrc != spl_image->dcrc) { + puts("SPL: Image data CRC check failed!\n"); + ret = -EINVAL; + } + } +#endif + return ret; } /** |