From d0a0c52c221e5dcf82f24d4346c1cf52109d6dfb Mon Sep 17 00:00:00 2001 From: "Carsey, Jaben" Date: Sat, 28 Apr 2018 06:32:48 +0800 Subject: [PATCH] BaseTools: standardize GUID and pack size currently GUID packing and pack size determination is spread throughout the code. This introduces a shared function and dict and routes all code paths through them. Cc: Liming Gao Cc: Yonghong Zhu Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jaben Carsey Reviewed-by: Yonghong Zhu --- BaseTools/Source/Python/AutoGen/GenPcdDb.py | 45 ++-------------- BaseTools/Source/Python/AutoGen/GenVar.py | 25 +-------- .../Python/AutoGen/ValidCheckingInfoObject.py | 26 ++-------- BaseTools/Source/Python/Common/DataType.py | 11 ++++ BaseTools/Source/Python/Common/Misc.py | 51 ++++++++++++++----- BaseTools/Source/Python/GenFds/Fv.py | 22 ++------ BaseTools/Source/Python/build/BuildReport.py | 2 +- 7 files changed, 60 insertions(+), 122 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/GenPcdDb.py b/BaseTools/Source/Python/AutoGen/GenPcdDb.py index aee722d146..d2d42fe9d0 100644 --- a/BaseTools/Source/Python/AutoGen/GenPcdDb.py +++ b/BaseTools/Source/Python/AutoGen/GenPcdDb.py @@ -21,7 +21,6 @@ from Common.VariableAttributes import VariableAttributes import copy from struct import unpack from Common.DataType import * -from GenVar import PackGUID DATABASE_VERSION = 7 @@ -290,22 +289,7 @@ class DbItemList: GuidString = GuidStructureStringToGuidString(GuidStructureValue) return PackGUID(GuidString.split('-')) - if self.ItemSize == 8: - PackStr = "=Q" - elif self.ItemSize == 4: - PackStr = "=L" - elif self.ItemSize == 2: - PackStr = "=H" - elif self.ItemSize == 1: - PackStr = "=B" - elif self.ItemSize == 0: - PackStr = "=B" - elif self.ItemSize == 16: - # pack Guid - PackStr = '' - else: - # should not reach here - assert(False) + PackStr = PACK_CODE_BY_SIZE[self.ItemSize] Buffer = '' for Datas in self.RawDataList: @@ -379,18 +363,7 @@ class DbComItemList (DbItemList): return self.ListSize def PackData(self): - if self.ItemSize == 8: - PackStr = "=Q" - elif self.ItemSize == 4: - PackStr = "=L" - elif self.ItemSize == 2: - PackStr = "=H" - elif self.ItemSize == 1: - PackStr = "=B" - elif self.ItemSize == 0: - PackStr = "=B" - else: - assert(False) + PackStr = PACK_CODE_BY_SIZE[self.ItemSize] Buffer = '' for DataList in self.RawDataList: @@ -818,19 +791,7 @@ def BuildExDataBase(Dict): # Construct the database buffer Guid = "{0x3c7d193c, 0x682c, 0x4c14, 0xa6, 0x8f, 0x55, 0x2d, 0xea, 0x4f, 0x43, 0x7e}" Guid = StringArrayToList(Guid) - Buffer = pack('=LHHBBBBBBBB', - Guid[0], - Guid[1], - Guid[2], - Guid[3], - Guid[4], - Guid[5], - Guid[6], - Guid[7], - Guid[8], - Guid[9], - Guid[10], - ) + Buffer = PackByteFormatGUID(Guid) b = pack("=L", DATABASE_VERSION) Buffer += b diff --git a/BaseTools/Source/Python/AutoGen/GenVar.py b/BaseTools/Source/Python/AutoGen/GenVar.py index e3595bb623..5660cf1348 100644 --- a/BaseTools/Source/Python/AutoGen/GenVar.py +++ b/BaseTools/Source/Python/AutoGen/GenVar.py @@ -26,22 +26,6 @@ var_info = collections.namedtuple("uefi_var", "pcdindex,pcdname,defaultstoragena NvStorageHeaderSize = 28 VariableHeaderSize = 32 -def PackGUID(Guid): - GuidBuffer = pack('=LHHBBBBBBBB', - int(Guid[0], 16), - int(Guid[1], 16), - int(Guid[2], 16), - int(Guid[3][-4:-2], 16), - int(Guid[3][-2:], 16), - int(Guid[4][-12:-10], 16), - int(Guid[4][-10:-8], 16), - int(Guid[4][-8:-6], 16), - int(Guid[4][-6:-4], 16), - int(Guid[4][-4:-2], 16), - int(Guid[4][-2:], 16) - ) - return GuidBuffer - class VariableMgr(object): def __init__(self, DefaultStoreMap,SkuIdMap): self.VarInfo = [] @@ -87,14 +71,7 @@ class VariableMgr(object): data_type = item.data_type value_list = item.default_value.strip("{").strip("}").split(",") if data_type in DataType.TAB_PCD_NUMERIC_TYPES: - if data_type == ["BOOLEAN", DataType.TAB_UINT8]: - data_flag = "=B" - elif data_type == DataType.TAB_UINT16: - data_flag = "=H" - elif data_type == DataType.TAB_UINT32: - data_flag = "=L" - elif data_type == DataType.TAB_UINT64: - data_flag = "=Q" + data_flag = DataType.PACK_CODE_BY_SIZE[MAX_SIZE_TYPE[data_type]] data = value_list[0] value_list = [] for data_byte in pack(data_flag,int(data,16) if data.upper().startswith('0X') else int(data)): diff --git a/BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py b/BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py index 92c8fe2df9..64d4965e96 100644 --- a/BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py +++ b/BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py @@ -35,12 +35,6 @@ class VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER(object): def dump(self, dest, Phase): - FormatMap = {} - FormatMap[1] = "=B" - FormatMap[2] = "=H" - FormatMap[4] = "=L" - FormatMap[8] = "=Q" - if not os.path.isabs(dest): return if not os.path.exists(dest): @@ -106,19 +100,7 @@ class VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER(object): realLength += 4 Guid = var_check_tab.Guid - b = pack('=LHHBBBBBBBB', - Guid[0], - Guid[1], - Guid[2], - Guid[3], - Guid[4], - Guid[5], - Guid[6], - Guid[7], - Guid[8], - Guid[9], - Guid[10], - ) + b = PackByteFormatGUID(Guid) Buffer += b realLength += 16 @@ -156,14 +138,14 @@ class VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER(object): realLength += 1 for v_data in item.data: if type(v_data) in (int, long): - b = pack(FormatMap[item.StorageWidth], v_data) + b = pack(PACK_CODE_BY_SIZE[item.StorageWidth], v_data) Buffer += b realLength += item.StorageWidth else: - b = pack(FormatMap[item.StorageWidth], v_data[0]) + b = pack(PACK_CODE_BY_SIZE[item.StorageWidth], v_data[0]) Buffer += b realLength += item.StorageWidth - b = pack(FormatMap[item.StorageWidth], v_data[1]) + b = pack(PACK_CODE_BY_SIZE[item.StorageWidth], v_data[1]) Buffer += b realLength += item.StorageWidth diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/Python/Common/DataType.py index 56f5bfedd6..44e636f5ff 100644 --- a/BaseTools/Source/Python/Common/DataType.py +++ b/BaseTools/Source/Python/Common/DataType.py @@ -544,3 +544,14 @@ SECTIONS_HAVE_ITEM_AFTER_ARCH_SET = {TAB_LIBRARY_CLASSES.upper(), TAB_DEPEX.uppe PCDS_DYNAMICEX_HII.upper(), TAB_BUILD_OPTIONS.upper(), TAB_INCLUDES.upper()} + +# +# pack codes as used in PcdDb and elsewhere +# +PACK_PATTERN_GUID = '=LHHBBBBBBBB' +PACK_CODE_BY_SIZE = {8:'=Q', + 4:'=L', + 2:'=H', + 1:'=B', + 0:'=B', + 16:""} diff --git a/BaseTools/Source/Python/Common/Misc.py b/BaseTools/Source/Python/Common/Misc.py index 3d205197ab..fe5a0b8101 100644 --- a/BaseTools/Source/Python/Common/Misc.py +++ b/BaseTools/Source/Python/Common/Misc.py @@ -2087,20 +2087,7 @@ class SkuClass(): # Pack a registry format GUID # def PackRegistryFormatGuid(Guid): - Guid = Guid.split('-') - return pack('=LHHBBBBBBBB', - int(Guid[0], 16), - int(Guid[1], 16), - int(Guid[2], 16), - int(Guid[3][-4:-2], 16), - int(Guid[3][-2:], 16), - int(Guid[4][-12:-10], 16), - int(Guid[4][-10:-8], 16), - int(Guid[4][-8:-6], 16), - int(Guid[4][-6:-4], 16), - int(Guid[4][-4:-2], 16), - int(Guid[4][-2:], 16) - ) + return PackGUID(Guid.split('-')) ## Get the integer value from string like "14U" or integer like 2 # @@ -2126,6 +2113,42 @@ def GetIntegerValue(Input): else: return int(String) +# +# Pack a GUID (registry format) list into a buffer and return it +# +def PackGUID(Guid): + return pack(PACK_PATTERN_GUID, + int(Guid[0], 16), + int(Guid[1], 16), + int(Guid[2], 16), + int(Guid[3][-4:-2], 16), + int(Guid[3][-2:], 16), + int(Guid[4][-12:-10], 16), + int(Guid[4][-10:-8], 16), + int(Guid[4][-8:-6], 16), + int(Guid[4][-6:-4], 16), + int(Guid[4][-4:-2], 16), + int(Guid[4][-2:], 16) + ) + +# +# Pack a GUID (byte) list into a buffer and return it +# +def PackByteFormatGUID(Guid): + return pack(PACK_PATTERN_GUID, + Guid[0], + Guid[1], + Guid[2], + Guid[3], + Guid[4], + Guid[5], + Guid[6], + Guid[7], + Guid[8], + Guid[9], + Guid[10], + ) + ## # # This acts like the main() function for the script, unless it is 'import'ed into another diff --git a/BaseTools/Source/Python/GenFds/Fv.py b/BaseTools/Source/Python/GenFds/Fv.py index adb7c185b8..c6721b8828 100644 --- a/BaseTools/Source/Python/GenFds/Fv.py +++ b/BaseTools/Source/Python/GenFds/Fv.py @@ -26,7 +26,7 @@ import FfsFileStatement from GenFdsGlobalVariable import GenFdsGlobalVariable from GenFds import GenFds from CommonDataClass.FdfClass import FvClassObject -from Common.Misc import SaveFileOnChange +from Common.Misc import SaveFileOnChange, PackGUID from Common.LongFilePathSupport import CopyLongFilePath from Common.LongFilePathSupport import OpenLongFilePath as open from Common.DataType import * @@ -367,10 +367,7 @@ class FV (FvClassObject): # FV UI name # Buffer += (pack('HH', (FvUiLen + 16 + 4), 0x0002) - + pack('=LHHBBBBBBBB', int(Guid[0], 16), int(Guid[1], 16), int(Guid[2], 16), - int(Guid[3][-4:-2], 16), int(Guid[3][-2:], 16), int(Guid[4][-12:-10], 16), - int(Guid[4][-10:-8], 16), int(Guid[4][-8:-6], 16), int(Guid[4][-6:-4], 16), - int(Guid[4][-4:-2], 16), int(Guid[4][-2:], 16)) + + PackGUID(Guid) + self.UiFvName) for Index in range (0, len(self.FvExtEntryType)): @@ -404,20 +401,7 @@ class FV (FvClassObject): Buffer += pack('B', int(ByteList[Index1], 16)) Guid = self.FvNameGuid.split('-') - Buffer = pack('=LHHBBBBBBBBL', - int(Guid[0], 16), - int(Guid[1], 16), - int(Guid[2], 16), - int(Guid[3][-4:-2], 16), - int(Guid[3][-2:], 16), - int(Guid[4][-12:-10], 16), - int(Guid[4][-10:-8], 16), - int(Guid[4][-8:-6], 16), - int(Guid[4][-6:-4], 16), - int(Guid[4][-4:-2], 16), - int(Guid[4][-2:], 16), - TotalSize - ) + Buffer + Buffer = PackGUID(Guid) + pack('=L', TotalSize) + Buffer # # Generate FV extension header file if the total size is not zero diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py index 608aad1148..cf45ef1734 100644 --- a/BaseTools/Source/Python/build/BuildReport.py +++ b/BaseTools/Source/Python/build/BuildReport.py @@ -298,7 +298,7 @@ class DepexParser(object): Statement = gOpCodeList[struct.unpack("B", OpCode)[0]] if Statement in ["BEFORE", "AFTER", "PUSH"]: GuidValue = "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X" % \ - struct.unpack("=LHHBBBBBBBB", DepexFile.read(16)) + struct.unpack(PACK_PATTERN_GUID, DepexFile.read(16)) GuidString = self._GuidDb.get(GuidValue, GuidValue) Statement = "%s %s" % (Statement, GuidString) DepexStatement.append(Statement)