
As with most other commands, this needs to factor in the sysmem offset in the sandbox or it will try to dereference the simulated physical address directly.
Signed-off-by: Tyler Hall tylerwhall@gmail.com --- cmd/cramfs.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/cmd/cramfs.c b/cmd/cramfs.c index 965ca4e60d..34be8554a7 100644 --- a/cmd/cramfs.c +++ b/cmd/cramfs.c @@ -18,6 +18,7 @@ #include <jffs2/jffs2.h> #include <jffs2/load_kernel.h> #include <cramfs/cramfs_fs.h> +#include <asm/io.h>
/* enable/disable debugging messages */ #define DEBUG_CRAMFS @@ -95,6 +96,7 @@ int do_cramfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) char *filename; int size; ulong offset = load_addr; + char *offset_virt;
struct part_info part; struct mtd_device dev; @@ -111,7 +113,7 @@ int do_cramfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) dev.id = &id; part.dev = &dev; /* fake the address offset */ - part.offset = addr - OFFSET_ADJUSTMENT; + part.offset = (u64) map_sysmem(addr - OFFSET_ADJUSTMENT, 0);
/* pre-set Boot file name */ if ((filename = getenv("bootfile")) == NULL) { @@ -127,9 +129,10 @@ int do_cramfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) filename = argv[2]; }
+ offset_virt = map_sysmem(offset, 0); size = 0; if (cramfs_check(&part)) - size = cramfs_load ((char *) offset, &part, filename); + size = cramfs_load (offset_virt, &part, filename);
if (size > 0) { printf("### CRAMFS load complete: %d bytes loaded to 0x%lx\n", @@ -139,6 +142,9 @@ int do_cramfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) printf("### CRAMFS LOAD ERROR<%x> for %s!\n", size, filename); }
+ unmap_sysmem(offset_virt); + unmap_sysmem((void *)part.offset); + return !(size > 0); }
@@ -172,7 +178,7 @@ int do_cramfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) dev.id = &id; part.dev = &dev; /* fake the address offset */ - part.offset = addr - OFFSET_ADJUSTMENT; + part.offset = (u64) map_sysmem(addr - OFFSET_ADJUSTMENT, 0);
if (argc == 2) filename = argv[1]; @@ -180,6 +186,7 @@ int do_cramfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) ret = 0; if (cramfs_check(&part)) ret = cramfs_ls (&part, filename); + unmap_sysmem((void *)part.offset);
return ret ? 0 : 1; }