1ce2b1ec6SManish Pandey#!/usr/bin/python3 2*b06344a3SAnders Dellien# Copyright (c) 2020-2022, Arm Limited. All rights reserved. 3ce2b1ec6SManish Pandey# 4ce2b1ec6SManish Pandey# SPDX-License-Identifier: BSD-3-Clause 5ce2b1ec6SManish Pandey 6ce2b1ec6SManish Pandey""" 7ce2b1ec6SManish PandeyThis script is invoked by Make system and generates secure partition makefile. 8ce2b1ec6SManish PandeyIt expects platform provided secure partition layout file which contains list 9ce2b1ec6SManish Pandeyof Secure Partition Images and Partition manifests(PM). 10ce2b1ec6SManish PandeyLayout file can exist outside of TF-A tree and the paths of Image and PM files 11ce2b1ec6SManish Pandeymust be relative to it. 12ce2b1ec6SManish Pandey 13ce2b1ec6SManish PandeyThis script parses the layout file and generates a make file which updates 1407c44475SManish PandeyFDT_SOURCES, FIP_ARGS, CRT_ARGS and SPTOOL_ARGS which are used in later build 1507c44475SManish Pandeysteps. 16ce2b1ec6SManish PandeyThis script also gets SP "uuid" from parsing its PM and converting it to a 17ce2b1ec6SManish Pandeystandard format. 18ce2b1ec6SManish Pandey 19ce2b1ec6SManish Pandeyparam1: Generated mk file "sp_gen.mk" 20ce2b1ec6SManish Pandeyparam2: "SP_LAYOUT_FILE", json file containing platform provided information 21ce2b1ec6SManish Pandeyparam3: plat out directory 221e7528ecSRuari Phippsparam4: CoT parameter 23ce2b1ec6SManish Pandey 24ce2b1ec6SManish PandeyGenerated "sp_gen.mk" file contains triplet of following information for each 25ce2b1ec6SManish PandeySecure Partition entry 26ce2b1ec6SManish Pandey FDT_SOURCES += sp1.dts 27ce2b1ec6SManish Pandey SPTOOL_ARGS += -i sp1.bin:sp1.dtb -o sp1.pkg 28ce2b1ec6SManish Pandey FIP_ARGS += --blob uuid=XXXXX-XXX...,file=sp1.pkg 2907c44475SManish Pandey CRT_ARGS += --sp-pkg1 sp1.pkg 30ce2b1ec6SManish Pandey 31ce2b1ec6SManish PandeyA typical SP_LAYOUT_FILE file will look like 32ce2b1ec6SManish Pandey{ 33ce2b1ec6SManish Pandey "SP1" : { 34ce2b1ec6SManish Pandey "image": "sp1.bin", 35ce2b1ec6SManish Pandey "pm": "test/sp1.dts" 36ce2b1ec6SManish Pandey }, 37ce2b1ec6SManish Pandey 38ce2b1ec6SManish Pandey "SP2" : { 39ce2b1ec6SManish Pandey "image": "sp2.bin", 40ce2b1ec6SManish Pandey "pm": "test/sp2.dts" 41ce2b1ec6SManish Pandey } 42ce2b1ec6SManish Pandey 43ce2b1ec6SManish Pandey ... 44ce2b1ec6SManish Pandey} 45ce2b1ec6SManish Pandey 46ce2b1ec6SManish Pandey""" 47ce2b1ec6SManish Pandey 48ce2b1ec6SManish Pandeyimport getopt 49ce2b1ec6SManish Pandeyimport json 50ce2b1ec6SManish Pandeyimport os 51ce2b1ec6SManish Pandeyimport re 52ce2b1ec6SManish Pandeyimport sys 53ce2b1ec6SManish Pandeyimport uuid 54ce2b1ec6SManish Pandey 55ce2b1ec6SManish Pandeywith open(sys.argv[2],'r') as in_file: 56ce2b1ec6SManish Pandey data = json.load(in_file) 57ce2b1ec6SManish Pandeyjson_file = os.path.abspath(sys.argv[2]) 58ce2b1ec6SManish Pandeyjson_dir = os.path.dirname(json_file) 5929214e95SGrant Likelygen_file = os.path.abspath(sys.argv[1]) 6029214e95SGrant Likelyout_dir = os.path.abspath(sys.argv[3]) 61ce2b1ec6SManish Pandeydtb_dir = out_dir + "/fdts/" 621e7528ecSRuari PhippsMAX_SP = 8 631e7528ecSRuari Phippsdualroot = sys.argv[4].lower() == "dualroot" 641e7528ecSRuari Phippssplit = int(MAX_SP / 2) 65ce2b1ec6SManish Pandeyprint(dtb_dir) 661e7528ecSRuari Phippsplatform_count = 1 671e7528ecSRuari Phippssip_count = 1 68ce2b1ec6SManish Pandey 69ce2b1ec6SManish Pandeywith open(gen_file, 'w') as out_file: 7007c44475SManish Pandey for idx, key in enumerate(data.keys()): 71ce2b1ec6SManish Pandey 721e7528ecSRuari Phipps pkg_num = idx + 1 731e7528ecSRuari Phipps 741e7528ecSRuari Phipps if (pkg_num > MAX_SP): 751e7528ecSRuari Phipps print("WARNING: Too many secure partitions\n") 761e7528ecSRuari Phipps exit(-1) 771e7528ecSRuari Phipps 781e7528ecSRuari Phipps if dualroot: 791e7528ecSRuari Phipps owner = data[key].get('owner') 801e7528ecSRuari Phipps if owner == "Plat": 811e7528ecSRuari Phipps if (platform_count > split): 821e7528ecSRuari Phipps print("WARNING: Maximum Secure partitions by Plat " + 831e7528ecSRuari Phipps "have been exceeded (" + str(split) + ")\n") 841e7528ecSRuari Phipps exit(-1) 851e7528ecSRuari Phipps pkg_num = split + platform_count 861e7528ecSRuari Phipps platform_count += 1 871e7528ecSRuari Phipps elif (sip_count > split): 881e7528ecSRuari Phipps print("WARNING: Maximum Secure partitions by SiP " + 891e7528ecSRuari Phipps "have been exceeded (" + str(split) + ")\n") 901e7528ecSRuari Phipps exit(-1) 911e7528ecSRuari Phipps else: 921e7528ecSRuari Phipps pkg_num = sip_count 931e7528ecSRuari Phipps sip_count += 1 941e7528ecSRuari Phipps 95ce2b1ec6SManish Pandey """ 96ce2b1ec6SManish Pandey Append FDT_SOURCES 97ce2b1ec6SManish Pandey """ 98ce2b1ec6SManish Pandey dts = os.path.join(json_dir, data[key]['pm']) 99ce2b1ec6SManish Pandey dtb = dtb_dir + os.path.basename(data[key]['pm'][:-1] + "b") 100ce2b1ec6SManish Pandey out_file.write("FDT_SOURCES += " + dts + "\n") 101ce2b1ec6SManish Pandey 102ce2b1ec6SManish Pandey """ 103ce2b1ec6SManish Pandey Update SPTOOL_ARGS 104ce2b1ec6SManish Pandey """ 105ce2b1ec6SManish Pandey dst = out_dir + "/" + key + ".pkg" 106ce2b1ec6SManish Pandey src = [ json_dir + "/" + data[key]['image'] , dtb ] 107ce2b1ec6SManish Pandey out_file.write("SPTOOL_ARGS += -i " + ":".join(src) + " -o " + dst + "\n") 108ce2b1ec6SManish Pandey 109ce2b1ec6SManish Pandey """ 110ce2b1ec6SManish Pandey Extract uuid from partition manifest 111ce2b1ec6SManish Pandey """ 112ce2b1ec6SManish Pandey pm_file = open(dts) 113ce2b1ec6SManish Pandey for line in pm_file: 114dcdbcddeSOlivier Deprez if "uuid" in line: 115dcdbcddeSOlivier Deprez # re.findall returns a list of string tuples. 116dcdbcddeSOlivier Deprez # uuid_hex is the first item in this list representing the four 117dcdbcddeSOlivier Deprez # uuid hex integers from the manifest uuid field. The heading 118dcdbcddeSOlivier Deprez # '0x' of the hexadecimal representation is stripped out. 119dcdbcddeSOlivier Deprez # e.g. uuid = <0x1e67b5b4 0xe14f904a 0x13fb1fb8 0xcbdae1da>; 120dcdbcddeSOlivier Deprez # uuid_hex = ('1e67b5b4', 'e14f904a', '13fb1fb8', 'cbdae1da') 121dcdbcddeSOlivier Deprez uuid_hex = re.findall(r'0x([0-9a-f]+) 0x([0-9a-f]+) 0x([0-9a-f]+) 0x([0-9a-f]+)', line)[0]; 122ce2b1ec6SManish Pandey 123dcdbcddeSOlivier Deprez # uuid_hex is a list of four hex string values 124dcdbcddeSOlivier Deprez if len(uuid_hex) != 4: 125dcdbcddeSOlivier Deprez print("ERROR: malformed UUID") 126dcdbcddeSOlivier Deprez exit(-1) 127dcdbcddeSOlivier Deprez 128dcdbcddeSOlivier Deprez # The uuid field in SP manifest is the little endian representation 129dcdbcddeSOlivier Deprez # mapped to arguments as described in SMCCC section 5.3. 130dcdbcddeSOlivier Deprez # Convert each unsigned integer value to a big endian representation 131dcdbcddeSOlivier Deprez # required by fiptool. 132dcdbcddeSOlivier Deprez y=list(map(bytearray.fromhex, uuid_hex)) 133dcdbcddeSOlivier Deprez z=(int.from_bytes(y[0], byteorder='little', signed=False), 134dcdbcddeSOlivier Deprez int.from_bytes(y[1], byteorder='little', signed=False), 135dcdbcddeSOlivier Deprez int.from_bytes(y[2], byteorder='little', signed=False), 136dcdbcddeSOlivier Deprez int.from_bytes(y[3], byteorder='little', signed=False)) 137*b06344a3SAnders Dellien uuid_std = uuid.UUID(f'{z[0]:08x}{z[1]:08x}{z[2]:08x}{z[3]:08x}') 138ce2b1ec6SManish Pandey 139ce2b1ec6SManish Pandey """ 140ce2b1ec6SManish Pandey Append FIP_ARGS 141ce2b1ec6SManish Pandey """ 142dcdbcddeSOlivier Deprez out_file.write("FIP_ARGS += --blob uuid=" + str(uuid_std) + ",file=" + dst + "\n") 14307c44475SManish Pandey 14407c44475SManish Pandey """ 14507c44475SManish Pandey Append CRT_ARGS 14607c44475SManish Pandey """ 1471e7528ecSRuari Phipps 1481e7528ecSRuari Phipps out_file.write("CRT_ARGS += --sp-pkg" + str(pkg_num) + " " + dst + "\n") 149ce2b1ec6SManish Pandey out_file.write("\n") 150