diff options
author | Lucas Stach <dev@lynxeye.de> | 2019-11-07 21:12:56 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-11-12 12:55:04 +0100 |
commit | 390bc7834ffcee9fe9b94babf0f313bcc4d3b42d (patch) | |
tree | 3fc7c7f15df0c96c11e73fd82df9dad858f2b70d /arch/arm/cpu | |
parent | b0348d677bb47bdbd368983603b3e9604528d4ed (diff) | |
download | barebox-390bc7834ffcee9fe9b94babf0f313bcc4d3b42d.tar.gz barebox-390bc7834ffcee9fe9b94babf0f313bcc4d3b42d.tar.xz |
ARM: start: check for machine type last
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 <dev@lynxeye.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/cpu')
-rw-r--r-- | arch/arm/cpu/start.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c index 44d974e40e..d99dd147b0 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) { |