]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/FfsInfStatement.py
BaseTools/GenFds: permit stripped MM_CORE_STANDALONE binaries
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FfsInfStatement.py
index c332eee6079dbfb294c87bb199ff5acb43c77d17..d4c61c0749636a0e1375bd8a2c29c6112ab814e5 100644 (file)
 ##\r
 # Import Modules\r
 #\r
-import Rule\r
+from __future__ import absolute_import\r
+from . import Rule\r
 import Common.LongFilePathOs as os\r
-import StringIO\r
+from io import BytesIO\r
 from struct import *\r
-from GenFdsGlobalVariable import GenFdsGlobalVariable\r
-import Ffs\r
+from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
+from .Ffs import SectionSuffix,FdfFvFileTypeToFileType\r
 import subprocess\r
 import sys\r
-import Section\r
-import RuleSimpleFile\r
-import RuleComplexFile\r
+from . import Section\r
+from . import RuleSimpleFile\r
+from . import RuleComplexFile\r
 from CommonDataClass.FdfClass import FfsInfStatementClassObject\r
 from Common.MultipleWorkspace import MultipleWorkspace as mws\r
-from Common.String import *\r
+from Common.StringUtils import *\r
 from Common.Misc import PathClass\r
 from Common.Misc import GuidStructureByteArrayToGuidString\r
 from Common.Misc import ProcessDuplicatedInf\r
 from Common.Misc import GetVariableOffset\r
 from Common import EdkLogger\r
 from Common.BuildToolError import *\r
-from GuidSection import GuidSection\r
-from FvImageSection import FvImageSection\r
+from .GuidSection import GuidSection\r
+from .FvImageSection import FvImageSection\r
 from Common.Misc import PeImageClass\r
 from AutoGen.GenDepex import DependencyExpression\r
 from PatchPcdValue.PatchPcdValue import PatchBinaryFile\r
 from Common.LongFilePathSupport import CopyLongFilePath\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 import Common.GlobalData as GlobalData\r
-from DepexSection import DepexSection\r
+from .DepexSection import DepexSection\r
 from Common.Misc import SaveFileOnChange\r
 from Common.Expression import *\r
 from Common.DataType import *\r
@@ -225,7 +226,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
             EdkLogger.warn("GenFds", GENFDS_ERROR, "Module %s NOT found in DSC file; Is it really a binary module?" % (self.InfFileName))\r
 \r
         if self.ModuleType == SUP_MODULE_SMM_CORE and int(self.PiSpecVersion, 16) < 0x0001000A:\r
-            EdkLogger.error("GenFds", FORMAT_NOT_SUPPORTED, "SMM_CORE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x0001000A", File=self.InfFileName)      \r
+            EdkLogger.error("GenFds", FORMAT_NOT_SUPPORTED, "SMM_CORE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x0001000A", File=self.InfFileName)\r
 \r
         if self.ModuleType == SUP_MODULE_MM_CORE_STANDALONE and int(self.PiSpecVersion, 16) < 0x00010032:\r
             EdkLogger.error("GenFds", FORMAT_NOT_SUPPORTED, "MM_CORE_STANDALONE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x00010032", File=self.InfFileName)\r
@@ -293,7 +294,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
                 try:\r
                     Pcd.InfDefaultValue = ValueExpressionEx(Pcd.InfDefaultValue, Pcd.DatumType, Platform._GuidDict)(True)\r
                 except BadExpression:\r
-                    EdkLogger.error("GenFds", GENFDS_ERROR, 'PCD [%s.%s] Value "%s"' %(Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DefaultValue),File=self.InfFileName)\r
+                    EdkLogger.error("GenFds", GENFDS_ERROR, 'PCD [%s.%s] Value "%s"' %(Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DefaultValue), File=self.InfFileName)\r
 \r
             # Check value, if value are equal, no need to patch\r
             if Pcd.DatumType == TAB_VOID:\r
@@ -340,9 +341,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
         self.InfModule = Inf\r
         self.PcdIsDriver = Inf.PcdIsDriver\r
         self.IsBinaryModule = Inf.IsBinaryModule\r
-        Inf._GetDepex()\r
-        Inf._GetDepexExpression()\r
-        if len(Inf._Depex.data) > 0 and len(Inf._DepexExpression.data) > 0:\r
+        if len(Inf.Depex.data) > 0 and len(Inf.DepexExpression.data) > 0:\r
             self.Depex = True\r
 \r
         GenFdsGlobalVariable.VerboseLogger("BaseName : %s" % self.BaseName)\r
@@ -374,13 +373,13 @@ class FfsInfStatement(FfsInfStatementClassObject):
     def PatchEfiFile(self, EfiFile, FileType):\r
         #\r
         # If the module does not have any patches, then return path to input file\r
-        #  \r
+        #\r
         if not self.PatchPcds:\r
             return EfiFile\r
 \r
         #\r
         # Only patch file if FileType is PE32 or ModuleType is USER_DEFINED\r
-        #  \r
+        #\r
         if FileType != BINARY_FILE_TYPE_PE32 and self.ModuleType != SUP_MODULE_USER_DEFINED:\r
             return EfiFile\r
 \r
@@ -398,7 +397,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
 \r
         #\r
         # If a different file from the same module has already been patched, then generate an error\r
-        #  \r
+        #\r
         if self.PatchedBinFile:\r
             EdkLogger.error("GenFds", GENFDS_ERROR,\r
                             'Only one binary file can be patched:\n'\r
@@ -408,12 +407,12 @@ class FfsInfStatement(FfsInfStatementClassObject):
 \r
         #\r
         # Copy unpatched file contents to output file location to perform patching\r
-        #  \r
+        #\r
         CopyLongFilePath(EfiFile, Output)\r
 \r
         #\r
         # Apply patches to patched output file\r
-        #  \r
+        #\r
         for Pcd, Value in self.PatchPcds:\r
             RetVal, RetStr = PatchBinaryFile(Output, int(Pcd.Offset, 0), Pcd.DatumType, Value, Pcd.MaxDatumSize)\r
             if RetVal:\r
@@ -421,12 +420,12 @@ class FfsInfStatement(FfsInfStatementClassObject):
 \r
         #\r
         # Save the path of the patched output file\r
-        #  \r
+        #\r
         self.PatchedBinFile = Output\r
 \r
         #\r
         # Return path to patched output file\r
-        #  \r
+        #\r
         return Output\r
 \r
     ## GenFfs() method\r
@@ -446,16 +445,16 @@ class FfsInfStatement(FfsInfStatementClassObject):
 \r
         self.__InfParse__(Dict)\r
         Arch = self.GetCurrentArch()\r
-        SrcFile = mws.join( GenFdsGlobalVariable.WorkSpaceDir , self.InfFileName);\r
+        SrcFile = mws.join( GenFdsGlobalVariable.WorkSpaceDir, self.InfFileName);\r
         DestFile = os.path.join( self.OutputPath, self.ModuleGuid + '.ffs')\r
-        \r
+\r
         SrcFileDir = "."\r
         SrcPath = os.path.dirname(SrcFile)\r
         SrcFileName = os.path.basename(SrcFile)\r
-        SrcFileBase, SrcFileExt = os.path.splitext(SrcFileName)   \r
+        SrcFileBase, SrcFileExt = os.path.splitext(SrcFileName)\r
         DestPath = os.path.dirname(DestFile)\r
         DestFileName = os.path.basename(DestFile)\r
-        DestFileBase, DestFileExt = os.path.splitext(DestFileName)   \r
+        DestFileBase, DestFileExt = os.path.splitext(DestFileName)\r
         self.MacroDict = {\r
             # source file\r
             "${src}"      :   SrcFile,\r
@@ -473,7 +472,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
         }\r
         #\r
         # Allow binary type module not specify override rule in FDF file.\r
-        # \r
+        #\r
         if len(self.BinFileList) > 0:\r
             if self.Rule is None or self.Rule == "":\r
                 self.Rule = "BINARY"\r
@@ -534,7 +533,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
             '$(NAMED_GUID)'  : self.ModuleGuid\r
         }\r
         String = GenFdsGlobalVariable.MacroExtend(String, MacroDict)\r
-        String = GenFdsGlobalVariable.MacroExtend(String, self.MacroDict)        \r
+        String = GenFdsGlobalVariable.MacroExtend(String, self.MacroDict)\r
         return String\r
 \r
     ## __GetRule__() method\r
@@ -694,13 +693,13 @@ class FfsInfStatement(FfsInfStatementClassObject):
             Arch = self.CurrentArch\r
 \r
         OutputPath = os.path.join(GenFdsGlobalVariable.OutputDirDict[Arch],\r
-                                  Arch ,\r
+                                  Arch,\r
                                   ModulePath,\r
                                   FileName,\r
                                   'OUTPUT'\r
                                   )\r
         DebugPath = os.path.join(GenFdsGlobalVariable.OutputDirDict[Arch],\r
-                                  Arch ,\r
+                                  Arch,\r
                                   ModulePath,\r
                                   FileName,\r
                                   'DEBUG'\r
@@ -761,7 +760,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
 \r
                 SecNum = '%d' %Index\r
                 GenSecOutputFile= self.__ExtendMacro__(Rule.NameGuid) + \\r
-                              Ffs.Ffs.SectionSuffix[SectionType] + SUP_MODULE_SEC + SecNum\r
+                              SectionSuffix[SectionType] + SUP_MODULE_SEC + SecNum\r
                 Index = Index + 1\r
                 OutputFile = os.path.join(self.OutputPath, GenSecOutputFile)\r
                 File = GenFdsGlobalVariable.MacroExtend(File, Dict, self.CurrentArch)\r
@@ -804,7 +803,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
         else:\r
             SecNum = '%d' %Index\r
             GenSecOutputFile= self.__ExtendMacro__(Rule.NameGuid) + \\r
-                              Ffs.Ffs.SectionSuffix[SectionType] + SUP_MODULE_SEC + SecNum\r
+                              SectionSuffix[SectionType] + SUP_MODULE_SEC + SecNum\r
             OutputFile = os.path.join(self.OutputPath, GenSecOutputFile)\r
             GenSecInputFile = GenFdsGlobalVariable.MacroExtend(GenSecInputFile, Dict, self.CurrentArch)\r
 \r
@@ -883,7 +882,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
             self.ModuleGuid = RegistryGuidStr\r
 \r
             GenFdsGlobalVariable.GenerateFfs(FfsOutput, InputSection,\r
-                                             Ffs.Ffs.FdfFvFileTypeToFileType[Rule.FvFileType],\r
+                                             FdfFvFileTypeToFileType[Rule.FvFileType],\r
                                              self.ModuleGuid, Fixed=Rule.Fixed,\r
                                              CheckSum=Rule.CheckSum, Align=Rule.Alignment,\r
                                              SectionAlign=SectionAlignments,\r
@@ -902,7 +901,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
     #   @retval string       File name of the generated section file\r
     #\r
     def __GenComplexFileSection__(self, Rule, FvChildAddr, FvParentAddr, IsMakefile = False):\r
-        if self.ModuleType in (SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM):\r
+        if self.ModuleType in (SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, SUP_MODULE_MM_CORE_STANDALONE):\r
             if Rule.KeepReloc is not None:\r
                 self.KeepRelocFromRule = Rule.KeepReloc\r
         SectFiles = []\r
@@ -960,14 +959,14 @@ class FfsInfStatement(FfsInfStatementClassObject):
                     Sect.FvAddr = FvChildAddr\r
             if FvParentAddr is not None and isinstance(Sect, GuidSection):\r
                 Sect.FvParentAddr = FvParentAddr\r
-            \r
+\r
             if Rule.KeyStringList != []:\r
-                SectList, Align = Sect.GenSection(self.OutputPath , self.ModuleGuid, SecIndex, Rule.KeyStringList, self, IsMakefile = IsMakefile)\r
+                SectList, Align = Sect.GenSection(self.OutputPath, self.ModuleGuid, SecIndex, Rule.KeyStringList, self, IsMakefile = IsMakefile)\r
             else :\r
-                SectList, Align = Sect.GenSection(self.OutputPath , self.ModuleGuid, SecIndex, self.KeyStringList, self, IsMakefile = IsMakefile)\r
-            \r
+                SectList, Align = Sect.GenSection(self.OutputPath, self.ModuleGuid, SecIndex, self.KeyStringList, self, IsMakefile = IsMakefile)\r
+\r
             if not HasGeneratedFlag:\r
-                UniVfrOffsetFileSection = ""    \r
+                UniVfrOffsetFileSection = ""\r
                 ModuleFileName = mws.join(GenFdsGlobalVariable.WorkSpaceDir, self.InfFileName)\r
                 InfData = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(ModuleFileName), self.CurrentArch]\r
                 #\r
@@ -978,16 +977,16 @@ class FfsInfStatement(FfsInfStatementClassObject):
                 for SourceFile in InfData.Sources:\r
                     if SourceFile.Type.upper() == ".VFR" :\r
                         #\r
-                        # search the .map file to find the offset of vfr binary in the PE32+/TE file. \r
+                        # search the .map file to find the offset of vfr binary in the PE32+/TE file.\r
                         #\r
                         VfrUniBaseName[SourceFile.BaseName] = (SourceFile.BaseName + "Bin")\r
                     if SourceFile.Type.upper() == ".UNI" :\r
                         #\r
-                        # search the .map file to find the offset of Uni strings binary in the PE32+/TE file. \r
+                        # search the .map file to find the offset of Uni strings binary in the PE32+/TE file.\r
                         #\r
                         VfrUniBaseName["UniOffsetName"] = (self.BaseName + "Strings")\r
-                    \r
-                \r
+\r
+\r
                 if len(VfrUniBaseName) > 0:\r
                     if IsMakefile:\r
                         if InfData.BuildType != 'UEFI_HII':\r
@@ -1023,7 +1022,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
                     if UniVfrOffsetFileSection:\r
                         SectList.append(UniVfrOffsetFileSection)\r
                         HasGeneratedFlag = True\r
-                \r
+\r
             for SecName in  SectList :\r
                 SectFiles.append(SecName)\r
                 SectAlignments.append(Align)\r
@@ -1056,7 +1055,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
 \r
         FfsOutput = os.path.join( self.OutputPath, self.ModuleGuid + '.ffs')\r
         GenFdsGlobalVariable.GenerateFfs(FfsOutput, InputFile,\r
-                                             Ffs.Ffs.FdfFvFileTypeToFileType[Rule.FvFileType],\r
+                                             FdfFvFileTypeToFileType[Rule.FvFileType],\r
                                              self.ModuleGuid, Fixed=Rule.Fixed,\r
                                              CheckSum=Rule.CheckSum, Align=Rule.Alignment,\r
                                              SectionAlign=Alignments,\r
@@ -1071,12 +1070,12 @@ class FfsInfStatement(FfsInfStatementClassObject):
     #   @param  self                  The object pointer\r
     #   @param  VfrUniBaseName        A name list contain the UNI/INF object name.\r
     #   @retval RetValue              A list contain offset of UNI/INF object.\r
-    #    \r
+    #\r
     def __GetBuildOutputMapFileVfrUniInfo(self, VfrUniBaseName):\r
         MapFileName = os.path.join(self.EfiOutputPath, self.BaseName + ".map")\r
         EfiFileName = os.path.join(self.EfiOutputPath, self.BaseName + ".efi")\r
         return GetVariableOffset(MapFileName, EfiFileName, VfrUniBaseName.values())\r
-    \r
+\r
     ## __GenUniVfrOffsetFile() method\r
     #\r
     #   Generate the offset file for the module which contain VFR or UNI file.\r
@@ -1088,8 +1087,8 @@ class FfsInfStatement(FfsInfStatementClassObject):
     def __GenUniVfrOffsetFile(VfrUniOffsetList, UniVfrOffsetFileName):\r
 \r
         # Use a instance of StringIO to cache data\r
-        fStringIO = StringIO.StringIO('')  \r
-        \r
+        fStringIO = BytesIO('')\r
+\r
         for Item in VfrUniOffsetList:\r
             if (Item[0].find("Strings") != -1):\r
                 #\r
@@ -1099,7 +1098,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
                 #\r
                 UniGuid = [0xe0, 0xc5, 0x13, 0x89, 0xf6, 0x33, 0x86, 0x4d, 0x9b, 0xf1, 0x43, 0xef, 0x89, 0xfc, 0x6, 0x66]\r
                 UniGuid = [chr(ItemGuid) for ItemGuid in UniGuid]\r
-                fStringIO.write(''.join(UniGuid))            \r
+                fStringIO.write(''.join(UniGuid))\r
                 UniValue = pack ('Q', int (Item[1], 16))\r
                 fStringIO.write (UniValue)\r
             else:\r
@@ -1110,19 +1109,19 @@ class FfsInfStatement(FfsInfStatementClassObject):
                 #\r
                 VfrGuid = [0xb4, 0x7c, 0xbc, 0xd0, 0x47, 0x6a, 0x5f, 0x49, 0xaa, 0x11, 0x71, 0x7, 0x46, 0xda, 0x6, 0xa2]\r
                 VfrGuid = [chr(ItemGuid) for ItemGuid in VfrGuid]\r
-                fStringIO.write(''.join(VfrGuid))                   \r
-                type (Item[1]) \r
+                fStringIO.write(''.join(VfrGuid))\r
+                type (Item[1])\r
                 VfrValue = pack ('Q', int (Item[1], 16))\r
                 fStringIO.write (VfrValue)\r
-            \r
+\r
         #\r
         # write data into file.\r
         #\r
         try :\r
             SaveFileOnChange(UniVfrOffsetFileName, fStringIO.getvalue())\r
         except:\r
-            EdkLogger.error("GenFds", FILE_WRITE_FAILURE, "Write data to file %s failed, please check whether the file been locked or using by other applications." %UniVfrOffsetFileName,None)\r
-        \r
+            EdkLogger.error("GenFds", FILE_WRITE_FAILURE, "Write data to file %s failed, please check whether the file been locked or using by other applications." %UniVfrOffsetFileName, None)\r
+\r
         fStringIO.close ()\r
 \r
-        \r
+\r