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 <liming....@intel.com>
Cc: Yonghong Zhu <yonghong....@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jaben Carsey <jaben.car...@intel.com>
---
 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

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to