BaseTools: Extend the RAW format to support multiple binary files

Current FDF spec updated to support multiple binary files for RAW File
in the [FV] and [Capsule] section. For the multiple normal files, it may
have the optional FfsAlignment.
Example:
FILE RAW = 197DB236-F856-4924-91F8-C1F12FB875F3 {
 Align=16 $(PLATFORM_PACKAGE)/Binaries/File1.pdb
 Align=16 $(PLATFORM_PACKAGE)/Binaries/File2.pdb
 Align=16 $(PLATFORM_PACKAGE)/Binaries/File3.pdb
}

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Yonghong Zhu
2016-03-21 19:27:35 +08:00
parent 481b93f7f0
commit 860992ed70
3 changed files with 107 additions and 3 deletions

View File

@ -1,7 +1,7 @@
## @file ## @file
# parse FDF file # parse FDF file
# #
# Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR> # Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
@ -2692,6 +2692,11 @@ class FdfParser:
elif self.__Token in ("DEFINE", "APRIORI", "SECTION"): elif self.__Token in ("DEFINE", "APRIORI", "SECTION"):
self.__UndoToken() self.__UndoToken()
self.__GetSectionData( FfsFileObj, MacroDict) self.__GetSectionData( FfsFileObj, MacroDict)
elif hasattr(FfsFileObj, 'FvFileType') and FfsFileObj.FvFileType == 'RAW':
self.__UndoToken()
self.__GetRAWData(FfsFileObj, MacroDict)
else: else:
FfsFileObj.CurrentLineNum = self.CurrentLineNumber FfsFileObj.CurrentLineNum = self.CurrentLineNumber
FfsFileObj.CurrentLineContent = self.__CurrentLine() FfsFileObj.CurrentLineContent = self.__CurrentLine()
@ -2701,6 +2706,48 @@ class FdfParser:
if not self.__IsToken( "}"): if not self.__IsToken( "}"):
raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)
## __GetRAWData() method
#
# Get RAW data for FILE statement
#
# @param self The object pointer
# @param FfsFileObj for whom section is got
# @param MacroDict dictionary used to replace macro
#
def __GetRAWData(self, FfsFileObj, MacroDict = {}):
FfsFileObj.FileName = []
FfsFileObj.Alignment = []
AlignDict = {"Auto":1, "8":8, "16":16, "32":32, "64":64, "128":128, "512":512, "1K":1024, "4K":4096, "32K":32768, "64K":65536}
while True:
AlignValue = None
if self.__GetAlignment():
if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
AlignValue = AlignValue = AlignDict[self.__Token]
if not self.__GetNextToken():
raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)
FileName = self.__Token.replace('$(SPACE)', ' ')
if FileName == '}':
self.__UndoToken()
raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)
elif not os.path.isfile(FileName):
raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)
self.__VerifyFile(FileName)
File = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir)
FfsFileObj.FileName.append(File.Path)
FfsFileObj.Alignment.append(AlignValue)
if self.__IsToken( "}"):
self.__UndoToken()
break
if len(FfsFileObj.Alignment) == 1:
FfsFileObj.Alignment = FfsFileObj.Alignment[0]
if len(FfsFileObj.FileName) == 1:
FfsFileObj.FileName = FfsFileObj.FileName[0]
## __GetFileOpts() method ## __GetFileOpts() method
# #
# Get options for FILE statement # Get options for FILE statement

View File

@ -1,7 +1,7 @@
## @file ## @file
# process FFS generation from FILE statement # process FFS generation from FILE statement
# #
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
# #
# 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 # are licensed and made available under the terms and conditions of the BSD License
@ -28,6 +28,8 @@ from Common.BuildToolError import *
from Common.Misc import GuidStructureByteArrayToGuidString from Common.Misc import GuidStructureByteArrayToGuidString
from GuidSection import GuidSection from GuidSection import GuidSection
from FvImageSection import FvImageSection from FvImageSection import FvImageSection
from Common.Misc import SaveFileOnChange
from struct import *
## generate FFS from FILE ## generate FFS from FILE
# #
@ -91,6 +93,33 @@ class FileStatement (FileStatementClassObject) :
SectionFiles = [FileName] SectionFiles = [FileName]
elif self.FileName != None: elif self.FileName != None:
if hasattr(self, 'FvFileType') and self.FvFileType == 'RAW':
if isinstance(self.FileName, list) and isinstance(self.Alignment, list) and len(self.FileName) == len(self.Alignment):
FileContent = ''
for Index, File in enumerate(self.FileName):
try:
f = open(File, 'r+b')
except:
GenFdsGlobalVariable.ErrorLogger("Error opening RAW file %s." % (File))
Content = f.read()
f.close()
AlignValue = self.Alignment[Index]
if AlignValue == None:
AlignValue = 1
FileContent += Content
if len(FileContent) % AlignValue != 0:
Size = AlignValue - len(FileContent) % AlignValue
for i in range(0, Size):
FileContent += pack('B', 0xFF)
if FileContent:
OutputRAWFile = os.path.join(GenFdsGlobalVariable.FfsDir, self.NameGuid, self.NameGuid + '.raw')
SaveFileOnChange(OutputRAWFile, FileContent, True)
self.FileName = OutputRAWFile
if max(self.Alignment):
self.Alignment = str(max(self.Alignment))
else:
self.Alignment = None
self.FileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FileName) self.FileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FileName)
#Replace $(SAPCE) with real space #Replace $(SAPCE) with real space
self.FileName = self.FileName.replace('$(SPACE)', ' ') self.FileName = self.FileName.replace('$(SPACE)', ' ')

View File

@ -1,7 +1,7 @@
## @file ## @file
# process FV generation # process FV generation
# #
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
# #
# 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 # are licensed and made available under the terms and conditions of the BSD License
@ -112,6 +112,34 @@ class FV (FvClassObject):
# Process Modules in FfsList # Process Modules in FfsList
for FfsFile in self.FfsList : for FfsFile in self.FfsList :
if hasattr(FfsFile, 'FvFileType') and FfsFile.FvFileType == 'RAW':
if isinstance(FfsFile.FileName, list) and isinstance(FfsFile.Alignment, list) and len(FfsFile.FileName) == len(FfsFile.Alignment):
FileContent = ''
for Index, File in enumerate(FfsFile.FileName):
try:
f = open(File, 'r+b')
except:
GenFdsGlobalVariable.ErrorLogger("Error opening RAW file %s." % (File))
Content = f.read()
f.close()
AlignValue = FfsFile.Alignment[Index]
if AlignValue == None:
AlignValue = 1
FileContent += Content
if len(FileContent) % AlignValue != 0:
Size = AlignValue - len(FileContent) % AlignValue
for i in range(0, Size):
FileContent += pack('B', 0xFF)
if FileContent:
OutputRAWFile = os.path.join(GenFdsGlobalVariable.FfsDir, FfsFile.NameGuid, FfsFile.NameGuid + '.raw')
SaveFileOnChange(OutputRAWFile, FileContent, True)
FfsFile.FileName = OutputRAWFile
if max(FfsFile.Alignment):
FfsFile.Alignment = str(max(FfsFile.Alignment))
else:
FfsFile.Alignment = None
FileName = FfsFile.GenFfs(MacroDict, FvParentAddr=BaseAddress) FileName = FfsFile.GenFfs(MacroDict, FvParentAddr=BaseAddress)
FfsFileList.append(FileName) FfsFileList.append(FileName)
self.FvInfFile.writelines("EFI_FILE_NAME = " + \ self.FvInfFile.writelines("EFI_FILE_NAME = " + \