diff mbox

[U-Boot,v2,6/9] spl: fit: add support for post-processing of images

Message ID 1466783837-27571-7-git-send-email-dannenberg@ti.com
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Andreas Dannenberg June 24, 2016, 3:57 p.m. UTC
From: Daniel Allred <d-allred@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 destination. This might be
desired to do things like strip headers or footers attached to the
images before they were packaged into the FIT, or to perform operations
such as decryption or authentication. Introduce new configuration
option CONFIG_SPL_FIT_IMAGE_POST_PROCESS to allow controlling this
feature. If enabled, a platform-specific post-process function must
be provided.

Signed-off-by: Daniel Allred <d-allred@ti.com>
Signed-off-by: Andreas Dannenberg <dannenberg@ti.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
---
 Kconfig              |  4 ++++
 common/spl/spl_fit.c | 21 ++++++++++++++++-----
 include/image.h      | 17 +++++++++++++++++
 3 files changed, 37 insertions(+), 5 deletions(-)

Comments

Simon Glass June 26, 2016, 2:54 a.m. UTC | #1
Hi Andreas,

On 24 June 2016 at 09:57, Andreas Dannenberg <dannenberg@ti.com> wrote:
> From: Daniel Allred <d-allred@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 destination. This might be
> desired to do things like strip headers or footers attached to the
> images before they were packaged into the FIT, or to perform operations
> such as decryption or authentication. Introduce new configuration
> option CONFIG_SPL_FIT_IMAGE_POST_PROCESS to allow controlling this
> feature. If enabled, a platform-specific post-process function must
> be provided.
>
> Signed-off-by: Daniel Allred <d-allred@ti.com>
> Signed-off-by: Andreas Dannenberg <dannenberg@ti.com>
> Reviewed-by: Tom Rini <trini@konsulko.com>
> ---
>  Kconfig              |  4 ++++
>  common/spl/spl_fit.c | 21 ++++++++++++++++-----
>  include/image.h      | 17 +++++++++++++++++
>  3 files changed, 37 insertions(+), 5 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

Nit below

>
> diff --git a/Kconfig b/Kconfig
> index 3ceff25..b0a5595 100644
> --- a/Kconfig
> +++ b/Kconfig
> @@ -313,6 +313,10 @@ config SPL_LOAD_FIT
>           particular it can handle selecting from multiple device tree
>           and passing the correct one to U-Boot.
>
> +config SPL_FIT_IMAGE_POST_PROCESS
> +       bool "Enable post-processing of FIT artifacts after loading by the SPL"

Please can you mention the function that is called in this case and
what that function is able to do?

> +       depends on SPL_LOAD_FIT && TI_SECURE_DEVICE
> +
>  config SYS_CLK_FREQ
>         depends on ARC || ARCH_SUNXI
>         int "CPU clock frequency"
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index 9874708..069e94d 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -132,7 +132,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 +206,13 @@ 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);
> +
> +#ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
> +       board_fit_image_post_process((void **)&src, (size_t *)&data_size);
> +#endif
> +
> +       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 +241,14 @@ 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;
> +
> +#ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
> +       board_fit_image_post_process((void **)&src, (size_t *)&fdt_len);
> +#endif
> +
> +       memcpy(dst, src, fdt_len);
>
>         return 0;
>  }
> diff --git a/include/image.h b/include/image.h
> index a8f6bd1..a17e505 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -1172,4 +1172,21 @@ ulong android_image_get_kload(const struct andr_img_hdr *hdr);
>   */
>  int board_fit_config_name_match(const char *name);
>
> +#ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
> +/**
> + * 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 /* CONFIG_SPL_FIT_IMAGE_POST_PROCESS */
> +
>  #endif /* __IMAGE_H__ */
> --
> 2.6.4
>

Regards,
Simon
Andreas Dannenberg June 26, 2016, 6:03 p.m. UTC | #2
On Sat, Jun 25, 2016 at 08:54:19PM -0600, Simon Glass wrote:
> Hi Andreas,
> 
> On 24 June 2016 at 09:57, Andreas Dannenberg <dannenberg@ti.com> wrote:
> > From: Daniel Allred <d-allred@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 destination. This might be
> > desired to do things like strip headers or footers attached to the
> > images before they were packaged into the FIT, or to perform operations
> > such as decryption or authentication. Introduce new configuration
> > option CONFIG_SPL_FIT_IMAGE_POST_PROCESS to allow controlling this
> > feature. If enabled, a platform-specific post-process function must
> > be provided.
> >
> > Signed-off-by: Daniel Allred <d-allred@ti.com>
> > Signed-off-by: Andreas Dannenberg <dannenberg@ti.com>
> > Reviewed-by: Tom Rini <trini@konsulko.com>
> > ---
> >  Kconfig              |  4 ++++
> >  common/spl/spl_fit.c | 21 ++++++++++++++++-----
> >  include/image.h      | 17 +++++++++++++++++
> >  3 files changed, 37 insertions(+), 5 deletions(-)
> 
> Reviewed-by: Simon Glass <sjg@chromium.org>
> 
> Nit below
> 
> >
> > diff --git a/Kconfig b/Kconfig
> > index 3ceff25..b0a5595 100644
> > --- a/Kconfig
> > +++ b/Kconfig
> > @@ -313,6 +313,10 @@ config SPL_LOAD_FIT
> >           particular it can handle selecting from multiple device tree
> >           and passing the correct one to U-Boot.
> >
> > +config SPL_FIT_IMAGE_POST_PROCESS
> > +       bool "Enable post-processing of FIT artifacts after loading by the SPL"
> 
> Please can you mention the function that is called in this case and
> what that function is able to do?

Hi Simon,
good suggestion. Will update and re-submit.

Thanks,

--
Andreas Dannenberg
Texas Instruments Inc
diff mbox

Patch

diff --git a/Kconfig b/Kconfig
index 3ceff25..b0a5595 100644
--- a/Kconfig
+++ b/Kconfig
@@ -313,6 +313,10 @@  config SPL_LOAD_FIT
 	  particular it can handle selecting from multiple device tree
 	  and passing the correct one to U-Boot.
 
+config SPL_FIT_IMAGE_POST_PROCESS
+	bool "Enable post-processing of FIT artifacts after loading by the SPL"
+	depends on SPL_LOAD_FIT && TI_SECURE_DEVICE
+
 config SYS_CLK_FREQ
 	depends on ARC || ARCH_SUNXI
 	int "CPU clock frequency"
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index 9874708..069e94d 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -132,7 +132,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 +206,13 @@  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);
+
+#ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
+	board_fit_image_post_process((void **)&src, (size_t *)&data_size);
+#endif
+
+	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 +241,14 @@  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;
+
+#ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
+	board_fit_image_post_process((void **)&src, (size_t *)&fdt_len);
+#endif
+
+	memcpy(dst, src, fdt_len);
 
 	return 0;
 }
diff --git a/include/image.h b/include/image.h
index a8f6bd1..a17e505 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1172,4 +1172,21 @@  ulong android_image_get_kload(const struct andr_img_hdr *hdr);
  */
 int board_fit_config_name_match(const char *name);
 
+#ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
+/**
+ * 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 /* CONFIG_SPL_FIT_IMAGE_POST_PROCESS */
+
 #endif	/* __IMAGE_H__ */