diff options
author | Andre Przywara <andre.przywara@arm.com> | 2017-04-26 01:32:35 +0100 |
---|---|---|
committer | Seung-Woo Kim <sw0312.kim@samsung.com> | 2017-09-05 09:11:27 +0000 |
commit | 8a74a0b8b28a84258bf0d164a3473bf93e92d51b (patch) | |
tree | ed96027a0d1143cbd242ab584eaf0fec73dc6e35 | |
parent | c12c017bd5f3186a1e22c4a81787f5a535bfa3d7 (diff) | |
download | u-boot-8a74a0b8b28a84258bf0d164a3473bf93e92d51b.tar.gz u-boot-8a74a0b8b28a84258bf0d164a3473bf93e92d51b.tar.bz2 u-boot-8a74a0b8b28a84258bf0d164a3473bf93e92d51b.zip |
SPL: FIT: improve error handling
At the moment we ignore any errors due to missing FIT properties,
instead go ahead and calculate our addresses with the -1 return value.
Fix this and bail out if any of the mandatory properties are missing.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
Tested-by: Kever Yang <kever.yang@rock-chips.com>
Tested-by: Jagan Teki <jagan@openedev.com>
Reviewed-by: Jagan Teki <jagan@openedev.com>
[egukim: cherry-pick from mainline to support ATF]
Signed-off-by: egukim <egukim@dignsys.com>
Change-Id: I096e7d2fb9da3342994c21a9d341caa4ded2adb1
-rw-r--r-- | common/spl/spl_fit.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index 85af9805af..ecd42d891b 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -11,14 +11,17 @@ #include <libfdt.h> #include <spl.h> +#define FDT_ERROR ((ulong)(-1)) + static ulong fdt_getprop_u32(const void *fdt, int node, const char *prop) { const u32 *cell; int len; cell = fdt_getprop(fdt, node, prop, &len); - if (len != sizeof(*cell)) - return -1U; + if (!cell || len != sizeof(*cell)) + return FDT_ERROR; + return fdt32_to_cpu(*cell); } @@ -222,7 +225,11 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, /* Get its information and set up the spl_image structure */ data_offset = fdt_getprop_u32(fit, node, "data-offset"); + if (data_offset == FDT_ERROR) + return -ENOENT; data_size = fdt_getprop_u32(fit, node, "data-size"); + if (data_size == FDT_ERROR) + return -ENOENT; load = fdt_getprop_u32(fit, node, "load"); debug("data_offset=%x, data_size=%x\n", data_offset, data_size); spl_image->load_addr = load; @@ -265,6 +272,10 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, } fdt_offset = fdt_getprop_u32(fit, node, "data-offset"); fdt_len = fdt_getprop_u32(fit, node, "data-size"); + if (fdt_offset == FDT_ERROR || fdt_len == FDT_ERROR) { + debug("%s: cannot load FDT data\n" __func__); + return -ENOENT; + } /* * Read the device tree and place it after the image. There may be |