summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolodymyr Babchuk <Volodymyr_Babchuk@epam.com>2024-03-11 21:33:45 +0000
committerCaleb Connolly <caleb.connolly@linaro.org>2024-04-04 17:46:45 +0200
commit86eb5d834d220893b5dc262c5aea7f933e275a4f (patch)
treec6418137c8233764411653643bf8a655044cc28f
parentb621dcd16246d5271ae000701c50b2deaac3feab (diff)
qcom: board: validate fdt before trying to use it
There are cases when previous bootloader stage leaves some seemingly valid value in r0, which in fact does not point to valid FDT blob. This behavior was encountered when trying to boot U-Boot as "hyp" loader on SA8155P-ADP. To be sure that we really got the pointer to a device tree we need to validate it with fdt_check_header() function. Note: This approach is not 100% fool-proof, as get_prev_bl_fdt_addr() theoretically can return a pointer to a region that is not physically mapped and we will get data abort exception when fdt_check_header() will try to access it. But at this early boot stage we don't know where RAM is anyways so there is little we can do. Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com> Reviewed-by: Sumit Garg <sumit.garg@linaro.org> Reviewed-by: Caleb Connolly <caleb.connolly@linaro.org> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
-rw-r--r--arch/arm/mach-snapdragon/board.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
index f12f5791a13..6f762fc948b 100644
--- a/arch/arm/mach-snapdragon/board.c
+++ b/arch/arm/mach-snapdragon/board.c
@@ -24,6 +24,7 @@
#include <linux/sizes.h>
#include <lmb.h>
#include <malloc.h>
+#include <fdt_support.h>
#include <usb.h>
#include <sort.h>
@@ -93,7 +94,9 @@ void *board_fdt_blob_setup(int *err)
* try and use the FDT built into U-Boot if there is one...
* This avoids having a hard dependency on the previous stage bootloader
*/
- if (IS_ENABLED(CONFIG_OF_SEPARATE) && (!fdt || fdt != ALIGN(fdt, SZ_4K))) {
+
+ if (IS_ENABLED(CONFIG_OF_SEPARATE) && (!fdt || fdt != ALIGN(fdt, SZ_4K) ||
+ fdt_check_header((void *)fdt))) {
debug("%s: Using built in FDT, bootloader gave us %#llx\n", __func__, fdt);
return (void *)gd->fdt_blob;
}