]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/GenPcdDb.py
BaseTools: Fixed the issue of Multiple Skus are always disables
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenPcdDb.py
index 76d1254e72ed5d50dcdab50bff677c57f16b7c90..22283ef7fe2384d51aa27eb4c44c25a941531196 100644 (file)
@@ -18,8 +18,10 @@ from ValidCheckingInfoObject import VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER
 from ValidCheckingInfoObject import VAR_CHECK_PCD_VARIABLE_TAB\r
 from ValidCheckingInfoObject import VAR_VALID_OBJECT_FACTORY\r
 from Common.VariableAttributes import VariableAttributes\r
+import copy\r
+from struct import unpack\r
 \r
-DATABASE_VERSION = 5\r
+DATABASE_VERSION = 7\r
 \r
 gPcdDatabaseAutoGenC = TemplateString("""\r
 //\r
@@ -27,6 +29,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 +90,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 +116,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 +123,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 +140,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 +155,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,7 +174,10 @@ ${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
@@ -184,11 +185,11 @@ typedef struct {
   //TABLE_OFFSET          StringTableOffset;\r
   //TABLE_OFFSET          SizeTableOffset;\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 +205,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,8 +229,6 @@ ${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {
   {\r
     0, 0\r
   },\r
-  /* SkuIdTable */\r
-  { 0 },\r
   ${SYSTEM_SKU_ID_VALUE}\r
 };\r
 #endif\r
@@ -626,31 +627,6 @@ def GetMatchedIndex(Key1, List1, Key2, List2):
     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
-\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
@@ -676,7 +652,7 @@ def GetTokenTypeValue(TokenType):
         "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_SKU_ENABLED":(0x2 << 28),\r
         "PCD_TYPE_STRING":(0x1 << 28),\r
 \r
         "PCD_DATUM_TYPE_SHIFT":24,\r
@@ -721,9 +697,7 @@ 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
     StringTableValue = Dict['STRING_TABLE_DB_VALUE']\r
@@ -760,9 +734,9 @@ 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
+    DbSkuidValue = DbItemList(8, RawDataList = SkuidValue)\r
+\r
+\r
     \r
     # Unit Db Items\r
     UnInitValueUint64 = Dict['UNINIT_GUID_DECL_UINT64']\r
@@ -777,24 +751,24 @@ def BuildExDataBase(Dict):
     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
+    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
+               "VardefValueBoolean", "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
+    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
+               DbVardefValueBoolean, 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
+    # 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
     SkuIdTableOffset = FixedHeaderLen\r
@@ -805,29 +779,8 @@ def BuildExDataBase(Dict):
     \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
     # 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
@@ -847,16 +800,8 @@ 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] + 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
     for VariableEntries in VariableTable:\r
@@ -901,6 +846,7 @@ 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
@@ -938,6 +884,12 @@ def BuildExDataBase(Dict):
 \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
@@ -971,12 +923,13 @@ def BuildExDataBase(Dict):
     Buffer += b\r
     b = pack('=H', GuidTableCount)\r
  \r
-    Buffer += b\r
-    b = pack('=B', SystemSkuId)\r
\r
     Buffer += b\r
     b = pack('=B', Pad)\r
\r
+    Buffer += b\r
+    Buffer += b\r
+    Buffer += b\r
+    Buffer += b\r
+    Buffer += b\r
     Buffer += b\r
     \r
     Index = 0\r
@@ -1005,7 +958,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,7 +966,7 @@ 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
@@ -1024,14 +977,87 @@ def CreatePcdDatabaseCode (Info, AutoGenC, AutoGenH):
     DbFile = StringIO()\r
     DbFile.write(PcdDbBuffer)\r
     Changed = SaveFileOnChange(DbFileName, DbFile.getvalue(), True)\r
+def CreatePcdDataBase(PcdDBData):\r
+    delta = {}\r
+    basedata = {}\r
+    if not PcdDBData:\r
+        return ""\r
+    for skuname,skuid in PcdDBData:\r
+        if len(PcdDBData[(skuname,skuid)][1]) != len(PcdDBData[("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 == "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[("DEFAULT","0")][1][index]]\r
+        basedata[(skuname,skuid)] = [(index,PcdDBData[("DEFAULT","0")][1][index],hex(PcdDBData[("DEFAULT","0")][1][index])) for index,data in enumerate(PcdDBData[(skuname,skuid)][1]) if PcdDBData[(skuname,skuid)][1][index] != PcdDBData[("DEFAULT","0")][1][index]]\r
+    databasebuff = PcdDBData[("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]\r
+    for i in range(36,totallen):\r
+        newbuffer += databasebuff[i]\r
+\r
+    return newbuffer\r
+def CreateVarCheckBin(VarCheckTab):\r
+    return VarCheckTab[('DEFAULT',"0")]\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
+        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 PcdDbBuffer:\r
+                final_data += unpack("B",item)\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, 'FV')\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
 \r
+    PcdDbBuffer = CreatePcdDataBase(PcdDBData)\r
+    return AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer\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
@@ -1057,9 +1083,8 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         '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
+    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
@@ -1108,8 +1133,6 @@ 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
     Dict['PCD_TOKENSPACE'] = []\r
     Dict['PCD_CNAME'] = [] \r
@@ -1134,16 +1157,23 @@ 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 = "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
         if GlobalData.BuildOptionPcd:\r
             for PcdItem in GlobalData.BuildOptionPcd:\r
-                if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) == (PcdItem[0], PcdItem[1]):\r
+                if (Pcd.TokenSpaceGuidCName, CName) == (PcdItem[0], PcdItem[1]):\r
                     Pcd.DefaultValue = PcdItem[2]\r
                     break\r
 \r
@@ -1188,11 +1218,9 @@ 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
+            Pcd.TokenTypeList += ['PCD_TYPE_SKU_ENABLED']\r
             NumberOfSkuEnabledPcd += 1\r
         \r
-        SkuIndexTableTmp = []\r
-        SkuIndexTableTmp.append(0)  \r
         SkuIdIndex = 1  \r
         VariableHeadList = []\r
         for SkuName in Pcd.SkuInfoList:\r
@@ -1201,10 +1229,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             if SkuId == 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
             SkuIdIndex += 1\r
     \r
             if len(Sku.VariableName) > 0:\r
@@ -1235,32 +1260,28 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                 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
+                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
+                    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
@@ -1406,9 +1427,6 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             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
         if 'PCD_TYPE_HII' in Pcd.TokenTypeList:\r
             Dict['VARIABLE_HEAD_CNAME_DECL'].append(CName)\r
@@ -1461,11 +1479,6 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
         if Pcd.Phase != Phase:\r
             continue\r
-        if GlobalData.BuildOptionPcd:\r
-            for PcdItem in GlobalData.BuildOptionPcd:\r
-                if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) == (PcdItem[0], PcdItem[1]):\r
-                    Pcd.DefaultValue = PcdItem[2]\r
-                    break\r
 \r
         TokenSpaceGuid = GuidStructureStringToGuidValueName(Pcd.TokenSpaceGuidValue) #(Platform.PackageList, TokenSpaceGuidCName))\r
         GeneratedTokenNumber = Platform.PcdTokenNumber[CName, TokenSpaceGuidCName] - 1\r
@@ -1475,6 +1488,17 @@ 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
+        if GlobalData.BuildOptionPcd:\r
+            for PcdItem in GlobalData.BuildOptionPcd:\r
+                if (Pcd.TokenSpaceGuidCName, CName) == (PcdItem[0], PcdItem[1]):\r
+                    Pcd.DefaultValue = PcdItem[2]\r
+                    break\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
@@ -1655,11 +1679,10 @@ 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
+\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