]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/GenPcdDb.py
BaseTools/AutoGen: Remove redundant copy action for binary module
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenPcdDb.py
index 08719fa733a462bd0528b0e0fcceab13b76a2d2a..289a6ff841e58b5c92863193ed1da770a787de82 100644 (file)
@@ -528,13 +528,20 @@ class DbSizeTableItemList (DbItemList):
         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
@@ -732,7 +739,7 @@ def BuildExDataBase(Dict):
     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
@@ -812,7 +819,7 @@ def BuildExDataBase(Dict):
         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
@@ -829,7 +836,7 @@ def BuildExDataBase(Dict):
         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
@@ -842,6 +849,7 @@ def BuildExDataBase(Dict):
 \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
@@ -853,7 +861,9 @@ def BuildExDataBase(Dict):
                 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
@@ -995,10 +1005,6 @@ def CreatePcdDatabaseCode (Info, AutoGenC, AutoGenH):
     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
@@ -1094,6 +1100,8 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     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
@@ -1105,6 +1113,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     GuidList = []\r
     i = 0\r
     for Pcd in Platform.DynamicPcdList:\r
+        VoidStarTypeCurrSize = []\r
         i += 1\r
         CName = Pcd.TokenCName\r
         TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
@@ -1156,6 +1165,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         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
@@ -1171,27 +1181,36 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             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
@@ -1246,7 +1265,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                     # 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
@@ -1256,11 +1275,8 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                 # 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
@@ -1278,29 +1294,36 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                     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
@@ -1326,8 +1349,14 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                 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
@@ -1352,6 +1381,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             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
@@ -1405,11 +1435,12 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             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
@@ -1427,6 +1458,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         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
@@ -1475,13 +1507,13 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             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
@@ -1501,7 +1533,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     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
@@ -1524,7 +1556,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     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