## @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
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 ValidCheckingInfoObject import GetValidationObject\r
from Common.VariableAttributes import VariableAttributes\r
import copy\r
from struct import unpack\r
+from Common.DataType import *\r
+from GenVar import PackGUID\r
\r
DATABASE_VERSION = 7\r
\r
#endif\r
""")\r
\r
-## PackGuid\r
-#\r
-# Pack the GUID value in C structure format into data array\r
-#\r
-# @param GuidStructureValue: The GUID value in C structure format\r
-#\r
-# @retval Buffer: a data array contains the Guid\r
-#\r
-def PackGuid(GuidStructureValue):\r
- GuidString = GuidStructureStringToGuidString(GuidStructureValue)\r
- Guid = GuidString.split('-')\r
- Buffer = pack('=LHHBBBBBBBB', \r
- int(Guid[0], 16), \r
- int(Guid[1], 16), \r
- int(Guid[2], 16), \r
- int(Guid[3][-4:-2], 16), \r
- int(Guid[3][-2:], 16),\r
- int(Guid[4][-12:-10], 16),\r
- int(Guid[4][-10:-8], 16),\r
- int(Guid[4][-8:-6], 16),\r
- int(Guid[4][-6:-4], 16),\r
- int(Guid[4][-4:-2], 16),\r
- int(Guid[4][-2:], 16)\r
- )\r
- return Buffer\r
-\r
-def toHex(s):\r
- lst = []\r
- for ch in s:\r
- hv = hex(ord(ch)).replace('0x', ' ')\r
- if len(hv) == 1:\r
- hv = '0'+hv\r
- lst.append(hv)\r
- if lst:\r
- return reduce(lambda x,y:x+y, lst)\r
- else:\r
- return 'empty'\r
## DbItemList\r
#\r
# The class holds the Pcd database items. ItemSize if not zero should match the item datum type in the C structure. \r
#\r
class DbItemList:\r
def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
- if DataList is None:\r
- DataList = []\r
- if RawDataList is None:\r
- RawDataList = []\r
self.ItemSize = ItemSize\r
- self.DataList = DataList\r
- self.RawDataList = RawDataList\r
+ self.DataList = DataList if DataList else []\r
+ self.RawDataList = RawDataList if RawDataList else []\r
self.ListSize = 0\r
\r
def GetInterOffset(self, Index):\r
for ItemIndex in xrange(Index):\r
Offset += len(self.RawDataList[ItemIndex])\r
else:\r
- for Datas in self.RawDataList:\r
- Offset = self.ItemSize * Index\r
+ Offset = self.ItemSize * Index\r
\r
return Offset\r
\r
return self.ListSize\r
\r
def PackData(self):\r
+ ## PackGuid\r
+ #\r
+ # Pack the GUID value in C structure format into data array\r
+ #\r
+ # @param GuidStructureValue: The GUID value in C structure format\r
+ #\r
+ # @retval Buffer: a data array contains the Guid\r
+ #\r
+ def PackGuid(GuidStructureValue):\r
+ GuidString = GuidStructureStringToGuidString(GuidStructureValue)\r
+ return PackGUID(GuidString.split('-'))\r
+\r
if self.ItemSize == 8:\r
PackStr = "=Q"\r
elif self.ItemSize == 4:\r
#\r
class DbExMapTblItemList (DbItemList):\r
def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
- if DataList is None:\r
- DataList = []\r
- if RawDataList is None:\r
- RawDataList = []\r
DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+\r
def PackData(self):\r
Buffer = ''\r
PackStr = "=LHH"\r
#\r
class DbComItemList (DbItemList):\r
def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
- if DataList is None:\r
- DataList = []\r
- if RawDataList is None:\r
- RawDataList = []\r
DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+\r
def GetInterOffset(self, Index):\r
Offset = 0\r
if self.ItemSize == 0:\r
#\r
class DbVariableTableItemList (DbComItemList):\r
def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
- if DataList is None:\r
- DataList = []\r
- if RawDataList is None:\r
- RawDataList = []\r
DbComItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+\r
def PackData(self):\r
PackStr = "=LLHHLHH"\r
Buffer = ''\r
\r
class DbStringHeadTableItemList(DbItemList):\r
def __init__(self,ItemSize,DataList=None,RawDataList=None):\r
- if DataList is None:\r
- DataList = []\r
- if RawDataList is None:\r
- RawDataList = [] \r
DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
\r
def GetInterOffset(self, Index):\r
#\r
class DbSkuHeadTableItemList (DbItemList):\r
def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
- if DataList is None:\r
- DataList = []\r
- if RawDataList is None:\r
- RawDataList = [] \r
DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+\r
def PackData(self):\r
PackStr = "=LL"\r
Buffer = ''\r
#\r
class DbSizeTableItemList (DbItemList):\r
def __init__(self, ItemSize, DataList=None, RawDataList=None):\r
- if DataList is None:\r
- DataList = []\r
- if RawDataList is None:\r
- RawDataList = [] \r
DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+\r
def GetListSize(self):\r
length = 0\r
for Data in self.RawDataList:\r
AutoGenC.Append(AdditionalAutoGenC.String)\r
\r
if Info.IsBinaryModule:\r
- DbFileName = os.path.join(Info.PlatformInfo.BuildDir, "FV", Phase + "PcdDataBase.raw")\r
+ DbFileName = os.path.join(Info.PlatformInfo.BuildDir, TAB_FV_DIRECTORY, Phase + "PcdDataBase.raw")\r
else:\r
DbFileName = os.path.join(Info.OutputDir, Phase + "PcdDataBase.raw")\r
DbFile = StringIO()\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
+ 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 == "DEFAULT":\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[("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
+ 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
newbuffer += databasebuff[i]\r
\r
return newbuffer\r
+\r
def CreateVarCheckBin(VarCheckTab):\r
- return VarCheckTab[('DEFAULT',"0")]\r
+ return VarCheckTab[(TAB_DEFAULT,"0")]\r
+\r
def CreateAutoGen(PcdDriverAutoGenData):\r
autogenC = TemplateString()\r
for skuname,skuid in PcdDriverAutoGenData:\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
PcdDriverAutoGenData[(skuname,skuid)] = (AdditionalAutoGenH, AdditionalAutoGenC)\r
VarCheckTableData[(skuname,skuid)] = VarCheckTab\r
if Platform.Platform.VarCheckFlag:\r
- dest = os.path.join(Platform.BuildDir, 'FV')\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
\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
\r
Dict['PCD_INFO_FLAG'] = Platform.Platform.PcdInfoFlag\r
\r
- for DatumType in ['UINT64','UINT32','UINT16','UINT8','BOOLEAN', "VOID*"]:\r
+ for DatumType in TAB_PCD_NUMERIC_TYPES_VOID:\r
Dict['VARDEF_CNAME_' + DatumType] = []\r
Dict['VARDEF_GUID_' + DatumType] = []\r
Dict['VARDEF_SKUID_' + DatumType] = []\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
+ item.DatumType = TAB_VOID\r
for Pcd in ReorderedDynPcdList:\r
VoidStarTypeCurrSize = []\r
i += 1\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
#\r
TokenSpaceGuidStructure = Pcd.TokenSpaceGuidValue\r
TokenSpaceGuid = GuidStructureStringToGuidValueName(TokenSpaceGuidStructure)\r
- if Pcd.Type in gDynamicExPcd:\r
+ if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
if TokenSpaceGuid not in GuidList:\r
GuidList += [TokenSpaceGuid]\r
Dict['GUID_STRUCTURE'].append(TokenSpaceGuidStructure)\r
VariableDbValueList = []\r
Pcd.InitString = 'UNINIT'\r
\r
- if Pcd.DatumType == 'VOID*':\r
- if Pcd.Type not in ["DynamicVpd", "DynamicExVpd"]:\r
+ if Pcd.DatumType == TAB_VOID:\r
+ if Pcd.Type not in [TAB_PCDS_DYNAMIC_VPD, TAB_PCDS_DYNAMIC_EX_VPD]:\r
Pcd.TokenTypeList = ['PCD_TYPE_STRING']\r
else:\r
Pcd.TokenTypeList = []\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 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
+ var_check_obj.push_back(GetValidationObject(Pcd, Sku.VariableOffset))\r
VarAttr, _ = VariableAttributes.GetVarAttributes(Sku.VariableAttribute)\r
var_check_obj.SetAttributes(VarAttr)\r
var_check_obj.UpdateSize()\r
#\r
Dict['VARDEF_DB_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue)\r
\r
- if Pcd.DatumType == "UINT64":\r
+ if Pcd.DatumType == TAB_UINT64:\r
Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "ULL")\r
- elif Pcd.DatumType in ("UINT32", "UINT16", "UINT8"):\r
+ elif Pcd.DatumType in (TAB_UINT32, TAB_UINT16, TAB_UINT8):\r
Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "U")\r
elif Pcd.DatumType == "BOOLEAN":\r
if eval(Sku.HiiDefaultValue) in [1,0]:\r
VpdHeadOffsetList.append(str(Sku.VpdOffset) + 'U')\r
VpdDbOffsetList.append(Sku.VpdOffset)\r
# Also add the VOID* string of VPD PCD to SizeTable \r
- if Pcd.DatumType == 'VOID*':\r
+ if Pcd.DatumType == TAB_VOID:\r
NumberOfSizeItems += 1\r
# For VPD type of PCD, its current size is equal to its MAX size.\r
VoidStarTypeCurrSize = [str(Pcd.MaxDatumSize) + 'U'] \r
continue\r
\r
- if Pcd.DatumType == 'VOID*':\r
+ if Pcd.DatumType == TAB_VOID:\r
Pcd.TokenTypeList += ['PCD_TYPE_STRING']\r
Pcd.InitString = 'INIT'\r
if Sku.HiiDefaultValue != '' and Sku.DefaultValue == '':\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
#\r
- if Pcd.DatumType == "UINT64":\r
+ if Pcd.DatumType == TAB_UINT64:\r
ValueList.append(Sku.DefaultValue + "ULL")\r
- elif Pcd.DatumType in ("UINT32", "UINT16", "UINT8"):\r
+ elif Pcd.DatumType in (TAB_UINT32, TAB_UINT16, TAB_UINT8):\r
ValueList.append(Sku.DefaultValue + "U")\r
elif Pcd.DatumType == "BOOLEAN":\r
if Sku.DefaultValue in ["1", "0"]:\r
DbValueList.append(Sku.DefaultValue)\r
\r
Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))\r
- if Pcd.DatumType == 'VOID*': \r
+ if Pcd.DatumType == TAB_VOID:\r
Dict['SIZE_TABLE_CNAME'].append(CName)\r
Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)\r
Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(str(Pcd.MaxDatumSize) + 'U')\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
Dict['VARDEF_HEADER'][GeneratedTokenNumber] = ''\r
\r
\r
- if Pcd.Type in gDynamicExPcd:\r
+ if Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
\r
if Phase == 'DXE':\r
GeneratedTokenNumber += NumberOfPeiLocalTokens\r