## @file\r
# Routines for generating Pcd Database\r
#\r
-# Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2013 - 2016, 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
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
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
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
# 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
\r
DbTotal = [InitValueUint64, VardefValueUint64, InitValueUint32, VardefValueUint32, VpdHeadValue, ExMapTable, \r
LocalTokenNumberTable, GuidTable, StringHeadValue, PcdNameOffsetTable,VariableTable,SkuTable, StringTableLen, PcdTokenTable,PcdCNameTable, \r
- SizeTableValue, InitValueUint16, VardefValueUint16,InitValueUint8, VardefValueUint8, InitValueBoolean,\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
- DbSizeTableValue, DbInitValueUint16, DbVardefValueUint16,DbInitValueUint8, DbVardefValueUint8, DbInitValueBoolean,\r
+ DbSizeTableValue, DbInitValueUint16, DbVardefValueUint16, DbInitValueUint8, DbVardefValueUint8, DbInitValueBoolean,\r
DbVardefValueBoolean, DbSkuidValue, DbSkuIndexValue, DbUnInitValueUint64, DbUnInitValueUint32, DbUnInitValueUint16, DbUnInitValueUint8, DbUnInitValueBoolean]\r
\r
# SkuidValue is the last table in the init table items\r
DbOffset += DbItemTotal[DbIndex].GetInterOffset(Offset)\r
break\r
DbOffset += DbItemTotal[DbIndex].GetListSize()\r
+ if DbIndex + 1 == InitTableNum:\r
+ if DbOffset % 8:\r
+ DbOffset += (8 - DbOffset % 8)\r
else:\r
assert(False)\r
\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
DbOffset += DbItemTotal[DbIndex].GetInterOffset(VariableOffset)\r
break\r
DbOffset += DbItemTotal[DbIndex].GetListSize()\r
+ if DbIndex + 1 == InitTableNum:\r
+ if DbOffset % 8:\r
+ DbOffset += (8 - DbOffset % 8)\r
else:\r
assert(False)\r
if isinstance(VariableRefTable[0],list):\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
for Item in (DbUnInitValueUint64, DbUnInitValueUint32, DbUnInitValueUint16, DbUnInitValueUint8, DbUnInitValueBoolean):\r
UninitDataBaseSize += Item.GetListSize()\r
\r
+ if (DbTotalLength - UninitDataBaseSize) % 8:\r
+ DbTotalLength += (8 - (DbTotalLength - UninitDataBaseSize) % 8)\r
# Construct the database buffer\r
Guid = "{0x3c7d193c, 0x682c, 0x4c14, 0xa6, 0x8f, 0x55, 0x2d, 0xea, 0x4f, 0x43, 0x7e}"\r
Guid = StringArrayToList(Guid)\r
b = Item.PackData()\r
Buffer += b \r
if Index == InitTableNum:\r
+ if len(Buffer) % 8:\r
+ for num in range(8 - len(Buffer) % 8):\r
+ b = pack('=B', Pad)\r
+ Buffer += b\r
break \r
return Buffer\r
\r
}\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
NumberOfSizeItems = 0\r
NumberOfSkuEnabledPcd = 0\r
GuidList = []\r
+ VarCheckTab = VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER()\r
i = 0\r
ReorderedDynPcdList = GetOrderedDynamicPcdList(Platform.DynamicPcdList, Platform.PcdTokenNumber)\r
for Pcd in ReorderedDynPcdList:\r
CName = Pcd.TokenCName\r
TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
\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
EdkLogger.debug(EdkLogger.DEBUG_3, "PCD: %s %s (%s : %s)" % (CName, TokenSpaceGuidCName, Pcd.Phase, Phase))\r
\r
if Pcd.Phase == 'PEI':\r
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 all variable names of one HII PCD under different SKU to stringTable\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
# 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
Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
elif Sku.DefaultValue[0] == '"':\r
DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
- Size = len(Sku.DefaultValue) -2 + 1\r
+ Size = len(Sku.DefaultValue) - 2 + 1\r
Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
elif Sku.DefaultValue[0] == '{':\r
DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
Pcd.InitString = 'INIT'\r
else:\r
if int(Sku.DefaultValue, 0) != 0:\r
- Pcd.InitString = 'INIT' \r
+ Pcd.InitString = 'INIT'\r
#\r
# For UNIT64 type PCD's value, ULL should be append to avoid\r
# warning under linux building environment.\r
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
if NumberOfSkuEnabledPcd != 0: \r
Dict['SKU_HEAD_SIZE'] = str(NumberOfSkuEnabledPcd) + 'U'\r
\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
\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