]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/FfsInfStatement.py
Sync EDKII BaseTools to BaseTools project r1903.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FfsInfStatement.py
index ac13e4d7d97adc1b83c3ebf834383babab4ae64c..b00e5a21788410fdebc19dfe2c99b5985e5f5cdf 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # process FFS generation from INF statement\r
 #\r
-#  Copyright (c) 2007, Intel Corporation\r
+#  Copyright (c) 2007 - 2010, Intel Corporation\r
 #\r
 #  All rights reserved. This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
@@ -31,6 +31,9 @@ from Common.Misc import PathClass
 from Common.Misc import GuidStructureByteArrayToGuidString\r
 from Common import EdkLogger\r
 from Common.BuildToolError import *\r
+from GuidSection import GuidSection\r
+from FvImageSection import FvImageSection\r
+from Common.Misc import PeImageClass\r
 \r
 ## generate FFS from INF\r
 #\r
@@ -90,7 +93,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
             self.BaseName = Inf.BaseName\r
             self.ModuleGuid = Inf.Guid\r
             self.ModuleType = Inf.ModuleType\r
-            if Inf.Specification != None and 'PI_SPECIFICATION_VERSION' in Inf.Specification:
+            if Inf.Specification != None and 'PI_SPECIFICATION_VERSION' in Inf.Specification:\r
                 self.PiSpecVersion = Inf.Specification['PI_SPECIFICATION_VERSION']\r
             if Inf.AutoGenVersion < 0x00010005:\r
                 self.ModuleType = Inf.ComponentType\r
@@ -105,7 +108,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
             self.BaseName = Inf.BaseName\r
             self.ModuleGuid = Inf.Guid\r
             self.ModuleType = Inf.ModuleType\r
-            if Inf.Specification != None and 'PI_SPECIFICATION_VERSION' in Inf.Specification:
+            if Inf.Specification != None and 'PI_SPECIFICATION_VERSION' in Inf.Specification:\r
                 self.PiSpecVersion = Inf.Specification['PI_SPECIFICATION_VERSION']\r
             self.VersionString = Inf.Version\r
             self.BinFileList = Inf.Binaries\r
@@ -118,7 +121,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
         if len(self.SourceFileList) != 0 and not self.InDsc:\r
             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 == 'SMM_CORE' and self.PiSpecVersion < 0x0001000A:
+        if self.ModuleType == 'SMM_CORE' and self.PiSpecVersion < 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
 \r
         if Inf._Defs != None and len(Inf._Defs) > 0:\r
@@ -146,11 +149,13 @@ class FfsInfStatement(FfsInfStatementClassObject):
     #\r
     #   Generate FFS\r
     #\r
-    #   @param  self        The object pointer\r
-    #   @param  Dict        dictionary contains macro and value pair\r
-    #   @retval string      Generated FFS file name\r
+    #   @param  self         The object pointer\r
+    #   @param  Dict         dictionary contains macro and value pair\r
+    #   @param  FvChildAddr  Array of the inside FvImage base address\r
+    #   @param  FvParentAddr Parent Fv base address\r
+    #   @retval string       Generated FFS file name\r
     #\r
-    def GenFfs(self, Dict = {}):\r
+    def GenFfs(self, Dict = {}, FvChildAddr = [], FvParentAddr=None):\r
         #\r
         # Parse Inf file get Module related information\r
         #\r
@@ -184,7 +189,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
         # For Rule has ComplexFile\r
         #\r
         elif isinstance(Rule, RuleComplexFile.RuleComplexFile):\r
-            InputSectList, InputSectAlignments = self.__GenComplexFileSection__(Rule)\r
+            InputSectList, InputSectAlignments = self.__GenComplexFileSection__(Rule, FvChildAddr, FvParentAddr)\r
             FfsOutput = self.__GenComplexFileFfs__(Rule, InputSectList, InputSectAlignments)\r
 \r
             return FfsOutput\r
@@ -393,8 +398,13 @@ class FfsInfStatement(FfsInfStatementClassObject):
         #\r
         FileList = []\r
         OutputFileList = []\r
+        GenSecInputFile = None\r
         if Rule.FileName != None:\r
             GenSecInputFile = self.__ExtendMacro__(Rule.FileName)\r
+            if os.path.isabs(GenSecInputFile):
+                GenSecInputFile = os.path.normpath(GenSecInputFile)
+            else:
+                GenSecInputFile = os.path.normpath(os.path.join(self.EfiOutputPath, GenSecInputFile))\r
         else:\r
             FileList, IsSect = Section.Section.GetFileList(self, '', Rule.FileExtension)\r
 \r
@@ -429,6 +439,15 @@ class FfsInfStatement(FfsInfStatementClassObject):
                               Ffs.Ffs.SectionSuffix[SectionType] + 'SEC' + SecNum\r
                 Index = Index + 1\r
                 OutputFile = os.path.join(self.OutputPath, GenSecOutputFile)\r
+                File = GenFdsGlobalVariable.MacroExtend(File, Dict, self.CurrentArch)\r
+\r
+                #Get PE Section alignment when align is set to AUTO\r
+                if self.Alignment == 'Auto' and (SectionType == 'PE32' or SectionType == 'TE'):\r
+                    ImageObj = PeImageClass (File)\r
+                    if ImageObj.SectionAlignment < 0x400:\r
+                        self.Alignment = str (ImageObj.SectionAlignment)\r
+                    else:\r
+                        self.Alignment = str (ImageObj.SectionAlignment / 0x400) + 'K'\r
 \r
                 if not NoStrip:\r
                     FileBeforeStrip = os.path.join(self.OutputPath, ModuleName + '.reloc')\r
@@ -438,7 +457,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
                     StrippedFile = os.path.join(self.OutputPath, ModuleName + '.stipped')\r
                     GenFdsGlobalVariable.GenerateFirmwareImage(\r
                                             StrippedFile,\r
-                                            [GenFdsGlobalVariable.MacroExtend(File, Dict, self.CurrentArch)],\r
+                                            [File],\r
                                             Strip=True\r
                                             )\r
                     File = StrippedFile\r
@@ -447,7 +466,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
                     TeFile = os.path.join( self.OutputPath, self.ModuleGuid + 'Te.raw')\r
                     GenFdsGlobalVariable.GenerateFirmwareImage(\r
                                             TeFile,\r
-                                            [GenFdsGlobalVariable.MacroExtend(File, Dict, self.CurrentArch)],\r
+                                            [File],\r
                                             Type='te'\r
                                             )\r
                     File = TeFile\r
@@ -459,6 +478,15 @@ class FfsInfStatement(FfsInfStatementClassObject):
             GenSecOutputFile= self.__ExtendMacro__(Rule.NameGuid) + \\r
                               Ffs.Ffs.SectionSuffix[SectionType] + 'SEC' + SecNum\r
             OutputFile = os.path.join(self.OutputPath, GenSecOutputFile)\r
+            GenSecInputFile = GenFdsGlobalVariable.MacroExtend(GenSecInputFile, Dict, self.CurrentArch)\r
+\r
+            #Get PE Section alignment when align is set to AUTO\r
+            if self.Alignment == 'Auto' and (SectionType == 'PE32' or SectionType == 'TE'):\r
+                ImageObj = PeImageClass (GenSecInputFile)\r
+                if ImageObj.SectionAlignment < 0x400:\r
+                    self.Alignment = str (ImageObj.SectionAlignment)\r
+                else:\r
+                    self.Alignment = str (ImageObj.SectionAlignment / 0x400) + 'K'\r
 \r
             if not NoStrip:\r
                 FileBeforeStrip = os.path.join(self.OutputPath, ModuleName + '.reloc')\r
@@ -468,7 +496,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
                 StrippedFile = os.path.join(self.OutputPath, ModuleName + '.stipped')\r
                 GenFdsGlobalVariable.GenerateFirmwareImage(\r
                                         StrippedFile,\r
-                                        [GenFdsGlobalVariable.MacroExtend(GenSecInputFile, Dict, self.CurrentArch)],\r
+                                        [GenSecInputFile],\r
                                         Strip=True\r
                                         )\r
                 GenSecInputFile = StrippedFile\r
@@ -477,7 +505,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
                 TeFile = os.path.join( self.OutputPath, self.ModuleGuid + 'Te.raw')\r
                 GenFdsGlobalVariable.GenerateFirmwareImage(\r
                                         TeFile,\r
-                                        [GenFdsGlobalVariable.MacroExtend(File, Dict, self.CurrentArch)],\r
+                                        [GenSecInputFile],\r
                                         Type='te'\r
                                         )\r
                 GenSecInputFile = TeFile\r
@@ -507,7 +535,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
         SectionAlignments = []\r
         for InputFile in InputFileList:\r
             InputSection.append(InputFile)\r
-            SectionAlignments.append(Rule.Alignment)\r
+            SectionAlignments.append(Rule.SectAlignment)\r
 \r
         if Rule.NameGuid != None and Rule.NameGuid.startswith('PCD('):\r
             PcdValue = GenFdsGlobalVariable.GetPcdValue(Rule.NameGuid)\r
@@ -534,11 +562,13 @@ class FfsInfStatement(FfsInfStatementClassObject):
     #\r
     #   Generate section by sections in Rule\r
     #\r
-    #   @param  self        The object pointer\r
-    #   @param  Rule        The rule object used to generate section\r
-    #   @retval string      File name of the generated section file\r
+    #   @param  self         The object pointer\r
+    #   @param  Rule         The rule object used to generate section\r
+    #   @param  FvChildAddr  Array of the inside FvImage base address\r
+    #   @param  FvParentAddr Parent Fv base address\r
+    #   @retval string       File name of the generated section file\r
     #\r
-    def __GenComplexFileSection__(self, Rule):\r
+    def __GenComplexFileSection__(self, Rule, FvChildAddr, FvParentAddr):\r
         if self.ModuleType in ('SEC', 'PEI_CORE', 'PEIM'):\r
             if Rule.KeepReloc != None:\r
                 self.KeepRelocFromRule = Rule.KeepReloc\r
@@ -560,6 +590,17 @@ class FfsInfStatement(FfsInfStatementClassObject):
             if self.ModuleType == 'DXE_SMM_DRIVER' and self.PiSpecVersion < 0x0001000A:\r
                 if Sect.SectionType == 'SMM_DEPEX':\r
                     EdkLogger.error("GenFds", FORMAT_NOT_SUPPORTED, "Framework SMM module doesn't support SMM_DEPEX section type", File=self.InfFileName)\r
+            #\r
+            # process the inside FvImage from FvSection or GuidSection\r
+            #\r
+            if FvChildAddr != []:\r
+                if isinstance(Sect, FvImageSection):\r
+                    Sect.FvAddr = FvChildAddr.pop(0)\r
+                elif isinstance(Sect, GuidSection):\r
+                    Sect.FvAddr = FvChildAddr\r
+            if FvParentAddr != None and isinstance(Sect, GuidSection):\r
+                Sect.FvParentAddr = FvParentAddr\r
+            \r
             if Rule.KeyStringList != []:\r
                 SectList, Align = Sect.GenSection(self.OutputPath , self.ModuleGuid, SecIndex, Rule.KeyStringList, self)\r
             else :\r