cmd: fdt: move: Use map_sysmem to convert pointers
authorAndre Przywara <andre.przywara@arm.com>
Fri, 10 Feb 2023 11:02:11 +0000 (11:02 +0000)
committerSimon Glass <sjg@chromium.org>
Mon, 13 Feb 2023 00:33:51 +0000 (17:33 -0700)
The "fdt move" subcommand was using the provided DTB addresses directly,
without trying to "map" them into U-Boot's address space. This happened
to work since on the vast majority of "real" platforms there is a simple
1:1 mapping of VA to PAs, so either value works fine.

However this is not true on the sandbox, so the "fdt move" command fails
there miserably:
=> fdt addr $fdtcontroladdr
=> cp.l $fdtcontroladdr $fdt_addr_r 40  # simple memcpy works
=> fdt move $fdtcontroladdr $fdt_addr_r
Segmentation fault

Use the proper "map_sysmem" call to convert PAs to VAs, to make this
more robust in general and to enable operation in the sandbox.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
cmd/fdt.c

index 8e51a43126175cfff297dcc4eac07d2c45f5991a..0ba691c573b433693ffbdcb5ff12f51a85748112 100644 (file)
--- a/cmd/fdt.c
+++ b/cmd/fdt.c
@@ -231,11 +231,11 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
                /*
                 * Set the address and length of the fdt.
                 */
-               working_fdt = (struct fdt_header *)hextoul(argv[2], NULL);
+               working_fdt = map_sysmem(hextoul(argv[2], NULL), 0);
                if (!fdt_valid(&working_fdt))
                        return 1;
 
-               newaddr = (struct fdt_header *)hextoul(argv[3], NULL);
+               newaddr = map_sysmem(hextoul(argv[3], NULL), 0);
 
                /*
                 * If the user specifies a length, use that.  Otherwise use the
@@ -262,7 +262,7 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
                                fdt_strerror(err));
                        return 1;
                }
-               set_working_fdt_addr((ulong)newaddr);
+               set_working_fdt_addr(map_to_sysmem(newaddr));
 #ifdef CONFIG_OF_SYSTEM_SETUP
        /* Call the board-specific fixup routine */
        } else if (strncmp(argv[1], "sys", 3) == 0) {