]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/AutoGen.py
BaseTools: report warning if VOID* PCD with {} value is not 8-byte aligned
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / AutoGen.py
index cf0b4466f9925f563a8e927fcf76d2477d602248..05ce72bd914e53091d5dd162a834faac45146002 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Generate AutoGen.h, AutoGen.c and *.depex files\r
 #\r
-# Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 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
@@ -317,6 +317,12 @@ class WorkspaceAutoGen(AutoGen):
             GlobalData.gFdfParser = Fdf\r
             GlobalData.gAutoGenPhase = False\r
             PcdSet = Fdf.Profile.PcdDict\r
+            if Fdf.CurrentFdName and Fdf.CurrentFdName in Fdf.Profile.FdDict:\r
+                FdDict = Fdf.Profile.FdDict[Fdf.CurrentFdName]\r
+                for FdRegion in FdDict.RegionList:\r
+                    if str(FdRegion.RegionType) is 'FILE' and self.Platform.VpdToolGuid in str(FdRegion.RegionDataList):\r
+                        if int(FdRegion.Offset) % 8 != 0:\r
+                            EdkLogger.error("build", FORMAT_INVALID, 'The VPD Base Address %s must be 8-byte aligned.' % (FdRegion.Offset))\r
             ModuleList = Fdf.Profile.InfList\r
             self.FdfProfile = Fdf.Profile\r
             for fvname in self.FvTargetList:\r
@@ -1138,6 +1144,28 @@ class PlatformAutoGen(AutoGen):
                     Pcd = VpdPcdDict[PcdKey]\r
                     for (SkuName,Sku) in Pcd.SkuInfoList.items():\r
                         Sku.VpdOffset = Sku.VpdOffset.strip()\r
+                        PcdValue = Sku.DefaultValue\r
+                        if PcdValue == "":\r
+                            PcdValue  = Pcd.DefaultValue\r
+                        if Sku.VpdOffset != '*':\r
+                            if PcdValue.startswith("{"):\r
+                                Alignment = 8\r
+                            elif PcdValue.startswith("L"):\r
+                                Alignment = 2\r
+                            else:\r
+                                Alignment = 1\r
+                            try:\r
+                                VpdOffset = int(Sku.VpdOffset)\r
+                            except:\r
+                                try:\r
+                                    VpdOffset = int(Sku.VpdOffset, 16)\r
+                                except:\r
+                                    EdkLogger.error("build", FORMAT_INVALID, "Invalid offset value %s for PCD %s.%s." % (Sku.VpdOffset, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
+                            if VpdOffset % Alignment != 0:\r
+                                if PcdValue.startswith("{"):\r
+                                    EdkLogger.warn("build", "The offset value of PCD %s.%s is not 8-byte aligned!" %(Pcd.TokenSpaceGuidCName, Pcd.TokenCName), File=self.MetaFile)\r
+                                else:\r
+                                    EdkLogger.error("build", FORMAT_INVALID, 'The offset value of PCD %s.%s should be %s-byte aligned.' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Alignment))\r
                         VpdFile.Add(Pcd, Sku.VpdOffset)\r
                         # if the offset of a VPD is *, then it need to be fixed up by third party tool.\r
                         if not NeedProcessVpdMapFile and Sku.VpdOffset == "*":\r
@@ -1193,6 +1221,27 @@ class PlatformAutoGen(AutoGen):
 #                                Sku = DscPcdEntry.SkuInfoList[DscPcdEntry.SkuInfoList.keys()[0]]\r
                                 Sku.VpdOffset = Sku.VpdOffset.strip()\r
                                 PcdValue = Sku.DefaultValue\r
+                                if PcdValue == "":\r
+                                    PcdValue  = DscPcdEntry.DefaultValue\r
+                                if Sku.VpdOffset != '*':\r
+                                    if PcdValue.startswith("{"):\r
+                                        Alignment = 8\r
+                                    elif PcdValue.startswith("L"):\r
+                                        Alignment = 2\r
+                                    else:\r
+                                        Alignment = 1\r
+                                    try:\r
+                                        VpdOffset = int(Sku.VpdOffset)\r
+                                    except:\r
+                                        try:\r
+                                            VpdOffset = int(Sku.VpdOffset, 16)\r
+                                        except:\r
+                                            EdkLogger.error("build", FORMAT_INVALID, "Invalid offset value %s for PCD %s.%s." % (Sku.VpdOffset, DscPcdEntry.TokenSpaceGuidCName, DscPcdEntry.TokenCName))\r
+                                    if VpdOffset % Alignment != 0:\r
+                                        if PcdValue.startswith("{"):\r
+                                            EdkLogger.warn("build", "The offset value of PCD %s.%s is not 8-byte aligned!" %(DscPcdEntry.TokenSpaceGuidCName, DscPcdEntry.TokenCName), File=self.MetaFile)\r
+                                        else:\r
+                                            EdkLogger.error("build", FORMAT_INVALID, 'The offset value of PCD %s.%s should be %s-byte aligned.' % (DscPcdEntry.TokenSpaceGuidCName, DscPcdEntry.TokenCName, Alignment))\r
                                 VpdFile.Add(DscPcdEntry, Sku.VpdOffset)\r
                                 if not NeedProcessVpdMapFile and Sku.VpdOffset == "*":\r
                                     NeedProcessVpdMapFile = True \r
@@ -1213,7 +1262,6 @@ class PlatformAutoGen(AutoGen):
                                 "Fail to get FLASH_DEFINITION definition in DSC file %s which is required when DSC contains VPD PCD." % str(self.Platform.MetaFile))\r
 \r
             if VpdFile.GetCount() != 0:\r
-                DscTimeStamp = self.Platform.MetaFile.TimeStamp\r
                 FvPath = os.path.join(self.BuildDir, "FV")\r
                 if not os.path.exists(FvPath):\r
                     try:\r
@@ -1221,13 +1269,9 @@ class PlatformAutoGen(AutoGen):
                     except:\r
                         EdkLogger.error("build", FILE_WRITE_FAILURE, "Fail to create FV folder under %s" % self.BuildDir)\r
 \r
-\r
                 VpdFilePath = os.path.join(FvPath, "%s.txt" % self.Platform.VpdToolGuid)\r
 \r
-\r
-                if not os.path.exists(VpdFilePath) or os.path.getmtime(VpdFilePath) < DscTimeStamp:\r
-                    VpdFile.Write(VpdFilePath)\r
-\r
+                if VpdFile.Write(VpdFilePath):\r
                     # retrieve BPDG tool's path from tool_def.txt according to VPD_TOOL_GUID defined in DSC file.\r
                     BPDGToolName = None\r
                     for ToolDef in self.ToolDefinition.values():\r
@@ -2724,7 +2768,7 @@ class ModuleAutoGen(AutoGen):
         Order_Dict = {}\r
         self._GetModuleBuildOption()\r
         for SingleFile in FileList:\r
-            if self.BuildRuleOrder and SingleFile.Ext in self.BuildRuleOrder:\r
+            if self.BuildRuleOrder and SingleFile.Ext in self.BuildRuleOrder and SingleFile.Ext in self.BuildRules:\r
                 key = SingleFile.Path.split(SingleFile.Ext)[0]\r
                 if key in Order_Dict:\r
                     Order_Dict[key].append(SingleFile.Ext)\r