summaryrefslogtreecommitdiff
path: root/BaseTools/Source/Python/GenFds/FvImageSection.py
diff options
context:
space:
mode:
Diffstat (limited to 'BaseTools/Source/Python/GenFds/FvImageSection.py')
-rw-r--r--BaseTools/Source/Python/GenFds/FvImageSection.py316
1 files changed, 158 insertions, 158 deletions
diff --git a/BaseTools/Source/Python/GenFds/FvImageSection.py b/BaseTools/Source/Python/GenFds/FvImageSection.py
index ff2d5ca3c0..8590c64b1a 100644
--- a/BaseTools/Source/Python/GenFds/FvImageSection.py
+++ b/BaseTools/Source/Python/GenFds/FvImageSection.py
@@ -1,158 +1,158 @@
-## @file
-# process FV image section generation
-#
-# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-
-##
-# Import Modules
-#
-from __future__ import absolute_import
-from . import Section
-from io import BytesIO
-from .Ffs import SectionSuffix
-import subprocess
-from .GenFdsGlobalVariable import GenFdsGlobalVariable
-import Common.LongFilePathOs as os
-from CommonDataClass.FdfClass import FvImageSectionClassObject
-from Common.MultipleWorkspace import MultipleWorkspace as mws
-from Common import EdkLogger
-from Common.BuildToolError import *
-from Common.DataType import *
-
-## generate FV image section
-#
-#
-class FvImageSection(FvImageSectionClassObject):
-
- ## The constructor
- #
- # @param self The object pointer
- #
- def __init__(self):
- FvImageSectionClassObject.__init__(self)
-
- ## GenSection() method
- #
- # Generate FV image section
- #
- # @param self The object pointer
- # @param OutputPath Where to place output file
- # @param ModuleName Which module this section belongs to
- # @param SecNum Index of section
- # @param KeyStringList Filter for inputs of section generation
- # @param FfsInf FfsInfStatement object that contains this section data
- # @param Dict dictionary contains macro and its value
- # @retval tuple (Generated file name, section alignment)
- #
- def GenSection(self, OutputPath, ModuleName, SecNum, KeyStringList, FfsInf = None, Dict = None, IsMakefile = False):
-
- OutputFileList = []
- if Dict is None:
- Dict = {}
- if self.FvFileType is not None:
- FileList, IsSect = Section.Section.GetFileList(FfsInf, self.FvFileType, self.FvFileExtension)
- if IsSect :
- return FileList, self.Alignment
-
- Num = SecNum
-
- MaxFvAlignment = 0
- for FvFileName in FileList:
- FvAlignmentValue = 0
- if os.path.isfile(FvFileName):
- FvFileObj = open (FvFileName, 'rb')
- FvFileObj.seek(0)
- # PI FvHeader is 0x48 byte
- FvHeaderBuffer = FvFileObj.read(0x48)
- # FV alignment position.
- if isinstance(FvHeaderBuffer[0x2E], str):
- FvAlignmentValue = 1 << (ord(FvHeaderBuffer[0x2E]) & 0x1F)
- else:
- FvAlignmentValue = 1 << (FvHeaderBuffer[0x2E] & 0x1F)
- FvFileObj.close()
- if FvAlignmentValue > MaxFvAlignment:
- MaxFvAlignment = FvAlignmentValue
-
- OutputFile = os.path.join(OutputPath, ModuleName + SUP_MODULE_SEC + Num + SectionSuffix.get("FV_IMAGE"))
- GenFdsGlobalVariable.GenerateSection(OutputFile, [FvFileName], 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE', IsMakefile=IsMakefile)
- OutputFileList.append(OutputFile)
-
- # MaxFvAlignment is larger than or equal to 1K
- if MaxFvAlignment >= 0x400:
- if MaxFvAlignment >= 0x100000:
- #The max alignment supported by FFS is 16M.
- if MaxFvAlignment >= 0x1000000:
- self.Alignment = "16M"
- else:
- self.Alignment = str(MaxFvAlignment // 0x100000) + "M"
- else:
- self.Alignment = str (MaxFvAlignment // 0x400) + "K"
- else:
- # MaxFvAlignment is less than 1K
- self.Alignment = str (MaxFvAlignment)
-
- return OutputFileList, self.Alignment
- #
- # Generate Fv
- #
- if self.FvName is not None:
- Buffer = BytesIO()
- Fv = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName)
- if Fv is not None:
- self.Fv = Fv
- if not self.FvAddr and self.Fv.BaseAddress:
- self.FvAddr = self.Fv.BaseAddress
- FvFileName = Fv.AddToBuffer(Buffer, self.FvAddr, MacroDict = Dict, Flag=IsMakefile)
- if Fv.FvAlignment is not None:
- if self.Alignment is None:
- self.Alignment = Fv.FvAlignment
- else:
- if GenFdsGlobalVariable.GetAlignment (Fv.FvAlignment) > GenFdsGlobalVariable.GetAlignment (self.Alignment):
- self.Alignment = Fv.FvAlignment
- else:
- if self.FvFileName is not None:
- FvFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvFileName)
- if os.path.isfile(FvFileName):
- FvFileObj = open (FvFileName, 'rb')
- FvFileObj.seek(0)
- # PI FvHeader is 0x48 byte
- FvHeaderBuffer = FvFileObj.read(0x48)
- # FV alignment position.
- if isinstance(FvHeaderBuffer[0x2E], str):
- FvAlignmentValue = 1 << (ord(FvHeaderBuffer[0x2E]) & 0x1F)
- else:
- FvAlignmentValue = 1 << (FvHeaderBuffer[0x2E] & 0x1F)
- # FvAlignmentValue is larger than or equal to 1K
- if FvAlignmentValue >= 0x400:
- if FvAlignmentValue >= 0x100000:
- #The max alignment supported by FFS is 16M.
- if FvAlignmentValue >= 0x1000000:
- self.Alignment = "16M"
- else:
- self.Alignment = str(FvAlignmentValue // 0x100000) + "M"
- else:
- self.Alignment = str (FvAlignmentValue // 0x400) + "K"
- else:
- # FvAlignmentValue is less than 1K
- self.Alignment = str (FvAlignmentValue)
- FvFileObj.close()
- else:
- if len (mws.getPkgPath()) == 0:
- EdkLogger.error("GenFds", FILE_NOT_FOUND, "%s is not found in WORKSPACE: %s" % self.FvFileName, GenFdsGlobalVariable.WorkSpaceDir)
- else:
- EdkLogger.error("GenFds", FILE_NOT_FOUND, "%s is not found in packages path:\n\t%s" % (self.FvFileName, '\n\t'.join(mws.getPkgPath())))
-
- else:
- EdkLogger.error("GenFds", GENFDS_ERROR, "FvImageSection Failed! %s NOT found in FDF" % self.FvName)
-
- #
- # Prepare the parameter of GenSection
- #
- OutputFile = os.path.join(OutputPath, ModuleName + SUP_MODULE_SEC + SecNum + SectionSuffix.get("FV_IMAGE"))
- GenFdsGlobalVariable.GenerateSection(OutputFile, [FvFileName], 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE', IsMakefile=IsMakefile)
- OutputFileList.append(OutputFile)
-
- return OutputFileList, self.Alignment
+## @file
+# process FV image section generation
+#
+# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+
+##
+# Import Modules
+#
+from __future__ import absolute_import
+from . import Section
+from io import BytesIO
+from .Ffs import SectionSuffix
+import subprocess
+from .GenFdsGlobalVariable import GenFdsGlobalVariable
+import Common.LongFilePathOs as os
+from CommonDataClass.FdfClass import FvImageSectionClassObject
+from Common.MultipleWorkspace import MultipleWorkspace as mws
+from Common import EdkLogger
+from Common.BuildToolError import *
+from Common.DataType import *
+
+## generate FV image section
+#
+#
+class FvImageSection(FvImageSectionClassObject):
+
+ ## The constructor
+ #
+ # @param self The object pointer
+ #
+ def __init__(self):
+ FvImageSectionClassObject.__init__(self)
+
+ ## GenSection() method
+ #
+ # Generate FV image section
+ #
+ # @param self The object pointer
+ # @param OutputPath Where to place output file
+ # @param ModuleName Which module this section belongs to
+ # @param SecNum Index of section
+ # @param KeyStringList Filter for inputs of section generation
+ # @param FfsInf FfsInfStatement object that contains this section data
+ # @param Dict dictionary contains macro and its value
+ # @retval tuple (Generated file name, section alignment)
+ #
+ def GenSection(self, OutputPath, ModuleName, SecNum, KeyStringList, FfsInf = None, Dict = None, IsMakefile = False):
+
+ OutputFileList = []
+ if Dict is None:
+ Dict = {}
+ if self.FvFileType is not None:
+ FileList, IsSect = Section.Section.GetFileList(FfsInf, self.FvFileType, self.FvFileExtension)
+ if IsSect :
+ return FileList, self.Alignment
+
+ Num = SecNum
+
+ MaxFvAlignment = 0
+ for FvFileName in FileList:
+ FvAlignmentValue = 0
+ if os.path.isfile(FvFileName):
+ FvFileObj = open (FvFileName, 'rb')
+ FvFileObj.seek(0)
+ # PI FvHeader is 0x48 byte
+ FvHeaderBuffer = FvFileObj.read(0x48)
+ # FV alignment position.
+ if isinstance(FvHeaderBuffer[0x2E], str):
+ FvAlignmentValue = 1 << (ord(FvHeaderBuffer[0x2E]) & 0x1F)
+ else:
+ FvAlignmentValue = 1 << (FvHeaderBuffer[0x2E] & 0x1F)
+ FvFileObj.close()
+ if FvAlignmentValue > MaxFvAlignment:
+ MaxFvAlignment = FvAlignmentValue
+
+ OutputFile = os.path.join(OutputPath, ModuleName + SUP_MODULE_SEC + Num + SectionSuffix.get("FV_IMAGE"))
+ GenFdsGlobalVariable.GenerateSection(OutputFile, [FvFileName], 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE', IsMakefile=IsMakefile)
+ OutputFileList.append(OutputFile)
+
+ # MaxFvAlignment is larger than or equal to 1K
+ if MaxFvAlignment >= 0x400:
+ if MaxFvAlignment >= 0x100000:
+ #The max alignment supported by FFS is 16M.
+ if MaxFvAlignment >= 0x1000000:
+ self.Alignment = "16M"
+ else:
+ self.Alignment = str(MaxFvAlignment // 0x100000) + "M"
+ else:
+ self.Alignment = str (MaxFvAlignment // 0x400) + "K"
+ else:
+ # MaxFvAlignment is less than 1K
+ self.Alignment = str (MaxFvAlignment)
+
+ return OutputFileList, self.Alignment
+ #
+ # Generate Fv
+ #
+ if self.FvName is not None:
+ Buffer = BytesIO()
+ Fv = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName)
+ if Fv is not None:
+ self.Fv = Fv
+ if not self.FvAddr and self.Fv.BaseAddress:
+ self.FvAddr = self.Fv.BaseAddress
+ FvFileName = Fv.AddToBuffer(Buffer, self.FvAddr, MacroDict = Dict, Flag=IsMakefile)
+ if Fv.FvAlignment is not None:
+ if self.Alignment is None:
+ self.Alignment = Fv.FvAlignment
+ else:
+ if GenFdsGlobalVariable.GetAlignment (Fv.FvAlignment) > GenFdsGlobalVariable.GetAlignment (self.Alignment):
+ self.Alignment = Fv.FvAlignment
+ else:
+ if self.FvFileName is not None:
+ FvFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FvFileName)
+ if os.path.isfile(FvFileName):
+ FvFileObj = open (FvFileName, 'rb')
+ FvFileObj.seek(0)
+ # PI FvHeader is 0x48 byte
+ FvHeaderBuffer = FvFileObj.read(0x48)
+ # FV alignment position.
+ if isinstance(FvHeaderBuffer[0x2E], str):
+ FvAlignmentValue = 1 << (ord(FvHeaderBuffer[0x2E]) & 0x1F)
+ else:
+ FvAlignmentValue = 1 << (FvHeaderBuffer[0x2E] & 0x1F)
+ # FvAlignmentValue is larger than or equal to 1K
+ if FvAlignmentValue >= 0x400:
+ if FvAlignmentValue >= 0x100000:
+ #The max alignment supported by FFS is 16M.
+ if FvAlignmentValue >= 0x1000000:
+ self.Alignment = "16M"
+ else:
+ self.Alignment = str(FvAlignmentValue // 0x100000) + "M"
+ else:
+ self.Alignment = str (FvAlignmentValue // 0x400) + "K"
+ else:
+ # FvAlignmentValue is less than 1K
+ self.Alignment = str (FvAlignmentValue)
+ FvFileObj.close()
+ else:
+ if len (mws.getPkgPath()) == 0:
+ EdkLogger.error("GenFds", FILE_NOT_FOUND, "%s is not found in WORKSPACE: %s" % self.FvFileName, GenFdsGlobalVariable.WorkSpaceDir)
+ else:
+ EdkLogger.error("GenFds", FILE_NOT_FOUND, "%s is not found in packages path:\n\t%s" % (self.FvFileName, '\n\t'.join(mws.getPkgPath())))
+
+ else:
+ EdkLogger.error("GenFds", GENFDS_ERROR, "FvImageSection Failed! %s NOT found in FDF" % self.FvName)
+
+ #
+ # Prepare the parameter of GenSection
+ #
+ OutputFile = os.path.join(OutputPath, ModuleName + SUP_MODULE_SEC + SecNum + SectionSuffix.get("FV_IMAGE"))
+ GenFdsGlobalVariable.GenerateSection(OutputFile, [FvFileName], 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE', IsMakefile=IsMakefile)
+ OutputFileList.append(OutputFile)
+
+ return OutputFileList, self.Alignment