diff options
author | Yonghong Zhu <yonghong.zhu@intel.com> | 2016-03-21 19:27:35 +0800 |
---|---|---|
committer | Hao Wu <hao.a.wu@intel.com> | 2016-07-13 09:30:59 +0800 |
commit | a7388528447f84acadb2c51cdf26ae77e03ffd98 (patch) | |
tree | a552ec2f941c1292901e7c95386df9eb5d696120 | |
parent | eab56dde33a927b40dfc610bd79cf6234ece9e8b (diff) | |
download | edk2-platforms-a7388528447f84acadb2c51cdf26ae77e03ffd98.tar.xz |
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>
(cherry picked from commit 860992ed70ae4c849239174c154d9a7650eabd6e)
-rw-r--r-- | BaseTools/Source/Python/GenFds/FdfParser.py | 49 | ||||
-rw-r--r-- | BaseTools/Source/Python/GenFds/FfsFileStatement.py | 31 | ||||
-rw-r--r-- | BaseTools/Source/Python/GenFds/Fv.py | 30 |
3 files changed, 107 insertions, 3 deletions
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.<BR>
+# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>
#
# 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.<BR>
+# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
#
# 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.<BR>
+# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
#
# 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 = " + \
|