]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/GenPcdDb.py
BaseTools: Fixed Pcd value override issue.
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenPcdDb.py
index e3ab0275011d4210ab5a44a79755e4d4b642b983..e2848e7aaf3760faaa0918f45ca57fec2c959982 100644 (file)
@@ -176,7 +176,8 @@ typedef struct {
   //GUID                  Signature;  // PcdDataBaseGuid\r
   //UINT32                BuildVersion;\r
   //UINT32                Length;\r
-  //SKU_ID                SystemSkuId;      // Current SkuId value.\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
@@ -188,7 +189,7 @@ typedef struct {
   //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
-  //UINT8                 Pad[2];\r
+  //UINT8                 Pad[6];\r
   ${PHASE}_PCD_DATABASE_INIT    Init;\r
   ${PHASE}_PCD_DATABASE_UNINIT  Uninit;\r
 } ${PHASE}_PCD_DATABASE;\r
@@ -767,7 +768,7 @@ def BuildExDataBase(Dict):
     # 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 = 76\r
+    FixedHeaderLen = 80\r
 \r
     # Get offset of SkuId table in the database \r
     SkuIdTableOffset = FixedHeaderLen\r
@@ -924,10 +925,11 @@ def BuildExDataBase(Dict):
  \r
     Buffer += b\r
     b = pack('=B', Pad)\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
     \r
     Index = 0\r
@@ -991,9 +993,13 @@ def CreatePcdDataBase(PcdDBData):
     databasebuff = PcdDBData[("DEFAULT","0")][0]\r
 \r
     for skuname,skuid in delta:\r
-        databasebuff += pack('=H', int(skuid))\r
-        databasebuff += pack('=H', 0)\r
-        databasebuff += pack('=L', 8+4*len(delta[(skuname,skuid)]))\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
@@ -1018,6 +1024,19 @@ def NewCreatePcdDatabasePhaseSpecificAutoGen(Platform,Phase):
     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 ['UINT8','UINT16','UINT32','UINT64']:\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
@@ -1077,9 +1096,8 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):
         'SYSTEM_SKU_ID_VALUE'           : '0U'\r
     }\r
     \r
-   \r
-    SkuObj = SkuClass(Platform.Platform.AvilableSkuIds, Platform.Platform.SkuIds)\r
-    Dict['SYSTEM_SKU_ID_VALUE'] = Platform.Platform.SkuIds[SkuObj.SystemSkuId][0]\r
+    SkuObj = Platform.Platform.SkuIdMgr\r
+    Dict['SYSTEM_SKU_ID_VALUE'] = 0 if SkuObj.SkuUsageType == SkuObj.SINGLE else Platform.Platform.SkuIds[SkuObj.SystemSkuId][0]\r
 \r
     Dict['PCD_INFO_FLAG'] = Platform.Platform.PcdInfoFlag\r
 \r
@@ -1166,12 +1184,6 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):
             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
@@ -1396,8 +1408,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):
                     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
@@ -1488,12 +1499,6 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):
             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