
On 01/19/2018 01:43 PM, Bryan O'Donoghue wrote:
This patch adds support for bootable OPTEE images to mkimage. Currently there is a (Trusted Execution Environment) TEE image type, the TEE image type is installed to a memory location with u-boot continuing to own the boot process whereas the OPTEE image type defined here is a bootable image, which typically wants to live at a defined location in memory. Defining a new image type allows us to pull out the load address and entry point defined in the OPTEE header and having a separate image type lays the foundation for a subsequent patch to validate the OPTEE memory defined in a board-port matches the link location specified in the OPTEE bootable image.
example usage:
mkimage -A arm -T optee -C none -d ./out/arm-plat-imx/core/tee.bin uTee.optee
making a separate image type means you don't need to specify things like entry point and load address as you would if you were defining the OPTEE image as a linux image.
I'm still not getting the reasoning for this all, you can have the load address checks and relocation stuff inside your loadable handler:
U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_TEE, board_tee_image_process);
Then define 'board_tee_image_process' to do whatever you want to your image.
mkimage -A arm -O linux -C none -a 0x9c0fffe4 -e 0x9c100000 -d ./out/arm-plat-imx/core/tee.bin uTee
Signed-off-by: Bryan O'Donoghue bryan.odonoghue@linaro.org Cc: Harinarayan Bhatta harinarayan@ti.com Cc: Andrew F. Davis afd@ti.com Cc: Tom Rini trini@konsulko.com Cc: Kever Yang kever.yang@rock-chips.com Cc: Philipp Tomsich philipp.tomsich@theobroma-systems.com Cc: Peng Fan peng.fan@nxp.com Tested-by: Peng Fan peng.fan@nxp.com
common/image.c | 1 + include/image.h | 1 + tools/default_image.c | 25 +++++++++++++++++++------ 3 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/common/image.c b/common/image.c index e9609cd..14e738b 100644 --- a/common/image.c +++ b/common/image.c @@ -161,6 +161,7 @@ static const table_entry_t uimage_type[] = { { IH_TYPE_TEE, "tee", "Trusted Execution Environment Image",}, { IH_TYPE_FIRMWARE_IVT, "firmware_ivt", "Firmware with HABv4 IVT" }, { IH_TYPE_PMMC, "pmmc", "TI Power Management Micro-Controller Firmware",},
- { IH_TYPE_OPTEE, "optee", "OPTEE Boot Image",}, { -1, "", "", },
};
diff --git a/include/image.h b/include/image.h index a128a62..9175624 100644 --- a/include/image.h +++ b/include/image.h @@ -271,6 +271,7 @@ enum { IH_TYPE_TEE, /* Trusted Execution Environment OS Image */ IH_TYPE_FIRMWARE_IVT, /* Firmware Image with HABv4 IVT */ IH_TYPE_PMMC, /* TI Power Management Micro-Controller Firmware */
IH_TYPE_OPTEE, /* OPTEE Boot Image */
IH_TYPE_COUNT, /* Number of image types */
}; diff --git a/tools/default_image.c b/tools/default_image.c index 4e5568e..5653933 100644 --- a/tools/default_image.c +++ b/tools/default_image.c @@ -18,6 +18,7 @@ #include "mkimage.h"
#include <image.h> +#include <tee/optee.h> #include <u-boot/crc.h>
static image_header_t header; @@ -25,7 +26,8 @@ static image_header_t header; static int image_check_image_types(uint8_t type) { if (((type > IH_TYPE_INVALID) && (type < IH_TYPE_FLATDT)) ||
(type == IH_TYPE_KERNEL_NOLOAD) || (type == IH_TYPE_FIRMWARE_IVT))
(type == IH_TYPE_KERNEL_NOLOAD) || (type == IH_TYPE_FIRMWARE_IVT) ||
return EXIT_SUCCESS; else return EXIT_FAILURE;(type == IH_TYPE_OPTEE))
@@ -90,6 +92,8 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd, uint32_t checksum; time_t time; uint32_t imagesize;
uint32_t ep;
uint32_t addr;
image_header_t * hdr = (image_header_t *)ptr;
@@ -99,18 +103,27 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd, sbuf->st_size - sizeof(image_header_t));
time = imagetool_get_source_date(params, sbuf->st_mtime);
- if (params->type == IH_TYPE_FIRMWARE_IVT)
- ep = params->ep;
- addr = params->addr;
- imagesize = sbuf->st_size - sizeof(image_header_t);
- switch (params->type) {
- case IH_TYPE_FIRMWARE_IVT: /* Add size of CSF minus IVT */ imagesize = sbuf->st_size - sizeof(image_header_t) + 0x1FE0;
- else
imagesize = sbuf->st_size - sizeof(image_header_t);
break;
case IH_TYPE_OPTEE:
addr = optee_image_get_load_addr(hdr);
ep = optee_image_get_entry_point(hdr);
break;
}
/* Build new header */ image_set_magic(hdr, IH_MAGIC); image_set_time(hdr, time); image_set_size(hdr, imagesize);
- image_set_load(hdr, params->addr);
- image_set_ep(hdr, params->ep);
- image_set_load(hdr, addr);
- image_set_ep(hdr, ep); image_set_dcrc(hdr, checksum); image_set_os(hdr, params->os); image_set_arch(hdr, params->arch);