## @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
import sys\r
from Common import EdkLogger\r
from Common.BuildToolError import *\r
+from FvImageSection import FvImageSection\r
\r
## generate GUIDed section\r
#\r
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
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
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
'.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
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
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