summaryrefslogtreecommitdiffstats
path: root/arch/arm/cpu
diff options
context:
space:
mode:
authorLucas Stach <dev@lynxeye.de>2019-11-07 21:12:56 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2019-11-12 12:55:04 +0100
commit390bc7834ffcee9fe9b94babf0f313bcc4d3b42d (patch)
tree3fc7c7f15df0c96c11e73fd82df9dad858f2b70d /arch/arm/cpu
parentb0348d677bb47bdbd368983603b3e9604528d4ed (diff)
downloadbarebox-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.c22
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) {