diff mbox series

optee: fix copy of optee reserved-memory node

Message ID 20200605092205.1.Ibab98d647c5748ec387b62823fa04035ac0afd74@changeid
State New
Headers show
Series optee: fix copy of optee reserved-memory node | expand

Commit Message

Patrick Delaunay June 5, 2020, 7:22 a.m. UTC
From: Etienne Carriere <etienne.carriere at linaro.org>

Fix the loop that parses FDT for a reserved memory node named "optee".

Before this change, if at least one subnode was found in the
reserved-memory node, the function endlessly looped since instruction
continue returned back in the loop without updating variable subnode.
This change fixes the issue by using a for loop.

Fixes: 6ccb05eae01b ("image: fdt: copy possible optee nodes to a loaded devicetree")
Signed-off-by: Etienne Carriere <etienne.carriere at linaro.org>
Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
---

 lib/optee/optee.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

Comments

Patrick Delaunay June 12, 2020, 9:03 a.m. UTC | #1
Hi Tom,

> From: Patrick DELAUNAY <patrick.delaunay at st.com>
> Sent: vendredi 5 juin 2020 09:22
> 
> From: Etienne Carriere <etienne.carriere at linaro.org>
> 
> Fix the loop that parses FDT for a reserved memory node named "optee".
> 
> Before this change, if at least one subnode was found in the reserved-memory
> node, the function endlessly looped since instruction continue returned back in the
> loop without updating variable subnode.
> This change fixes the issue by using a for loop.
> 
> Fixes: 6ccb05eae01b ("image: fdt: copy possible optee nodes to a loaded
> devicetree")
> Signed-off-by: Etienne Carriere <etienne.carriere at linaro.org>
> Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
> ---
> 
>  lib/optee/optee.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/optee/optee.c b/lib/optee/optee.c index e59b5766e7..457d4cca8a
> 100644
> --- a/lib/optee/optee.c
> +++ b/lib/optee/optee.c
> @@ -156,8 +156,9 @@ int optee_copy_fdt_nodes(const void *old_blob, void
> *new_blob)
>  	/* optee inserts its memory regions as reserved-memory nodes */
>  	nodeoffset = fdt_subnode_offset(old_blob, 0, "reserved-memory");
>  	if (nodeoffset >= 0) {
> -		subnode = fdt_first_subnode(old_blob, nodeoffset);
> -		while (subnode >= 0) {
> +		for (subnode = fdt_first_subnode(old_blob, nodeoffset);
> +		     subnode >= 0;
> +		     subnode = fdt_next_subnode(old_blob, subnode)) {
>  			const char *name = fdt_get_name(old_blob,
>  							subnode, NULL);
>  			if (!name)
> @@ -197,8 +198,6 @@ int optee_copy_fdt_nodes(const void *old_blob, void
> *new_blob)
>  				if (ret < 0)
>  					return ret;
>  			}
> -
> -			subnode = fdt_next_subnode(old_blob, subnode);
>  		}
>  	}
> 
> --
> 2.17.1

Do you think it is possible to include this fix in v2020.07 ?
Or do you expect some review ?

This issue blocks the STM32MP1 boot with OP-TEE...
as subnode is not update if the first reserved node is not "optee" one, 
with:

	if (strncmp(name, "optee", 5))
		continue;

for example DT =

reserved-memory {
	gpu_reserved: gpu at da000000 {
		reg = <0xda000000 0x4000000>;
		no-map;
	};

	optee at de000000 {
		reg = <0xde000000 0x02000000>;
		no-map;
	};
};

See also http://patchwork.ozlabs.org/project/uboot/list/?series=181471


Regards

Patrick
Tom Rini June 15, 2020, 7:55 p.m. UTC | #2
On Fri, Jun 05, 2020 at 09:22:11AM +0200, Patrick Delaunay wrote:

> From: Etienne Carriere <etienne.carriere at linaro.org>
> 
> Fix the loop that parses FDT for a reserved memory node named "optee".
> 
> Before this change, if at least one subnode was found in the
> reserved-memory node, the function endlessly looped since instruction
> continue returned back in the loop without updating variable subnode.
> This change fixes the issue by using a for loop.
> 
> Fixes: 6ccb05eae01b ("image: fdt: copy possible optee nodes to a loaded devicetree")
> Signed-off-by: Etienne Carriere <etienne.carriere at linaro.org>
> Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/lib/optee/optee.c b/lib/optee/optee.c
index e59b5766e7..457d4cca8a 100644
--- a/lib/optee/optee.c
+++ b/lib/optee/optee.c
@@ -156,8 +156,9 @@  int optee_copy_fdt_nodes(const void *old_blob, void *new_blob)
 	/* optee inserts its memory regions as reserved-memory nodes */
 	nodeoffset = fdt_subnode_offset(old_blob, 0, "reserved-memory");
 	if (nodeoffset >= 0) {
-		subnode = fdt_first_subnode(old_blob, nodeoffset);
-		while (subnode >= 0) {
+		for (subnode = fdt_first_subnode(old_blob, nodeoffset);
+		     subnode >= 0;
+		     subnode = fdt_next_subnode(old_blob, subnode)) {
 			const char *name = fdt_get_name(old_blob,
 							subnode, NULL);
 			if (!name)
@@ -197,8 +198,6 @@  int optee_copy_fdt_nodes(const void *old_blob, void *new_blob)
 				if (ret < 0)
 					return ret;
 			}
-
-			subnode = fdt_next_subnode(old_blob, subnode);
 		}
 	}