[PATCH 09/24] image: Add a function to find a script in an image
Heinrich Schuchardt
xypron.glpk at gmx.de
Tue Oct 18 00:05:45 CEST 2022
On 10/17/22 22:29, Simon Glass wrote:
> Split this functionality out of the 'source' command so it can be used
> from another place.
It is not obvious how this relates to changing the series.
Please, provide a description of the future use of the extracted library
function.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> cmd/source.c | 173 ++++++++++++++++++++++++++----------------------
> include/image.h | 13 ++++
If you extract a library function, it should not live in cmd/source.c.
Best regards
Heinrich
> 2 files changed, 107 insertions(+), 79 deletions(-)
>
> diff --git a/cmd/source.c b/cmd/source.c
> index 698d9f86d96..dfa995f1df6 100644
> --- a/cmd/source.c
> +++ b/cmd/source.c
> @@ -24,7 +24,6 @@
> #include <asm/byteorder.h>
> #include <asm/io.h>
>
> -#if defined(CONFIG_FIT)
> /**
> * get_default_image() - Return default property from /images
> *
> @@ -40,123 +39,139 @@ static const char *get_default_image(const void *fit)
>
> return fdt_getprop(fit, images_noffset, FIT_DEFAULT_PROP, NULL);
> }
> -#endif
>
> -int image_source_script(ulong addr, const char *fit_uname)
> +int image_locate_script(void *buf, int size, const char *fit_uname,
> + char **datap, uint *lenp)
> {
> ulong len;
> -#if defined(CONFIG_LEGACY_IMAGE_FORMAT)
> const struct legacy_img_hdr *hdr;
> -#endif
> u32 *data;
> int verify;
> - void *buf;
> -#if defined(CONFIG_FIT)
> const void* fit_hdr;
> int noffset;
> const void *fit_data;
> size_t fit_len;
> -#endif
>
> verify = env_get_yesno("verify");
>
> - buf = map_sysmem(addr, 0);
> switch (genimg_get_format(buf)) {
> -#if defined(CONFIG_LEGACY_IMAGE_FORMAT)
> case IMAGE_FORMAT_LEGACY:
> - hdr = buf;
> + if (IS_ENABLED(CONFIG_LEGACY_IMAGE_FORMAT)) {
> + hdr = buf;
>
> - if (!image_check_magic (hdr)) {
> - puts ("Bad magic number\n");
> - return 1;
> - }
> + if (!image_check_magic(hdr)) {
> + puts("Bad magic number\n");
> + return 1;
> + }
>
> - if (!image_check_hcrc (hdr)) {
> - puts ("Bad header crc\n");
> - return 1;
> - }
> + if (!image_check_hcrc(hdr)) {
> + puts("Bad header crc\n");
> + return 1;
> + }
> +
> + if (verify) {
> + if (!image_check_dcrc(hdr)) {
> + puts("Bad data crc\n");
> + return 1;
> + }
> + }
>
> - if (verify) {
> - if (!image_check_dcrc (hdr)) {
> - puts ("Bad data crc\n");
> + if (!image_check_type(hdr, IH_TYPE_SCRIPT)) {
> + puts("Bad image type\n");
> return 1;
> }
> - }
>
> - if (!image_check_type (hdr, IH_TYPE_SCRIPT)) {
> - puts ("Bad image type\n");
> - return 1;
> - }
> + /* get length of script */
> + data = (u32 *)image_get_data(hdr);
>
> - /* get length of script */
> - data = (u32 *)image_get_data (hdr);
> + len = uimage_to_cpu(*data);
> + if (!len) {
> + puts("Empty Script\n");
> + return 1;
> + }
>
> - if ((len = uimage_to_cpu (*data)) == 0) {
> - puts ("Empty Script\n");
> - return 1;
> + /*
> + * scripts are just multi-image files with one
> + * component, so seek past the zero-terminated sequence
> + * of image lengths to get to the actual image data
> + */
> + while (*data++);
> }
> -
> - /*
> - * 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;
> -#endif
> -#if defined(CONFIG_FIT)
> case IMAGE_FORMAT_FIT:
> - fit_hdr = buf;
> - if (fit_check_format(fit_hdr, IMAGE_SIZE_INVAL)) {
> - puts ("Bad FIT image format\n");
> - return 1;
> - }
> + if (IS_ENABLED(CONFIG_FIT)) {
> + fit_hdr = buf;
> + if (fit_check_format(fit_hdr, IMAGE_SIZE_INVAL)) {
> + puts("Bad FIT image format\n");
> + return 1;
> + }
>
> - if (!fit_uname)
> - fit_uname = get_default_image(fit_hdr);
> + if (!fit_uname)
> + fit_uname = get_default_image(fit_hdr);
>
> - if (!fit_uname) {
> - puts("No FIT subimage unit name\n");
> - return 1;
> - }
> + if (!fit_uname) {
> + puts("No FIT subimage unit name\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;
> - }
> + /* 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;
> - }
> + 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_verify(fit_hdr, noffset)) {
> + puts("Bad Data Hash\n");
> + return 1;
> + }
> + }
>
> - /* verify integrity */
> - if (verify) {
> - if (!fit_image_verify(fit_hdr, noffset)) {
> - puts ("Bad Data Hash\n");
> + /* 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;
> }
> - }
>
> - /* 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 = (u32 *)fit_data;
> + len = (ulong)fit_len;
> }
> -
> - data = (u32 *)fit_data;
> - len = (ulong)fit_len;
> break;
> -#endif
> default:
> - puts ("Wrong image format for \"source\" command\n");
> - return 1;
> + puts("Wrong image format for \"source\" command\n");
> + return -EPERM;
> }
>
> - debug("** Script length: %ld\n", len);
> - return run_command_list((char *)data, len, 0);
> + *datap = (char *)data;
> + *lenp = len;
> +
> + return 0;
> +}
> +
> +int image_source_script(ulong addr, const char *fit_uname)
> +{
> + char *data;
> + void *buf;
> + uint len;
> + int ret;
> +
> + buf = map_sysmem(addr, 0);
> + ret = image_locate_script(buf, 0, fit_uname, &data, &len);
> + unmap_sysmem(buf);
> + if (ret)
> + return CMD_RET_FAILURE;
> +
> + debug("** Script length: %d\n", len);
> + return run_command_list(data, len, 0);
> }
>
> /**************************************************/
> diff --git a/include/image.h b/include/image.h
> index feb8e90c2e8..1cbc51ca228 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -720,6 +720,19 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
> */
> int image_source_script(ulong addr, const char *fit_uname);
>
> +/**
> + * image_locate_script() - Locate the raw script in an image
> + *
> + * @buf: Address of image
> + * @size: Size of image in bytes
> + * @fit_uname: Node name of FIT image to read
> + * @datap: Returns pointer to raw script on success
> + * @lenp: Returns size of raw script on success
> + * @return 0 if OK, non-zero on error
> + */
> +int image_locate_script(void *buf, int size, const char *fit_uname,
> + char **datap, uint *lenp);
> +
> /**
> * fit_get_node_from_config() - Look up an image a FIT by type
> *
More information about the U-Boot
mailing list