From b97a2a0a21f279d66de8a9bdbfe21920968bcb1c Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Tue, 8 Jan 2008 18:14:09 +0100 Subject: [new uImage] Define a API for image handling operations - Add inline helper macros for basic header processing - Move common non inline code common/image.c - Replace direct header access with the API routines - Rename IH_CPU_* to IH_ARCH_* Signed-off-by: Marian Balakowicz --- common/cmd_autoscript.c | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) (limited to 'common/cmd_autoscript.c') diff --git a/common/cmd_autoscript.c b/common/cmd_autoscript.c index a6038a6eff..3e68ced1fe 100644 --- a/common/cmd_autoscript.c +++ b/common/cmd_autoscript.c @@ -49,56 +49,44 @@ #if defined(CONFIG_AUTOSCRIPT) || defined(CONFIG_CMD_AUTOSCRIPT) -extern image_header_t header; /* from cmd_bootm.c */ int autoscript (ulong addr) { - ulong crc, data, len; - image_header_t *hdr = &header; + ulong len; + image_header_t *hdr = (image_header_t *)addr; ulong *len_ptr; char *cmd; int rcode = 0; int verify; - cmd = getenv ("verify"); - verify = (cmd && (*cmd == 'n')) ? 0 : 1; + verify = getenv_verify (); - - memmove (hdr, (char *)addr, sizeof(image_header_t)); - - if (ntohl(hdr->ih_magic) != IH_MAGIC) { + if (!image_check_magic (hdr)) { puts ("Bad magic number\n"); return 1; } - crc = ntohl(hdr->ih_hcrc); - hdr->ih_hcrc = 0; - len = sizeof (image_header_t); - data = (ulong)hdr; - if (crc32(0, (uchar *)data, len) != crc) { + if (!image_check_hcrc (hdr)) { puts ("Bad header crc\n"); return 1; } - data = addr + sizeof(image_header_t); - len = ntohl(hdr->ih_size); - if (verify) { - if (crc32(0, (uchar *)data, len) != ntohl(hdr->ih_dcrc)) { + if (!image_check_dcrc (hdr)) { puts ("Bad data crc\n"); return 1; } } - if (hdr->ih_type != IH_TYPE_SCRIPT) { + if (!image_check_type (hdr, IH_TYPE_SCRIPT)) { puts ("Bad image type\n"); return 1; } /* get length of script */ - len_ptr = (ulong *)data; + len_ptr = (ulong *)image_get_data (hdr); - if ((len = ntohl(*len_ptr)) == 0) { + if ((len = image_to_cpu (*len_ptr)) == 0) { puts ("Empty Script\n"); return 1; } -- cgit From f13e7b2e993c61fed1f607962501e051940d6e80 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Tue, 8 Jan 2008 18:12:17 +0100 Subject: [new uImage] Cleanup image header pointer use in bootm code - use single image header pointer instead of a set of auxilliary variables. - add multi component image helper routines: get component size/data address Signed-off-by: Marian Balakowicz --- common/cmd_autoscript.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'common/cmd_autoscript.c') diff --git a/common/cmd_autoscript.c b/common/cmd_autoscript.c index 3e68ced1fe..53f8e8311a 100644 --- a/common/cmd_autoscript.c +++ b/common/cmd_autoscript.c @@ -54,7 +54,7 @@ autoscript (ulong addr) { ulong len; image_header_t *hdr = (image_header_t *)addr; - ulong *len_ptr; + ulong *data; char *cmd; int rcode = 0; int verify; @@ -84,9 +84,9 @@ autoscript (ulong addr) } /* get length of script */ - len_ptr = (ulong *)image_get_data (hdr); + data = (ulong *)image_get_data (hdr); - if ((len = image_to_cpu (*len_ptr)) == 0) { + if ((len = image_to_cpu (*data)) == 0) { puts ("Empty Script\n"); return 1; } @@ -97,10 +97,10 @@ autoscript (ulong addr) return 1; } - while (*len_ptr++); + while (*data++); /* make sure cmd is null terminated */ - memmove (cmd, (char *)len_ptr, len); + memmove (cmd, (char *)data, len); *(cmd + len) = 0; #ifdef CFG_HUSH_PARSER /*?? */ -- cgit From d5934ad7756f038a393a9cfab76a4fe306d9d930 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Mon, 4 Feb 2008 08:28:09 +0100 Subject: [new uImage] Add dual format uImage support framework This patch adds framework for dual format images. Format detection is added and the bootm controll flow is updated to include cases for new FIT format uImages. When the legacy (image_header based) format is detected appropriate legacy specific handling is invoked. For the new (FIT based) format uImages dual boot framework has a minial support, that will only print out a corresponding debug messages. Implementation of the FIT specific handling will be added in following patches. Signed-off-by: Marian Balakowicz --- common/cmd_autoscript.c | 56 ++++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 21 deletions(-) (limited to 'common/cmd_autoscript.c') diff --git a/common/cmd_autoscript.c b/common/cmd_autoscript.c index 53f8e8311a..f9ab1d9a13 100644 --- a/common/cmd_autoscript.c +++ b/common/cmd_autoscript.c @@ -53,7 +53,7 @@ int autoscript (ulong addr) { ulong len; - image_header_t *hdr = (image_header_t *)addr; + image_header_t *hdr; ulong *data; char *cmd; int rcode = 0; @@ -61,33 +61,47 @@ autoscript (ulong addr) verify = getenv_verify (); - if (!image_check_magic (hdr)) { - puts ("Bad magic number\n"); - return 1; - } + switch (gen_image_get_format ((void *)addr)) { + case IMAGE_FORMAT_LEGACY: + hdr = (image_header_t *)addr; - if (!image_check_hcrc (hdr)) { - puts ("Bad header crc\n"); - return 1; - } + if (!image_check_magic (hdr)) { + puts ("Bad magic number\n"); + return 1; + } - if (verify) { - if (!image_check_dcrc (hdr)) { - puts ("Bad data crc\n"); + if (!image_check_hcrc (hdr)) { + puts ("Bad header crc\n"); return 1; } - } - if (!image_check_type (hdr, IH_TYPE_SCRIPT)) { - puts ("Bad image type\n"); - return 1; - } + if (verify) { + if (!image_check_dcrc (hdr)) { + puts ("Bad data crc\n"); + return 1; + } + } + + if (!image_check_type (hdr, IH_TYPE_SCRIPT)) { + puts ("Bad image type\n"); + return 1; + } - /* get length of script */ - data = (ulong *)image_get_data (hdr); + /* get length of script */ + data = (ulong *)image_get_data (hdr); - if ((len = image_to_cpu (*data)) == 0) { - puts ("Empty Script\n"); + if ((len = image_to_cpu (*data)) == 0) { + puts ("Empty Script\n"); + return 1; + } + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("autoscript"); + return 1; +#endif + default: + puts ("Wrong image format for autoscript\n"); return 1; } -- cgit From 9a4daad0a35eb5143037eea9f786a3e9d672bdd6 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Fri, 29 Feb 2008 14:58:34 +0100 Subject: [new uImage] Update naming convention for bootm/uImage related code This patch introduces the following prefix convention for the image format handling and bootm related code: genimg_ - dual format shared code image_ - legacy uImage format specific code fit_ - new uImage format specific code boot_ - booting process related code Related routines are renamed and a few pieces of code are moved around and re-grouped. Signed-off-by: Marian Balakowicz --- common/cmd_autoscript.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'common/cmd_autoscript.c') diff --git a/common/cmd_autoscript.c b/common/cmd_autoscript.c index f9ab1d9a13..60ffc7dbce 100644 --- a/common/cmd_autoscript.c +++ b/common/cmd_autoscript.c @@ -61,7 +61,7 @@ autoscript (ulong addr) verify = getenv_verify (); - switch (gen_image_get_format ((void *)addr)) { + switch (genimg_get_format ((void *)addr)) { case IMAGE_FORMAT_LEGACY: hdr = (image_header_t *)addr; @@ -90,7 +90,7 @@ autoscript (ulong addr) /* get length of script */ data = (ulong *)image_get_data (hdr); - if ((len = image_to_cpu (*data)) == 0) { + if ((len = uimage_to_cpu (*data)) == 0) { puts ("Empty Script\n"); return 1; } -- cgit From 424c4abdd175d2c470510df8ce0e32d3f463ec16 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Wed, 12 Mar 2008 10:33:00 +0100 Subject: [new uImage] Add new uImage format support to autoscript routine autoscript() routine is updated to accept second argument, which is only used for FIT images and provides a FIT subimage unit name. autoscript() routine callers must now pass two arguments. For non-interactive use (like in cmd_load.c, cmd_net.c), new environment variable 'autoscript_uname' is introduced and used as a FIT subimage unit name source. autoscript command accepts extended syntax of the addr argument: addr: Signed-off-by: Marian Balakowicz --- common/cmd_autoscript.c | 84 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 69 insertions(+), 15 deletions(-) (limited to 'common/cmd_autoscript.c') diff --git a/common/cmd_autoscript.c b/common/cmd_autoscript.c index 60ffc7dbce..5163d57cc4 100644 --- a/common/cmd_autoscript.c +++ b/common/cmd_autoscript.c @@ -50,14 +50,20 @@ #if defined(CONFIG_AUTOSCRIPT) || defined(CONFIG_CMD_AUTOSCRIPT) int -autoscript (ulong addr) +autoscript (ulong addr, const char *fit_uname) { - ulong len; - image_header_t *hdr; - ulong *data; - char *cmd; - int rcode = 0; - int verify; + ulong len; + image_header_t *hdr; + ulong *data; + char *cmd; + int rcode = 0; + int verify; +#if defined(CONFIG_FIT) + const void* fit_hdr; + int noffset; + const void *fit_data; + size_t fit_len; +#endif verify = getenv_verify (); @@ -97,8 +103,46 @@ autoscript (ulong addr) break; #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: - fit_unsupported ("autoscript"); - return 1; + if (fit_uname == NULL) { + puts ("No FIT subimage unit name\n"); + return 1; + } + + fit_hdr = (const void *)addr; + if (!fit_check_format (fit_hdr)) { + puts ("Bad FIT image format\n"); + return 1; + } + + /* get script component image node offset */ + noffset = fit_image_get_node (fit_hdr, fit_uname); + if (noffset < 0) { + printf ("Can't find '%s' FIT subimage\n", fit_uname); + return 1; + } + + if (!fit_image_check_type (fit_hdr, noffset, IH_TYPE_SCRIPT)) { + puts ("Not a image image\n"); + return 1; + } + + /* verify integrity */ + if (verify) { + if (!fit_image_check_hashes (fit_hdr, noffset)) { + puts ("Bad Data Hash\n"); + return 1; + } + } + + /* get script subimage data address and length */ + if (fit_image_get_data (fit_hdr, noffset, &fit_data, &fit_len)) { + puts ("Could not find script subimage data\n"); + return 1; + } + + data = (ulong *)fit_data; + len = (ulong)fit_len; + break; #endif default: puts ("Wrong image format for autoscript\n"); @@ -160,25 +204,35 @@ do_autoscript (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { ulong addr; int rcode; + const char *fit_uname = NULL; + /* Find script image */ if (argc < 2) { addr = CFG_LOAD_ADDR; + debug ("* autoscr: default load address = 0x%08lx\n", addr); +#if defined(CONFIG_FIT) + } else if (fit_parse_subimage (argv[1], load_addr, &addr, &fit_uname)) { + debug ("* autoscr: subimage '%s' from FIT image at 0x%08lx\n", + fit_uname, addr); +#endif } else { - addr = simple_strtoul (argv[1],0,16); + addr = simple_strtoul(argv[1], NULL, 16); + debug ("* autoscr: cmdline image address = 0x%08lx\n", addr); } - printf ("## Executing script at %08lx\n",addr); - rcode = autoscript (addr); + printf ("## Executing script at %08lx\n", addr); + rcode = autoscript (addr, fit_uname); return rcode; } -#if defined(CONFIG_CMD_AUTOSCRIPT) U_BOOT_CMD( autoscr, 2, 0, do_autoscript, "autoscr - run script from memory\n", "[addr] - run script starting at addr" " - A valid autoscr header must be present\n" -); +#if defined(CONFIG_FIT) + "For FIT format uImage addr must include subimage\n" + "unit name in the form of addr:\n" #endif - +); #endif -- cgit From 36cc8cbb3379d5166f882641123521735c469f92 Mon Sep 17 00:00:00 2001 From: Bartlomiej Sieka Date: Thu, 20 Mar 2008 23:10:19 +0100 Subject: [new uImage] Fix autoscr command used with new uImage format Signed-off-by: Bartlomiej Sieka --- common/cmd_autoscript.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'common/cmd_autoscript.c') diff --git a/common/cmd_autoscript.c b/common/cmd_autoscript.c index 5163d57cc4..1a37b90d79 100644 --- a/common/cmd_autoscript.c +++ b/common/cmd_autoscript.c @@ -100,6 +100,13 @@ autoscript (ulong addr, const char *fit_uname) puts ("Empty Script\n"); return 1; } + + /* + * scripts are just multi-image files with one component, seek + * past the zero-terminated sequence of image lengths to get + * to the actual image data + */ + while (*data++); break; #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: @@ -155,8 +162,6 @@ autoscript (ulong addr, const char *fit_uname) return 1; } - while (*data++); - /* make sure cmd is null terminated */ memmove (cmd, (char *)data, len); *(cmd + len) = 0; -- cgit