feat(sptool): specify endianness for HOB bin
Specify endianness encoding when packing HOB binary. Little-endian is
used as target platforms are expected to be little-endian.
Signed-off-by: Kathleen Capella <kathleen.capella@arm.com>
Change-Id: I28d7b302f79482ed142c1964409c310f713a9b8c
diff --git a/tools/sptool/hob.py b/tools/sptool/hob.py
index 372ec68..9715f40 100644
--- a/tools/sptool/hob.py
+++ b/tools/sptool/hob.py
@@ -78,6 +78,20 @@
STMM_MMRAM_REGION_STATE_DEFAULT = EFI_CACHEABLE | EFI_ALLOCATED
STMM_MMRAM_REGION_STATE_HEAP = EFI_CACHEABLE
+"""`struct` python module allows user to specify endianness.
+We are expecting FVP or STMM platform as target and that they will be
+little-endian. See `struct` python module documentation if other endianness is
+needed."""
+ENDIANNESS = "<"
+
+
+def struct_pack_with_endianness(format_str, *args):
+ return struct.pack((ENDIANNESS + format_str), *args)
+
+
+def struct_calcsize_with_endianness(format_str):
+ return struct.calcsize(ENDIANNESS + format_str)
+
# Helper for fdt node property parsing
def get_integer_property_value(fdt_node, name):
@@ -107,7 +121,7 @@
self.format_str = "IHH8B"
def pack(self):
- return struct.pack(
+ return struct_pack_with_endianness(
self.format_str,
self.time_low,
self.time_mid,
@@ -131,11 +145,11 @@
def __init__(self, hob_type, hob_length):
self.format_str = "HHI"
self.hob_type = hob_type
- self.hob_length = struct.calcsize(self.format_str) + hob_length
+ self.hob_length = struct_calcsize_with_endianness(self.format_str) + hob_length
self.reserved = 0
def pack(self):
- return struct.pack(
+ return struct_pack_with_endianness(
self.format_str, self.hob_type, self.hob_length, self.reserved
)
@@ -151,7 +165,9 @@
specification by generating a GUID for the HOB entry."""
def __init__(self, name: EfiGuid, data_format_str, data):
- hob_length = struct.calcsize(name.format_str) + struct.calcsize(data_format_str)
+ hob_length = struct_calcsize_with_endianness(
+ name.format_str
+ ) + struct_calcsize_with_endianness(data_format_str)
self.header = HobGenericHeader(EFI_HOB_TYPE_GUID_EXTENSION, hob_length)
self.name = name
self.data = data
@@ -164,7 +180,7 @@
return (
self.header.pack()
+ self.name.pack()
- + struct.pack(self.data_format_str, *self.data)
+ + struct_pack_with_endianness(self.data_format_str, *self.data)
)
def __str__(self):
@@ -186,7 +202,7 @@
def __init__(self, memory_base, memory_size, free_memory_base, free_memory_size):
# header,uint32t,uint32t, uint64_t * 5
self.format_str = "II5Q"
- hob_length = struct.calcsize(self.format_str)
+ hob_length = struct_calcsize_with_endianness(self.format_str)
self.header = HobGenericHeader(EFI_HOB_TYPE_HANDOFF, hob_length)
self.version = EFI_HOB_HANDOFF_TABLE_VERSION
self.boot_mode = STMM_BOOT_MODE
@@ -203,7 +219,7 @@
self.free_memory_bottom = addr
def pack(self):
- return self.header.pack() + struct.pack(
+ return self.header.pack() + struct_pack_with_endianness(
self.format_str,
self.version,
self.boot_mode,
@@ -225,14 +241,14 @@
def __init__(self, base_address, img_offset, img_size):
# header, uint64_t, uint64_t
self.data_format_str = "2Q"
- hob_length = struct.calcsize(self.data_format_str)
+ hob_length = struct_calcsize_with_endianness(self.data_format_str)
self.header = HobGenericHeader(EFI_HOB_TYPE_FV, hob_length)
self.format_str = self.header.format_str + self.data_format_str
self.base_address = base_address + img_offset
self.length = img_size - img_offset
def pack(self):
- return self.header.pack() + struct.pack(
+ return self.header.pack() + struct_pack_with_endianness(
self.data_format_str, self.base_address, self.length
)
@@ -301,8 +317,9 @@
def generate_pei_mmram_memory_reserve_guid(regions):
- # uint32t n_reserved regions, array of mmram descriptors
- format_str = "I"
+ # uint32t n_reserved regions, 4 bytes for padding so that array is aligned,
+ # array of mmram descriptors
+ format_str = "I4x"
data = [len(regions)]
for desc_format_str, mmram_desc in regions:
format_str += desc_format_str