## @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
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
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
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
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
#\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
# 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
#\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
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
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
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
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
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
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
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
#\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
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