diff options
author | Andre Przywara <andre.przywara@arm.com> | 2023-02-10 11:02:11 +0000 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2023-02-12 17:33:51 -0700 |
commit | 645973461975b672c5471cb9e047274b27cf8840 (patch) | |
tree | 651f0cb8893a1e91e2b066d49aaf07ba9fadfb12 | |
parent | 193d3dbd452f64c0a32854708974402d4a0d675d (diff) | |
download | u-boot-645973461975b672c5471cb9e047274b27cf8840.zip u-boot-645973461975b672c5471cb9e047274b27cf8840.tar.gz u-boot-645973461975b672c5471cb9e047274b27cf8840.tar.bz2 |
cmd: fdt: move: Use map_sysmem to convert pointers
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>
-rw-r--r-- | cmd/fdt.c | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -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) { |