From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.115; helo=mga14.intel.com; envelope-from=jaben.carsey@intel.com; receiver=edk2-devel@lists.01.org Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D5B582034C8D3 for ; Fri, 27 Apr 2018 15:33:02 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Apr 2018 15:33:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,336,1520924400"; d="scan'208";a="54252874" Received: from jcarsey-desk1.amr.corp.intel.com ([10.7.159.144]) by orsmga002.jf.intel.com with ESMTP; 27 Apr 2018 15:33:01 -0700 From: Jaben Carsey To: edk2-devel@lists.01.org Cc: Liming Gao , Yonghong Zhu Date: Fri, 27 Apr 2018 15:32:48 -0700 Message-Id: X-Mailer: git-send-email 2.16.2.windows.1 In-Reply-To: References: In-Reply-To: References: Subject: [PATCH v1 34/42] BaseTools: standardize GUID and pack size X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Apr 2018 22:33:03 -0000 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 --- BaseTools/Source/Python/AutoGen/GenPcdDb.py | 45 ++--------------- BaseTools/Source/Python/AutoGen/GenVar.py | 25 +--------- BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py | 28 ++--------- 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, 61 insertions(+), 123 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/GenPcdDb.py b/BaseTools/Source/Python/AutoGen/GenPcdDb.py index ef6647a15302..94f430897b98 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 e3595bb62315..bc750bd72f37 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 = 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 f5b1574e4440..3ca113c25669 100644 --- a/BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py +++ b/BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py @@ -34,13 +34,6 @@ class VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER(object): self.var_check_info.append(var_check_tab) 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 +99,8 @@ 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 48700ba82012..c3058d751470 100644 --- a/BaseTools/Source/Python/Common/DataType.py +++ b/BaseTools/Source/Python/Common/DataType.py @@ -530,3 +530,14 @@ SECTIONS_HAVE_ITEM_AFTER_ARCH = [TAB_LIBRARY_CLASSES.upper(), TAB_DEPEX.upper(), 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 f6ebaa60e23f..86c69808422c 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 2e57c5e92365..40e8bcd5aa72 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 @@ -366,10 +366,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)): @@ -403,20 +400,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 bcbe6f89b48b..505bbcd29e0a 100644 --- a/BaseTools/Source/Python/build/BuildReport.py +++ b/BaseTools/Source/Python/build/BuildReport.py @@ -313,7 +313,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) -- 2.16.2.windows.1