[U-Boot] [PATCH v2 6/9] tools: mkimage: add optee image type

Andrew F. Davis afd at ti.com
Fri Jan 19 20:14:31 UTC 2018


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 at linaro.org>
> Cc: Harinarayan Bhatta <harinarayan at ti.com>
> Cc: Andrew F. Davis <afd at ti.com>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: Kever Yang <kever.yang at rock-chips.com>
> Cc: Philipp Tomsich <philipp.tomsich at theobroma-systems.com>
> Cc: Peng Fan <peng.fan at nxp.com>
> Tested-by: Peng Fan <peng.fan at 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) ||
> +	    (type == IH_TYPE_OPTEE))
>  		return EXIT_SUCCESS;
>  	else
>  		return EXIT_FAILURE;
> @@ -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);
> 


More information about the U-Boot mailing list