[PATCH v2 1/1] cmd: bootefi: Honor the address & size cells properties correctly

Heinrich Schuchardt xypron.glpk at gmx.de
Fri Jun 19 09:16:40 CEST 2020


From: Atish Patra <atish.patra at wdc.com>

fdtdec_get_addr_size reads the uses a fixed value for address & size
cell properties which may not be correct always.

Use the auto variant of the function which automatically reads
 #address-cells & #size-cells from parent and uses to read the "reg"
property.

Signed-off-by: Atish Patra <atish.patra at wdc.com>

On 32 bit systems fdt_addr_t may be 4 bytes long but size is defined as
u64. Avoid filling the upper 4 bytes of the sizep parameter of
fdtdec_get_addr_size_auto_parent() with random bytes from the stack by
defining a separate variable fdt_size.

Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
---
 cmd/bootefi.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 0f6d0f7750..ac713cad1b 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -189,16 +189,19 @@ static void efi_carve_out_dt_rsv(void *fdt)
 	if (nodeoffset >= 0) {
 		subnode = fdt_first_subnode(fdt, nodeoffset);
 		while (subnode >= 0) {
+			fdt_addr_t fdt_addr, fdt_size;
+
 			/* check if this subnode has a reg property */
-			addr = fdtdec_get_addr_size(fdt, subnode, "reg",
-						    (fdt_size_t *)&size);
+			fdt_addr = fdtdec_get_addr_size_auto_parent(
+						fdt, nodeoffset, subnode,
+						"reg", 0, &fdt_size, false);
 			/*
 			 * The /reserved-memory node may have children with
 			 * a size instead of a reg property.
 			 */
 			if (addr != FDT_ADDR_T_NONE &&
 			    fdtdec_get_is_enabled(fdt, subnode))
-				efi_reserve_memory(addr, size);
+				efi_reserve_memory(fdt_addr, fdt_size);
 			subnode = fdt_next_subnode(fdt, subnode);
 		}
 	}
--
2.27.0



More information about the U-Boot mailing list