There are cases that the devicetree blob is placed after _end, such as
fdt_find_separate() returns _end. This is in bss area cleared before
relocation.

When GD_FLG_SKIP_RELOC is set, the blob is still in bss, but will be
cleared. As a result, the devicetree become invalid.

To avoid this issue, should relocate it to the new fdt area using the
latter condition in reloc_fdt().

Signed-off-by: Kunihiko Hayashi <hayashi.kunih...@socionext.com>
---
 common/board_f.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/common/board_f.c b/common/board_f.c
index 51d2f3c365e9..9a245872d190 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -622,7 +622,8 @@ static int init_post(void)
 static int reloc_fdt(void)
 {
        if (!IS_ENABLED(CONFIG_OF_EMBED)) {
-               if (gd->flags & GD_FLG_SKIP_RELOC)
+               if (gd->flags & GD_FLG_SKIP_RELOC &&
+                   gd->fdt_blob != &_end)
                        return 0;
                if (gd->new_fdt) {
                        memcpy(gd->new_fdt, gd->fdt_blob,
-- 
2.25.1

Reply via email to