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.odonog...@linaro.org>
> Cc: Harinarayan Bhatta <harinara...@ti.com>
> Cc: Andrew F. Davis <a...@ti.com>
> Cc: Tom Rini <tr...@konsulko.com>
> Cc: Kever Yang <kever.y...@rock-chips.com>
> Cc: Philipp Tomsich <philipp.toms...@theobroma-systems.com>
> Cc: Peng Fan <peng....@nxp.com>
> Tested-by: Peng Fan <peng....@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);
> 
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to