## @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
+import copy\r
+from struct import unpack\r
\r
-DATABASE_VERSION = 4\r
+DATABASE_VERSION = 7\r
\r
gPcdDatabaseAutoGenC = TemplateString("""\r
//\r
//\r
#if 0\r
${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {\r
+ /* SkuIdTable */\r
+ { ${BEGIN}${SKUID_VALUE}, ${END} },\r
${BEGIN} { ${INIT_VALUE_UINT64} }, /* ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}] */\r
${END}\r
${BEGIN} ${VARDEF_VALUE_UINT64}, /* ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64} */\r
${END}\r
${BEGIN} ${VARDEF_VALUE_BOOLEAN}, /* ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN} */\r
${END}\r
- /* SkuIdTable */\r
- { ${BEGIN}${SKUID_VALUE}, ${END} },\r
${SYSTEM_SKU_ID_VALUE}\r
};\r
#endif\r
#define ${PHASE}_EXMAPPING_TABLE_SIZE ${EXMAPPING_TABLE_SIZE}\r
#define ${PHASE}_EX_TOKEN_NUMBER ${EX_TOKEN_NUMBER}\r
#define ${PHASE}_SIZE_TABLE_SIZE ${SIZE_TABLE_SIZE}\r
-#define ${PHASE}_SKU_HEAD_SIZE ${SKU_HEAD_SIZE}\r
#define ${PHASE}_GUID_TABLE_EMPTY ${GUID_TABLE_EMPTY}\r
#define ${PHASE}_STRING_TABLE_EMPTY ${STRING_TABLE_EMPTY}\r
#define ${PHASE}_SKUID_TABLE_EMPTY ${SKUID_TABLE_EMPTY}\r
#define ${PHASE}_EXMAP_TABLE_EMPTY ${EXMAP_TABLE_EMPTY}\r
\r
typedef struct {\r
+ UINT64 SkuIdTable[${PHASE}_SKUID_TABLE_SIZE];\r
${BEGIN} UINT64 ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}];\r
${END}\r
${BEGIN} UINT64 ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64};\r
${BEGIN} STRING_HEAD ${STRING_HEAD_CNAME_DECL}_${STRING_HEAD_GUID_DECL}[${STRING_HEAD_NUMSKUS_DECL}];\r
${END}\r
${BEGIN} VARIABLE_HEAD ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}_Variable_Header[${VARIABLE_HEAD_NUMSKUS_DECL}];\r
-${END}\r
-${BEGIN} SKU_HEAD SkuHead[${PHASE}_SKU_HEAD_SIZE];\r
-${END}\r
${BEGIN} UINT8 StringTable${STRING_TABLE_INDEX}[${STRING_TABLE_LENGTH}]; /* ${STRING_TABLE_CNAME}_${STRING_TABLE_GUID} */\r
${END}\r
SIZE_INFO SizeTable[${PHASE}_SIZE_TABLE_SIZE];\r
${END}\r
${BEGIN} BOOLEAN ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN};\r
${END}\r
- UINT8 SkuIdTable[${PHASE}_SKUID_TABLE_SIZE];\r
${SYSTEM_SKU_ID}\r
} ${PHASE}_PCD_DATABASE_INIT;\r
\r
\r
typedef struct {\r
//GUID Signature; // PcdDataBaseGuid\r
+ //UINT32 BuildVersion;\r
//UINT32 Length;\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
//TABLE_OFFSET StringTableOffset;\r
//TABLE_OFFSET SizeTableOffset;\r
//TABLE_OFFSET SkuIdTableOffset; \r
+ //TABLE_OFFSET PcdNameTableOffset;\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
- //SKU_ID SystemSkuId; // Current SkuId value.\r
- //UINT8 Pad;\r
+ //UINT8 Pad[6];\r
${PHASE}_PCD_DATABASE_INIT Init;\r
${PHASE}_PCD_DATABASE_UNINIT Uninit;\r
} ${PHASE}_PCD_DATABASE;\r
//\r
#if 0\r
${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {\r
+ /* SkuIdTable */\r
+ { 0 },\r
/* ExMapTable */\r
{\r
{0, 0, 0}\r
{\r
0, 0\r
},\r
- /* SkuIdTable */\r
- { 0 },\r
${SYSTEM_SKU_ID_VALUE}\r
};\r
#endif\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
if RawDataList is None:\r
RawDataList = [] \r
DbItemList.__init__(self, ItemSize, DataList, RawDataList)\r
+ def GetListSize(self):\r
+ length = 0\r
+ for Data in self.RawDataList:\r
+ length += (1 + len(Data[1]))\r
+ return length * self.ItemSize\r
def PackData(self):\r
- PackStr = "=HH"\r
+ PackStr = "=H"\r
Buffer = ''\r
for Data in self.RawDataList:\r
Buffer += pack(PackStr, \r
- GetIntegerValue(Data[0]),\r
- GetIntegerValue(Data[1]))\r
+ GetIntegerValue(Data[0]))\r
+ for subData in Data[1]:\r
+ Buffer += pack(PackStr, \r
+ GetIntegerValue(subData))\r
return Buffer\r
\r
## DbStringItemList\r
return -1\r
\r
\r
-## Get the integer value from string like "14U" or integer like 2\r
-#\r
-# @param Input The object that may be either a integer value or a string \r
-# \r
-# @retval Value The integer value that the input represents\r
-#\r
-def GetIntegerValue(Input):\r
- if type(Input) in (int, long):\r
- return Input\r
- String = Input\r
- if String.endswith("U"):\r
- String = String[:-1]\r
- if String.endswith("ULL"):\r
- String = String[:-3]\r
- if String.endswith("LL"):\r
- String = String[:-2]\r
- \r
- if String.startswith("0x") or String.startswith("0X"):\r
- return int(String, 16)\r
- elif String == '':\r
- return 0\r
- else:\r
- return int(String)\r
-\r
-\r
## convert StringArray like {0x36, 0x00, 0x34, 0x00, 0x21, 0x00, 0x36, 0x00, 0x34, 0x00, 0x00, 0x00}\r
# to List like [0x36, 0x00, 0x34, 0x00, 0x21, 0x00, 0x36, 0x00, 0x34, 0x00, 0x00, 0x00]\r
#\r
"PCD_TYPE_DATA":(0x0 << 28),\r
"PCD_TYPE_HII":(0x8 << 28),\r
"PCD_TYPE_VPD":(0x4 << 28),\r
- "PCD_TYPE_SKU_ENABLED":(0x2 << 28),\r
+# "PCD_TYPE_SKU_ENABLED":(0x2 << 28),\r
"PCD_TYPE_STRING":(0x1 << 28),\r
\r
"PCD_DATUM_TYPE_SHIFT":24,\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
- DbSkuTable = DbSkuHeadTableItemList(8, RawDataList = SkuTable)\r
+\r
Dict['STRING_TABLE_DB_VALUE'] = [StringArrayToList(x) for x in Dict['STRING_TABLE_VALUE']]\r
\r
StringTableValue = Dict['STRING_TABLE_DB_VALUE']\r
DbPcdNameOffsetTable = DbItemList(4,RawDataList = PcdNameOffsetTable)\r
\r
SizeTableValue = zip(Dict['SIZE_TABLE_MAXIMUM_LENGTH'], Dict['SIZE_TABLE_CURRENT_LENGTH'])\r
- DbSizeTableValue = DbSizeTableItemList(4, RawDataList = SizeTableValue)\r
+ DbSizeTableValue = DbSizeTableItemList(2, RawDataList = SizeTableValue)\r
InitValueUint16 = Dict['INIT_DB_VALUE_UINT16']\r
DbInitValueUint16 = DbComItemList(2, RawDataList = InitValueUint16)\r
VardefValueUint16 = Dict['VARDEF_DB_VALUE_UINT16']\r
VardefValueBoolean = Dict['VARDEF_DB_VALUE_BOOLEAN']\r
DbVardefValueBoolean = DbItemList(1, RawDataList = VardefValueBoolean)\r
SkuidValue = Dict['SKUID_VALUE']\r
- DbSkuidValue = DbItemList(1, RawDataList = SkuidValue)\r
- SkuIndexValue = Dict['SKU_INDEX_VALUE']\r
- DbSkuIndexValue = DbItemList(0,RawDataList = SkuIndexValue)\r
+ DbSkuidValue = DbItemList(8, RawDataList = SkuidValue)\r
+\r
+\r
\r
# Unit Db Items\r
UnInitValueUint64 = Dict['UNINIT_GUID_DECL_UINT64']\r
DbUnInitValueUint8 = DbItemList(1, RawDataList = UnInitValueUint8)\r
UnInitValueBoolean = Dict['UNINIT_GUID_DECL_BOOLEAN']\r
DbUnInitValueBoolean = DbItemList(1, RawDataList = UnInitValueBoolean)\r
+ PcdTokenNumberMap = Dict['PCD_ORDER_TOKEN_NUMBER_MAP']\r
\r
- DbNameTotle = ["InitValueUint64", "VardefValueUint64", "InitValueUint32", "VardefValueUint32", "VpdHeadValue", "ExMapTable", \r
- "LocalTokenNumberTable", "GuidTable", "StringHeadValue", "PcdNameOffsetTable","VariableTable","SkuTable", "StringTableLen", "PcdTokenTable", "PcdCNameTable", \r
+ DbNameTotle = ["SkuidValue", "InitValueUint64", "VardefValueUint64", "InitValueUint32", "VardefValueUint32", "VpdHeadValue", "ExMapTable",\r
+ "LocalTokenNumberTable", "GuidTable", "StringHeadValue", "PcdNameOffsetTable","VariableTable", "StringTableLen", "PcdTokenTable", "PcdCNameTable",\r
"SizeTableValue", "InitValueUint16", "VardefValueUint16", "InitValueUint8", "VardefValueUint8", "InitValueBoolean",\r
- "VardefValueBoolean", "SkuidValue", "SkuIndexValue","UnInitValueUint64", "UnInitValueUint32", "UnInitValueUint16", "UnInitValueUint8", "UnInitValueBoolean"]\r
+ "VardefValueBoolean", "UnInitValueUint64", "UnInitValueUint32", "UnInitValueUint16", "UnInitValueUint8", "UnInitValueBoolean"]\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
- 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
- DbVardefValueBoolean, DbSkuidValue, DbSkuIndexValue, DbUnInitValueUint64, DbUnInitValueUint32, DbUnInitValueUint16, DbUnInitValueUint8, DbUnInitValueBoolean]\r
+ DbTotal = [SkuidValue, InitValueUint64, VardefValueUint64, InitValueUint32, VardefValueUint32, VpdHeadValue, ExMapTable,\r
+ LocalTokenNumberTable, GuidTable, StringHeadValue, PcdNameOffsetTable,VariableTable, StringTableLen, PcdTokenTable,PcdCNameTable,\r
+ SizeTableValue, InitValueUint16, VardefValueUint16, InitValueUint8, VardefValueUint8, InitValueBoolean,\r
+ VardefValueBoolean, UnInitValueUint64, UnInitValueUint32, UnInitValueUint16, UnInitValueUint8, UnInitValueBoolean]\r
+ DbItemTotal = [DbSkuidValue, DbInitValueUint64, DbVardefValueUint64, DbInitValueUint32, DbVardefValueUint32, DbVpdHeadValue, DbExMapTable,\r
+ DbLocalTokenNumberTable, DbGuidTable, DbStringHeadValue, DbPcdNameOffsetTable,DbVariableTable, DbStringTableLen, DbPcdTokenTable, DbPcdCNameTable,\r
+ DbSizeTableValue, DbInitValueUint16, DbVardefValueUint16, DbInitValueUint8, DbVardefValueUint8, DbInitValueBoolean,\r
+ DbVardefValueBoolean, DbUnInitValueUint64, DbUnInitValueUint32, DbUnInitValueUint16, DbUnInitValueUint8, DbUnInitValueBoolean]\r
\r
- # SkuidValue is the last table in the init table items\r
- InitTableNum = DbTotal.index(SkuidValue) + 1 + 1 # +1 is for SkuIndexValue table\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 = 64\r
+ FixedHeaderLen = 80\r
\r
# Get offset of SkuId table in the database \r
SkuIdTableOffset = FixedHeaderLen\r
\r
\r
# Get offset of SkuValue table in the database \r
- SkuTableOffset = FixedHeaderLen\r
- for DbIndex in xrange(len(DbTotal)):\r
- if DbTotal[DbIndex] is SkuTable:\r
- break\r
- SkuTableOffset += DbItemTotal[DbIndex].GetListSize()\r
- PcdTokenTableDbOffset = FixedHeaderLen\r
- for DbIndex in xrange(len(DbTotal)):\r
- if DbTotal[DbIndex] is PcdTokenTable:\r
- break\r
- PcdTokenTableDbOffset += DbItemTotal[DbIndex].GetListSize()\r
- \r
- PcdCNameTableDbOffset = FixedHeaderLen\r
- for DbIndex in xrange(len(DbTotal)):\r
- if DbTotal[DbIndex] is PcdCNameTable:\r
- break\r
- PcdCNameTableDbOffset += DbItemTotal[DbIndex].GetListSize()\r
+\r
# Fix up the LocalTokenNumberTable, SkuHeader table\r
- SkuHeaderIndex = 0\r
- if len(Dict['SKU_INDEX_VALUE']) > 0:\r
- SkuIndexIndexTable = [(0) for i in xrange(len(Dict['SKU_INDEX_VALUE']))]\r
- SkuIndexIndexTable[0] = 0 #Dict['SKU_INDEX_VALUE'][0][0]\r
- for i in range(1,len(Dict['SKU_INDEX_VALUE'])):\r
- SkuIndexIndexTable[i] = SkuIndexIndexTable[i-1]+Dict['SKU_INDEX_VALUE'][i-1][0]\r
for (LocalTokenNumberTableIndex, (Offset, Table)) in enumerate(LocalTokenNumberTable):\r
DbIndex = 0\r
DbOffset = FixedHeaderLen\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
LocalTokenNumberTable[LocalTokenNumberTableIndex] = DbOffset|int(TokenTypeValue)\r
# if PCD_TYPE_SKU_ENABLED, then we need to fix up the SkuTable\r
\r
- SkuIndexTabalOffset = SkuIdTableOffset + Dict['SKUID_VALUE'][0]\r
- if (TokenTypeValue & (0x2 << 28)):\r
- SkuTable[SkuHeaderIndex] = (DbOffset|int(TokenTypeValue & ~(0x2<<28)), SkuIndexTabalOffset + SkuIndexIndexTable[SkuHeaderIndex])\r
- LocalTokenNumberTable[LocalTokenNumberTableIndex] = (SkuTableOffset + SkuHeaderIndex * 8) | int(TokenTypeValue)\r
- SkuHeaderIndex += 1\r
\r
\r
- if SkuHeaderIndex == 0:\r
- SkuHeaderIndex = 1\r
- assert(SkuHeaderIndex == NumberOfSkuEnabledPcd)\r
\r
# resolve variable table offset \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
- \r
+ if isinstance(VariableRefTable[0],list):\r
+ DbOffset += skuindex * 4 \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
elif DbItemTotal[DbIndex] is DbPcdNameOffsetTable:\r
DbPcdNameOffset = DbTotalLength\r
\r
+\r
DbTotalLength += DbItemTotal[DbIndex].GetListSize()\r
if not Dict['PCD_INFO_FLAG']:\r
DbPcdNameOffset = 0 \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
\r
b = pack('=L', DbTotalLength - UninitDataBaseSize)\r
\r
+ Buffer += b\r
+ b = pack('=Q', SystemSkuId)\r
+\r
+ Buffer += b\r
+ b = pack('=L', 0)\r
+\r
Buffer += b\r
b = pack('=L', UninitDataBaseSize)\r
\r
Buffer += b\r
b = pack('=H', GuidTableCount)\r
\r
- Buffer += b\r
- b = pack('=B', SystemSkuId)\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
Buffer += b\r
\r
Index = 0\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
EdkLogger.error("build", AUTOGEN_ERROR, "Not supported PcdIsDriver type:%s" % Info.PcdIsDriver,\r
ExtraData="[%s]" % str(Info))\r
\r
- AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, 'PEI')\r
+ AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer = NewCreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, 'PEI')\r
AutoGenH.Append(AdditionalAutoGenH.String)\r
\r
Phase = gPcdPhaseMap[Info.PcdIsDriver]\r
AutoGenC.Append(AdditionalAutoGenC.String)\r
\r
if Phase == 'DXE':\r
- AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, Phase)\r
+ AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer = NewCreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, Phase)\r
AutoGenH.Append(AdditionalAutoGenH.String)\r
AutoGenC.Append(AdditionalAutoGenC.String)\r
\r
DbFile = StringIO()\r
DbFile.write(PcdDbBuffer)\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
+ EdkLogger.ERROR("The size of each sku in one pcd are not same")\r
+ for skuname,skuid in PcdDBData:\r
+ if skuname == "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
+\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
+def CreateVarCheckBin(VarCheckTab):\r
+ return VarCheckTab[('DEFAULT',"0")]\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
+ 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, 'FV')\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
\r
-\r
-def CArrayToArray(carray):\r
- return "{%s, 0x00}" % ", ".join(["0x%02x" % ord(C) for C in carray])\r
-\r
+ PcdDbBuffer = CreatePcdDataBase(PcdDBData)\r
+ return AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer\r
## Create PCD database in DXE or PEI phase\r
#\r
# @param Platform The platform object\r
# @retval tuple Two TemplateString objects for C code and header file,\r
# respectively\r
#\r
-def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):\r
+def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):\r
AutoGenC = TemplateString()\r
AutoGenH = TemplateString()\r
\r
}\r
\r
\r
- SkuObj = SkuClass(Platform.Platform.SkuName,Platform.Platform.SkuIds)\r
- Dict['SYSTEM_SKU_ID_VALUE'] = Platform.Platform.SkuIds[SkuObj.SystemSkuId]\r
+ SkuObj = SkuClass(Platform.Platform.SkuName, Platform.Platform.SkuIds)\r
+ Dict['SYSTEM_SKU_ID_VALUE'] = Platform.Platform.SkuIds[SkuObj.SystemSkuId][0]\r
\r
Dict['PCD_INFO_FLAG'] = Platform.Platform.PcdInfoFlag\r
\r
\r
Dict['LOCAL_TOKEN_NUMBER_DB_VALUE'] = []\r
Dict['VARIABLE_DB_VALUE'] = []\r
- Dict['SKUHEAD_TABLE_VALUE'] = []\r
- Dict['SKU_INDEX_VALUE'] = []\r
\r
Dict['PCD_TOKENSPACE'] = []\r
Dict['PCD_CNAME'] = [] \r
Dict['PCD_TOKENSPACE_MAP'] = []\r
Dict['PCD_NAME_OFFSET'] = []\r
\r
+ Dict['PCD_ORDER_TOKEN_NUMBER_MAP'] = {}\r
+ PCD_STRING_INDEX_MAP = {}\r
+ \r
StringTableIndex = 0\r
StringTableSize = 0\r
NumberOfLocalTokens = 0\r
NumberOfSizeItems = 0\r
NumberOfSkuEnabledPcd = 0\r
GuidList = []\r
+ VarCheckTab = VAR_CHECK_PCD_VARIABLE_TAB_CONTAINER()\r
i = 0\r
- for Pcd in Platform.DynamicPcdList:\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
+ for Pcd in ReorderedDynPcdList:\r
+ VoidStarTypeCurrSize = []\r
i += 1\r
CName = Pcd.TokenCName\r
TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
\r
+ for PcdItem in GlobalData.MixedPcd:\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
Pcd.TokenTypeList = ['PCD_DATUM_TYPE_' + Pcd.DatumType]\r
\r
if len(Pcd.SkuInfoList) > 1:\r
- Pcd.TokenTypeList += ['PCD_TYPE_SKU_ENABLED']\r
+# Pcd.TokenTypeList += ['PCD_TYPE_SKU_ENABLED']\r
NumberOfSkuEnabledPcd += 1\r
\r
- SkuIndexTableTmp = []\r
- SkuIndexTableTmp.append(0) \r
SkuIdIndex = 1 \r
+ VariableHeadList = []\r
for SkuName in Pcd.SkuInfoList:\r
Sku = Pcd.SkuInfoList[SkuName]\r
SkuId = Sku.SkuId\r
if SkuId == None or SkuId == '':\r
continue\r
\r
- if (SkuId + 'U') not in Dict['SKUID_VALUE']:\r
- Dict['SKUID_VALUE'].append(SkuId + 'U')\r
\r
- SkuIndexTableTmp.append(SkuId+'U')\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 VariableName to stringTable and calculate the VariableHeadStringIndex\r
- if Sku.VariableName.startswith('{'):\r
- VariableNameStructure = CArrayToArray(Sku.VariableName)\r
- else:\r
- VariableNameStructure = StringToArray(Sku.VariableName)\r
+ # Store all variable names of one HII PCD under different SKU to stringTable\r
+ # and calculate the VariableHeadStringIndex\r
+\r
+ VariableNameStructure = StringToArray(Sku.VariableName)\r
if VariableNameStructure not in Dict['STRING_TABLE_VALUE']:\r
Dict['STRING_TABLE_CNAME'].append(CName)\r
Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)\r
Dict['STRING_TABLE_INDEX'].append('')\r
else:\r
Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)\r
-\r
- Dict['STRING_TABLE_LENGTH'].append((len(Sku.VariableName) - 3 + 1) * 2 )\r
+ VarNameSize = len(VariableNameStructure.replace(',',' ').split())\r
+ Dict['STRING_TABLE_LENGTH'].append(VarNameSize )\r
Dict['STRING_TABLE_VALUE'].append(VariableNameStructure)\r
+ StringHeadOffsetList.append(str(StringTableSize) + 'U')\r
+ VarStringDbOffsetList = []\r
+ VarStringDbOffsetList.append(StringTableSize)\r
+ Dict['STRING_DB_VALUE'].append(VarStringDbOffsetList)\r
StringTableIndex += 1\r
- StringTableSize += (len(Sku.VariableName) - 3 + 1) * 2\r
+ StringTableSize += len(VariableNameStructure.replace(',',' ').split())\r
VariableHeadStringIndex = 0\r
for Index in range(Dict['STRING_TABLE_VALUE'].index(VariableNameStructure)):\r
VariableHeadStringIndex += Dict['STRING_TABLE_LENGTH'][Index]\r
-\r
+ VariableHeadList.append(VariableHeadStringIndex)\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
# Also add the VOID* string of VPD PCD to SizeTable \r
if Pcd.DatumType == 'VOID*':\r
NumberOfSizeItems += 1\r
- Dict['SIZE_TABLE_CNAME'].append(CName)\r
- Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)\r
# For VPD type of PCD, its current size is equal to its MAX size.\r
- Dict['SIZE_TABLE_CURRENT_LENGTH'].append(str(Pcd.MaxDatumSize) + 'U')\r
- Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(str(Pcd.MaxDatumSize) + 'U')\r
+ VoidStarTypeCurrSize = [str(Pcd.MaxDatumSize) + 'U'] \r
continue\r
\r
if Pcd.DatumType == 'VOID*':\r
else:\r
Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)\r
if Sku.DefaultValue[0] == 'L':\r
- Size = (len(Sku.DefaultValue) - 3 + 1) * 2 \r
- Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue))\r
+ DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
+ Size = len(DefaultValueBinStructure.replace(',',' ').split())\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
- Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue))\r
+ Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
elif Sku.DefaultValue[0] == '{':\r
- Size = len(Sku.DefaultValue.replace(',',' ').split())\r
- Dict['STRING_TABLE_VALUE'].append(Sku.DefaultValue)\r
+ DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
+ Size = len(Sku.DefaultValue.split(","))\r
+ Dict['STRING_TABLE_VALUE'].append(DefaultValueBinStructure)\r
\r
StringHeadOffsetList.append(str(StringTableSize) + 'U')\r
StringDbOffsetList.append(StringTableSize)\r
- Dict['SIZE_TABLE_CNAME'].append(CName)\r
- Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)\r
- Dict['SIZE_TABLE_CURRENT_LENGTH'].append(str(Size) + 'U')\r
- Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(str(Pcd.MaxDatumSize) + 'U')\r
if Pcd.MaxDatumSize != '':\r
MaxDatumSize = int(Pcd.MaxDatumSize, 0)\r
if MaxDatumSize < Size:\r
- MaxDatumSize = Size\r
- Size = MaxDatumSize\r
- Dict['STRING_TABLE_LENGTH'].append(Size)\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
+ StringTabLen = MaxDatumSize\r
+ if StringTabLen % 2:\r
+ StringTabLen += 1\r
+ if Sku.VpdOffset == '':\r
+ VoidStarTypeCurrSize.append(str(Size) + 'U')\r
+ Dict['STRING_TABLE_LENGTH'].append(StringTabLen)\r
StringTableIndex += 1\r
- StringTableSize += (Size)\r
+ StringTableSize += (StringTabLen)\r
else:\r
if "PCD_TYPE_HII" not in Pcd.TokenTypeList:\r
Pcd.TokenTypeList += ['PCD_TYPE_DATA']\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
DbValueList.append(Sku.DefaultValue)\r
\r
Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))\r
+ if Pcd.DatumType == '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
+ Dict['SIZE_TABLE_CURRENT_LENGTH'].append(VoidStarTypeCurrSize)\r
+ \r
\r
- SkuIndexTableTmp[0] = len(SkuIndexTableTmp)\r
- if len(Pcd.SkuInfoList) > 1:\r
- Dict['SKU_INDEX_VALUE'].append(SkuIndexTableTmp) \r
\r
if 'PCD_TYPE_HII' in Pcd.TokenTypeList:\r
Dict['VARIABLE_HEAD_CNAME_DECL'].append(CName)\r
Dict['STRING_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))\r
Dict['STRING_HEAD_VALUE'].append(', '.join(StringHeadOffsetList))\r
Dict['STRING_DB_VALUE'].append(StringDbOffsetList)\r
+ PCD_STRING_INDEX_MAP[len(Dict['STRING_HEAD_CNAME_DECL']) -1 ] = len(Dict['STRING_DB_VALUE']) -1\r
if 'PCD_TYPE_DATA' in Pcd.TokenTypeList:\r
Dict[Pcd.InitString+'_CNAME_DECL_'+Pcd.DatumType].append(CName)\r
Dict[Pcd.InitString+'_GUID_DECL_'+Pcd.DatumType].append(TokenSpaceGuid)\r
Dict['PCD_CNAME'] = ['' for x in range(NumberOfLocalTokens)]\r
Dict['PCD_TOKENSPACE_MAP'] = ['' for x in range(NumberOfLocalTokens)] \r
Dict['PCD_CNAME_LENGTH'] = [0 for x in range(NumberOfLocalTokens)]\r
- for Pcd in Platform.DynamicPcdList:\r
+ SkuEnablePcdIndex = 0\r
+ for Pcd in ReorderedDynPcdList:\r
CName = Pcd.TokenCName\r
TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
if Pcd.Phase != Phase:\r
if Phase == 'DXE':\r
GeneratedTokenNumber -= NumberOfPeiLocalTokens\r
\r
+ if len(Pcd.SkuInfoList) > 1:\r
+ Dict['PCD_ORDER_TOKEN_NUMBER_MAP'][GeneratedTokenNumber] = SkuEnablePcdIndex\r
+ SkuEnablePcdIndex += 1\r
+\r
+ for PcdItem in GlobalData.MixedPcd:\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
TokenSpaceGuidCNameArray = StringToArray('"' + TokenSpaceGuidCName + '"' )\r
if TokenSpaceGuidCNameArray not in Dict['PCD_TOKENSPACE']:\r
Dict['PCD_TOKENSPACE'].append(TokenSpaceGuidCNameArray)\r
- Dict['PCD_TOKENSPACE_LENGTH'].append( len(TokenSpaceGuidCName) + 1 )\r
+ Dict['PCD_TOKENSPACE_LENGTH'].append( len(TokenSpaceGuidCNameArray.split(",")) )\r
Dict['PCD_TOKENSPACE_MAP'][GeneratedTokenNumber] = Dict['PCD_TOKENSPACE'].index(TokenSpaceGuidCNameArray)\r
- Dict['PCD_CNAME'][GeneratedTokenNumber] = StringToArray('"' + CName + '"' )\r
+ CNameBinArray = StringToArray('"' + CName + '"' )\r
+ Dict['PCD_CNAME'][GeneratedTokenNumber] = CNameBinArray\r
\r
- Dict['PCD_CNAME_LENGTH'][GeneratedTokenNumber] = len(CName) + 1\r
+ Dict['PCD_CNAME_LENGTH'][GeneratedTokenNumber] = len(CNameBinArray.split(","))\r
\r
\r
Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))\r
if 'PCD_TYPE_STRING' in Pcd.TokenTypeList and 'PCD_TYPE_HII' not in Pcd.TokenTypeList:\r
# Find index by CName, TokenSpaceGuid\r
Offset = GetMatchedIndex(CName, Dict['STRING_HEAD_CNAME_DECL'], TokenSpaceGuid, Dict['STRING_HEAD_GUID_DECL'])\r
+ Offset = PCD_STRING_INDEX_MAP[Offset]\r
assert(Offset != -1)\r
Table = Dict['STRING_DB_VALUE']\r
if 'PCD_TYPE_DATA' in Pcd.TokenTypeList:\r
Dict['PCD_TOKENSPACE_OFFSET'].append(TokenSpaceIndex) \r
for index in range(len(Dict['PCD_TOKENSPACE'])):\r
StringTableSize += Dict['PCD_TOKENSPACE_LENGTH'][index]\r
- \r
+ StringTableIndex += 1\r
for index in range(len(Dict['PCD_CNAME'])):\r
Dict['PCD_CNAME_OFFSET'].append(StringTableSize) \r
Dict['PCD_NAME_OFFSET'].append(Dict['PCD_TOKENSPACE_OFFSET'][index])\r
Dict['PCD_NAME_OFFSET'].append(StringTableSize)\r
StringTableSize += Dict['PCD_CNAME_LENGTH'][index]\r
- \r
+ StringTableIndex += 1\r
if GuidList != []:\r
Dict['GUID_TABLE_EMPTY'] = 'FALSE'\r
Dict['GUID_TABLE_SIZE'] = str(len(GuidList)) + 'U'\r
if Dict['SIZE_TABLE_CNAME'] == []:\r
Dict['SIZE_TABLE_CNAME'].append('')\r
Dict['SIZE_TABLE_GUID'].append('')\r
- Dict['SIZE_TABLE_CURRENT_LENGTH'].append('0U')\r
+ Dict['SIZE_TABLE_CURRENT_LENGTH'].append(['0U'])\r
Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append('0U')\r
\r
if NumberOfLocalTokens != 0:\r
if NumberOfSkuEnabledPcd != 0: \r
Dict['SKU_HEAD_SIZE'] = str(NumberOfSkuEnabledPcd) + 'U'\r
\r
- Dict['SKUID_VALUE'][0] = len(Dict['SKUID_VALUE'])\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
if NumberOfLocalTokens == 0:\r
\r
AutoGenC.Append(gPcdDatabaseAutoGenC.Replace(Dict))\r
\r
+\r
+# print Phase\r
Buffer = BuildExDataBase(Dict)\r
- return AutoGenH, AutoGenC, Buffer\r
+ return AutoGenH, AutoGenC, Buffer,VarCheckTab\r
+\r
+def GetOrderedDynamicPcdList(DynamicPcdList, PcdTokenNumberList):\r
+ ReorderedDyPcdList = [None for i in range(len(DynamicPcdList))]\r
+ for Pcd in DynamicPcdList:\r
+ if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) in PcdTokenNumberList:\r
+ ReorderedDyPcdList[PcdTokenNumberList[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]-1] = Pcd\r
+ return ReorderedDyPcdList\r
\r