]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/GenPcdDb.py
BaseTools: add new command line option to support override PCD value
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenPcdDb.py
index e995e141da7a44be4ea71aec043252f37c8c8d65..76d1254e72ed5d50dcdab50bff677c57f16b7c90 100644 (file)
@@ -1,7 +1,7 @@
 ## @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
@@ -14,8 +14,12 @@ from StringIO import StringIO
 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
@@ -444,7 +448,7 @@ class DbVariableTableItemList (DbComItemList):
             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
@@ -452,7 +456,10 @@ class DbVariableTableItemList (DbComItemList):
                                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
@@ -712,7 +719,7 @@ def BuildExDataBase(Dict):
     # 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
@@ -777,11 +784,11 @@ def BuildExDataBase(Dict):
  \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
@@ -829,6 +836,9 @@ def BuildExDataBase(Dict):
                 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
@@ -852,7 +862,7 @@ def BuildExDataBase(Dict):
     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
@@ -860,6 +870,9 @@ def BuildExDataBase(Dict):
                     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
@@ -867,8 +880,8 @@ def BuildExDataBase(Dict):
             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
@@ -901,6 +914,8 @@ def BuildExDataBase(Dict):
     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
@@ -970,6 +985,10 @@ def BuildExDataBase(Dict):
         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
@@ -1039,7 +1058,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     }\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
@@ -1113,6 +1132,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     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
@@ -1121,6 +1141,12 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         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
@@ -1182,6 +1208,29 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
             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
@@ -1215,8 +1264,6 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                         \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
@@ -1268,7 +1315,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, Sku.VariableAttribute])\r
 \r
             elif Sku.VpdOffset != '':\r
                 Pcd.TokenTypeList += ['PCD_TYPE_VPD']\r
@@ -1302,7 +1349,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                         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
@@ -1334,7 +1381,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                         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
@@ -1414,6 +1461,11 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
         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
@@ -1563,6 +1615,9 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
     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
@@ -1600,6 +1655,9 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
                 \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