[U-Boot] [PATCH 2/9] spl: fit: add support for post-processing of images
Simon Glass
sjg at chromium.org
Thu Jun 23 15:57:13 CEST 2016
Hi Andreas,
On 20 June 2016 at 21:34, Andreas Dannenberg <dannenberg at ti.com> wrote:
> From: Daniel Allred <d-allred at ti.com>
>
> The next stage boot loader image and the selected FDT can be
> post-processed by board/platform/device-specific code, which can include
> modifying the size and altering the starting source address before
> copying these binary blobs to their final desitination. This might be
> desired to do things like strip headers or footers attached to the
> images before they were packeaged into the FIT, or to perform operations
> such as decryption or authentication.
>
> Signed-off-by: Daniel Allred <d-allred at ti.com>
> Signed-off-by: Andreas Dannenberg <dannenberg at ti.com>
> ---
> common/spl/spl_fit.c | 21 ++++++++++++++++-----
> include/image.h | 15 +++++++++++++++
> 2 files changed, 31 insertions(+), 5 deletions(-)
>
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index 9874708..ecbcb97 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -121,6 +121,10 @@ static int get_aligned_image_size(struct spl_load_info *info, int data_size,
> return (data_size + info->bl_len - 1) / info->bl_len;
> }
>
> +void __weak board_fit_image_post_process(void **p_src, size_t *p_size)
> +{
> +}
Can you make this a Kconfig option instead of a weak function? It's
hard enough to trace what a particular board is doing...
> +
> int spl_load_simple_fit(struct spl_load_info *info, ulong sector, void *fit)
> {
> int sectors;
> @@ -132,7 +136,7 @@ int spl_load_simple_fit(struct spl_load_info *info, ulong sector, void *fit)
> int data_offset, data_size;
> int base_offset, align_len = ARCH_DMA_MINALIGN - 1;
> int src_sector;
> - void *dst;
> + void *dst, *src;
>
> /*
> * Figure out where the external images start. This is the base for the
> @@ -206,8 +210,11 @@ int spl_load_simple_fit(struct spl_load_info *info, ulong sector, void *fit)
> return -EIO;
> debug("image: dst=%p, data_offset=%x, size=%x\n", dst, data_offset,
> data_size);
> - memcpy(dst, dst + get_aligned_image_overhead(info, data_offset),
> - data_size);
> + src = dst + get_aligned_image_overhead(info, data_offset);
> +
> + board_fit_image_post_process((void **)&src, (size_t *)&data_size);
> +
> + memcpy(dst, src, data_size);
>
> /* Figure out which device tree the board wants to use */
> fdt_len = spl_fit_select_fdt(fit, images, &fdt_offset);
> @@ -236,8 +243,12 @@ int spl_load_simple_fit(struct spl_load_info *info, ulong sector, void *fit)
> */
> debug("fdt: dst=%p, data_offset=%x, size=%x\n", dst, fdt_offset,
> fdt_len);
> - memcpy(load_ptr + data_size,
> - dst + get_aligned_image_overhead(info, fdt_offset), fdt_len);
> + src = dst + get_aligned_image_overhead(info, fdt_offset);
> + dst = load_ptr + data_size;
> +
> + board_fit_image_post_process((void **)&src, (size_t *)&fdt_len);
> +
> + memcpy(dst, src, fdt_len);
>
> return 0;
> }
> diff --git a/include/image.h b/include/image.h
> index a8f6bd1..9536874 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -1172,4 +1172,19 @@ ulong android_image_get_kload(const struct andr_img_hdr *hdr);
> */
> int board_fit_config_name_match(const char *name);
>
> +/**
> + * board_fit_image_post_process() - Do any post-process on FIT binary data
> + *
> + * This is used to do any sort of image manipulation, verification, decryption
> + * etc. in a platform or board specific way. Obviously, anything done here would
> + * need to be comprehended in how the images were prepared before being injected
> + * into the FIT creation (i.e. the binary blobs would have been pre-processed
> + * before being added to the FIT image).
> + *
> + * @image: pointer to the image start pointer
> + * @size: pointer to the image size
> + * @return no return value (failure should be handled internally)
> + */
> +void board_fit_image_post_process(void **p_image, size_t *p_size);
> +
> #endif /* __IMAGE_H__ */
> --
> 2.6.4
>
Regards,
Simon
More information about the U-Boot
mailing list