]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/GuidSection.py
Sync BaseTools Trunk (version r2524) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / GuidSection.py
index e111e0fe507b038616ced488bb97181f67efc3d1..36ad4f58ef8189f2cb13b2308179baea08b18138 100644 (file)
@@ -1,9 +1,9 @@
 ## @file\r
 # process GUIDed section generation\r
 #\r
-#  Copyright (c) 2007, Intel Corporation\r
+#  Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
 #\r
-#  All rights reserved. This program and the accompanying materials\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
 #  http://opensource.org/licenses/bsd-license.php\r
@@ -25,6 +25,7 @@ from Common import ToolDefClassObject
 import sys\r
 from Common import EdkLogger\r
 from Common.BuildToolError import *\r
+from FvImageSection import FvImageSection\r
 \r
 ## generate GUIDed section\r
 #\r
@@ -63,16 +64,57 @@ class GuidSection(GuidSectionClassObject) :
             self.SectionType = FfsInf.__ExtendMacro__(self.SectionType)\r
             self.CurrentArchList = [FfsInf.CurrentArch]\r
 \r
-        SectFile = tuple()\r
+        SectFile  = tuple()\r
+        SectAlign = []\r
         Index = 0\r
+        MaxAlign = None\r
+        if self.FvAddr != []:\r
+            FvAddrIsSet = True\r
+        else:\r
+            FvAddrIsSet = False\r
+        \r
+        if self.ProcessRequired in ("TRUE", "1"):\r
+            if self.FvAddr != []:\r
+                #no use FvAddr when the image is processed.\r
+                self.FvAddr = []\r
+            if self.FvParentAddr != None:\r
+                #no use Parent Addr when the image is processed.\r
+                self.FvParentAddr = None\r
+\r
         for Sect in self.SectionList:\r
             Index = Index + 1\r
             SecIndex = '%s.%d' %(SecNum,Index)\r
+            # set base address for inside FvImage\r
+            if isinstance(Sect, FvImageSection):\r
+                if self.FvAddr != []:\r
+                    Sect.FvAddr = self.FvAddr.pop(0)\r
+                self.IncludeFvSection = True\r
+            elif isinstance(Sect, GuidSection):\r
+                Sect.FvAddr = self.FvAddr\r
+                Sect.FvParentAddr = self.FvParentAddr\r
             ReturnSectList, align = Sect.GenSection(OutputPath, ModuleName, SecIndex, KeyStringList,FfsInf, Dict)\r
+            if isinstance(Sect, GuidSection):\r
+                if Sect.IncludeFvSection:\r
+                    self.IncludeFvSection = Sect.IncludeFvSection\r
+\r
+            if align != None:\r
+                if MaxAlign == None:\r
+                    MaxAlign = align\r
+                if GenFdsGlobalVariable.GetAlignment (align) > GenFdsGlobalVariable.GetAlignment (MaxAlign):\r
+                    MaxAlign = align\r
             if ReturnSectList != []:\r
+                if align == None:\r
+                    align = "1"\r
                 for file in ReturnSectList:\r
                     SectFile += (file,)\r
+                    SectAlign.append(align)\r
 \r
+        if MaxAlign != None:\r
+            if self.Alignment == None:\r
+                self.Alignment = MaxAlign\r
+            else:\r
+                if GenFdsGlobalVariable.GetAlignment (MaxAlign) > GenFdsGlobalVariable.GetAlignment (self.Alignment):\r
+                    self.Alignment = MaxAlign\r
 \r
         OutputFile = OutputPath + \\r
                      os.sep     + \\r
@@ -83,15 +125,17 @@ class GuidSection(GuidSectionClassObject) :
         OutputFile = os.path.normpath(OutputFile)\r
 \r
         ExternalTool = None\r
+        ExternalOption = None\r
         if self.NameGuid != None:\r
-            ExternalTool = self.__FindExtendTool__()\r
+            ExternalTool, ExternalOption = self.__FindExtendTool__()\r
+\r
         #\r
         # If not have GUID , call default\r
         # GENCRC32 section\r
         #\r
         if self.NameGuid == None :\r
             GenFdsGlobalVariable.VerboseLogger( "Use GenSection function Generate CRC32 Section")\r
-            GenFdsGlobalVariable.GenerateSection(OutputFile, SectFile, Section.Section.SectionType[self.SectionType])\r
+            GenFdsGlobalVariable.GenerateSection(OutputFile, SectFile, Section.Section.SectionType[self.SectionType], InputAlign=SectAlign)\r
             OutputFileList = []\r
             OutputFileList.append(OutputFile)\r
             return OutputFileList, self.Alignment\r
@@ -99,14 +143,14 @@ class GuidSection(GuidSectionClassObject) :
         elif ExternalTool == None:\r
             EdkLogger.error("GenFds", GENFDS_ERROR, "No tool found with GUID %s" % self.NameGuid)\r
         else:\r
+            DummyFile = OutputFile+".dummy"\r
             #\r
             # Call GenSection with DUMMY section type.\r
             #\r
-            GenFdsGlobalVariable.GenerateSection(OutputFile+".dummy", SectFile)\r
+            GenFdsGlobalVariable.GenerateSection(DummyFile, SectFile, InputAlign=SectAlign)\r
             #\r
             # Use external tool process the Output\r
             #\r
-            InputFile = OutputFile+".dummy"\r
             TempFile = OutputPath + \\r
                        os.sep     + \\r
                        ModuleName + \\r
@@ -115,30 +159,80 @@ class GuidSection(GuidSectionClassObject) :
                        '.tmp'\r
             TempFile = os.path.normpath(TempFile)\r
 \r
-            ExternalToolCmd = (\r
-                ExternalTool,\r
-                '-e',\r
-                '-o', TempFile,\r
-                InputFile,\r
-                )\r
-\r
+            FirstCall = False\r
+            CmdOption = '-e'\r
+            if ExternalOption != None:\r
+                CmdOption = CmdOption + ' ' + ExternalOption\r
+            if self.ProcessRequired not in ("TRUE", "1") and self.IncludeFvSection and not FvAddrIsSet and self.FvParentAddr != None:\r
+                #FirstCall is only set for the encapsulated flash FV image without process required attribute.\r
+                FirstCall = True\r
             #\r
             # Call external tool\r
             #\r
-            GenFdsGlobalVariable.GuidTool(TempFile, [InputFile], ExternalTool, '-e')\r
+            ReturnValue = [1]\r
+            if FirstCall:\r
+                #first try to call the guided tool with -z option and CmdOption for the no process required guided tool.\r
+                GenFdsGlobalVariable.GuidTool(TempFile, [DummyFile], ExternalTool, '-z' + ' ' + CmdOption, ReturnValue)\r
+\r
+            #\r
+            # when no call or first call failed, ReturnValue are not 1.\r
+            # Call the guided tool with CmdOption\r
+            #\r
+            if ReturnValue[0] != 0:\r
+                FirstCall = False\r
+                ReturnValue[0] = 0\r
+                GenFdsGlobalVariable.GuidTool(TempFile, [DummyFile], ExternalTool, CmdOption)\r
+\r
+            FileHandleIn = open(DummyFile,'rb')\r
+            FileHandleIn.seek(0,2)\r
+            InputFileSize = FileHandleIn.tell()\r
+            \r
+            FileHandleOut = open(TempFile,'rb')\r
+            FileHandleOut.seek(0,2)\r
+            TempFileSize = FileHandleOut.tell()\r
 \r
+            Attribute = []\r
+            HeaderLength = None\r
+            if self.ExtraHeaderSize != -1:\r
+                HeaderLength = str(self.ExtraHeaderSize)\r
+\r
+            if self.ProcessRequired == "NONE" and HeaderLength == None:\r
+                if TempFileSize > InputFileSize and TempFileSize % 4 == 0:\r
+                    FileHandleIn.seek(0)\r
+                    BufferIn  = FileHandleIn.read()\r
+                    FileHandleOut.seek(0)\r
+                    BufferOut = FileHandleOut.read()\r
+                    if BufferIn == BufferOut[TempFileSize - InputFileSize:]:\r
+                        HeaderLength = str(TempFileSize - InputFileSize)\r
+                #auto sec guided attribute with process required\r
+                if HeaderLength == None:\r
+                    Attribute.append('PROCESSING_REQUIRED')\r
+\r
+            FileHandleIn.close()\r
+            FileHandleOut.close()\r
+            \r
+            if FirstCall and 'PROCESSING_REQUIRED' in Attribute:\r
+                # Guided data by -z option on first call is the process required data. Call the guided tool with the real option.\r
+                GenFdsGlobalVariable.GuidTool(TempFile, [DummyFile], ExternalTool, CmdOption)\r
+            \r
             #\r
-            # Call Gensection Add Secntion Header\r
+            # Call Gensection Add Section Header\r
             #\r
-            Attribute = None\r
-            if self.ProcessRequired == True:\r
-                Attribute = 'PROCSSING_REQUIRED'\r
-            if self.AuthStatusValid == True:\r
-                Attribute = 'AUTH_STATUS_VALID'\r
+            if self.ProcessRequired in ("TRUE", "1"):\r
+                if 'PROCESSING_REQUIRED' not in Attribute:\r
+                    Attribute.append('PROCESSING_REQUIRED')\r
+  \r
+            if self.AuthStatusValid in ("TRUE", "1"):\r
+                Attribute.append('AUTH_STATUS_VALID')\r
             GenFdsGlobalVariable.GenerateSection(OutputFile, [TempFile], Section.Section.SectionType['GUIDED'],\r
-                                                 Guid=self.NameGuid, GuidAttr=Attribute)\r
+                                                 Guid=self.NameGuid, GuidAttr=Attribute, GuidHdrLen=HeaderLength)\r
             OutputFileList = []\r
             OutputFileList.append(OutputFile)\r
+            if 'PROCESSING_REQUIRED' in Attribute:\r
+                # reset guided section alignment to none for the processed required guided data\r
+                self.Alignment = None\r
+                self.IncludeFvSection = False\r
+                self.ProcessRequired = "TRUE"\r
             return OutputFileList, self.Alignment\r
 \r
     ## __FindExtendTool()\r
@@ -177,6 +271,12 @@ class GuidSection(GuidSectionClassObject) :
                                                    KeyList[3] + \\r
                                                    '_'        + \\r
                                                    'PATH')\r
+\r
+                    ToolOption = ToolDefinition.get( Key        + \\r
+                                                    '_'        + \\r
+                                                    KeyList[3] + \\r
+                                                    '_'        + \\r
+                                                    'FLAGS')\r
                     if ToolPathTmp == None:\r
                         ToolPathTmp = ToolPath\r
                     else:\r
@@ -184,7 +284,7 @@ class GuidSection(GuidSectionClassObject) :
                             EdkLogger.error("GenFds", GENFDS_ERROR, "Don't know which tool to use, %s or %s ?" % (ToolPathTmp, ToolPath))\r
                             \r
                     \r
-        return ToolPathTmp\r
+        return ToolPathTmp, ToolOption\r
 \r
 \r
 \r