X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=BaseTools%2FSource%2FPython%2FGenFds%2FFd.py;h=cc4124ad902e6905b82976cc0cf7745bd04a3e09;hp=26de500d9b6c59d30efed35fda1e9f8fab9946af;hb=9eb87141eca12b1f15afa4b769af04d1395891c6;hpb=b303ea726e1c8ed240dad2bce54821318567eab3 diff --git a/BaseTools/Source/Python/GenFds/Fd.py b/BaseTools/Source/Python/GenFds/Fd.py index 26de500d9b..cc4124ad90 100644 --- a/BaseTools/Source/Python/GenFds/Fd.py +++ b/BaseTools/Source/Python/GenFds/Fd.py @@ -1,9 +1,9 @@ ## @file # process FD generation # -# Copyright (c) 2007, Intel Corporation +# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
# -# All rights reserved. This program and the accompanying materials +# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at # http://opensource.org/licenses/bsd-license.php @@ -17,7 +17,7 @@ # import Region import Fv -import os +import Common.LongFilePathOs as os import StringIO import sys from struct import * @@ -45,14 +45,17 @@ class FD(FDClassObject): # # @retval string Generated FD file name # - def GenFd (self): - if self.FdUiName.upper() + 'fd' in GenFds.ImageBinDict.keys(): + def GenFd (self, Flag = False): + if self.FdUiName.upper() + 'fd' in GenFds.ImageBinDict: return GenFds.ImageBinDict[self.FdUiName.upper() + 'fd'] # # Print Information # - GenFdsGlobalVariable.InfLogger("Fd File Name:%s" %self.FdUiName) + FdFileName = os.path.join(GenFdsGlobalVariable.FvDir, self.FdUiName + '.fd') + if not Flag: + GenFdsGlobalVariable.InfLogger("\nFd File Name:%s (%s)" %(self.FdUiName, FdFileName)) + Offset = 0x00 for item in self.BlockSizeList: Offset = Offset + item[0] * item[1] @@ -65,32 +68,40 @@ class FD(FDClassObject): GenFdsGlobalVariable.VerboseLogger('################### Gen VTF ####################') self.GenVtfFile() - TempFdBuffer = StringIO.StringIO('') - PreviousRegionStart = -1 - PreviousRegionSize = 1 - - for RegionObj in self.RegionList : + HasCapsuleRegion = False + for RegionObj in self.RegionList: if RegionObj.RegionType == 'CAPSULE': - continue - if RegionObj.Offset + RegionObj.Size <= PreviousRegionStart: - pass - elif RegionObj.Offset <= PreviousRegionStart or (RegionObj.Offset >=PreviousRegionStart and RegionObj.Offset < PreviousRegionStart + PreviousRegionSize): - pass - elif RegionObj.Offset > PreviousRegionStart + PreviousRegionSize: - GenFdsGlobalVariable.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart + PreviousRegionSize, RegionObj.Offset - (PreviousRegionStart + PreviousRegionSize))) - PadRegion = Region.Region() - PadRegion.Offset = PreviousRegionStart + PreviousRegionSize - PadRegion.Size = RegionObj.Offset - PadRegion.Offset - PadRegion.AddToBuffer(TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict) - PreviousRegionStart = RegionObj.Offset - PreviousRegionSize = RegionObj.Size - # - # Call each region's AddToBuffer function - # - if PreviousRegionSize > self.Size: - pass - GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function') - RegionObj.AddToBuffer (TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict) + HasCapsuleRegion = True + break + if HasCapsuleRegion: + TempFdBuffer = StringIO.StringIO('') + PreviousRegionStart = -1 + PreviousRegionSize = 1 + + for RegionObj in self.RegionList : + if RegionObj.RegionType == 'CAPSULE': + continue + if RegionObj.Offset + RegionObj.Size <= PreviousRegionStart: + pass + elif RegionObj.Offset <= PreviousRegionStart or (RegionObj.Offset >=PreviousRegionStart and RegionObj.Offset < PreviousRegionStart + PreviousRegionSize): + pass + elif RegionObj.Offset > PreviousRegionStart + PreviousRegionSize: + if not Flag: + GenFdsGlobalVariable.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart + PreviousRegionSize, RegionObj.Offset - (PreviousRegionStart + PreviousRegionSize))) + PadRegion = Region.Region() + PadRegion.Offset = PreviousRegionStart + PreviousRegionSize + PadRegion.Size = RegionObj.Offset - PadRegion.Offset + if not Flag: + PadRegion.AddToBuffer(TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict) + PreviousRegionStart = RegionObj.Offset + PreviousRegionSize = RegionObj.Size + # + # Call each region's AddToBuffer function + # + if PreviousRegionSize > self.Size: + pass + GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function') + RegionObj.AddToBuffer (TempFdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict) FdBuffer = StringIO.StringIO('') PreviousRegionStart = -1 @@ -105,31 +116,34 @@ class FD(FDClassObject): 'Region offset 0x%X overlaps with Region starting from 0x%X, size 0x%X' \ % (RegionObj.Offset, PreviousRegionStart, PreviousRegionSize)) elif RegionObj.Offset > PreviousRegionStart + PreviousRegionSize: - GenFdsGlobalVariable.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart + PreviousRegionSize, RegionObj.Offset - (PreviousRegionStart + PreviousRegionSize))) + if not Flag: + GenFdsGlobalVariable.InfLogger('Padding region starting from offset 0x%X, with size 0x%X' %(PreviousRegionStart + PreviousRegionSize, RegionObj.Offset - (PreviousRegionStart + PreviousRegionSize))) PadRegion = Region.Region() PadRegion.Offset = PreviousRegionStart + PreviousRegionSize PadRegion.Size = RegionObj.Offset - PadRegion.Offset - PadRegion.AddToBuffer(FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict) + if not Flag: + PadRegion.AddToBuffer(FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict) PreviousRegionStart = RegionObj.Offset PreviousRegionSize = RegionObj.Size # + # Verify current region fits within allocated FD section Size + # + if PreviousRegionStart + PreviousRegionSize > self.Size: + EdkLogger.error("GenFds", GENFDS_ERROR, + 'FD %s size too small to fit region with offset 0x%X and size 0x%X' + % (self.FdUiName, PreviousRegionStart, PreviousRegionSize)) + # # Call each region's AddToBuffer function # - if PreviousRegionSize > self.Size: - EdkLogger.error("GenFds", GENFDS_ERROR, 'FD %s size too small' % self.FdUiName) GenFdsGlobalVariable.VerboseLogger('Call each region\'s AddToBuffer function') - RegionObj.AddToBuffer (FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict) - # - # Create a empty Fd file - # - GenFdsGlobalVariable.VerboseLogger ('Create an empty Fd file') - FdFileName = os.path.join(GenFdsGlobalVariable.FvDir,self.FdUiName + '.fd') + RegionObj.AddToBuffer (FdBuffer, self.BaseAddress, self.BlockSizeList, self.ErasePolarity, GenFds.ImageBinDict, self.vtfRawDict, self.DefineVarDict,Flag=Flag) # # Write the buffer contents to Fd file # GenFdsGlobalVariable.VerboseLogger('Write the buffer contents to Fd file') - SaveFileOnChange(FdFileName, FdBuffer.getvalue()) - FdBuffer.close(); + if not Flag: + SaveFileOnChange(FdFileName, FdBuffer.getvalue()) + FdBuffer.close() GenFds.ImageBinDict[self.FdUiName.upper() + 'fd'] = FdFileName return FdFileName