[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