A valid DTB may reside low in the Barebox binary address map. If this
binary is started at a very low address, we might mistake the pointer
for a machine type. Make sure to check for all other possibilities first
before interpreting the boarddata as a raw machine type.

Fixes: 19c24e2f0121 (ARM: start: Allow to pass machine type as boarddata)
Signed-off-by: Lucas Stach <d...@lynxeye.de>
---
 arch/arm/cpu/start.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
index 44d974e40ef2..d99dd147b004 100644
--- a/arch/arm/cpu/start.c
+++ b/arch/arm/cpu/start.c
@@ -193,7 +193,17 @@ __noreturn void barebox_non_pbl_start(unsigned long 
membase,
                uint32_t totalsize = 0;
                const char *name;
 
-               if ((unsigned long)boarddata < 8192) {
+               if (blob_is_fdt(boarddata)) {
+                       totalsize = get_unaligned_be32(boarddata + 4);
+                       name = "DTB";
+               } else if (blob_is_compressed_fdt(boarddata)) {
+                       struct barebox_arm_boarddata_compressed_dtb *bd = 
boarddata;
+                       totalsize = bd->datalen + sizeof(*bd);
+                       name = "Compressed DTB";
+               } else if (blob_is_arm_boarddata(boarddata)) {
+                       totalsize = sizeof(struct barebox_arm_boarddata);
+                       name = "machine type";
+               } else if ((unsigned long)boarddata < 8192) {
                        struct barebox_arm_boarddata *bd;
                        uint32_t machine_type = (unsigned long)boarddata;
                        unsigned long mem = arm_mem_boarddata(membase, endmem,
@@ -205,16 +215,6 @@ __noreturn void barebox_non_pbl_start(unsigned long 
membase,
                        bd->magic = BAREBOX_ARM_BOARDDATA_MAGIC;
                        bd->machine = machine_type;
                        malloc_end = mem;
-               } else if (blob_is_fdt(boarddata)) {
-                       totalsize = get_unaligned_be32(boarddata + 4);
-                       name = "DTB";
-               } else if (blob_is_compressed_fdt(boarddata)) {
-                       struct barebox_arm_boarddata_compressed_dtb *bd = 
boarddata;
-                       totalsize = bd->datalen + sizeof(*bd);
-                       name = "Compressed DTB";
-               } else if (blob_is_arm_boarddata(boarddata)) {
-                       totalsize = sizeof(struct barebox_arm_boarddata);
-                       name = "machine type";
                }
 
                if (totalsize) {
-- 
2.23.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to