From 860992ed70ae4c849239174c154d9a7650eabd6e Mon Sep 17 00:00:00 2001 From: Yonghong Zhu Date: Mon, 21 Mar 2016 19:27:35 +0800 Subject: 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 Reviewed-by: Liming Gao --- BaseTools/Source/Python/GenFds/FdfParser.py | 49 +++++++++++++++++++++- BaseTools/Source/Python/GenFds/FfsFileStatement.py | 31 +++++++++++++- BaseTools/Source/Python/GenFds/Fv.py | 30 ++++++++++++- 3 files changed, 107 insertions(+), 3 deletions(-) (limited to 'BaseTools') diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py index 788190567e..b86c196067 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -1,7 +1,7 @@ ## @file # parse FDF file # -# Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.
# Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.
# # This program and the accompanying materials @@ -2692,6 +2692,11 @@ class FdfParser: elif self.__Token in ("DEFINE", "APRIORI", "SECTION"): self.__UndoToken() self.__GetSectionData( FfsFileObj, MacroDict) + + elif hasattr(FfsFileObj, 'FvFileType') and FfsFileObj.FvFileType == 'RAW': + self.__UndoToken() + self.__GetRAWData(FfsFileObj, MacroDict) + else: FfsFileObj.CurrentLineNum = self.CurrentLineNumber FfsFileObj.CurrentLineContent = self.__CurrentLine() @@ -2701,6 +2706,48 @@ class FdfParser: if not self.__IsToken( "}"): 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 # # Get options for FILE statement diff --git a/BaseTools/Source/Python/GenFds/FfsFileStatement.py b/BaseTools/Source/Python/GenFds/FfsFileStatement.py index cd099196d0..506789e979 100644 --- a/BaseTools/Source/Python/GenFds/FfsFileStatement.py +++ b/BaseTools/Source/Python/GenFds/FfsFileStatement.py @@ -1,7 +1,7 @@ ## @file # process FFS generation from FILE statement # -# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.
# # This program and the accompanying materials # 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 GuidSection import GuidSection from FvImageSection import FvImageSection +from Common.Misc import SaveFileOnChange +from struct import * ## generate FFS from FILE # @@ -91,6 +93,33 @@ class FileStatement (FileStatementClassObject) : SectionFiles = [FileName] 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) #Replace $(SAPCE) with real space self.FileName = self.FileName.replace('$(SPACE)', ' ') diff --git a/BaseTools/Source/Python/GenFds/Fv.py b/BaseTools/Source/Python/GenFds/Fv.py index df97ccbab6..e385ccb1b5 100644 --- a/BaseTools/Source/Python/GenFds/Fv.py +++ b/BaseTools/Source/Python/GenFds/Fv.py @@ -1,7 +1,7 @@ ## @file # process FV generation # -# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.
# # This program and the accompanying materials # 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 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) FfsFileList.append(FileName) self.FvInfFile.writelines("EFI_FILE_NAME = " + \ -- cgit v1.2.3