From 49c656633178d21679afd467e41f43a761d4238c Mon Sep 17 00:00:00 2001 From: Kathleen Capella Date: Wed, 18 Dec 2024 18:39:21 -0500 Subject: [PATCH] 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 Change-Id: I28d7b302f79482ed142c1964409c310f713a9b8c --- tools/sptool/hob.py | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/tools/sptool/hob.py b/tools/sptool/hob.py index 372ec68a5..9715f4015 100644 --- a/tools/sptool/hob.py +++ b/tools/sptool/hob.py @@ -78,6 +78,20 @@ STMM_BOOT_MODE = EFI_BOOT_WITH_FULL_CONFIGURATION 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 @@ class EfiGuid: 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 @@ class HobGenericHeader: 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 @@ class HobGuid: 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 @@ class HobGuid: 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 @@ class HandoffInfoTable: 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 @@ class HandoffInfoTable: 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 @@ class FirmwareVolumeHob: 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_ns_buffer_guid(mmram_desc): 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