]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/GenPcdDb.py
BaseTools: Various typo
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenPcdDb.py
index 23865254d791b2c6531ca46aa79d68bf65f3a8ac..b3f4ccf4f4c2e43f54877ea84a936f860f3dcf8f 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Routines for generating Pcd Database\r
 #\r
-# Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>\r
 # This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # which accompanies this distribution.  The full text of the license may be found at\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 #\r
-from StringIO import StringIO\r
+from __future__ import absolute_import\r
+from io import BytesIO\r
 from Common.Misc import *\r
-from Common.String import StringToArray\r
+from Common.StringUtils import StringToArray\r
 from struct import pack\r
-from ValidCheckingInfoObject import VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER\r
-from ValidCheckingInfoObject import VAR_CHECK_PCD_VARIABLE_TAB\r
-from ValidCheckingInfoObject import VAR_VALID_OBJECT_FACTORY\r
+from .ValidCheckingInfoObject import VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER\r
+from .ValidCheckingInfoObject import VAR_CHECK_PCD_VARIABLE_TAB\r
+from .ValidCheckingInfoObject import GetValidationObject\r
 from Common.VariableAttributes import VariableAttributes\r
+import copy\r
+from struct import unpack\r
+from Common.DataType import *\r
+from Common import GlobalData\r
+from Common import EdkLogger\r
+import Common.LongFilePathOs as os\r
 \r
-DATABASE_VERSION = 5\r
+DATABASE_VERSION = 7\r
 \r
 gPcdDatabaseAutoGenC = TemplateString("""\r
 //\r
@@ -27,6 +34,8 @@ gPcdDatabaseAutoGenC = TemplateString("""
 //\r
 #if 0\r
 ${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {\r
+  /* SkuIdTable */\r
+  { ${BEGIN}${SKUID_VALUE}, ${END} },\r
 ${BEGIN}  { ${INIT_VALUE_UINT64} }, /*  ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}] */\r
 ${END}\r
 ${BEGIN}  ${VARDEF_VALUE_UINT64}, /* ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64} */\r
@@ -86,8 +95,6 @@ ${BEGIN}  { ${INIT_VALUE_BOOLEAN} }, /*  ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_
 ${END}\r
 ${BEGIN}  ${VARDEF_VALUE_BOOLEAN}, /* ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN} */\r
 ${END}\r
-  /* SkuIdTable */\r
-  { ${BEGIN}${SKUID_VALUE}, ${END} },\r
   ${SYSTEM_SKU_ID_VALUE}\r
 };\r
 #endif\r
@@ -114,7 +121,6 @@ gPcdDatabaseAutoGenH = TemplateString("""
 #define ${PHASE}_EXMAPPING_TABLE_SIZE           ${EXMAPPING_TABLE_SIZE}\r
 #define ${PHASE}_EX_TOKEN_NUMBER                ${EX_TOKEN_NUMBER}\r
 #define ${PHASE}_SIZE_TABLE_SIZE                ${SIZE_TABLE_SIZE}\r
-#define ${PHASE}_SKU_HEAD_SIZE                  ${SKU_HEAD_SIZE}\r
 #define ${PHASE}_GUID_TABLE_EMPTY               ${GUID_TABLE_EMPTY}\r
 #define ${PHASE}_STRING_TABLE_EMPTY             ${STRING_TABLE_EMPTY}\r
 #define ${PHASE}_SKUID_TABLE_EMPTY              ${SKUID_TABLE_EMPTY}\r
@@ -122,6 +128,7 @@ gPcdDatabaseAutoGenH = TemplateString("""
 #define ${PHASE}_EXMAP_TABLE_EMPTY              ${EXMAP_TABLE_EMPTY}\r
 \r
 typedef struct {\r
+  UINT64             SkuIdTable[${PHASE}_SKUID_TABLE_SIZE];\r
 ${BEGIN}  UINT64             ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}];\r
 ${END}\r
 ${BEGIN}  UINT64             ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64};\r
@@ -138,9 +145,6 @@ ${END}
 ${BEGIN}  STRING_HEAD        ${STRING_HEAD_CNAME_DECL}_${STRING_HEAD_GUID_DECL}[${STRING_HEAD_NUMSKUS_DECL}];\r
 ${END}\r
 ${BEGIN}  VARIABLE_HEAD      ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}_Variable_Header[${VARIABLE_HEAD_NUMSKUS_DECL}];\r
-${END}\r
-${BEGIN}  SKU_HEAD           SkuHead[${PHASE}_SKU_HEAD_SIZE];\r
-${END}\r
 ${BEGIN}  UINT8              StringTable${STRING_TABLE_INDEX}[${STRING_TABLE_LENGTH}]; /* ${STRING_TABLE_CNAME}_${STRING_TABLE_GUID} */\r
 ${END}\r
   SIZE_INFO          SizeTable[${PHASE}_SIZE_TABLE_SIZE];\r
@@ -156,7 +160,6 @@ ${BEGIN}  BOOLEAN            ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_DECL_BOOLEAN
 ${END}\r
 ${BEGIN}  BOOLEAN            ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN};\r
 ${END}\r
-  UINT8              SkuIdTable[${PHASE}_SKUID_TABLE_SIZE];\r
 ${SYSTEM_SKU_ID}\r
 } ${PHASE}_PCD_DATABASE_INIT;\r
 \r
@@ -176,19 +179,22 @@ ${END}
 \r
 typedef struct {\r
   //GUID                  Signature;  // PcdDataBaseGuid\r
+  //UINT32                BuildVersion;\r
   //UINT32                Length;\r
+  //SKU_ID                SystemSkuId;       // Current SkuId value.\r
+  //UINT32                LengthForAllSkus;  // Length of all SKU PCD DB\r
   //UINT32                UninitDataBaseSize;// Total size for PCD those default value with 0.\r
   //TABLE_OFFSET          LocalTokenNumberTableOffset;\r
   //TABLE_OFFSET          ExMapTableOffset;\r
-  //TABLE_OFFSET          GuidTableOffset;     \r
+  //TABLE_OFFSET          GuidTableOffset;\r
   //TABLE_OFFSET          StringTableOffset;\r
   //TABLE_OFFSET          SizeTableOffset;\r
-  //TABLE_OFFSET          SkuIdTableOffset; \r
+  //TABLE_OFFSET          SkuIdTableOffset;\r
+  //TABLE_OFFSET          PcdNameTableOffset;\r
   //UINT16                LocalTokenCount;  // LOCAL_TOKEN_NUMBER for all\r
   //UINT16                ExTokenCount;     // EX_TOKEN_NUMBER for DynamicEx\r
   //UINT16                GuidTableCount;   // The Number of Guid in GuidTable\r
-  //SKU_ID                SystemSkuId;      // Current SkuId value.\r
-  //UINT8                 Pad;\r
+  //UINT8                 Pad[6];\r
   ${PHASE}_PCD_DATABASE_INIT    Init;\r
   ${PHASE}_PCD_DATABASE_UNINIT  Uninit;\r
 } ${PHASE}_PCD_DATABASE;\r
@@ -204,6 +210,8 @@ gEmptyPcdDatabaseAutoGenC = TemplateString("""
 //\r
 #if 0\r
 ${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {\r
+  /* SkuIdTable */\r
+  { 0 },\r
   /* ExMapTable */\r
   {\r
     {0, 0, 0}\r
@@ -226,67 +234,24 @@ ${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {
   {\r
     0, 0\r
   },\r
-  /* SkuIdTable */\r
-  { 0 },\r
   ${SYSTEM_SKU_ID_VALUE}\r
 };\r
 #endif\r
 """)\r
 \r
-## PackGuid\r
-#\r
-# Pack the GUID value in C structure format into data array\r
-#\r
-# @param GuidStructureValue:   The GUID value in C structure format\r
-#\r
-# @retval Buffer:  a data array contains the Guid\r
-#\r
-def PackGuid(GuidStructureValue):\r
-    GuidString = GuidStructureStringToGuidString(GuidStructureValue)\r
-    Guid = GuidString.split('-')\r
-    Buffer = pack('=LHHBBBBBBBB', \r
-                int(Guid[0], 16), \r
-                int(Guid[1], 16), \r
-                int(Guid[2], 16), \r
-                int(Guid[3][-4:-2], 16), \r
-                int(Guid[3][-2:], 16),\r
-                int(Guid[4][-12:-10], 16),\r
-                int(Guid[4][-10:-8], 16),\r
-                int(Guid[4][-8:-6], 16),\r
-                int(Guid[4][-6:-4], 16),\r
-                int(Guid[4][-4:-2], 16),\r
-                int(Guid[4][-2:], 16)\r
-                )\r
-    return Buffer\r
-\r
-def toHex(s):\r
-    lst = []\r
-    for ch in s:\r
-        hv = hex(ord(ch)).replace('0x', ' ')\r
-        if len(hv) == 1:\r
-            hv = '0'+hv\r
-        lst.append(hv)\r
-    if lst:\r
-        return reduce(lambda x,y:x+y, lst)\r
-    else:\r
-        return 'empty'\r
 ## DbItemList\r
 #\r
-#  The class holds the Pcd database items. ItemSize if not zero should match the item datum type in the C structure. \r
+#  The class holds the Pcd database items. ItemSize if not zero should match the item datum type in the C structure.\r
 #  When the structure is changed, remember to check the ItemSize and the related  PackStr in PackData()\r
-#  RawDataList is the RawData that may need some kind of calculation or transformation, \r
+#  RawDataList is the RawData that may need some kind of calculation or transformation,\r
 #  the DataList corresponds to the data that need to be written to database. If DataList is not present, then RawDataList\r
-#  will be written to the database. \r
+#  will be written to the database.\r
 #\r
 class DbItemList:\r
     def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
-        if DataList is None:\r
-            DataList = []\r
-        if RawDataList is None:\r
-            RawDataList = []\r
         self.ItemSize = ItemSize\r
-        self.DataList = DataList\r
-        self.RawDataList = RawDataList\r
+        self.DataList = DataList if DataList else []\r
+        self.RawDataList = RawDataList if RawDataList else []\r
         self.ListSize = 0\r
 \r
     def GetInterOffset(self, Index):\r
@@ -296,11 +261,10 @@ class DbItemList:
             # Variable length, need to calculate one by one\r
             #\r
             assert(Index < len(self.RawDataList))\r
-            for ItemIndex in xrange(Index):\r
+            for ItemIndex in range(Index):\r
                 Offset += len(self.RawDataList[ItemIndex])\r
         else:\r
-            for Datas in self.RawDataList:\r
-                Offset = self.ItemSize * Index\r
+            Offset = self.ItemSize * Index\r
 \r
         return Offset\r
 \r
@@ -317,24 +281,21 @@ class DbItemList:
         return self.ListSize\r
 \r
     def PackData(self):\r
-        if self.ItemSize == 8:\r
-            PackStr = "=Q"\r
-        elif self.ItemSize == 4:\r
-            PackStr = "=L"\r
-        elif self.ItemSize == 2:\r
-            PackStr = "=H"\r
-        elif self.ItemSize == 1:\r
-            PackStr = "=B"\r
-        elif self.ItemSize == 0:\r
-            PackStr = "=B"\r
-        elif self.ItemSize == 16:\r
-            # pack Guid\r
-            PackStr = ''\r
-        else:\r
-            # should not reach here\r
-            assert(False)\r
+        ## PackGuid\r
+        #\r
+        # Pack the GUID value in C structure format into data array\r
+        #\r
+        # @param GuidStructureValue:   The GUID value in C structure format\r
+        #\r
+        # @retval Buffer:  a data array contains the Guid\r
+        #\r
+        def PackGuid(GuidStructureValue):\r
+            GuidString = GuidStructureStringToGuidString(GuidStructureValue)\r
+            return PackGUID(GuidString.split('-'))\r
+\r
+        PackStr = PACK_CODE_BY_SIZE[self.ItemSize]\r
 \r
-        Buffer = ''\r
+        Buffer = bytearray()\r
         for Datas in self.RawDataList:\r
             if type(Datas) in (list, tuple):\r
                 for Data in Datas:\r
@@ -352,49 +313,43 @@ class DbItemList:
 \r
 ## DbExMapTblItemList\r
 #\r
-#  The class holds the ExMap table \r
+#  The class holds the ExMap table\r
 #\r
 class DbExMapTblItemList (DbItemList):\r
     def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
-        if DataList is None:\r
-            DataList = []\r
-        if RawDataList is None:\r
-            RawDataList = []\r
         DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+\r
     def PackData(self):\r
-        Buffer = ''\r
+        Buffer = bytearray()\r
         PackStr = "=LHH"\r
         for Datas in self.RawDataList:\r
-            Buffer += pack(PackStr, \r
+            Buffer += pack(PackStr,\r
                            GetIntegerValue(Datas[0]),\r
                            GetIntegerValue(Datas[1]),\r
-                           GetIntegerValue(Datas[2]))      \r
+                           GetIntegerValue(Datas[2]))\r
         return Buffer\r
 \r
 ## DbComItemList\r
 #\r
-# The DbComItemList is a special kind of DbItemList in case that the size of the List can not be computed by the \r
+# The DbComItemList is a special kind of DbItemList in case that the size of the List can not be computed by the\r
 # ItemSize multiply the ItemCount.\r
 #\r
 class DbComItemList (DbItemList):\r
     def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
-        if DataList is None:\r
-            DataList = []\r
-        if RawDataList is None:\r
-            RawDataList = []\r
         DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+\r
     def GetInterOffset(self, Index):\r
         Offset = 0\r
         if self.ItemSize == 0:\r
             #\r
-            # Variable length, need to calculte one by one\r
+            # Variable length, need to calculate one by one\r
             # The only variable table is stringtable, it is not Composite item, should not reach here\r
             #\r
             assert(False)\r
         else:\r
             assert(Index < len(self.RawDataList))\r
-            for ItemIndex in xrange(Index):\r
-                Offset += len(self.RawDataList[ItemIndex]) * self.ItemSize         \r
+            for ItemIndex in range(Index):\r
+                Offset += len(self.RawDataList[ItemIndex]) * self.ItemSize\r
 \r
         return Offset\r
 \r
@@ -412,20 +367,9 @@ class DbComItemList (DbItemList):
         return self.ListSize\r
 \r
     def PackData(self):\r
-        if self.ItemSize == 8:\r
-            PackStr = "=Q"\r
-        elif self.ItemSize == 4:\r
-            PackStr = "=L"\r
-        elif self.ItemSize == 2:\r
-            PackStr = "=H"\r
-        elif self.ItemSize == 1:\r
-            PackStr = "=B"\r
-        elif self.ItemSize == 0:\r
-            PackStr = "=B"\r
-        else:\r
-            assert(False)\r
+        PackStr = PACK_CODE_BY_SIZE[self.ItemSize]\r
 \r
-        Buffer = ''\r
+        Buffer = bytearray()\r
         for DataList in self.RawDataList:\r
             for Data in DataList:\r
                 if type(Data) in (list, tuple):\r
@@ -433,26 +377,23 @@ class DbComItemList (DbItemList):
                         Buffer += pack(PackStr, GetIntegerValue(SingleData))\r
                 else:\r
                     Buffer += pack(PackStr, GetIntegerValue(Data))\r
-        \r
+\r
         return Buffer\r
 \r
 ## DbVariableTableItemList\r
 #\r
-#  The class holds the Variable header value table \r
+#  The class holds the Variable header value table\r
 #\r
 class DbVariableTableItemList (DbComItemList):\r
     def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
-        if DataList is None:\r
-            DataList = []\r
-        if RawDataList is None:\r
-            RawDataList = []\r
         DbComItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+\r
     def PackData(self):\r
         PackStr = "=LLHHLHH"\r
-        Buffer = ''\r
+        Buffer = bytearray()\r
         for DataList in self.RawDataList:\r
             for Data in DataList:\r
-                Buffer += pack(PackStr, \r
+                Buffer += pack(PackStr,\r
                                GetIntegerValue(Data[0]),\r
                                GetIntegerValue(Data[1]),\r
                                GetIntegerValue(Data[2]),\r
@@ -464,12 +405,8 @@ class DbVariableTableItemList (DbComItemList):
 \r
 class DbStringHeadTableItemList(DbItemList):\r
     def __init__(self,ItemSize,DataList=None,RawDataList=None):\r
-        if DataList is None:\r
-            DataList = []\r
-        if RawDataList is None:\r
-            RawDataList = []        \r
         DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
-        \r
+\r
     def GetInterOffset(self, Index):\r
         Offset = 0\r
         if self.ItemSize == 0:\r
@@ -477,7 +414,7 @@ class DbStringHeadTableItemList(DbItemList):
             # Variable length, need to calculate one by one\r
             #\r
             assert(Index < len(self.RawDataList))\r
-            for ItemIndex in xrange(Index):\r
+            for ItemIndex in range(Index):\r
                 Offset += len(self.RawDataList[ItemIndex])\r
         else:\r
             for innerIndex in range(Index):\r
@@ -502,39 +439,33 @@ class DbStringHeadTableItemList(DbItemList):
                     self.ListSize += len(Datas) * self.ItemSize\r
                 else:\r
                     self.ListSize += self.ItemSize\r
-        return self.ListSize \r
+        return self.ListSize\r
 \r
 ## DbSkuHeadTableItemList\r
 #\r
-#  The class holds the Sku header value table \r
+#  The class holds the Sku header value table\r
 #\r
 class DbSkuHeadTableItemList (DbItemList):\r
     def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
-        if DataList is None:\r
-            DataList = []\r
-        if RawDataList is None:\r
-            RawDataList = []        \r
         DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+\r
     def PackData(self):\r
         PackStr = "=LL"\r
-        Buffer = ''\r
+        Buffer = bytearray()\r
         for Data in self.RawDataList:\r
-            Buffer += pack(PackStr, \r
+            Buffer += pack(PackStr,\r
                            GetIntegerValue(Data[0]),\r
                            GetIntegerValue(Data[1]))\r
         return Buffer\r
 \r
 ## DbSizeTableItemList\r
 #\r
-#  The class holds the size table \r
+#  The class holds the size table\r
 #\r
 class DbSizeTableItemList (DbItemList):\r
     def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
-        if DataList is None:\r
-            DataList = []\r
-        if RawDataList is None:\r
-            RawDataList = []        \r
         DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+\r
     def GetListSize(self):\r
         length = 0\r
         for Data in self.RawDataList:\r
@@ -542,18 +473,18 @@ class DbSizeTableItemList (DbItemList):
         return length * self.ItemSize\r
     def PackData(self):\r
         PackStr = "=H"\r
-        Buffer = ''\r
+        Buffer = bytearray()\r
         for Data in self.RawDataList:\r
-            Buffer += pack(PackStr, \r
+            Buffer += pack(PackStr,\r
                            GetIntegerValue(Data[0]))\r
             for subData in Data[1]:\r
-                Buffer += pack(PackStr, \r
+                Buffer += pack(PackStr,\r
                            GetIntegerValue(subData))\r
         return Buffer\r
 \r
 ## DbStringItemList\r
 #\r
-#  The class holds the string table \r
+#  The class holds the string table\r
 #\r
 class DbStringItemList (DbComItemList):\r
     def __init__(self, ItemSize, DataList=None, RawDataList=None, LenList=None):\r
@@ -563,18 +494,18 @@ class DbStringItemList (DbComItemList):
             RawDataList = []\r
         if LenList is None:\r
             LenList = []\r
-             \r
+\r
         assert(len(RawDataList) == len(LenList))\r
         DataList = []\r
         # adjust DataList according to the LenList\r
-        for Index in xrange(len(RawDataList)):\r
+        for Index in range(len(RawDataList)):\r
             Len = LenList[Index]\r
             RawDatas = RawDataList[Index]\r
             assert(Len >= len(RawDatas))\r
             ActualDatas = []\r
-            for i in xrange(len(RawDatas)):\r
+            for i in range(len(RawDatas)):\r
                 ActualDatas.append(RawDatas[i])\r
-            for i in xrange(len(RawDatas), Len):\r
+            for i in range(len(RawDatas), Len):\r
                 ActualDatas.append(0)\r
             DataList.append(ActualDatas)\r
         self.LenList = LenList\r
@@ -583,7 +514,7 @@ class DbStringItemList (DbComItemList):
         Offset = 0\r
 \r
         assert(Index < len(self.LenList))\r
-        for ItemIndex in xrange(Index):\r
+        for ItemIndex in range(Index):\r
             Offset += self.LenList[ItemIndex]\r
 \r
         return Offset\r
@@ -622,40 +553,15 @@ def GetMatchedIndex(Key1, List1, Key2, List2):
             return Index\r
         else:\r
             StartPos = Index + 1\r
-    \r
-    return -1\r
 \r
-\r
-##  Get the integer value from string like "14U" or integer like 2\r
-#\r
-#   @param      Input   The object that may be either a integer value or a string \r
-#  \r
-#   @retval     Value    The integer value that the input represents\r
-#\r
-def GetIntegerValue(Input):\r
-    if type(Input) in (int, long):\r
-        return Input\r
-    String = Input\r
-    if String.endswith("U"):\r
-        String = String[:-1]\r
-    if String.endswith("ULL"):\r
-        String = String[:-3]\r
-    if String.endswith("LL"):\r
-        String = String[:-2]\r
-    \r
-    if String.startswith("0x") or String.startswith("0X"):\r
-        return int(String, 16)\r
-    elif String == '':\r
-        return 0\r
-    else:\r
-        return int(String)\r
+    return -1\r
 \r
 \r
 ## convert StringArray like {0x36, 0x00, 0x34, 0x00, 0x21, 0x00, 0x36, 0x00, 0x34, 0x00, 0x00, 0x00}\r
 # to List like [0x36, 0x00, 0x34, 0x00, 0x21, 0x00, 0x36, 0x00, 0x34, 0x00, 0x00, 0x00]\r
 #\r
 #   @param      StringArray A string array like {0x36, 0x00, 0x34, 0x00, 0x21, 0x00, 0x36, 0x00, 0x34, 0x00, 0x00, 0x00}\r
-#  \r
+#\r
 #   @retval                 A list object of integer items\r
 #\r
 def StringArrayToList(StringArray):\r
@@ -667,34 +573,34 @@ def StringArrayToList(StringArray):
 ## Convert TokenType String like  "PCD_DATUM_TYPE_UINT32 | PCD_TYPE_HII" to TokenType value\r
 #\r
 #   @param      TokenType  A TokenType string like "PCD_DATUM_TYPE_UINT32 | PCD_TYPE_HII"\r
-#  \r
+#\r
 #   @retval                A integer representation of the TokenType\r
 #\r
 def GetTokenTypeValue(TokenType):\r
     TokenTypeDict = {\r
-        "PCD_TYPE_SHIFT":28,\r
-        "PCD_TYPE_DATA":(0x0 << 28),\r
-        "PCD_TYPE_HII":(0x8 << 28),\r
-        "PCD_TYPE_VPD":(0x4 << 28),\r
-        "PCD_TYPE_SKU_ENABLED":(0x2 << 28),\r
-        "PCD_TYPE_STRING":(0x1 << 28),\r
-\r
-        "PCD_DATUM_TYPE_SHIFT":24,\r
-        "PCD_DATUM_TYPE_POINTER":(0x0 << 24),\r
-        "PCD_DATUM_TYPE_UINT8":(0x1 << 24),\r
-        "PCD_DATUM_TYPE_UINT16":(0x2 << 24),\r
-        "PCD_DATUM_TYPE_UINT32":(0x4 << 24),\r
-        "PCD_DATUM_TYPE_UINT64":(0x8 << 24),\r
-\r
-        "PCD_DATUM_TYPE_SHIFT2":20,\r
-        "PCD_DATUM_TYPE_UINT8_BOOLEAN":(0x1 << 20 | 0x1 << 24),\r
+        "PCD_TYPE_SHIFT": 28,\r
+        "PCD_TYPE_DATA": (0x0 << 28),\r
+        "PCD_TYPE_HII": (0x8 << 28),\r
+        "PCD_TYPE_VPD": (0x4 << 28),\r
+#        "PCD_TYPE_SKU_ENABLED":(0x2 << 28),\r
+        "PCD_TYPE_STRING": (0x1 << 28),\r
+\r
+        "PCD_DATUM_TYPE_SHIFT": 24,\r
+        "PCD_DATUM_TYPE_POINTER": (0x0 << 24),\r
+        "PCD_DATUM_TYPE_UINT8": (0x1 << 24),\r
+        "PCD_DATUM_TYPE_UINT16": (0x2 << 24),\r
+        "PCD_DATUM_TYPE_UINT32": (0x4 << 24),\r
+        "PCD_DATUM_TYPE_UINT64": (0x8 << 24),\r
+\r
+        "PCD_DATUM_TYPE_SHIFT2": 20,\r
+        "PCD_DATUM_TYPE_UINT8_BOOLEAN": (0x1 << 20 | 0x1 << 24),\r
         }\r
     return eval(TokenType, TokenTypeDict)\r
 \r
 ## construct the external Pcd database using data from Dict\r
 #\r
 #   @param      Dict  A dictionary contains Pcd related tables\r
-#  \r
+#\r
 #   @retval     Buffer A byte stream of the Pcd database\r
 #\r
 def BuildExDataBase(Dict):\r
@@ -709,7 +615,7 @@ def BuildExDataBase(Dict):
     DbVardefValueUint32 = DbItemList(4, RawDataList = VardefValueUint32)\r
     VpdHeadValue = Dict['VPD_DB_VALUE']\r
     DbVpdHeadValue = DbComItemList(4, RawDataList = VpdHeadValue)\r
-    ExMapTable = zip(Dict['EXMAPPING_TABLE_EXTOKEN'], Dict['EXMAPPING_TABLE_LOCAL_TOKEN'], Dict['EXMAPPING_TABLE_GUID_INDEX'])\r
+    ExMapTable = list(zip(Dict['EXMAPPING_TABLE_EXTOKEN'], Dict['EXMAPPING_TABLE_LOCAL_TOKEN'], Dict['EXMAPPING_TABLE_GUID_INDEX']))\r
     DbExMapTable = DbExMapTblItemList(8, RawDataList = ExMapTable)\r
     LocalTokenNumberTable = Dict['LOCAL_TOKEN_NUMBER_DB_VALUE']\r
     DbLocalTokenNumberTable = DbItemList(4, RawDataList = LocalTokenNumberTable)\r
@@ -721,31 +627,29 @@ def BuildExDataBase(Dict):
     VariableTable = Dict['VARIABLE_DB_VALUE']\r
     DbVariableTable = DbVariableTableItemList(20, RawDataList = VariableTable)\r
     NumberOfSkuEnabledPcd = GetIntegerValue(Dict['SKU_HEAD_SIZE'])\r
-    Dict['SKUHEAD_TABLE_VALUE'] = [(0,0) for i in xrange(NumberOfSkuEnabledPcd)]\r
-    SkuTable = Dict['SKUHEAD_TABLE_VALUE']  # Generated later\r
-    DbSkuTable = DbSkuHeadTableItemList(8, RawDataList = SkuTable)\r
+\r
     Dict['STRING_TABLE_DB_VALUE'] = [StringArrayToList(x) for x in Dict['STRING_TABLE_VALUE']]\r
-    \r
+\r
     StringTableValue = Dict['STRING_TABLE_DB_VALUE']\r
-    # when calcute the offset, should use StringTableLen instead of StringTableValue, as string maxium len may be different with actual len\r
+    # when calcute the offset, should use StringTableLen instead of StringTableValue, as string maximum len may be different with actual len\r
     StringTableLen = Dict['STRING_TABLE_LENGTH']\r
     DbStringTableLen = DbStringItemList(0, RawDataList = StringTableValue, LenList = StringTableLen)\r
 \r
-    \r
+\r
     PcdTokenTable = Dict['PCD_TOKENSPACE']\r
     PcdTokenLen = Dict['PCD_TOKENSPACE_LENGTH']\r
     PcdTokenTableValue = [StringArrayToList(x) for x in Dict['PCD_TOKENSPACE']]\r
     DbPcdTokenTable = DbStringItemList(0, RawDataList = PcdTokenTableValue, LenList = PcdTokenLen)\r
-    \r
+\r
     PcdCNameTable = Dict['PCD_CNAME']\r
     PcdCNameLen = Dict['PCD_CNAME_LENGTH']\r
     PcdCNameTableValue = [StringArrayToList(x) for x in Dict['PCD_CNAME']]\r
     DbPcdCNameTable = DbStringItemList(0, RawDataList = PcdCNameTableValue, LenList = PcdCNameLen)\r
-    \r
+\r
     PcdNameOffsetTable = Dict['PCD_NAME_OFFSET']\r
-    DbPcdNameOffsetTable = DbItemList(4,RawDataList = PcdNameOffsetTable)\r
-    \r
-    SizeTableValue = zip(Dict['SIZE_TABLE_MAXIMUM_LENGTH'], Dict['SIZE_TABLE_CURRENT_LENGTH'])\r
+    DbPcdNameOffsetTable = DbItemList(4, RawDataList = PcdNameOffsetTable)\r
+\r
+    SizeTableValue = list(zip(Dict['SIZE_TABLE_MAXIMUM_LENGTH'], Dict['SIZE_TABLE_CURRENT_LENGTH']))\r
     DbSizeTableValue = DbSizeTableItemList(2, RawDataList = SizeTableValue)\r
     InitValueUint16 = Dict['INIT_DB_VALUE_UINT16']\r
     DbInitValueUint16 = DbComItemList(2, RawDataList = InitValueUint16)\r
@@ -760,10 +664,10 @@ def BuildExDataBase(Dict):
     VardefValueBoolean = Dict['VARDEF_DB_VALUE_BOOLEAN']\r
     DbVardefValueBoolean = DbItemList(1, RawDataList = VardefValueBoolean)\r
     SkuidValue = Dict['SKUID_VALUE']\r
-    DbSkuidValue = DbItemList(1, RawDataList = SkuidValue)\r
-    SkuIndexValue = Dict['SKU_INDEX_VALUE']\r
-    DbSkuIndexValue = DbItemList(0,RawDataList = SkuIndexValue)\r
-    \r
+    DbSkuidValue = DbItemList(8, RawDataList = SkuidValue)\r
+\r
+\r
+\r
     # Unit Db Items\r
     UnInitValueUint64 = Dict['UNINIT_GUID_DECL_UINT64']\r
     DbUnInitValueUint64 = DbItemList(8, RawDataList = UnInitValueUint64)\r
@@ -776,62 +680,41 @@ def BuildExDataBase(Dict):
     UnInitValueBoolean = Dict['UNINIT_GUID_DECL_BOOLEAN']\r
     DbUnInitValueBoolean = DbItemList(1, RawDataList = UnInitValueBoolean)\r
     PcdTokenNumberMap = Dict['PCD_ORDER_TOKEN_NUMBER_MAP']\r
\r
-    DbNameTotle = ["InitValueUint64", "VardefValueUint64", "InitValueUint32", "VardefValueUint32", "VpdHeadValue", "ExMapTable", \r
-               "LocalTokenNumberTable", "GuidTable", "StringHeadValue",  "PcdNameOffsetTable","VariableTable","SkuTable", "StringTableLen", "PcdTokenTable", "PcdCNameTable", \r
+\r
+    DbNameTotle = ["SkuidValue",  "InitValueUint64", "VardefValueUint64", "InitValueUint32", "VardefValueUint32", "VpdHeadValue", "ExMapTable",\r
+               "LocalTokenNumberTable", "GuidTable", "StringHeadValue",  "PcdNameOffsetTable", "VariableTable", "StringTableLen", "PcdTokenTable", "PcdCNameTable",\r
                "SizeTableValue", "InitValueUint16", "VardefValueUint16", "InitValueUint8", "VardefValueUint8", "InitValueBoolean",\r
-               "VardefValueBoolean", "SkuidValue", "SkuIndexValue","UnInitValueUint64", "UnInitValueUint32", "UnInitValueUint16", "UnInitValueUint8", "UnInitValueBoolean"]\r
\r
-    DbTotal = [InitValueUint64, VardefValueUint64, InitValueUint32, VardefValueUint32, VpdHeadValue, ExMapTable, \r
-               LocalTokenNumberTable, GuidTable, StringHeadValue,  PcdNameOffsetTable,VariableTable,SkuTable, StringTableLen, PcdTokenTable,PcdCNameTable, \r
+               "VardefValueBoolean", "UnInitValueUint64", "UnInitValueUint32", "UnInitValueUint16", "UnInitValueUint8", "UnInitValueBoolean"]\r
+\r
+    DbTotal = [SkuidValue,  InitValueUint64, VardefValueUint64, InitValueUint32, VardefValueUint32, VpdHeadValue, ExMapTable,\r
+               LocalTokenNumberTable, GuidTable, StringHeadValue,  PcdNameOffsetTable, VariableTable, StringTableLen, PcdTokenTable, PcdCNameTable,\r
                SizeTableValue, InitValueUint16, VardefValueUint16, InitValueUint8, VardefValueUint8, InitValueBoolean,\r
-               VardefValueBoolean, SkuidValue, SkuIndexValue, UnInitValueUint64, UnInitValueUint32, UnInitValueUint16, UnInitValueUint8, UnInitValueBoolean]\r
-    DbItemTotal = [DbInitValueUint64, DbVardefValueUint64, DbInitValueUint32, DbVardefValueUint32, DbVpdHeadValue, DbExMapTable, \r
-               DbLocalTokenNumberTable, DbGuidTable, DbStringHeadValue,  DbPcdNameOffsetTable,DbVariableTable,DbSkuTable, DbStringTableLen, DbPcdTokenTable, DbPcdCNameTable, \r
+               VardefValueBoolean, UnInitValueUint64, UnInitValueUint32, UnInitValueUint16, UnInitValueUint8, UnInitValueBoolean]\r
+    DbItemTotal = [DbSkuidValue,  DbInitValueUint64, DbVardefValueUint64, DbInitValueUint32, DbVardefValueUint32, DbVpdHeadValue, DbExMapTable,\r
+               DbLocalTokenNumberTable, DbGuidTable, DbStringHeadValue,  DbPcdNameOffsetTable, DbVariableTable, DbStringTableLen, DbPcdTokenTable, DbPcdCNameTable,\r
                DbSizeTableValue, DbInitValueUint16, DbVardefValueUint16, DbInitValueUint8, DbVardefValueUint8, DbInitValueBoolean,\r
-               DbVardefValueBoolean, DbSkuidValue, DbSkuIndexValue, DbUnInitValueUint64, DbUnInitValueUint32, DbUnInitValueUint16, DbUnInitValueUint8, DbUnInitValueBoolean]\r
-    \r
-    # SkuidValue is the last table in the init table items\r
-    InitTableNum = DbTotal.index(SkuidValue) + 1 + 1 # +1 is for SkuIndexValue table\r
+               DbVardefValueBoolean, DbUnInitValueUint64, DbUnInitValueUint32, DbUnInitValueUint16, DbUnInitValueUint8, DbUnInitValueBoolean]\r
+\r
+    # VardefValueBoolean is the last table in the init table items\r
+    InitTableNum = DbNameTotle.index("VardefValueBoolean") + 1\r
     # The FixedHeader length of the PCD_DATABASE_INIT, from Signature to Pad\r
-    FixedHeaderLen = 64\r
+    FixedHeaderLen = 80\r
 \r
-    # Get offset of SkuId table in the database \r
+    # Get offset of SkuId table in the database\r
     SkuIdTableOffset = FixedHeaderLen\r
-    for DbIndex in xrange(len(DbTotal)):\r
+    for DbIndex in range(len(DbTotal)):\r
         if DbTotal[DbIndex] is SkuidValue:\r
             break\r
         SkuIdTableOffset += DbItemTotal[DbIndex].GetListSize()\r
-    \r
-    \r
-    # Get offset of SkuValue table in the database    \r
-    SkuTableOffset = FixedHeaderLen\r
-    for DbIndex in xrange(len(DbTotal)):\r
-        if DbTotal[DbIndex] is SkuTable:\r
-            break\r
-        SkuTableOffset += DbItemTotal[DbIndex].GetListSize()\r
-    PcdTokenTableDbOffset = FixedHeaderLen\r
-    for DbIndex in xrange(len(DbTotal)):\r
-        if DbTotal[DbIndex] is PcdTokenTable:\r
-            break\r
-        PcdTokenTableDbOffset += DbItemTotal[DbIndex].GetListSize()\r
-    \r
-    PcdCNameTableDbOffset = FixedHeaderLen\r
-    for DbIndex in xrange(len(DbTotal)):\r
-        if DbTotal[DbIndex] is PcdCNameTable:\r
-            break\r
-        PcdCNameTableDbOffset += DbItemTotal[DbIndex].GetListSize()\r
+\r
+\r
+    # Get offset of SkuValue table in the database\r
+\r
     # Fix up the LocalTokenNumberTable, SkuHeader table\r
-    SkuHeaderIndex = 0\r
-    if len(Dict['SKU_INDEX_VALUE']) > 0:\r
-        SkuIndexIndexTable = [(0) for i in xrange(len(Dict['SKU_INDEX_VALUE']))]\r
-        SkuIndexIndexTable[0] = 0  #Dict['SKU_INDEX_VALUE'][0][0]\r
-        for i in range(1,len(Dict['SKU_INDEX_VALUE'])):\r
-            SkuIndexIndexTable[i] = SkuIndexIndexTable[i-1]+Dict['SKU_INDEX_VALUE'][i-1][0] + 1\r
     for (LocalTokenNumberTableIndex, (Offset, Table)) in enumerate(LocalTokenNumberTable):\r
         DbIndex = 0\r
         DbOffset = FixedHeaderLen\r
-        for DbIndex in xrange(len(DbTotal)):\r
+        for DbIndex in range(len(DbTotal)):\r
             if DbTotal[DbIndex] is Table:\r
                 DbOffset += DbItemTotal[DbIndex].GetInterOffset(Offset)\r
                 break\r
@@ -846,26 +729,18 @@ def BuildExDataBase(Dict):
         TokenTypeValue = GetTokenTypeValue(TokenTypeValue)\r
         LocalTokenNumberTable[LocalTokenNumberTableIndex] = DbOffset|int(TokenTypeValue)\r
         # if PCD_TYPE_SKU_ENABLED, then we need to fix up the SkuTable\r
-        \r
-        SkuIndexTabalOffset = SkuIdTableOffset + Dict['SKUID_VALUE'][0] + 1\r
-        if (TokenTypeValue & (0x2 << 28)):\r
-            SkuTable[SkuHeaderIndex] = (DbOffset|int(TokenTypeValue & ~(0x2<<28)), SkuIndexTabalOffset + SkuIndexIndexTable[PcdTokenNumberMap[LocalTokenNumberTableIndex]])\r
-            LocalTokenNumberTable[LocalTokenNumberTableIndex] = (SkuTableOffset + SkuHeaderIndex * 8) | int(TokenTypeValue)\r
-            SkuHeaderIndex += 1\r
-        \r
-    \r
-    if SkuHeaderIndex == 0:\r
-        SkuHeaderIndex = 1\r
-    assert(SkuHeaderIndex == NumberOfSkuEnabledPcd)\r
-\r
-    # resolve variable table offset \r
+\r
+\r
+\r
+\r
+    # resolve variable table offset\r
     for VariableEntries in VariableTable:\r
         skuindex = 0\r
         for VariableEntryPerSku in VariableEntries:\r
             (VariableHeadGuidIndex, VariableHeadStringIndex, SKUVariableOffset, VariableOffset, VariableRefTable, VariableAttribute) = VariableEntryPerSku[:]\r
             DbIndex = 0\r
             DbOffset = FixedHeaderLen\r
-            for DbIndex in xrange(len(DbTotal)):\r
+            for DbIndex in range(len(DbTotal)):\r
                 if DbTotal[DbIndex] is VariableRefTable:\r
                     DbOffset += DbItemTotal[DbIndex].GetInterOffset(VariableOffset)\r
                     break\r
@@ -875,8 +750,8 @@ def BuildExDataBase(Dict):
                         DbOffset += (8 - DbOffset % 8)\r
             else:\r
                 assert(False)\r
-            if isinstance(VariableRefTable[0],list):\r
-                DbOffset += skuindex * 4   \r
+            if isinstance(VariableRefTable[0], list):\r
+                DbOffset += skuindex * 4\r
             skuindex += 1\r
             if DbIndex >= InitTableNum:\r
                 assert(False)\r
@@ -885,7 +760,7 @@ def BuildExDataBase(Dict):
 \r
     # calculate various table offset now\r
     DbTotalLength = FixedHeaderLen\r
-    for DbIndex in xrange(len(DbItemTotal)):\r
+    for DbIndex in range(len(DbItemTotal)):\r
         if DbItemTotal[DbIndex] is DbLocalTokenNumberTable:\r
             LocalTokenNumberTableOffset = DbTotalLength\r
         elif DbItemTotal[DbIndex] is DbExMapTable:\r
@@ -901,43 +776,38 @@ def BuildExDataBase(Dict):
         elif DbItemTotal[DbIndex] is DbPcdNameOffsetTable:\r
             DbPcdNameOffset = DbTotalLength\r
 \r
+\r
         DbTotalLength += DbItemTotal[DbIndex].GetListSize()\r
     if not Dict['PCD_INFO_FLAG']:\r
-        DbPcdNameOffset  = 0   \r
+        DbPcdNameOffset  = 0\r
     LocalTokenCount = GetIntegerValue(Dict['LOCAL_TOKEN_NUMBER'])\r
     ExTokenCount = GetIntegerValue(Dict['EX_TOKEN_NUMBER'])\r
     GuidTableCount = GetIntegerValue(Dict['GUID_TABLE_SIZE'])\r
     SystemSkuId = GetIntegerValue(Dict['SYSTEM_SKU_ID_VALUE'])\r
     Pad = 0xDA\r
-    \r
+\r
     UninitDataBaseSize  = 0\r
     for Item in (DbUnInitValueUint64, DbUnInitValueUint32, DbUnInitValueUint16, DbUnInitValueUint8, DbUnInitValueBoolean):\r
         UninitDataBaseSize += Item.GetListSize()\r
-    \r
+\r
     if (DbTotalLength - UninitDataBaseSize) % 8:\r
         DbTotalLength += (8 - (DbTotalLength - UninitDataBaseSize) % 8)\r
     # Construct the database buffer\r
     Guid = "{0x3c7d193c, 0x682c, 0x4c14, 0xa6, 0x8f, 0x55, 0x2d, 0xea, 0x4f, 0x43, 0x7e}"\r
     Guid = StringArrayToList(Guid)\r
-    Buffer = pack('=LHHBBBBBBBB', \r
-                Guid[0], \r
-                Guid[1], \r
-                Guid[2], \r
-                Guid[3], \r
-                Guid[4],  \r
-                Guid[5],\r
-                Guid[6],\r
-                Guid[7],\r
-                Guid[8],\r
-                Guid[9],\r
-                Guid[10],\r
-                )\r
+    Buffer = PackByteFormatGUID(Guid)\r
 \r
     b = pack("=L", DATABASE_VERSION)\r
     Buffer += b\r
 \r
     b = pack('=L', DbTotalLength - UninitDataBaseSize)\r
 \r
+    Buffer += b\r
+    b = pack('=Q', SystemSkuId)\r
+\r
+    Buffer += b\r
+    b = pack('=L', 0)\r
+\r
     Buffer += b\r
     b = pack('=L', UninitDataBaseSize)\r
 \r
@@ -946,7 +816,7 @@ def BuildExDataBase(Dict):
 \r
     Buffer += b\r
     b = pack('=L', ExMapTableOffset)\r
\r
+\r
     Buffer += b\r
     b = pack('=L', GuidTableOffset)\r
 \r
@@ -970,26 +840,28 @@ def BuildExDataBase(Dict):
 \r
     Buffer += b\r
     b = pack('=H', GuidTableCount)\r
\r
-    Buffer += b\r
-    b = pack('=B', SystemSkuId)\r
\r
+\r
     Buffer += b\r
     b = pack('=B', Pad)\r
\r
     Buffer += b\r
-    \r
+    Buffer += b\r
+    Buffer += b\r
+    Buffer += b\r
+    Buffer += b\r
+    Buffer += b\r
+\r
     Index = 0\r
     for Item in DbItemTotal:\r
         Index +=1\r
-        b = Item.PackData()\r
-        Buffer += b  \r
+        packdata = Item.PackData()\r
+        for i in range(len(packdata)):\r
+            Buffer += packdata[i:i + 1]\r
         if Index == InitTableNum:\r
             if len(Buffer) % 8:\r
                 for num in range(8 - len(Buffer) % 8):\r
                     b = pack('=B', Pad)\r
                     Buffer += b\r
-            break        \r
+            break\r
     return Buffer\r
 \r
 ## Create code for PCD database\r
@@ -1005,7 +877,7 @@ def CreatePcdDatabaseCode (Info, AutoGenC, AutoGenH):
         EdkLogger.error("build", AUTOGEN_ERROR, "Not supported PcdIsDriver type:%s" % Info.PcdIsDriver,\r
                         ExtraData="[%s]" % str(Info))\r
 \r
-    AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, 'PEI')\r
+    AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer = NewCreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, 'PEI')\r
     AutoGenH.Append(AdditionalAutoGenH.String)\r
 \r
     Phase = gPcdPhaseMap[Info.PcdIsDriver]\r
@@ -1013,25 +885,112 @@ def CreatePcdDatabaseCode (Info, AutoGenC, AutoGenH):
         AutoGenC.Append(AdditionalAutoGenC.String)\r
 \r
     if Phase == 'DXE':\r
-        AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, Phase)\r
+        AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer = NewCreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, Phase)\r
         AutoGenH.Append(AdditionalAutoGenH.String)\r
         AutoGenC.Append(AdditionalAutoGenC.String)\r
 \r
     if Info.IsBinaryModule:\r
-        DbFileName = os.path.join(Info.PlatformInfo.BuildDir, "FV", Phase + "PcdDataBase.raw")\r
+        DbFileName = os.path.join(Info.PlatformInfo.BuildDir, TAB_FV_DIRECTORY, Phase + "PcdDataBase.raw")\r
     else:\r
         DbFileName = os.path.join(Info.OutputDir, Phase + "PcdDataBase.raw")\r
-    DbFile = StringIO()\r
+    DbFile = BytesIO()\r
     DbFile.write(PcdDbBuffer)\r
     Changed = SaveFileOnChange(DbFileName, DbFile.getvalue(), True)\r
+def CreatePcdDataBase(PcdDBData):\r
+    delta = {}\r
+    for skuname, skuid in PcdDBData:\r
+        if len(PcdDBData[(skuname, skuid)][1]) != len(PcdDBData[(TAB_DEFAULT, "0")][1]):\r
+            EdkLogger.ERROR("The size of each sku in one pcd are not same")\r
+    for skuname, skuid in PcdDBData:\r
+        if skuname == TAB_DEFAULT:\r
+            continue\r
+        delta[(skuname, skuid)] = [(index, data, hex(data)) for index, data in enumerate(PcdDBData[(skuname, skuid)][1]) if PcdDBData[(skuname, skuid)][1][index] != PcdDBData[(TAB_DEFAULT, "0")][1][index]]\r
+    databasebuff = PcdDBData[(TAB_DEFAULT, "0")][0]\r
+\r
+    for skuname, skuid in delta:\r
+        # 8 byte align\r
+        if len(databasebuff) % 8 > 0:\r
+            for i in range(8 - (len(databasebuff) % 8)):\r
+                databasebuff += pack("=B", 0)\r
+        databasebuff += pack('=Q', int(skuid))\r
+        databasebuff += pack('=Q', 0)\r
+        databasebuff += pack('=L', 8+8+4+4*len(delta[(skuname, skuid)]))\r
+        for item in delta[(skuname, skuid)]:\r
+            databasebuff += pack("=L", item[0])\r
+            databasebuff = databasebuff[:-1] + pack("=B", item[1])\r
+    totallen = len(databasebuff)\r
+    totallenbuff = pack("=L", totallen)\r
+    newbuffer = databasebuff[:32]\r
+    for i in range(4):\r
+        newbuffer += totallenbuff[i:i+1]\r
+    for i in range(36, totallen):\r
+        newbuffer += databasebuff[i:i+1]\r
+\r
+    return newbuffer\r
+\r
+def CreateVarCheckBin(VarCheckTab):\r
+    return VarCheckTab[(TAB_DEFAULT, "0")]\r
+\r
+def CreateAutoGen(PcdDriverAutoGenData):\r
+    autogenC = TemplateString()\r
+    for skuname, skuid in PcdDriverAutoGenData:\r
+        autogenC.Append("//SKUID: %s" % skuname)\r
+        autogenC.Append(PcdDriverAutoGenData[(skuname, skuid)][1].String)\r
+    return (PcdDriverAutoGenData[(skuname, skuid)][0], autogenC)\r
+def NewCreatePcdDatabasePhaseSpecificAutoGen(Platform, Phase):\r
+    def prune_sku(pcd, skuname):\r
+        new_pcd = copy.deepcopy(pcd)\r
+        new_pcd.SkuInfoList = {skuname:pcd.SkuInfoList[skuname]}\r
+        new_pcd.isinit = 'INIT'\r
+        if new_pcd.DatumType in TAB_PCD_NUMERIC_TYPES:\r
+            for skuobj in pcd.SkuInfoList.values():\r
+                if skuobj.DefaultValue:\r
+                    defaultvalue = int(skuobj.DefaultValue, 16) if skuobj.DefaultValue.upper().startswith("0X") else int(skuobj.DefaultValue, 10)\r
+                    if defaultvalue  != 0:\r
+                        new_pcd.isinit = "INIT"\r
+                        break\r
+                elif skuobj.VariableName:\r
+                    new_pcd.isinit = "INIT"\r
+                    break\r
+            else:\r
+                new_pcd.isinit = "UNINIT"\r
+        return new_pcd\r
+    DynamicPcds = Platform.DynamicPcdList\r
+    DynamicPcdSet_Sku = {(SkuName, skuobj.SkuId):[] for pcd in DynamicPcds for (SkuName, skuobj) in pcd.SkuInfoList.items() }\r
+    for skuname, skuid in DynamicPcdSet_Sku:\r
+        DynamicPcdSet_Sku[(skuname, skuid)] = [prune_sku(pcd, skuname) for pcd in DynamicPcds]\r
+    PcdDBData = {}\r
+    PcdDriverAutoGenData = {}\r
+    VarCheckTableData = {}\r
+    if DynamicPcdSet_Sku:\r
+        for skuname, skuid in DynamicPcdSet_Sku:\r
+            AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer, VarCheckTab = CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdSet_Sku[(skuname, skuid)], Phase)\r
+            final_data = ()\r
+            for item in range(len(PcdDbBuffer)):\r
+                final_data += unpack("B", PcdDbBuffer[item:item+1])\r
+            PcdDBData[(skuname, skuid)] = (PcdDbBuffer, final_data)\r
+            PcdDriverAutoGenData[(skuname, skuid)] = (AdditionalAutoGenH, AdditionalAutoGenC)\r
+            VarCheckTableData[(skuname, skuid)] = VarCheckTab\r
+        if Platform.Platform.VarCheckFlag:\r
+            dest = os.path.join(Platform.BuildDir, TAB_FV_DIRECTORY)\r
+            VarCheckTable = CreateVarCheckBin(VarCheckTableData)\r
+            VarCheckTable.dump(dest, Phase)\r
+        AdditionalAutoGenH, AdditionalAutoGenC =  CreateAutoGen(PcdDriverAutoGenData)\r
+    else:\r
+        AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer, VarCheckTab = CreatePcdDatabasePhaseSpecificAutoGen (Platform, {}, Phase)\r
+        final_data = ()\r
+        for item in range(len(PcdDbBuffer)):\r
+            final_data += unpack("B", PcdDbBuffer[item:item + 1])\r
+        PcdDBData[(TAB_DEFAULT, "0")] = (PcdDbBuffer, final_data)\r
 \r
+    return AdditionalAutoGenH, AdditionalAutoGenC, CreatePcdDataBase(PcdDBData)\r
 ## Create PCD database in DXE or PEI phase\r
 #\r
 #   @param      Platform    The platform object\r
 #   @retval     tuple       Two TemplateString objects for C code and header file,\r
 #                           respectively\r
 #\r
-def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):\r
+def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):\r
     AutoGenC = TemplateString()\r
     AutoGenH = TemplateString()\r
 \r
@@ -1052,31 +1011,30 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         'SKUID_TABLE_EMPTY'             : 'TRUE',\r
         'DATABASE_EMPTY'                : 'TRUE',\r
         'EXMAP_TABLE_EMPTY'             : 'TRUE',\r
-        'PCD_DATABASE_UNINIT_EMPTY'     : '  UINT8  dummy; /* PCD_DATABASE_UNINIT is emptry */',\r
+        'PCD_DATABASE_UNINIT_EMPTY'     : '  UINT8  dummy; /* PCD_DATABASE_UNINIT is empty */',\r
         'SYSTEM_SKU_ID'                 : '  SKU_ID             SystemSkuId;',\r
         'SYSTEM_SKU_ID_VALUE'           : '0U'\r
     }\r
-    \r
-   \r
-    SkuObj = SkuClass(Platform.Platform.AvilableSkuIds, Platform.Platform.SkuIds)\r
-    Dict['SYSTEM_SKU_ID_VALUE'] = Platform.Platform.SkuIds[SkuObj.SystemSkuId]\r
+\r
+    SkuObj = Platform.Platform.SkuIdMgr\r
+    Dict['SYSTEM_SKU_ID_VALUE'] = 0 if SkuObj.SkuUsageType == SkuObj.SINGLE else Platform.Platform.SkuIds[SkuObj.SystemSkuId][0]\r
 \r
     Dict['PCD_INFO_FLAG'] = Platform.Platform.PcdInfoFlag\r
 \r
-    for DatumType in ['UINT64','UINT32','UINT16','UINT8','BOOLEAN', "VOID*"]:\r
+    for DatumType in TAB_PCD_NUMERIC_TYPES_VOID:\r
         Dict['VARDEF_CNAME_' + DatumType] = []\r
         Dict['VARDEF_GUID_' + DatumType]  = []\r
         Dict['VARDEF_SKUID_' + DatumType] = []\r
         Dict['VARDEF_VALUE_' + DatumType] = []\r
         Dict['VARDEF_DB_VALUE_' + DatumType] = []\r
-        for Init in ['INIT','UNINIT']:\r
+        for Init in ['INIT', 'UNINIT']:\r
             Dict[Init+'_CNAME_DECL_' + DatumType]   = []\r
             Dict[Init+'_GUID_DECL_' + DatumType]    = []\r
             Dict[Init+'_NUMSKUS_DECL_' + DatumType] = []\r
             Dict[Init+'_VALUE_' + DatumType]        = []\r
             Dict[Init+'_DB_VALUE_'+DatumType] = []\r
-            \r
-    for Type in ['STRING_HEAD','VPD_HEAD','VARIABLE_HEAD']:\r
+\r
+    for Type in ['STRING_HEAD', 'VPD_HEAD', 'VARIABLE_HEAD']:\r
         Dict[Type + '_CNAME_DECL']   = []\r
         Dict[Type + '_GUID_DECL']    = []\r
         Dict[Type + '_NUMSKUS_DECL'] = []\r
@@ -1085,7 +1043,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     Dict['STRING_DB_VALUE'] = []\r
     Dict['VPD_DB_VALUE'] = []\r
     Dict['VARIABLE_DB_VALUE'] = []\r
-    \r
+\r
     Dict['STRING_TABLE_INDEX'] = []\r
     Dict['STRING_TABLE_LENGTH']  = []\r
     Dict['STRING_TABLE_CNAME'] = []\r
@@ -1108,21 +1066,19 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
 \r
     Dict['LOCAL_TOKEN_NUMBER_DB_VALUE'] = []\r
     Dict['VARIABLE_DB_VALUE'] = []\r
-    Dict['SKUHEAD_TABLE_VALUE'] = []\r
-    Dict['SKU_INDEX_VALUE'] = []\r
-    \r
+\r
     Dict['PCD_TOKENSPACE'] = []\r
-    Dict['PCD_CNAME'] = [] \r
+    Dict['PCD_CNAME'] = []\r
     Dict['PCD_TOKENSPACE_LENGTH'] = []\r
     Dict['PCD_CNAME_LENGTH'] = []\r
     Dict['PCD_TOKENSPACE_OFFSET'] = []\r
     Dict['PCD_CNAME_OFFSET'] = []\r
     Dict['PCD_TOKENSPACE_MAP'] = []\r
     Dict['PCD_NAME_OFFSET'] = []\r
-    \r
+\r
     Dict['PCD_ORDER_TOKEN_NUMBER_MAP'] = {}\r
     PCD_STRING_INDEX_MAP = {}\r
-    \r
+\r
     StringTableIndex = 0\r
     StringTableSize = 0\r
     NumberOfLocalTokens = 0\r
@@ -1134,13 +1090,20 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     GuidList = []\r
     VarCheckTab = VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER()\r
     i = 0\r
-    ReorderedDynPcdList = GetOrderedDynamicPcdList(Platform.DynamicPcdList, Platform.PcdTokenNumber)\r
+    ReorderedDynPcdList = GetOrderedDynamicPcdList(DynamicPcdList, Platform.PcdTokenNumber)\r
+    for item in ReorderedDynPcdList:\r
+        if item.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
+            item.DatumType = TAB_VOID\r
     for Pcd in ReorderedDynPcdList:\r
         VoidStarTypeCurrSize = []\r
         i += 1\r
         CName = Pcd.TokenCName\r
         TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
 \r
+        for PcdItem in GlobalData.MixedPcd:\r
+            if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
+                CName = PcdItem[0]\r
+\r
         EdkLogger.debug(EdkLogger.DEBUG_3, "PCD: %s %s (%s : %s)" % (CName, TokenSpaceGuidCName, Pcd.Phase, Phase))\r
 \r
         if Pcd.Phase == 'PEI':\r
@@ -1155,9 +1118,9 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         #\r
         TokenSpaceGuidStructure = Pcd.TokenSpaceGuidValue\r
         TokenSpaceGuid = GuidStructureStringToGuidValueName(TokenSpaceGuidStructure)\r
-        if Pcd.Type in gDynamicExPcd:\r
+        if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
             if TokenSpaceGuid not in GuidList:\r
-                GuidList += [TokenSpaceGuid]\r
+                GuidList.append(TokenSpaceGuid)\r
                 Dict['GUID_STRUCTURE'].append(TokenSpaceGuidStructure)\r
             NumberOfExTokens += 1\r
 \r
@@ -1171,8 +1134,8 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         VariableDbValueList = []\r
         Pcd.InitString = 'UNINIT'\r
 \r
-        if Pcd.DatumType == 'VOID*':\r
-            if Pcd.Type not in ["DynamicVpd", "DynamicExVpd"]:\r
+        if Pcd.DatumType == TAB_VOID:\r
+            if Pcd.Type not in [TAB_PCDS_DYNAMIC_VPD, TAB_PCDS_DYNAMIC_EX_VPD]:\r
                 Pcd.TokenTypeList = ['PCD_TYPE_STRING']\r
             else:\r
                 Pcd.TokenTypeList = []\r
@@ -1182,32 +1145,26 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             Pcd.TokenTypeList = ['PCD_DATUM_TYPE_' + Pcd.DatumType]\r
 \r
         if len(Pcd.SkuInfoList) > 1:\r
-            Pcd.TokenTypeList += ['PCD_TYPE_SKU_ENABLED']\r
             NumberOfSkuEnabledPcd += 1\r
-        \r
-        SkuIndexTableTmp = []\r
-        SkuIndexTableTmp.append(0)  \r
-        SkuIdIndex = 1  \r
+\r
+        SkuIdIndex = 1\r
         VariableHeadList = []\r
         for SkuName in Pcd.SkuInfoList:\r
             Sku = Pcd.SkuInfoList[SkuName]\r
             SkuId = Sku.SkuId\r
-            if SkuId == None or SkuId == '':\r
+            if SkuId is None or SkuId == '':\r
                 continue\r
 \r
-            if (SkuId + 'U') not in Dict['SKUID_VALUE']:\r
-                Dict['SKUID_VALUE'].append(SkuId + 'U')\r
-                \r
-            SkuIndexTableTmp.append(SkuId+'U')\r
+\r
             SkuIdIndex += 1\r
-    \r
+\r
             if len(Sku.VariableName) > 0:\r
                 VariableGuidStructure = Sku.VariableGuidValue\r
                 VariableGuid = GuidStructureStringToGuidValueName(VariableGuidStructure)\r
                 if Platform.Platform.VarCheckFlag:\r
                     var_check_obj = VAR_CHECK_PCD_VARIABLE_TAB(VariableGuidStructure, StringToArray(Sku.VariableName))\r
                     try:\r
-                        var_check_obj.push_back(VAR_VALID_OBJECT_FACTORY.Get_valid_object(Pcd, Sku.VariableOffset))\r
+                        var_check_obj.push_back(GetValidationObject(Pcd, Sku.VariableOffset))\r
                         VarAttr, _ = VariableAttributes.GetVarAttributes(Sku.VariableAttribute)\r
                         var_check_obj.SetAttributes(VarAttr)\r
                         var_check_obj.UpdateSize()\r
@@ -1225,52 +1182,54 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                         else:\r
                             EdkLogger.error("build", PCD_VALIDATION_INFO_ERROR,\r
                                                 "The PCD '%s.%s' Validation information defined in DEC file has incorrect format." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
-                Pcd.TokenTypeList += ['PCD_TYPE_HII']\r
+                Pcd.TokenTypeList.append('PCD_TYPE_HII')\r
                 Pcd.InitString = 'INIT'\r
                 # Store all variable names of one HII PCD under different SKU to stringTable\r
                 # and calculate the VariableHeadStringIndex\r
-                if SkuIdIndex - 2 == 0:\r
-                    for SkuName2 in Pcd.SkuInfoList:\r
-                        SkuInfo = Pcd.SkuInfoList[SkuName2]\r
-                        if SkuInfo.SkuId == None or SkuInfo.SkuId == '':\r
-                            continue\r
-                        VariableNameStructure = StringToArray(SkuInfo.VariableName)\r
-                        if VariableNameStructure not in Dict['STRING_TABLE_VALUE']:\r
-                            Dict['STRING_TABLE_CNAME'].append(CName)\r
-                            Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)\r
-                            if StringTableIndex == 0:\r
-                                Dict['STRING_TABLE_INDEX'].append('')\r
-                            else:\r
-                                Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)\r
-                            VarNameSize = len(VariableNameStructure.replace(',',' ').split())\r
-                            Dict['STRING_TABLE_LENGTH'].append(VarNameSize )\r
-                            Dict['STRING_TABLE_VALUE'].append(VariableNameStructure)\r
-                            StringHeadOffsetList.append(str(StringTableSize) + 'U')\r
-                            VarStringDbOffsetList = []\r
-                            VarStringDbOffsetList.append(StringTableSize)\r
-                            Dict['STRING_DB_VALUE'].append(VarStringDbOffsetList)      \r
-                            StringTableIndex += 1\r
-                            StringTableSize += len(VariableNameStructure.replace(',',' ').split())\r
-                        VariableHeadStringIndex = 0\r
-                        for Index in range(Dict['STRING_TABLE_VALUE'].index(VariableNameStructure)):\r
-                            VariableHeadStringIndex += Dict['STRING_TABLE_LENGTH'][Index]\r
-                        VariableHeadList.append(VariableHeadStringIndex)\r
-                        \r
+\r
+                VariableNameStructure = StringToArray(Sku.VariableName)\r
+\r
+                #  Make pointer of VaraibleName(HII PCD) 2 bytes aligned\r
+                VariableNameStructureBytes = VariableNameStructure.lstrip("{").rstrip("}").split(",")\r
+                if len(VariableNameStructureBytes) % 2:\r
+                    VariableNameStructure = "{%s,0x00}" % ",".join(VariableNameStructureBytes)\r
+\r
+                if VariableNameStructure not in Dict['STRING_TABLE_VALUE']:\r
+                    Dict['STRING_TABLE_CNAME'].append(CName)\r
+                    Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)\r
+                    if StringTableIndex == 0:\r
+                        Dict['STRING_TABLE_INDEX'].append('')\r
+                    else:\r
+                        Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)\r
+                    VarNameSize = len(VariableNameStructure.replace(',', ' ').split())\r
+                    Dict['STRING_TABLE_LENGTH'].append(VarNameSize )\r
+                    Dict['STRING_TABLE_VALUE'].append(VariableNameStructure)\r
+                    StringHeadOffsetList.append(str(StringTableSize) + 'U')\r
+                    VarStringDbOffsetList = []\r
+                    VarStringDbOffsetList.append(StringTableSize)\r
+                    Dict['STRING_DB_VALUE'].append(VarStringDbOffsetList)\r
+                    StringTableIndex += 1\r
+                    StringTableSize += len(VariableNameStructure.replace(',', ' ').split())\r
+                VariableHeadStringIndex = 0\r
+                for Index in range(Dict['STRING_TABLE_VALUE'].index(VariableNameStructure)):\r
+                    VariableHeadStringIndex += Dict['STRING_TABLE_LENGTH'][Index]\r
+                VariableHeadList.append(VariableHeadStringIndex)\r
+\r
                 VariableHeadStringIndex = VariableHeadList[SkuIdIndex - 2]\r
                 # store VariableGuid to GuidTable and get the VariableHeadGuidIndex\r
 \r
                 if VariableGuid not in GuidList:\r
-                    GuidList += [VariableGuid]\r
+                    GuidList.append(VariableGuid)\r
                     Dict['GUID_STRUCTURE'].append(VariableGuidStructure)\r
                 VariableHeadGuidIndex = GuidList.index(VariableGuid)\r
 \r
                 if "PCD_TYPE_STRING" in Pcd.TokenTypeList:\r
                     VariableHeadValueList.append('%dU, offsetof(%s_PCD_DATABASE, Init.%s_%s), %dU, %sU' %\r
-                                                 (VariableHeadStringIndex, Phase, CName, TokenSpaceGuid, \r
+                                                 (VariableHeadStringIndex, Phase, CName, TokenSpaceGuid,\r
                                                  VariableHeadGuidIndex, Sku.VariableOffset))\r
                 else:\r
                     VariableHeadValueList.append('%dU, offsetof(%s_PCD_DATABASE, Init.%s_%s_VariableDefault_%s), %dU, %sU' %\r
-                                                 (VariableHeadStringIndex, Phase, CName, TokenSpaceGuid, SkuIdIndex, \r
+                                                 (VariableHeadStringIndex, Phase, CName, TokenSpaceGuid, SkuIdIndex,\r
                                                  VariableHeadGuidIndex, Sku.VariableOffset))\r
                 Dict['VARDEF_CNAME_'+Pcd.DatumType].append(CName)\r
                 Dict['VARDEF_GUID_'+Pcd.DatumType].append(TokenSpaceGuid)\r
@@ -1283,13 +1242,13 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                     # warning under linux building environment.\r
                     #\r
                     Dict['VARDEF_DB_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue)\r
-                    \r
-                    if Pcd.DatumType == "UINT64":\r
+\r
+                    if Pcd.DatumType == TAB_UINT64:\r
                         Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "ULL")\r
-                    elif Pcd.DatumType in ("UINT32", "UINT16", "UINT8"):\r
+                    elif Pcd.DatumType in (TAB_UINT32, TAB_UINT16, TAB_UINT8):\r
                         Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "U")\r
                     elif Pcd.DatumType == "BOOLEAN":\r
-                        if eval(Sku.HiiDefaultValue) in [1,0]:\r
+                        if eval(Sku.HiiDefaultValue) in [1, 0]:\r
                             Dict['VARDEF_VALUE_'+Pcd.DatumType].append(str(eval(Sku.HiiDefaultValue)) + "U")\r
                     else:\r
                         Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue)\r
@@ -1312,19 +1271,19 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                 VariableDbValueList.append([VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset, VariableOffset, VariableRefTable, Sku.VariableAttribute])\r
 \r
             elif Sku.VpdOffset != '':\r
-                Pcd.TokenTypeList += ['PCD_TYPE_VPD']\r
+                Pcd.TokenTypeList.append('PCD_TYPE_VPD')\r
                 Pcd.InitString = 'INIT'\r
                 VpdHeadOffsetList.append(str(Sku.VpdOffset) + 'U')\r
                 VpdDbOffsetList.append(Sku.VpdOffset)\r
-                # Also add the VOID* string of VPD PCD to SizeTable \r
-                if Pcd.DatumType == 'VOID*':\r
+                # Also add the VOID* string of VPD PCD to SizeTable\r
+                if Pcd.DatumType == TAB_VOID:\r
                     NumberOfSizeItems += 1\r
                     # For VPD type of PCD, its current size is equal to its MAX size.\r
-                    VoidStarTypeCurrSize = [str(Pcd.MaxDatumSize) + 'U']                 \r
+                    VoidStarTypeCurrSize = [str(Pcd.MaxDatumSize) + 'U']\r
                 continue\r
-          \r
-            if Pcd.DatumType == 'VOID*':\r
-                Pcd.TokenTypeList += ['PCD_TYPE_STRING']\r
+\r
+            if Pcd.DatumType == TAB_VOID:\r
+                Pcd.TokenTypeList.append('PCD_TYPE_STRING')\r
                 Pcd.InitString = 'INIT'\r
                 if Sku.HiiDefaultValue != '' and Sku.DefaultValue == '':\r
                     Sku.DefaultValue = Sku.HiiDefaultValue\r
@@ -1339,7 +1298,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                         Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)\r
                     if Sku.DefaultValue[0] == 'L':\r
                         DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
-                        Size = len(DefaultValueBinStructure.replace(',',' ').split())\r
+                        Size = len(DefaultValueBinStructure.replace(',', ' ').split())\r
                         Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
                     elif Sku.DefaultValue[0] == '"':\r
                         DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
@@ -1349,15 +1308,18 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                         DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
                         Size = len(Sku.DefaultValue.split(","))\r
                         Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
-                    \r
+\r
                     StringHeadOffsetList.append(str(StringTableSize) + 'U')\r
                     StringDbOffsetList.append(StringTableSize)\r
                     if Pcd.MaxDatumSize != '':\r
                         MaxDatumSize = int(Pcd.MaxDatumSize, 0)\r
                         if MaxDatumSize < Size:\r
-                            EdkLogger.error("build", AUTOGEN_ERROR,\r
+                            if Pcd.MaxSizeUserSet:\r
+                                EdkLogger.error("build", AUTOGEN_ERROR,\r
                                             "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),\r
                                             ExtraData="[%s]" % str(Platform))\r
+                            else:\r
+                                MaxDatumSize = Size\r
                     else:\r
                         MaxDatumSize = Size\r
                     StringTabLen = MaxDatumSize\r
@@ -1370,39 +1332,35 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                     StringTableSize += (StringTabLen)\r
             else:\r
                 if "PCD_TYPE_HII" not in Pcd.TokenTypeList:\r
-                    Pcd.TokenTypeList += ['PCD_TYPE_DATA']\r
+                    Pcd.TokenTypeList.append('PCD_TYPE_DATA')\r
                     if Sku.DefaultValue == 'TRUE':\r
                         Pcd.InitString = 'INIT'\r
                     else:\r
-                        if int(Sku.DefaultValue, 0) != 0:\r
-                            Pcd.InitString = 'INIT'\r
+                        Pcd.InitString = Pcd.isinit\r
                 #\r
                 # For UNIT64 type PCD's value, ULL should be append to avoid\r
                 # warning under linux building environment.\r
                 #\r
-                if Pcd.DatumType == "UINT64":\r
+                if Pcd.DatumType == TAB_UINT64:\r
                     ValueList.append(Sku.DefaultValue + "ULL")\r
-                elif Pcd.DatumType in ("UINT32", "UINT16", "UINT8"):\r
+                elif Pcd.DatumType in (TAB_UINT32, TAB_UINT16, TAB_UINT8):\r
                     ValueList.append(Sku.DefaultValue + "U")\r
                 elif Pcd.DatumType == "BOOLEAN":\r
                     if Sku.DefaultValue in ["1", "0"]:\r
-                        ValueList.append(Sku.DefaultValue + "U")              \r
+                        ValueList.append(Sku.DefaultValue + "U")\r
                 else:\r
                     ValueList.append(Sku.DefaultValue)\r
-                \r
+\r
                 DbValueList.append(Sku.DefaultValue)\r
 \r
         Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))\r
-        if Pcd.DatumType == 'VOID*':  \r
+        if Pcd.DatumType == TAB_VOID:\r
             Dict['SIZE_TABLE_CNAME'].append(CName)\r
             Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)\r
             Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(str(Pcd.MaxDatumSize) + 'U')\r
             Dict['SIZE_TABLE_CURRENT_LENGTH'].append(VoidStarTypeCurrSize)\r
-        \r
-        \r
-        SkuIndexTableTmp[0] = len(SkuIndexTableTmp) - 1\r
-        if len(Pcd.SkuInfoList) > 1:\r
-            Dict['SKU_INDEX_VALUE'].append(SkuIndexTableTmp)            \r
+\r
+\r
 \r
         if 'PCD_TYPE_HII' in Pcd.TokenTypeList:\r
             Dict['VARIABLE_HEAD_CNAME_DECL'].append(CName)\r
@@ -1435,7 +1393,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             else:\r
                 Dict[Pcd.InitString+'_VALUE_'+Pcd.DatumType].append(', '.join(ValueList))\r
                 Dict[Pcd.InitString+'_DB_VALUE_'+Pcd.DatumType].append(DbValueList)\r
-                \r
+\r
     if Phase == 'PEI':\r
         NumberOfLocalTokens = NumberOfPeiLocalTokens\r
     if Phase == 'DXE':\r
@@ -1447,7 +1405,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     Dict['TOKEN_TYPE']       = ['' for x in range(NumberOfLocalTokens)]\r
     Dict['LOCAL_TOKEN_NUMBER_DB_VALUE'] = ['' for x in range(NumberOfLocalTokens)]\r
     Dict['PCD_CNAME']        = ['' for x in range(NumberOfLocalTokens)]\r
-    Dict['PCD_TOKENSPACE_MAP'] = ['' for x in range(NumberOfLocalTokens)]  \r
+    Dict['PCD_TOKENSPACE_MAP'] = ['' for x in range(NumberOfLocalTokens)]\r
     Dict['PCD_CNAME_LENGTH'] = [0 for x in range(NumberOfLocalTokens)]\r
     SkuEnablePcdIndex = 0\r
     for Pcd in ReorderedDynPcdList:\r
@@ -1464,10 +1422,15 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         if len(Pcd.SkuInfoList) > 1:\r
             Dict['PCD_ORDER_TOKEN_NUMBER_MAP'][GeneratedTokenNumber] = SkuEnablePcdIndex\r
             SkuEnablePcdIndex += 1\r
+\r
+        for PcdItem in GlobalData.MixedPcd:\r
+            if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in GlobalData.MixedPcd[PcdItem]:\r
+                CName = PcdItem[0]\r
+\r
         EdkLogger.debug(EdkLogger.DEBUG_1, "PCD = %s.%s" % (CName, TokenSpaceGuidCName))\r
         EdkLogger.debug(EdkLogger.DEBUG_1, "phase = %s" % Phase)\r
         EdkLogger.debug(EdkLogger.DEBUG_1, "GeneratedTokenNumber = %s" % str(GeneratedTokenNumber))\r
-        \r
+\r
         #\r
         # following four Dict items hold the information for LocalTokenNumberTable\r
         #\r
@@ -1478,7 +1441,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         Dict['TOKEN_CNAME'][GeneratedTokenNumber] = CName\r
         Dict['TOKEN_GUID'][GeneratedTokenNumber] = TokenSpaceGuid\r
         Dict['TOKEN_TYPE'][GeneratedTokenNumber] = ' | '.join(Pcd.TokenTypeList)\r
-        \r
+\r
         if Platform.Platform.PcdInfoFlag:\r
             TokenSpaceGuidCNameArray = StringToArray('"' + TokenSpaceGuidCName + '"' )\r
             if TokenSpaceGuidCNameArray not in Dict['PCD_TOKENSPACE']:\r
@@ -1487,10 +1450,10 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             Dict['PCD_TOKENSPACE_MAP'][GeneratedTokenNumber] = Dict['PCD_TOKENSPACE'].index(TokenSpaceGuidCNameArray)\r
             CNameBinArray = StringToArray('"' + CName + '"' )\r
             Dict['PCD_CNAME'][GeneratedTokenNumber] = CNameBinArray\r
-            \r
+\r
             Dict['PCD_CNAME_LENGTH'][GeneratedTokenNumber] = len(CNameBinArray.split(","))\r
-        \r
-        \r
+\r
+\r
         Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))\r
 \r
         # search the Offset and Table, used by LocalTokenNumberTableOffset\r
@@ -1516,7 +1479,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             if Pcd.InitString == 'UNINIT':\r
                 Table =  Dict[Pcd.InitString+'_GUID_DECL_'+Pcd.DatumType]\r
             else:\r
-                Table = Dict[Pcd.InitString+'_DB_VALUE_'+Pcd.DatumType]               \r
+                Table = Dict[Pcd.InitString+'_DB_VALUE_'+Pcd.DatumType]\r
         Dict['LOCAL_TOKEN_NUMBER_DB_VALUE'][GeneratedTokenNumber] = (Offset, Table)\r
 \r
         #\r
@@ -1526,10 +1489,10 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             Dict['VARDEF_HEADER'][GeneratedTokenNumber] = '_Variable_Header'\r
         else:\r
             Dict['VARDEF_HEADER'][GeneratedTokenNumber] = ''\r
-       \r
-        \r
-        if Pcd.Type in gDynamicExPcd:\r
-            \r
+\r
+\r
+        if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
+\r
             if Phase == 'DXE':\r
                 GeneratedTokenNumber += NumberOfPeiLocalTokens\r
             #\r
@@ -1541,7 +1504,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             # Therefore, 1 is added to GeneratedTokenNumber to generate a PCD Token Number before being inserted\r
             # to the EXMAPPING_TABLE.\r
             #\r
-            \r
+\r
 \r
             Dict['EXMAPPING_TABLE_EXTOKEN'].append(str(Pcd.TokenValue) + 'U')\r
             Dict['EXMAPPING_TABLE_LOCAL_TOKEN'].append(str(GeneratedTokenNumber + 1) + 'U')\r
@@ -1552,12 +1515,12 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             TokenSpaceIndex = StringTableSize\r
             for i in range(Dict['PCD_TOKENSPACE_MAP'][index]):\r
                 TokenSpaceIndex += Dict['PCD_TOKENSPACE_LENGTH'][i]\r
-            Dict['PCD_TOKENSPACE_OFFSET'].append(TokenSpaceIndex)   \r
+            Dict['PCD_TOKENSPACE_OFFSET'].append(TokenSpaceIndex)\r
         for index in range(len(Dict['PCD_TOKENSPACE'])):\r
             StringTableSize += Dict['PCD_TOKENSPACE_LENGTH'][index]\r
             StringTableIndex += 1\r
         for index in range(len(Dict['PCD_CNAME'])):\r
-            Dict['PCD_CNAME_OFFSET'].append(StringTableSize)        \r
+            Dict['PCD_CNAME_OFFSET'].append(StringTableSize)\r
             Dict['PCD_NAME_OFFSET'].append(Dict['PCD_TOKENSPACE_OFFSET'][index])\r
             Dict['PCD_NAME_OFFSET'].append(StringTableSize)\r
             StringTableSize += Dict['PCD_CNAME_LENGTH'][index]\r
@@ -1600,15 +1563,15 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
 \r
     if NumberOfSizeItems != 0:\r
         Dict['SIZE_TABLE_SIZE'] = str(NumberOfSizeItems * 2) + 'U'\r
-    \r
-    if NumberOfSkuEnabledPcd != 0: \r
+\r
+    if NumberOfSkuEnabledPcd != 0:\r
         Dict['SKU_HEAD_SIZE'] = str(NumberOfSkuEnabledPcd) + 'U'\r
-    \r
+\r
     for AvailableSkuNumber in SkuObj.SkuIdNumberSet:\r
         if AvailableSkuNumber not in Dict['SKUID_VALUE']:\r
             Dict['SKUID_VALUE'].append(AvailableSkuNumber)\r
     Dict['SKUID_VALUE'][0] = len(Dict['SKUID_VALUE']) - 1\r
-    \r
+\r
     AutoGenH.Append(gPcdDatabaseAutoGenH.Replace(Dict))\r
     if NumberOfLocalTokens == 0:\r
         AutoGenC.Append(gEmptyPcdDatabaseAutoGenC.Replace(Dict))\r
@@ -1621,11 +1584,11 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         SizeCurLenTempList = []\r
         SizeMaxLenTempList = []\r
         ReOrderFlag = True\r
-  \r
+\r
         if len(Dict['SIZE_TABLE_CNAME']) == 1:\r
             if not (Dict['SIZE_TABLE_CNAME'][0] and Dict['SIZE_TABLE_GUID'][0]):\r
                 ReOrderFlag = False\r
-        \r
+\r
         if ReOrderFlag:\r
             for Count in range(len(Dict['TOKEN_CNAME'])):\r
                 for Count1 in range(len(Dict['SIZE_TABLE_CNAME'])):\r
@@ -1635,20 +1598,19 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                         SizeGuidTempList.append(Dict['SIZE_TABLE_GUID'][Count1])\r
                         SizeCurLenTempList.append(Dict['SIZE_TABLE_CURRENT_LENGTH'][Count1])\r
                         SizeMaxLenTempList.append(Dict['SIZE_TABLE_MAXIMUM_LENGTH'][Count1])\r
-                        \r
+\r
             for Count in range(len(Dict['SIZE_TABLE_CNAME'])):\r
                 Dict['SIZE_TABLE_CNAME'][Count] = SizeCNameTempList[Count]\r
                 Dict['SIZE_TABLE_GUID'][Count] = SizeGuidTempList[Count]\r
                 Dict['SIZE_TABLE_CURRENT_LENGTH'][Count] = SizeCurLenTempList[Count]\r
                 Dict['SIZE_TABLE_MAXIMUM_LENGTH'][Count] = SizeMaxLenTempList[Count]\r
-                \r
+\r
         AutoGenC.Append(gPcdDatabaseAutoGenC.Replace(Dict))\r
-    \r
-    if Platform.Platform.VarCheckFlag:\r
-        dest = os.path.join(Platform.BuildDir, 'FV')\r
-        VarCheckTab.dump(dest, Phase)\r
+\r
+\r
+#     print Phase\r
     Buffer = BuildExDataBase(Dict)\r
-    return AutoGenH, AutoGenC, Buffer\r
+    return AutoGenH, AutoGenC, Buffer, VarCheckTab\r
 \r
 def GetOrderedDynamicPcdList(DynamicPcdList, PcdTokenNumberList):\r
     ReorderedDyPcdList = [None for i in range(len(DynamicPcdList))]\r