]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/GenPcdDb.py
BaseTools/Build: Add all support skuid to the Pcd DB system skuid table
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenPcdDb.py
index 08719fa733a462bd0528b0e0fcceab13b76a2d2a..20f4a23371e6f5c0611fda2faf08fda6e4246ad2 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Routines for generating Pcd Database\r
 #\r
-# Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2013 - 2015, 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
@@ -14,8 +14,12 @@ from StringIO import StringIO
 from Common.Misc import *\r
 from Common.String 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 Common.VariableAttributes import VariableAttributes\r
 \r
-DATABASE_VERSION = 4\r
+DATABASE_VERSION = 5\r
 \r
 gPcdDatabaseAutoGenC = TemplateString("""\r
 //\r
@@ -444,7 +448,7 @@ class DbVariableTableItemList (DbComItemList):
             RawDataList = []\r
         DbComItemList.__init__(self, ItemSize, DataList, RawDataList)\r
     def PackData(self):\r
-        PackStr = "=LLHH"\r
+        PackStr = "=LLHHLHH"\r
         Buffer = ''\r
         for DataList in self.RawDataList:\r
             for Data in DataList:\r
@@ -452,7 +456,10 @@ class DbVariableTableItemList (DbComItemList):
                                GetIntegerValue(Data[0]),\r
                                GetIntegerValue(Data[1]),\r
                                GetIntegerValue(Data[2]),\r
-                               GetIntegerValue(Data[3]))\r
+                               GetIntegerValue(Data[3]),\r
+                               GetIntegerValue(Data[4]),\r
+                               GetIntegerValue(Data[5]),\r
+                               GetIntegerValue(0))\r
         return Buffer\r
 \r
 class DbStringHeadTableItemList(DbItemList):\r
@@ -528,13 +535,20 @@ class DbSizeTableItemList (DbItemList):
         if RawDataList is None:\r
             RawDataList = []        \r
         DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+    def GetListSize(self):\r
+        length = 0\r
+        for Data in self.RawDataList:\r
+            length += (1 + len(Data[1]))\r
+        return length * self.ItemSize\r
     def PackData(self):\r
-        PackStr = "=HH"\r
+        PackStr = "=H"\r
         Buffer = ''\r
         for Data in self.RawDataList:\r
             Buffer += pack(PackStr, \r
-                           GetIntegerValue(Data[0]),\r
-                           GetIntegerValue(Data[1]))\r
+                           GetIntegerValue(Data[0]))\r
+            for subData in Data[1]:\r
+                Buffer += pack(PackStr, \r
+                           GetIntegerValue(subData))\r
         return Buffer\r
 \r
 ## DbStringItemList\r
@@ -705,7 +719,7 @@ def BuildExDataBase(Dict):
     # DbItemList to DbStringHeadTableItemList\r
     DbStringHeadValue = DbStringHeadTableItemList(4, RawDataList = StringHeadValue)\r
     VariableTable = Dict['VARIABLE_DB_VALUE']\r
-    DbVariableTable = DbVariableTableItemList(12, RawDataList = VariableTable)\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
@@ -732,7 +746,7 @@ def BuildExDataBase(Dict):
     DbPcdNameOffsetTable = DbItemList(4,RawDataList = PcdNameOffsetTable)\r
     \r
     SizeTableValue = zip(Dict['SIZE_TABLE_MAXIMUM_LENGTH'], Dict['SIZE_TABLE_CURRENT_LENGTH'])\r
-    DbSizeTableValue = DbSizeTableItemList(4, RawDataList = SizeTableValue)\r
+    DbSizeTableValue = DbSizeTableItemList(2, RawDataList = SizeTableValue)\r
     InitValueUint16 = Dict['INIT_DB_VALUE_UINT16']\r
     DbInitValueUint16 = DbComItemList(2, RawDataList = InitValueUint16)\r
     VardefValueUint16 = Dict['VARDEF_DB_VALUE_UINT16']\r
@@ -761,6 +775,7 @@ def BuildExDataBase(Dict):
     DbUnInitValueUint8 = DbItemList(1, RawDataList = UnInitValueUint8)\r
     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
@@ -812,7 +827,7 @@ def BuildExDataBase(Dict):
         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]\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
@@ -829,9 +844,9 @@ def BuildExDataBase(Dict):
         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]\r
+        SkuIndexTabalOffset = SkuIdTableOffset + Dict['SKUID_VALUE'][0] + 1\r
         if (TokenTypeValue & (0x2 << 28)):\r
-            SkuTable[SkuHeaderIndex] = (DbOffset|int(TokenTypeValue & ~(0x2<<28)), SkuIndexTabalOffset + SkuIndexIndexTable[SkuHeaderIndex])\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
@@ -842,8 +857,9 @@ def BuildExDataBase(Dict):
 \r
     # resolve variable table offset \r
     for VariableEntries in VariableTable:\r
+        skuindex = 0\r
         for VariableEntryPerSku in VariableEntries:\r
-            (VariableHeadGuidIndex, VariableHeadStringIndex, SKUVariableOffset, VariableOffset, VariableRefTable) = VariableEntryPerSku[:]\r
+            (VariableHeadGuidIndex, VariableHeadStringIndex, SKUVariableOffset, VariableOffset, VariableRefTable, VariableAttribute) = VariableEntryPerSku[:]\r
             DbIndex = 0\r
             DbOffset = FixedHeaderLen\r
             for DbIndex in xrange(len(DbTotal)):\r
@@ -853,11 +869,13 @@ def BuildExDataBase(Dict):
                 DbOffset += DbItemTotal[DbIndex].GetListSize()\r
             else:\r
                 assert(False)\r
-            \r
+            if isinstance(VariableRefTable[0],list):\r
+                DbOffset += skuindex * 4   \r
+            skuindex += 1\r
             if DbIndex >= InitTableNum:\r
                 assert(False)\r
-\r
-            VariableEntryPerSku[:] = (VariableHeadStringIndex, DbOffset, VariableHeadGuidIndex, SKUVariableOffset)\r
+            VarAttr, VarProp = VariableAttributes.GetVarAttributes(VariableAttribute)\r
+            VariableEntryPerSku[:] = (VariableHeadStringIndex, DbOffset, VariableHeadGuidIndex, SKUVariableOffset, VarAttr, VarProp)\r
 \r
     # calculate various table offset now\r
     DbTotalLength = FixedHeaderLen\r
@@ -995,10 +1013,6 @@ def CreatePcdDatabaseCode (Info, AutoGenC, AutoGenH):
     DbFile.write(PcdDbBuffer)\r
     Changed = SaveFileOnChange(DbFileName, DbFile.getvalue(), True)\r
 \r
-\r
-def CArrayToArray(carray):\r
-    return "{%s, 0x00}" % ", ".join(["0x%02x" % ord(C) for C in carray])\r
-\r
 ## Create PCD database in DXE or PEI phase\r
 #\r
 #   @param      Platform    The platform object\r
@@ -1032,7 +1046,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     }\r
     \r
    \r
-    SkuObj = SkuClass(Platform.Platform.SkuName,Platform.Platform.SkuIds)\r
+    SkuObj = SkuClass(Platform.Platform.AvilableSkuIds, Platform.Platform.SkuIds)\r
     Dict['SYSTEM_SKU_ID_VALUE'] = Platform.Platform.SkuIds[SkuObj.SystemSkuId]\r
 \r
     Dict['PCD_INFO_FLAG'] = Platform.Platform.PcdInfoFlag\r
@@ -1094,6 +1108,9 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     Dict['PCD_TOKENSPACE_MAP'] = []\r
     Dict['PCD_NAME_OFFSET'] = []\r
     \r
+    Dict['PCD_ORDER_TOKEN_NUMBER_MAP'] = {}\r
+    PCD_STRING_INDEX_MAP = {}\r
+    \r
     StringTableIndex = 0\r
     StringTableSize = 0\r
     NumberOfLocalTokens = 0\r
@@ -1103,8 +1120,11 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     NumberOfSizeItems = 0\r
     NumberOfSkuEnabledPcd = 0\r
     GuidList = []\r
+    VarCheckTab = VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER()\r
     i = 0\r
-    for Pcd in Platform.DynamicPcdList:\r
+    ReorderedDynPcdList = GetOrderedDynamicPcdList(Platform.DynamicPcdList, Platform.PcdTokenNumber)\r
+    for Pcd in ReorderedDynPcdList:\r
+        VoidStarTypeCurrSize = []\r
         i += 1\r
         CName = Pcd.TokenCName\r
         TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
@@ -1156,6 +1176,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         SkuIndexTableTmp = []\r
         SkuIndexTableTmp.append(0)  \r
         SkuIdIndex = 1  \r
+        VariableHeadList = []\r
         for SkuName in Pcd.SkuInfoList:\r
             Sku = Pcd.SkuInfoList[SkuName]\r
             SkuId = Sku.SkuId\r
@@ -1169,32 +1190,62 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             SkuIdIndex += 1\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
+                        VarAttr, _ = VariableAttributes.GetVarAttributes(Sku.VariableAttribute)\r
+                        var_check_obj.SetAttributes(VarAttr)\r
+                        var_check_obj.UpdateSize()\r
+                        VarCheckTab.push_back(var_check_obj)\r
+                    except Exception:\r
+                        ValidInfo = ''\r
+                        if Pcd.validateranges:\r
+                            ValidInfo = Pcd.validateranges[0]\r
+                        if Pcd.validlists:\r
+                            ValidInfo = Pcd.validlists[0]\r
+                        if ValidInfo:\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
+                                                ExtraData = "[%s]" % str(ValidInfo))\r
+                        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.InitString = 'INIT'\r
-                # store VariableName to stringTable and calculate the VariableHeadStringIndex\r
-                if Sku.VariableName.startswith('{'):\r
-                    VariableNameStructure = CArrayToArray(Sku.VariableName)\r
-                else:\r
-                    VariableNameStructure = StringToArray(Sku.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
-\r
-                    Dict['STRING_TABLE_LENGTH'].append((len(Sku.VariableName) - 3 + 1) * 2 )\r
-                    Dict['STRING_TABLE_VALUE'].append(VariableNameStructure)\r
-                    StringTableIndex += 1\r
-                    StringTableSize += (len(Sku.VariableName) - 3 + 1) * 2\r
-                VariableHeadStringIndex = 0\r
-                for Index in range(Dict['STRING_TABLE_VALUE'].index(VariableNameStructure)):\r
-                    VariableHeadStringIndex += Dict['STRING_TABLE_LENGTH'][Index]\r
-\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
+                VariableHeadStringIndex = VariableHeadList[SkuIdIndex - 2]\r
                 # store VariableGuid to GuidTable and get the VariableHeadGuidIndex\r
-                VariableGuidStructure = Sku.VariableGuidValue\r
-                VariableGuid = GuidStructureStringToGuidValueName(VariableGuidStructure)\r
 \r
                 if VariableGuid not in GuidList:\r
                     GuidList += [VariableGuid]\r
@@ -1246,7 +1297,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                     # the Pcd default value was filled before\r
                     VariableOffset = len(Dict['VARDEF_DB_VALUE_' + Pcd.DatumType]) - 1\r
                     VariableRefTable = Dict['VARDEF_DB_VALUE_' + Pcd.DatumType]\r
-                    VariableDbValueList.append([VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset, VariableOffset, VariableRefTable])\r
+                VariableDbValueList.append([VariableHeadGuidIndex, VariableHeadStringIndex, Sku.VariableOffset, VariableOffset, VariableRefTable, Sku.VariableAttribute])\r
 \r
             elif Sku.VpdOffset != '':\r
                 Pcd.TokenTypeList += ['PCD_TYPE_VPD']\r
@@ -1256,11 +1307,8 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                 # Also add the VOID* string of VPD PCD to SizeTable \r
                 if Pcd.DatumType == 'VOID*':\r
                     NumberOfSizeItems += 1\r
-                    Dict['SIZE_TABLE_CNAME'].append(CName)\r
-                    Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)\r
                     # For VPD type of PCD, its current size is equal to its MAX size.\r
-                    Dict['SIZE_TABLE_CURRENT_LENGTH'].append(str(Pcd.MaxDatumSize) + 'U')\r
-                    Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(str(Pcd.MaxDatumSize) + 'U')\r
+                    VoidStarTypeCurrSize = [str(Pcd.MaxDatumSize) + 'U']                 \r
                 continue\r
           \r
             if Pcd.DatumType == 'VOID*':\r
@@ -1278,29 +1326,36 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                     else:\r
                         Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)\r
                     if Sku.DefaultValue[0] == 'L':\r
-                        Size = (len(Sku.DefaultValue) - 3 + 1) * 2 \r
-                        Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue))\r
+                        DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
+                        Size = len(DefaultValueBinStructure.replace(',',' ').split())\r
+                        Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
                     elif Sku.DefaultValue[0] == '"':\r
-                        Size = len(Sku.DefaultValue) - 2 + 1\r
-                        Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue))\r
+                        DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
+                        Size = len(Sku.DefaultValue) -2 + 1\r
+                        Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
                     elif Sku.DefaultValue[0] == '{':\r
-                        Size = len(Sku.DefaultValue.replace(',',' ').split())\r
-                        Dict['STRING_TABLE_VALUE'].append(Sku.DefaultValue)\r
+                        DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
+                        Size = len(Sku.DefaultValue.split(","))\r
+                        Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
                     \r
                     StringHeadOffsetList.append(str(StringTableSize) + 'U')\r
                     StringDbOffsetList.append(StringTableSize)\r
-                    Dict['SIZE_TABLE_CNAME'].append(CName)\r
-                    Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)\r
-                    Dict['SIZE_TABLE_CURRENT_LENGTH'].append(str(Size) + 'U')\r
-                    Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(str(Pcd.MaxDatumSize) + 'U')\r
                     if Pcd.MaxDatumSize != '':\r
                         MaxDatumSize = int(Pcd.MaxDatumSize, 0)\r
                         if MaxDatumSize < Size:\r
-                            MaxDatumSize = Size\r
-                        Size = MaxDatumSize\r
-                    Dict['STRING_TABLE_LENGTH'].append(Size)\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
+                    StringTabLen = MaxDatumSize\r
+                    if StringTabLen % 2:\r
+                        StringTabLen += 1\r
+                    if Sku.VpdOffset == '':\r
+                        VoidStarTypeCurrSize.append(str(Size) + 'U')\r
+                    Dict['STRING_TABLE_LENGTH'].append(StringTabLen)\r
                     StringTableIndex += 1\r
-                    StringTableSize += (Size)\r
+                    StringTableSize += (StringTabLen)\r
             else:\r
                 if "PCD_TYPE_HII" not in Pcd.TokenTypeList:\r
                     Pcd.TokenTypeList += ['PCD_TYPE_DATA']\r
@@ -1326,8 +1381,14 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                 DbValueList.append(Sku.DefaultValue)\r
 \r
         Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))\r
+        if Pcd.DatumType == '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
-        SkuIndexTableTmp[0] = len(SkuIndexTableTmp)\r
+        \r
+        SkuIndexTableTmp[0] = len(SkuIndexTableTmp) - 1\r
         if len(Pcd.SkuInfoList) > 1:\r
             Dict['SKU_INDEX_VALUE'].append(SkuIndexTableTmp)            \r
 \r
@@ -1352,6 +1413,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             Dict['STRING_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))\r
             Dict['STRING_HEAD_VALUE'].append(', '.join(StringHeadOffsetList))\r
             Dict['STRING_DB_VALUE'].append(StringDbOffsetList)\r
+            PCD_STRING_INDEX_MAP[len(Dict['STRING_HEAD_CNAME_DECL']) -1 ] = len(Dict['STRING_DB_VALUE']) -1\r
         if 'PCD_TYPE_DATA' in Pcd.TokenTypeList:\r
             Dict[Pcd.InitString+'_CNAME_DECL_'+Pcd.DatumType].append(CName)\r
             Dict[Pcd.InitString+'_GUID_DECL_'+Pcd.DatumType].append(TokenSpaceGuid)\r
@@ -1375,7 +1437,8 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     Dict['PCD_CNAME']        = ['' 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
-    for Pcd in Platform.DynamicPcdList:\r
+    SkuEnablePcdIndex = 0\r
+    for Pcd in ReorderedDynPcdList:\r
         CName = Pcd.TokenCName\r
         TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
         if Pcd.Phase != Phase:\r
@@ -1386,6 +1449,9 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         if Phase == 'DXE':\r
             GeneratedTokenNumber -= NumberOfPeiLocalTokens\r
 \r
+        if len(Pcd.SkuInfoList) > 1:\r
+            Dict['PCD_ORDER_TOKEN_NUMBER_MAP'][GeneratedTokenNumber] = SkuEnablePcdIndex\r
+            SkuEnablePcdIndex += 1\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
@@ -1405,11 +1471,12 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             TokenSpaceGuidCNameArray = StringToArray('"' + TokenSpaceGuidCName + '"' )\r
             if TokenSpaceGuidCNameArray not in Dict['PCD_TOKENSPACE']:\r
                 Dict['PCD_TOKENSPACE'].append(TokenSpaceGuidCNameArray)\r
-                Dict['PCD_TOKENSPACE_LENGTH'].append( len(TokenSpaceGuidCName) + 1 )\r
+                Dict['PCD_TOKENSPACE_LENGTH'].append( len(TokenSpaceGuidCNameArray.split(",")) )\r
             Dict['PCD_TOKENSPACE_MAP'][GeneratedTokenNumber] = Dict['PCD_TOKENSPACE'].index(TokenSpaceGuidCNameArray)\r
-            Dict['PCD_CNAME'][GeneratedTokenNumber] = StringToArray('"' + CName + '"' )\r
+            CNameBinArray = StringToArray('"' + CName + '"' )\r
+            Dict['PCD_CNAME'][GeneratedTokenNumber] = CNameBinArray\r
             \r
-            Dict['PCD_CNAME_LENGTH'][GeneratedTokenNumber] = len(CName) + 1\r
+            Dict['PCD_CNAME_LENGTH'][GeneratedTokenNumber] = len(CNameBinArray.split(","))\r
         \r
         \r
         Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))\r
@@ -1427,6 +1494,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         if 'PCD_TYPE_STRING' in Pcd.TokenTypeList and 'PCD_TYPE_HII' not in Pcd.TokenTypeList:\r
             # Find index by CName, TokenSpaceGuid\r
             Offset = GetMatchedIndex(CName, Dict['STRING_HEAD_CNAME_DECL'], TokenSpaceGuid, Dict['STRING_HEAD_GUID_DECL'])\r
+            Offset = PCD_STRING_INDEX_MAP[Offset]\r
             assert(Offset != -1)\r
             Table = Dict['STRING_DB_VALUE']\r
         if 'PCD_TYPE_DATA' in Pcd.TokenTypeList:\r
@@ -1475,13 +1543,13 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             Dict['PCD_TOKENSPACE_OFFSET'].append(TokenSpaceIndex)   \r
         for index in range(len(Dict['PCD_TOKENSPACE'])):\r
             StringTableSize += Dict['PCD_TOKENSPACE_LENGTH'][index]\r
-        \r
+            StringTableIndex += 1\r
         for index in range(len(Dict['PCD_CNAME'])):\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
-            \r
+            StringTableIndex += 1\r
     if GuidList != []:\r
         Dict['GUID_TABLE_EMPTY'] = 'FALSE'\r
         Dict['GUID_TABLE_SIZE'] = str(len(GuidList)) + 'U'\r
@@ -1501,7 +1569,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     if Dict['SIZE_TABLE_CNAME'] == []:\r
         Dict['SIZE_TABLE_CNAME'].append('')\r
         Dict['SIZE_TABLE_GUID'].append('')\r
-        Dict['SIZE_TABLE_CURRENT_LENGTH'].append('0U')\r
+        Dict['SIZE_TABLE_CURRENT_LENGTH'].append(['0U'])\r
         Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append('0U')\r
 \r
     if NumberOfLocalTokens != 0:\r
@@ -1524,7 +1592,10 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     if NumberOfSkuEnabledPcd != 0: \r
         Dict['SKU_HEAD_SIZE'] = str(NumberOfSkuEnabledPcd) + 'U'\r
     \r
-    Dict['SKUID_VALUE'][0] = len(Dict['SKUID_VALUE'])\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
     AutoGenH.Append(gPcdDatabaseAutoGenH.Replace(Dict))\r
     if NumberOfLocalTokens == 0:\r
@@ -1561,6 +1632,16 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                 \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
     Buffer = BuildExDataBase(Dict)\r
     return AutoGenH, AutoGenC, Buffer\r
 \r
+def GetOrderedDynamicPcdList(DynamicPcdList, PcdTokenNumberList):\r
+    ReorderedDyPcdList = [None for i in range(len(DynamicPcdList))]\r
+    for Pcd in DynamicPcdList:\r
+        if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in PcdTokenNumberList:\r
+            ReorderedDyPcdList[PcdTokenNumberList[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]-1] = Pcd\r
+    return ReorderedDyPcdList\r
+\r