X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=tools%2Fmkimage.c;h=ff3024a8f172c8557bfaa02612d995bdcdd04f2d;hb=320e0570e67efbd093d7750655a758c66e9d5528;hp=1cc3a639815a052280579a7099621cf37ba6ff11;hpb=b0a487a4eb6c1e2214022f927cb3229f2323db44;p=oweals%2Fu-boot.git diff --git a/tools/mkimage.c b/tools/mkimage.c index 1cc3a63981..ff3024a8f1 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -15,7 +15,7 @@ static void copy_file(int, const char *, int); /* parameters initialized by core will be used by the image type code */ -struct image_tool_params params = { +static struct image_tool_params params = { .os = IH_OS_LINUX, .arch = IH_ARCH_PPC, .type = IH_TYPE_KERNEL, @@ -66,8 +66,9 @@ static void show_image_types(void) fprintf(stderr, "\n"); } -static void usage(void) +static void usage(const char *msg) { + fprintf(stderr, "Error: %s\n", msg); fprintf(stderr, "Usage: %s -l image\n" " -l ==> list image header information\n", params.cmdname); @@ -84,18 +85,21 @@ static void usage(void) " -x ==> set XIP (execute in place)\n", params.cmdname); fprintf(stderr, - " %s [-D dtc_options] [-f fit-image.its|-F] fit-image\n", + " %s [-D dtc_options] [-f fit-image.its|-f auto|-F] [-b [-b ]] fit-image\n" + " file is used with -f auto, it may occour multiple times.\n", params.cmdname); fprintf(stderr, " -D => set all options for device tree compiler\n" " -f => input filename for FIT source\n"); #ifdef CONFIG_FIT_SIGNATURE fprintf(stderr, - "Signing / verified boot options: [-k keydir] [-K dtb] [ -c ] [-r]\n" + "Signing / verified boot options: [-E] [-k keydir] [-K dtb] [ -c ] [-p addr] [-r]\n" + " -E => place data outside of the FIT structure\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"); #else fprintf(stderr, @@ -108,13 +112,33 @@ static void usage(void) exit(EXIT_FAILURE); } +static int add_content(int type, const char *fname) +{ + struct content_info *cont; + + cont = calloc(1, sizeof(*cont)); + if (!cont) + return -1; + cont->type = type; + cont->fname = fname; + if (params.content_tail) + params.content_tail->next = cont; + else + params.content_head = cont; + params.content_tail = cont; + + return 0; +} + static void process_args(int argc, char **argv) { char *ptr; + int type = IH_TYPE_INVALID; + char *datafile = NULL; int opt; while ((opt = getopt(argc, argv, - "a:A:cC:d:D:e:f:Fk:K:ln:O:rR:sT:vVx")) != -1) { + "a:A:b:cC:d:D:e:Ef:Fk:K:ln:p:O:rR:qsT:vVx")) != -1) { switch (opt) { case 'a': params.addr = strtoull(optarg, &ptr, 16); @@ -127,7 +151,15 @@ static void process_args(int argc, char **argv) case 'A': params.arch = genimg_get_arch_id(optarg); if (params.arch < 0) - usage(); + usage("Invalid architecture"); + break; + case 'b': + if (add_content(IH_TYPE_FLATDT, optarg)) { + fprintf(stderr, + "%s: Out of memory adding content '%s'", + params.cmdname, optarg); + exit(EXIT_FAILURE); + } break; case 'c': params.comment = optarg; @@ -135,7 +167,7 @@ static void process_args(int argc, char **argv) case 'C': params.comp = genimg_get_comp_id(optarg); if (params.comp < 0) - usage(); + usage("Invalid compression type"); break; case 'd': params.datafile = optarg; @@ -153,14 +185,19 @@ static void process_args(int argc, char **argv) } params.eflag = 1; break; + case 'E': + params.external_data = true; + break; case 'f': - params.datafile = optarg; + datafile = optarg; + params.auto_its = !strcmp(datafile, "auto"); /* no break */ case 'F': /* * The flattened image tree (FIT) format * requires a flattened device tree image type */ + params.fit_image_type = params.type; params.type = IH_TYPE_FLATDT; params.fflag = 1; break; @@ -179,7 +216,17 @@ static void process_args(int argc, char **argv) case 'O': params.os = genimg_get_os_id(optarg); if (params.os < 0) - usage(); + usage("Invalid operating system"); + break; + case 'p': + params.external_offset = strtoull(optarg, &ptr, 16); + if (*ptr) { + fprintf(stderr, "%s: invalid offset size %s\n", + params.cmdname, optarg); + exit(EXIT_FAILURE); + } + case 'q': + params.quiet = 1; break; case 'r': params.require_keys = 1; @@ -195,10 +242,10 @@ static void process_args(int argc, char **argv) params.skipcpy = 1; break; case 'T': - params.type = genimg_get_type_id(optarg); - if (params.type < 0) { + type = genimg_get_type_id(optarg); + if (type < 0) { show_image_types(); - usage(); + usage("Invalid image type"); } break; case 'v': @@ -211,13 +258,29 @@ static void process_args(int argc, char **argv) params.xflag++; break; default: - usage(); + usage("Invalid option"); } } - if (optind >= argc) - usage(); - params.imagefile = argv[optind]; + /* The last parameter is expected to be the imagefile */ + if (optind < argc) + params.imagefile = argv[optind]; + + /* + * For auto-generated FIT images we need to know the image type to put + * in the FIT, which is separate from the file's image type (which + * will always be IH_TYPE_FLATDT in this case). + */ + if (params.type == IH_TYPE_FLATDT) { + params.fit_image_type = type; + if (!params.auto_its) + params.datafile = datafile; + } else if (type != IH_TYPE_INVALID) { + params.type = type; + } + + if (!params.imagefile) + usage("Missing output filename"); } @@ -251,7 +314,7 @@ int main(int argc, char **argv) */ if (tparams->check_params) if (tparams->check_params (¶ms)) - usage(); + usage("Bad parameters for image type"); if (!params.eflag) { params.ep = params.addr;