mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-15 17:14:21 +00:00

The UUID conversion drops leading zeroes, so make sure that all hex strings always are 8 digits long Signed-off-by: Anders Dellien <anders.dellien@arm.com> Change-Id: I5d7e3cf3b53403a02bf551f35f17dbdb96dec8ae
149 lines
4.9 KiB
Python
Executable file
149 lines
4.9 KiB
Python
Executable file
#!/usr/bin/python3
|
|
# Copyright (c) 2020-2022, Arm Limited. All rights reserved.
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
"""
|
|
This script is invoked by Make system and generates secure partition makefile.
|
|
It expects platform provided secure partition layout file which contains list
|
|
of Secure Partition Images and Partition manifests(PM).
|
|
Layout file can exist outside of TF-A tree and the paths of Image and PM files
|
|
must be relative to it.
|
|
|
|
This script parses the layout file and generates a make file which updates
|
|
FDT_SOURCES, FIP_ARGS, CRT_ARGS and SPTOOL_ARGS which are used in later build
|
|
steps.
|
|
This script also gets SP "uuid" from parsing its PM and converting it to a
|
|
standard format.
|
|
|
|
param1: Generated mk file "sp_gen.mk"
|
|
param2: "SP_LAYOUT_FILE", json file containing platform provided information
|
|
param3: plat out directory
|
|
param4: CoT parameter
|
|
|
|
Generated "sp_gen.mk" file contains triplet of following information for each
|
|
Secure Partition entry
|
|
FDT_SOURCES += sp1.dts
|
|
SPTOOL_ARGS += -i sp1.bin:sp1.dtb -o sp1.pkg
|
|
FIP_ARGS += --blob uuid=XXXXX-XXX...,file=sp1.pkg
|
|
CRT_ARGS += --sp-pkg1 sp1.pkg
|
|
|
|
A typical SP_LAYOUT_FILE file will look like
|
|
{
|
|
"SP1" : {
|
|
"image": "sp1.bin",
|
|
"pm": "test/sp1.dts"
|
|
},
|
|
|
|
"SP2" : {
|
|
"image": "sp2.bin",
|
|
"pm": "test/sp2.dts"
|
|
}
|
|
|
|
...
|
|
}
|
|
|
|
"""
|
|
|
|
import getopt
|
|
import json
|
|
import os
|
|
import re
|
|
import sys
|
|
import uuid
|
|
|
|
with open(sys.argv[2],'r') as in_file:
|
|
data = json.load(in_file)
|
|
json_file = os.path.abspath(sys.argv[2])
|
|
json_dir = os.path.dirname(json_file)
|
|
gen_file = os.path.abspath(sys.argv[1])
|
|
out_dir = os.path.abspath(sys.argv[3])
|
|
dtb_dir = out_dir + "/fdts/"
|
|
MAX_SP = 8
|
|
dualroot = sys.argv[4].lower() == "dualroot"
|
|
split = int(MAX_SP / 2)
|
|
print(dtb_dir)
|
|
platform_count = 1
|
|
sip_count = 1
|
|
|
|
with open(gen_file, 'w') as out_file:
|
|
for idx, key in enumerate(data.keys()):
|
|
|
|
pkg_num = idx + 1
|
|
|
|
if (pkg_num > MAX_SP):
|
|
print("WARNING: Too many secure partitions\n")
|
|
exit(-1)
|
|
|
|
if dualroot:
|
|
owner = data[key].get('owner')
|
|
if owner == "Plat":
|
|
if (platform_count > split):
|
|
print("WARNING: Maximum Secure partitions by Plat " +
|
|
"have been exceeded (" + str(split) + ")\n")
|
|
exit(-1)
|
|
pkg_num = split + platform_count
|
|
platform_count += 1
|
|
elif (sip_count > split):
|
|
print("WARNING: Maximum Secure partitions by SiP " +
|
|
"have been exceeded (" + str(split) + ")\n")
|
|
exit(-1)
|
|
else:
|
|
pkg_num = sip_count
|
|
sip_count += 1
|
|
|
|
"""
|
|
Append FDT_SOURCES
|
|
"""
|
|
dts = os.path.join(json_dir, data[key]['pm'])
|
|
dtb = dtb_dir + os.path.basename(data[key]['pm'][:-1] + "b")
|
|
out_file.write("FDT_SOURCES += " + dts + "\n")
|
|
|
|
"""
|
|
Update SPTOOL_ARGS
|
|
"""
|
|
dst = out_dir + "/" + key + ".pkg"
|
|
src = [ json_dir + "/" + data[key]['image'] , dtb ]
|
|
out_file.write("SPTOOL_ARGS += -i " + ":".join(src) + " -o " + dst + "\n")
|
|
|
|
"""
|
|
Extract uuid from partition manifest
|
|
"""
|
|
pm_file = open(dts)
|
|
for line in pm_file:
|
|
if "uuid" in line:
|
|
# re.findall returns a list of string tuples.
|
|
# uuid_hex is the first item in this list representing the four
|
|
# uuid hex integers from the manifest uuid field. The heading
|
|
# '0x' of the hexadecimal representation is stripped out.
|
|
# e.g. uuid = <0x1e67b5b4 0xe14f904a 0x13fb1fb8 0xcbdae1da>;
|
|
# uuid_hex = ('1e67b5b4', 'e14f904a', '13fb1fb8', 'cbdae1da')
|
|
uuid_hex = re.findall(r'0x([0-9a-f]+) 0x([0-9a-f]+) 0x([0-9a-f]+) 0x([0-9a-f]+)', line)[0];
|
|
|
|
# uuid_hex is a list of four hex string values
|
|
if len(uuid_hex) != 4:
|
|
print("ERROR: malformed UUID")
|
|
exit(-1)
|
|
|
|
# The uuid field in SP manifest is the little endian representation
|
|
# mapped to arguments as described in SMCCC section 5.3.
|
|
# Convert each unsigned integer value to a big endian representation
|
|
# required by fiptool.
|
|
y=list(map(bytearray.fromhex, uuid_hex))
|
|
z=(int.from_bytes(y[0], byteorder='little', signed=False),
|
|
int.from_bytes(y[1], byteorder='little', signed=False),
|
|
int.from_bytes(y[2], byteorder='little', signed=False),
|
|
int.from_bytes(y[3], byteorder='little', signed=False))
|
|
uuid_std = uuid.UUID(f'{z[0]:08x}{z[1]:08x}{z[2]:08x}{z[3]:08x}')
|
|
|
|
"""
|
|
Append FIP_ARGS
|
|
"""
|
|
out_file.write("FIP_ARGS += --blob uuid=" + str(uuid_std) + ",file=" + dst + "\n")
|
|
|
|
"""
|
|
Append CRT_ARGS
|
|
"""
|
|
|
|
out_file.write("CRT_ARGS += --sp-pkg" + str(pkg_num) + " " + dst + "\n")
|
|
out_file.write("\n")
|