fix: SP UUID little to big endian in TF-A build

The UUID field in SP manifest DTS is represented as an array of four
integers that the SPMC consumes using the little endian representation.
The reason is that those values are directly mapped to the SMCCC section
5.3 recommendation and the way they are exposed to the
FFA_PARTITION_INFO_GET interface.

Per [1] TF-A build flow expects a big endian representation of the UUID
so the sp_mk_generator script is updated to accommodate this conversion.

[1] https://review.trustedfirmware.org/c/TF-A/trusted-firmware-a/+/9563

Signed-off-by: Olivier Deprez <olivier.deprez@arm.com>
Change-Id: I7c7b295225e23ea64f49170e27d97442b289703b
This commit is contained in:
Olivier Deprez 2021-05-11 09:43:37 +02:00
parent ab5964aadc
commit dcdbcddebd
1 changed files with 25 additions and 13 deletions

View File

@ -1,5 +1,5 @@
#!/usr/bin/python3
# Copyright (c) 2020, Arm Limited. All rights reserved.
# Copyright (c) 2020-2021, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
@ -110,24 +110,36 @@ with open(gen_file, 'w') as out_file:
Extract uuid from partition manifest
"""
pm_file = open(dts)
uuid_key = "uuid"
for line in pm_file:
if uuid_key in line:
uuid_hex = re.findall(r'\<(.+?)\>', line)[0];
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];
# PM has uuid in format 0xABC... 0x... 0x... 0x...
# Get rid of '0x' and spaces and convert to string of hex digits
uuid_hex = uuid_hex.replace('0x','').replace(' ','')
# make UUID from a string of hex digits
uuid_std = uuid.UUID(uuid_hex)
# convert UUID to a string of hex digits in standard form
uuid_std = str(uuid_std)
# 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]:04x}{z[1]:04x}{z[2]:04x}{z[3]:04x}')
"""
Append FIP_ARGS
"""
out_file.write("FIP_ARGS += --blob uuid=" + uuid_std + ",file=" + dst + "\n")
out_file.write("FIP_ARGS += --blob uuid=" + str(uuid_std) + ",file=" + dst + "\n")
"""
Append CRT_ARGS