[PATCH] mach-rockchip: make_fit_atf.py: support OP-TEE tee.bin v1 format

Peter Griffin peter.griffin at linaro.org
Wed May 11 22:54:26 CEST 2022


Hi Jerome,

On Wed, 11 May 2022 at 16:36, Jerome Forissier <jerome.forissier at linaro.org>
wrote:

> This commit adds support for the OP-TEE 'tee.bin' v1 format for Rockchip
> platforms.
>
> Since OP-TEE 3.8.0, tee.bin contains meta-data in a proprietary format
> in addition to the ELF data. They are essential information for proper
> initialization of the TEE core, such as the size of the memory region
> covered by the TEE or a compact representation of runtime relocation
> data when ASLR is enabled.
>
> With OP-TEE 3.8.0 onwards, 'tee.elf' MUST NOT be used and 'tee.bin'
> MUST be used instead. Ignoring this recommendation can lead to crashes
> as described in [3].
>
> Link: [1]
> https://github.com/OP-TEE/optee_os/commit/5dd1570ac5b0f6563b1a9c074533a19107b8222d
> Link: [2]
> https://github.com/OP-TEE/optee_os/blob/3.17.0/scripts/gen_tee_bin.py#L275-L302
> Link: [3] https://github.com/OP-TEE/optee_os/issues/4542
> Signed-off-by: Jerome Forissier <jerome.forissier at linaro.org>
>

Tested on my RockPi4b board, so

Tested-by: Peter Griffin <peter.griffin at linaro.org>


> ---
>  arch/arm/mach-rockchip/make_fit_atf.py | 43 +++++++++++++++++++++-----
>  1 file changed, 35 insertions(+), 8 deletions(-)
>
> diff --git a/arch/arm/mach-rockchip/make_fit_atf.py
> b/arch/arm/mach-rockchip/make_fit_atf.py
> index f3224d2555..fcea652388 100755
> --- a/arch/arm/mach-rockchip/make_fit_atf.py
> +++ b/arch/arm/mach-rockchip/make_fit_atf.py
> @@ -137,7 +137,7 @@ def generate_atf_fit_dts_bl31(fit_file,
> bl31_file_name, tee_file_name, dtbs_file
>      num_segments = len(segments)
>
>      if tee_file_name:
> -        tee_segments = unpack_elf(tee_file_name)
> +        tee_segments = unpack_tee_file(tee_file_name)
>          for index, entry, paddr, data in tee_segments:
>              append_tee_node(fit_file, num_segments + index + 1, paddr,
> entry)
>          num_segments = num_segments + len(tee_segments)
> @@ -169,7 +169,7 @@ def generate_atf_binary(bl31_file_name):
>
>  def generate_tee_binary(tee_file_name):
>      if tee_file_name:
> -        for index, entry, paddr, data in unpack_elf(tee_file_name):
> +        for index, entry, paddr, data in unpack_tee_file(tee_file_name):
>              file_name = 'tee_0x%08x.bin' % paddr
>              with open(file_name, "wb") as atf:
>                  atf.write(data)
> @@ -194,6 +194,31 @@ def unpack_elf(filename):
>                  segments.append((index, e_entry, p_paddr, p_data))
>      return segments
>
> +def unpack_tee_file(filename):
> +    if filename.endswith('.elf'):
> +        return unpack_elf(filename)
> +    with open(filename, 'rb') as file:
> +        bin = file.read()
> +    segments = []
> +    if bin[0:5] == b'OPTE\x01':
> +        # OP-TEE v1 format (tee.bin)
> +        init_sz, start_hi, start_lo, _, paged_sz =
> struct.unpack_from('<5I',
> +                                                                      bin,
> +                                                                      0x8)
> +        if paged_sz != 0:
> +            raise ValueError("OP-TEE paged mode not supported")
> +        e_entry = (start_hi << 32) + start_lo
> +        p_addr = e_entry
> +        p_data = bin[0x1c:]
> +        if len(p_data) != init_sz:
> +            raise ValueError("Invalid file '%s': size mismatch "
> +                             "(expected %d, have %d)" % (filename,
> init_sz,
> +                                                         len(p_data)))
> +        segments.append((0, e_entry, p_addr, p_data))
> +    else:
> +        raise ValueError("Unknown format for TEE file '%s'" % filename)
> +    return segments
> +
>  def main():
>      uboot_elf = "./u-boot"
>      fit_its = sys.stdout
> @@ -210,11 +235,13 @@ def main():
>          logging.warning(' Please read Building section in
> doc/README.rockchip')
>
>      if "TEE" in os.environ:
> -        tee_elf = os.getenv("TEE")
> +        tee_file = os.getenv("TEE")
> +    elif os.path.isfile("./tee.bin"):
> +        tee_file = "./tee.bin"
>      elif os.path.isfile("./tee.elf"):
> -        tee_elf = "./tee.elf"
> +        tee_file = "./tee.elf"
>      else:
> -        tee_elf = ""
> +        tee_file = ""
>
>      opts, args = getopt.getopt(sys.argv[1:], "o:u:b:t:h")
>      for opt, val in opts:
> @@ -225,16 +252,16 @@ def main():
>          elif opt == "-b":
>              bl31_elf = val
>          elif opt == "-t":
> -            tee_elf = val
> +            tee_file = val
>          elif opt == "-h":
>              print(__doc__)
>              sys.exit(2)
>
>      dtbs = args
>
> -    generate_atf_fit_dts(fit_its, bl31_elf, tee_elf, uboot_elf, dtbs)
> +    generate_atf_fit_dts(fit_its, bl31_elf, tee_file, uboot_elf, dtbs)
>      generate_atf_binary(bl31_elf)
> -    generate_tee_binary(tee_elf)
> +    generate_tee_binary(tee_file)
>
>  if __name__ == "__main__":
>      main()
> --
> 2.17.1
>
>


More information about the U-Boot mailing list