+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]\r
+ for i in range(36,totallen):\r
+ newbuffer += databasebuff[i]\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_CLEAN_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 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, 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 PcdDbBuffer:\r
+ final_data += unpack("B",item)\r
+ PcdDBData[(TAB_DEFAULT,"0")] = (PcdDbBuffer, final_data)\r