[U-Boot] [PATCH v1 4/4] spl: fit: Add FIT image support for falcon boot
York Sun
york.sun at nxp.com
Mon May 15 16:01:10 UTC 2017
Detect the image type before going the route to boot OS. Last kernel
image sets the entry point.
Signed-off-by: York Sun <york.sun at nxp.com>
---
Kconfig | 7 +++++
common/spl/spl_fit.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++
include/image.h | 4 +++
3 files changed, 83 insertions(+)
diff --git a/Kconfig b/Kconfig
index 1cf990d..e850941 100644
--- a/Kconfig
+++ b/Kconfig
@@ -239,6 +239,13 @@ 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 SPL_FIT_IMAGE_SECURE_VALIDATE
+ bool "Enable validation of FIT image after loaded by SPL"
+ depends on SPL_LOAD_FIT && SPL_OS_BOOT && CHAIN_OF_TRUST
+ help
+ Enable secure boot validation on OS FIT image before extracting
+ individual images.
+
endif # FIT
config OF_BOARD_SETUP
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index aae556f..cf23628 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -123,6 +123,9 @@ static int get_aligned_image_size(struct spl_load_info *info, int data_size,
return (data_size + info->bl_len - 1) / info->bl_len;
}
+#ifndef CONFIG_SYS_BOOTM_LEN
+#define CONFIG_SYS_BOOTM_LEN 0x800000
+#endif
int spl_load_simple_fit(struct spl_image_info *spl_image,
struct spl_load_info *info, ulong sector, void *fit)
{
@@ -136,6 +139,12 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
int base_offset, align_len = ARCH_DMA_MINALIGN - 1;
int src_sector;
void *dst, *src;
+#ifdef CONFIG_SPL_FIT
+ const void *data;
+ size_t d_size;
+ int len;
+ uint8_t type, image_comp;
+#endif
/*
* Figure out where the external images start. This is the base for the
@@ -180,7 +189,19 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
return -1;
}
+#ifdef CONFIG_SPL_FIT
+ data = fdt_getprop(fit, node, "type", &len);
+ if (data == NULL) {
+ printf("Cannot get image type\n");
+ return -1;
+ }
+ type = genimg_get_type_id(data);
+ if (type == IH_TYPE_KERNEL)
+ goto boot_kernel;
+#endif
+
/* Get its information and set up the spl_image structure */
+
data_offset = fdt_getprop_u32(fit, node, "data-offset");
data_size = fdt_getprop_u32(fit, node, "data-size");
load = fdt_getprop_u32(fit, node, "load");
@@ -254,4 +275,55 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
memcpy(dst, src, fdt_len);
return 0;
+
+#ifdef CONFIG_SPL_FIT
+boot_kernel:
+#ifdef CONFIG_SPL_FIT_IMAGE_SECURE_VALIDATE
+ board_fit_image_secure_validate(fit);
+#endif
+ for (; node >= 0; node = fdt_next_subnode(fit, node)) {
+ data = fdt_getprop(fit, node, "os", &len);
+ if (data == NULL)
+ spl_image->os = -1;
+ else
+ spl_image->os = genimg_get_os_id(data);
+
+ data = fdt_getprop(fit, node, "type", &len);
+ if (data == NULL) {
+ printf("Cannot get image type\n");
+ return -1;
+ }
+ load = fdt_getprop_u32(fit, node, "load");
+ type = genimg_get_type_id(data);
+ if (type == IH_TYPE_KERNEL) {
+ spl_image->load_addr = load;
+ spl_image->entry_point = load;
+ }
+ dst = (void *)load;
+ if (fit_image_get_data(fit, node, &data, &d_size)) {
+ printf("Cannot get image data/size\n");
+ return -1;
+ }
+ if (fit_image_get_comp(fit, node, &image_comp))
+ printf("Cannot get image compression format.\n");
+
+ debug("%s size %lx, data %p, %s\n",
+ genimg_get_type_name(type),
+ (ulong)d_size, dst,
+ genimg_get_comp_name(image_comp));
+ if (image_comp == IH_COMP_GZIP && type == IH_TYPE_KERNEL) {
+#ifdef CONFIG_SPL_GZIP
+ if (gunzip(dst, CONFIG_SYS_BOOTM_LEN, (void *)data, &d_size))
+ puts("Uncompressing error\n");
+#else
+ puts("GZIP is not enabled\n");
+ return -EINVAL;
+#endif
+ } else {
+ memcpy(dst, data, d_size);
+ }
+ }
+
+ return 0;
+#endif
}
diff --git a/include/image.h b/include/image.h
index 3f26f9b..10f5544 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1274,6 +1274,10 @@ int board_fit_config_name_match(const char *name);
void board_fit_image_post_process(void **p_image, size_t *p_size);
#endif /* CONFIG_SPL_FIT_IMAGE_POST_PROCESS */
+#ifdef CONFIG_SPL_FIT_IMAGE_SECURE_VALIDATE
+void board_fit_image_secure_validate(void *fit);
+#endif
+
/**
* Mapping of image types to function handlers to be invoked on the associated
* loaded images
--
2.7.4
More information about the U-Boot
mailing list