From b4e67c5112b8d8ec8f9255af057c3515c5ea71c1 Mon Sep 17 00:00:00 2001 From: Denis 'GNUtoo' Carikli Date: Sat, 29 May 2021 19:14:22 +0200 Subject: [PATCH] Add tool to dump sunxi images $./tools/dumpimage -l ~/work/temp/lime1.img Allwinner eGON image, size: 24576 bytes SPL header version 0.2 DT name: sun7i-a20-olinuxino-lime2-emmc $ ./tools/dumpimage -l ~/work/temp/parabola.img Allwinner eGON image, size: 24576 bytes SPL header version 0.2 DT name: sun7i-a20-olinuxino-lime2-emmc TODO: - why do we have the lime2 dt detected above? is the env a leftover from the previous image somehow? - Handle block devices: $ sudo ./tools/dumpimage -l /dev/sdb Image Type: MVEBU Boot from (null) Image Image version:0 Data Size: -4 Bytes = 4194304.00 KiB = 4096.00 MiB Load Address: 00000000 Entry Point: 00000000 - Make it easily parsable by tools - Force type to sunxi_egon Signed-off-by: Denis 'GNUtoo' Carikli --- tools/dumpimage.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/tools/dumpimage.c b/tools/dumpimage.c index e5481435a7..9d0d0c448b 100644 --- a/tools/dumpimage.c +++ b/tools/dumpimage.c @@ -71,6 +71,9 @@ int main(int argc, char **argv) char *ptr; int retval = EXIT_SUCCESS; struct image_type_params *tparams = NULL; + off_t offset = 0; + + offset = 8192; /* Allwinner SOCs */ params.cmdname = *argv; @@ -159,6 +162,14 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } + /* Handle block devices */ + if (sbuf.st_size == 0) { + /* 1M should be sufficient as we have the first partition that + * is typically aligned at 1M for MBR partitioning. + */ + sbuf.st_size = 1024*1024; + } + if ((uint32_t)sbuf.st_size < tparams->header_size) { fprintf(stderr, "%s: Bad size: \"%s\" is not valid image\n", params.cmdname, params.imagefile); @@ -182,7 +193,7 @@ int main(int argc, char **argv) * Extract the data files from within the matched * image type. Returns the error code if not matched */ - retval = dumpimage_extract_subimage(tparams, ptr, &sbuf); + retval = dumpimage_extract_subimage(tparams, ptr + offset, &sbuf); if (retval) fprintf(stderr, "%s: Can't extract subimage from %s\n", params.cmdname, params.imagefile); @@ -191,10 +202,9 @@ int main(int argc, char **argv) * Print the image information for matched image type * Returns the error code if not matched */ - retval = imagetool_verify_print_header(ptr, &sbuf, tparams, + retval = imagetool_verify_print_header(ptr + offset, &sbuf, tparams, ¶ms); } - (void)munmap((void *)ptr, sbuf.st_size); (void)close(ifd); -- 2.31.1