X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=tools%2Fmkimage.c;h=d2cd1917874eef0154764351cb7c0edd274553c0;hb=07672c478e3a6aa0ac2ddb5b05a181b1025fd759;hp=b0c98f6f5512be510e463538a24d35d36dfdcd91;hpb=0675f992dbf4a785a05a1baf149c2bce6aa5fe90;p=oweals%2Fu-boot.git diff --git a/tools/mkimage.c b/tools/mkimage.c index b0c98f6f55..d2cd191787 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -1,13 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2008 Semihalf * * (C) Copyright 2000-2009 * DENX Software Engineering * Wolfgang Denk, wd@denx.de - * - * SPDX-License-Identifier: GPL-2.0+ */ +#include "imagetool.h" #include "mkimage.h" #include "imximage.h" #include @@ -98,22 +98,23 @@ static void usage(const char *msg) " -i => input filename for ramdisk file\n"); #ifdef CONFIG_FIT_SIGNATURE fprintf(stderr, - "Signing / verified boot options: [-E] [-k keydir] [-K dtb] [ -c ] [-p addr] [-r] [-N engine]\n" + "Signing / verified boot options: [-E] [-B size] [-k keydir] [-K dtb] [ -c ] [-p addr] [-r] [-N engine]\n" " -E => place data outside of the FIT structure\n" + " -B => align size in hex for FIT structure and header\n" " -k => set directory containing private keys\n" " -K => write public keys to this .dtb file\n" " -c => add comment in signature node\n" " -F => re-sign existing FIT image\n" " -p => place external data at a static position\n" " -r => mark keys used as 'required' in dtb\n" - " -N => engine to use for signing (pkcs11)\n"); + " -N => openssl engine to use for signing\n"); #else fprintf(stderr, "Signing / verified boot not supported (CONFIG_FIT_SIGNATURE undefined)\n"); #endif fprintf(stderr, " %s -V ==> print version information and exit\n", params.cmdname); - fprintf(stderr, "Use -T to see a list of available image types\n"); + fprintf(stderr, "Use '-T list' to see a list of available image types\n"); exit(EXIT_FAILURE); } @@ -144,7 +145,7 @@ static void process_args(int argc, char **argv) int opt; while ((opt = getopt(argc, argv, - "a:A:b:c:C:d:D:e:Ef:Fk:i:K:ln:N:p:O:rR:qsT:vVx")) != -1) { + "a:A:b:B:c:C:d:D:e:Ef:Fk:i:K:ln:N:p:O:rR:qsT:vVx")) != -1) { switch (opt) { case 'a': params.addr = strtoull(optarg, &ptr, 16); @@ -168,6 +169,15 @@ static void process_args(int argc, char **argv) params.cmdname, optarg); exit(EXIT_FAILURE); } + break; + case 'B': + params.bl_len = strtoull(optarg, &ptr, 16); + if (*ptr) { + fprintf(stderr, "%s: invalid block length %s\n", + params.cmdname, optarg); + exit(EXIT_FAILURE); + } + break; case 'c': params.comment = optarg; @@ -201,7 +211,7 @@ static void process_args(int argc, char **argv) case 'f': datafile = optarg; params.auto_its = !strcmp(datafile, "auto"); - /* no break */ + /* fallthrough */ case 'F': /* * The flattened image tree (FIT) format @@ -260,6 +270,10 @@ static void process_args(int argc, char **argv) params.skipcpy = 1; break; case 'T': + if (strcmp(optarg, "list") == 0) { + show_valid_options(IH_TYPE); + exit(EXIT_SUCCESS); + } type = genimg_get_type_id(optarg); if (type < 0) { show_valid_options(IH_TYPE); @@ -297,6 +311,8 @@ static void process_args(int argc, char **argv) else if (!params.datafile) usage("Missing data file for auto-FIT (use -d)"); } else if (type != IH_TYPE_INVALID) { + if (type == IH_TYPE_SCRIPT && !params.datafile) + usage("Missing data file for script (use -d)"); params.type = type; } @@ -313,6 +329,7 @@ int main(int argc, char **argv) struct image_type_params *tparams = NULL; int pad_len = 0; int dfd; + size_t map_len; params.cmdname = *argv; params.addr = 0; @@ -397,14 +414,21 @@ int main(int argc, char **argv) exit (EXIT_FAILURE); } - /* - * scan through mkimage registry for all supported image types - * and verify the input image file header for match - * Print the image information for matched image type - * Returns the error code if not matched - */ - retval = imagetool_verify_print_header(ptr, &sbuf, - tparams, ¶ms); + if (params.fflag) { + /* + * Verifies the header format based on the expected header for image + * type in tparams + */ + retval = imagetool_verify_print_header_by_type(ptr, &sbuf, + tparams, ¶ms); + } else { + /** + * When listing the image, we are not given the image type. Simply check all + * image types to find one that matches our header + */ + retval = imagetool_verify_print_header(ptr, &sbuf, + tparams, ¶ms); + } (void) munmap((void *)ptr, sbuf.st_size); (void) close (ifd); @@ -510,13 +534,42 @@ int main(int argc, char **argv) } else if (params.type == IH_TYPE_PBLIMAGE) { /* PBL has special Image format, implements its' own */ pbl_load_uboot(ifd, ¶ms); + } else if (params.type == IH_TYPE_ZYNQMPBIF) { + /* Image file is meta, walk through actual targets */ + int ret; + + ret = zynqmpbif_copy_image(ifd, ¶ms); + if (ret) + return ret; + } else if (params.type == IH_TYPE_IMX8IMAGE) { + /* i.MX8/8X has special Image format */ + int ret; + + ret = imx8image_copy_image(ifd, ¶ms); + if (ret) + return ret; + } else if (params.type == IH_TYPE_IMX8MIMAGE) { + /* i.MX8M has special Image format */ + int ret; + + ret = imx8mimage_copy_image(ifd, ¶ms); + if (ret) + return ret; + } else if ((params.type == IH_TYPE_RKSD) || + (params.type == IH_TYPE_RKSPI)) { + /* Rockchip has special Image format */ + int ret; + + ret = rockchip_copy_image(ifd, ¶ms); + if (ret) + return ret; } else { copy_file(ifd, params.datafile, pad_len); } if (params.type == IH_TYPE_FIRMWARE_IVT) { /* Add alignment and IVT */ - uint32_t aligned_filesize = (params.file_size + 0x1000 - - 1) & ~(0x1000 - 1); + uint32_t aligned_filesize = ALIGN(params.file_size, + 0x1000); flash_header_v2_t ivt_header = { { 0xd1, 0x2000, 0x40 }, params.addr, 0, 0, 0, params.addr + aligned_filesize @@ -526,7 +579,7 @@ int main(int argc, char **argv) + 0x20, 0 }; int i = params.file_size; for (; i < aligned_filesize; i++) { - if (write(ifd, &i, 1) != 1) { + if (write(ifd, (char *) &i, 1) != 1) { fprintf(stderr, "%s: Write error on %s: %s\n", params.cmdname, @@ -564,7 +617,8 @@ int main(int argc, char **argv) } params.file_size = sbuf.st_size; - ptr = mmap(0, sbuf.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, ifd, 0); + map_len = sbuf.st_size; + ptr = mmap(0, map_len, PROT_READ | PROT_WRITE, MAP_SHARED, ifd, 0); if (ptr == MAP_FAILED) { fprintf (stderr, "%s: Can't map %s: %s\n", params.cmdname, params.imagefile, strerror(errno)); @@ -584,12 +638,11 @@ int main(int argc, char **argv) if (tparams->print_header) tparams->print_header (ptr); else { - fprintf (stderr, "%s: Can't print header for %s: %s\n", - params.cmdname, tparams->name, strerror(errno)); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: Can't print header for %s\n", + params.cmdname, tparams->name); } - (void) munmap((void *)ptr, sbuf.st_size); + (void)munmap((void *)ptr, map_len); /* We're a bit of paranoid */ #if defined(_POSIX_SYNCHRONIZED_IO) && \