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
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
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
+ SkuIndexIndexTable[i] = SkuIndexIndexTable[i-1]+Dict['SKU_INDEX_VALUE'][i-1][0] + 1\r
for (LocalTokenNumberTableIndex, (Offset, Table)) in enumerate(LocalTokenNumberTable):\r
DbIndex = 0\r
DbOffset = FixedHeaderLen\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
+ SkuIndexTabalOffset = SkuIdTableOffset + Dict['SKUID_VALUE'][0] + 1\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
\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
DbIndex = 0\r
DbOffset += DbItemTotal[DbIndex].GetListSize()\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
DbFile.write(PcdDbBuffer)\r
Changed = SaveFileOnChange(DbFileName, DbFile.getvalue(), True)\r
\r
-\r
-def CArrayToArray(carray):\r
- return "{%s, 0x00}" % ", ".join(["0x%02x" % ord(C) for C in carray])\r
-\r
## Create PCD database in DXE or PEI phase\r
#\r
# @param Platform The platform object\r
Dict['PCD_TOKENSPACE_MAP'] = []\r
Dict['PCD_NAME_OFFSET'] = []\r
\r
+ PCD_STRING_INDEX_MAP = {}\r
+ \r
StringTableIndex = 0\r
StringTableSize = 0\r
NumberOfLocalTokens = 0\r
GuidList = []\r
i = 0\r
for Pcd in Platform.DynamicPcdList:\r
+ VoidStarTypeCurrSize = []\r
i += 1\r
CName = Pcd.TokenCName\r
TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\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 len(Sku.VariableName) > 0:\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
- if VariableNameStructure not in Dict['STRING_TABLE_VALUE']:\r
- Dict['STRING_TABLE_CNAME'].append(CName)\r
- Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)\r
- if StringTableIndex == 0:\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
- Dict['STRING_TABLE_VALUE'].append(VariableNameStructure)\r
- StringTableIndex += 1\r
- StringTableSize += (len(Sku.VariableName) - 3 + 1) * 2\r
- VariableHeadStringIndex = 0\r
- for Index in range(Dict['STRING_TABLE_VALUE'].index(VariableNameStructure)):\r
- VariableHeadStringIndex += Dict['STRING_TABLE_LENGTH'][Index]\r
-\r
+ # Store all variable names of one HII PCD under different SKU to stringTable\r
+ # and calculate the VariableHeadStringIndex\r
+ if SkuIdIndex - 2 == 0:\r
+ for SkuName in Pcd.SkuInfoList:\r
+ SkuInfo = Pcd.SkuInfoList[SkuName]\r
+ if SkuInfo.SkuId == None or SkuInfo.SkuId == '':\r
+ continue\r
+ VariableNameStructure = StringToArray(SkuInfo.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
+ if StringTableIndex == 0:\r
+ Dict['STRING_TABLE_INDEX'].append('')\r
+ else:\r
+ Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)\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(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
+ 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
# 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])\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
- Size = len(Sku.DefaultValue) - 2 + 1\r
- Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue))\r
+ DefaultValueBinStructure = StringToArray(Sku.DefaultValue)\r
+ Size = len(Sku.DefaultValue) -2 + 1\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
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
- SkuIndexTableTmp[0] = len(SkuIndexTableTmp)\r
+ \r
+ SkuIndexTableTmp[0] = len(SkuIndexTableTmp) - 1\r
if len(Pcd.SkuInfoList) > 1:\r
Dict['SKU_INDEX_VALUE'].append(SkuIndexTableTmp) \r
\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
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
+ Dict['SKUID_VALUE'][0] = len(Dict['SKUID_VALUE']) - 1\r
\r
AutoGenH.Append(gPcdDatabaseAutoGenH.Replace(Dict))\r
if NumberOfLocalTokens == 0:\r