+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