## @file\r
# Routines for generating Pcd Database\r
#\r
-# Copyright (c) 2013 - 2016, 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
//GUID Signature; // PcdDataBaseGuid\r
//UINT32 BuildVersion;\r
//UINT32 Length;\r
- //SKU_ID SystemSkuId; // Current SkuId value.\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
//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
- //UINT8 Pad[2];\r
+ //UINT8 Pad[6];\r
${PHASE}_PCD_DATABASE_INIT Init;\r
${PHASE}_PCD_DATABASE_UNINIT Uninit;\r
} ${PHASE}_PCD_DATABASE;\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 = 76\r
+ FixedHeaderLen = 80\r
\r
# Get offset of SkuId table in the database \r
SkuIdTableOffset = FixedHeaderLen\r
\r
Buffer += b\r
b = pack('=B', Pad)\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
\r
Index = 0\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
databasebuff = PcdDBData[("DEFAULT","0")][0]\r
\r
for skuname,skuid in delta:\r
- databasebuff += pack('=H', int(skuid))\r
- databasebuff += pack('=H', 0)\r
- databasebuff += pack('=L', 8+4*len(delta[(skuname,skuid)]))\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
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 ['UINT8','UINT16','UINT32','UINT64']:\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
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[("DEFAULT","0")] = (PcdDbBuffer, final_data)\r
\r
- PcdDbBuffer = CreatePcdDataBase(PcdDBData)\r
- return AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer\r
+ return AdditionalAutoGenH, AdditionalAutoGenC, CreatePcdDataBase(PcdDBData)\r
## Create PCD database in DXE or PEI phase\r
#\r
# @param Platform The platform object\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][0]\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
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_3, "PCD: %s %s (%s : %s)" % (CName, TokenSpaceGuidCName, Pcd.Phase, Phase))\r
\r
if Pcd.Phase == 'PEI':\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
\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
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
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