diff options
-rw-r--r-- | Kconfig | 14 | ||||
-rw-r--r-- | common/image-fit.c | 26 |
2 files changed, 39 insertions, 1 deletions
@@ -344,6 +344,20 @@ config SPL_FIT_IMAGE_POST_PROCESS injected into the FIT creation (i.e. the blobs would have been pre- processed before being added to the FIT image). +config FIT_IMAGE_POST_PROCESS + bool "Enable post-processing of FIT artifacts after loading by U-Boot" + depends on FIT && TI_SECURE_DEVICE + help + Allows doing any sort of manipulation to blobs after they got extracted + from FIT images like stripping off headers or modifying the size of the + blob, verification, authentication, decryption etc. in a platform or + board specific way. In order to use this feature a platform or board- + specific implementation of board_fit_image_post_process() must be + provided. Also, anything done during this post-processing step would + need to be comprehended in how the images were prepared before being + injected into the FIT creation (i.e. the blobs would have been pre- + processed before being added to the FIT image). + config SYS_CLK_FREQ depends on ARC || ARCH_SUNXI int "CPU clock frequency" diff --git a/common/image-fit.c b/common/image-fit.c index 73ad34e491..d8d4e95030 100644 --- a/common/image-fit.c +++ b/common/image-fit.c @@ -11,9 +11,9 @@ #ifdef USE_HOSTCC #include "mkimage.h" -#include <image.h> #include <time.h> #else +#include <linux/compiler.h> #include <common.h> #include <errno.h> #include <mapmem.h> @@ -21,6 +21,7 @@ DECLARE_GLOBAL_DATA_PTR; #endif /* !USE_HOSTCC*/ +#include <image.h> #include <bootstage.h> #include <u-boot/crc.h> #include <u-boot/md5.h> @@ -1507,6 +1508,12 @@ void fit_conf_print(const void *fit, int noffset, const char *p) static int fit_image_select(const void *fit, int rd_noffset, int verify) { +#if !defined(USE_HOSTCC) && defined(CONFIG_FIT_IMAGE_POST_PROCESS) + const void *data; + size_t size; + int ret; +#endif + fit_image_print(fit, rd_noffset, " "); if (verify) { @@ -1518,6 +1525,23 @@ static int fit_image_select(const void *fit, int rd_noffset, int verify) puts("OK\n"); } +#if !defined(USE_HOSTCC) && defined(CONFIG_FIT_IMAGE_POST_PROCESS) + ret = fit_image_get_data(fit, rd_noffset, &data, &size); + if (ret) + return ret; + + /* perform any post-processing on the image data */ + board_fit_image_post_process((void **)&data, &size); + + /* + * update U-Boot's understanding of the "data" property start address + * and size according to the performed post-processing + */ + ret = fdt_setprop((void *)fit, rd_noffset, FIT_DATA_PROP, data, size); + if (ret) + return ret; +#endif + return 0; } |