#\r
# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
#\r
-# This program and the accompanying materials\r
-# are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution. The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
\r
##\r
# Import Modules\r
#\r
+from __future__ import absolute_import\r
import Common.LongFilePathOs as os\r
import subprocess\r
from io import BytesIO\r
from struct import *\r
-\r
-from . import Ffs\r
-from . import AprioriSection\r
from . import FfsFileStatement\r
from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
-from CommonDataClass.FdfClass import FvClassObject\r
from Common.Misc import SaveFileOnChange, PackGUID\r
from Common.LongFilePathSupport import CopyLongFilePath\r
from Common.LongFilePathSupport import OpenLongFilePath as open\r
## generate FV\r
#\r
#\r
-class FV (FvClassObject):\r
+class FV (object):\r
## The constructor\r
#\r
# @param self The object pointer\r
#\r
- def __init__(self):\r
- FvClassObject.__init__(self)\r
+ def __init__(self, Name=None):\r
+ self.UiFvName = Name\r
+ self.CreateFileName = None\r
+ self.BlockSizeList = []\r
+ self.DefineVarDict = {}\r
+ self.SetVarDict = {}\r
+ self.FvAlignment = None\r
+ self.FvAttributeDict = {}\r
+ self.FvNameGuid = None\r
+ self.FvNameString = None\r
+ self.AprioriSectionList = []\r
+ self.FfsList = []\r
+ self.BsBaseAddress = None\r
+ self.RtBaseAddress = None\r
self.FvInfFile = None\r
self.FvAddressFile = None\r
self.BaseAddress = None\r
self.FvForceRebase = None\r
self.FvRegionInFD = None\r
self.UsedSizeEnable = False\r
-\r
+ self.FvExtEntryTypeValue = []\r
+ self.FvExtEntryType = []\r
+ self.FvExtEntryData = []\r
## AddToBuffer()\r
#\r
# Generate Fv and add it to the Buffer\r
# @param BlockSize block size of FV\r
# @param BlockNum How many blocks in FV\r
# @param ErasePolarity Flash erase polarity\r
- # @param VtfDict VTF objects\r
# @param MacroDict macro value pair\r
# @retval string Generated FV file path\r
#\r
- def AddToBuffer (self, Buffer, BaseAddress=None, BlockSize= None, BlockNum=None, ErasePloarity='1', VtfDict=None, MacroDict = {}, Flag=False) :\r
-\r
+ def AddToBuffer (self, Buffer, BaseAddress=None, BlockSize= None, BlockNum=None, ErasePloarity='1', MacroDict = {}, Flag=False):\r
if BaseAddress is None and self.UiFvName.upper() + 'fv' in GenFdsGlobalVariable.ImageBinDict:\r
return GenFdsGlobalVariable.ImageBinDict[self.UiFvName.upper() + 'fv']\r
\r
if self.FvBaseAddress is not None:\r
BaseAddress = self.FvBaseAddress\r
if not Flag:\r
- self.__InitializeInf__(BaseAddress, BlockSize, BlockNum, ErasePloarity, VtfDict)\r
+ self._InitializeInf(BaseAddress, BlockSize, BlockNum, ErasePloarity)\r
#\r
# First Process the Apriori section\r
#\r
FfsFileList.append(FileName)\r
# Add Apriori file name to Inf file\r
if not Flag:\r
- self.FvInfFile.writelines("EFI_FILE_NAME = " + \\r
+ self.FvInfFile.append("EFI_FILE_NAME = " + \\r
FileName + \\r
TAB_LINE_BREAK)\r
\r
# Process Modules in FfsList\r
- for FfsFile in self.FfsList :\r
+ for FfsFile in self.FfsList:\r
if Flag:\r
if isinstance(FfsFile, FfsFileStatement.FileStatement):\r
continue\r
FileName = FfsFile.GenFfs(MacroDict, FvParentAddr=BaseAddress, IsMakefile=Flag, FvName=self.UiFvName)\r
FfsFileList.append(FileName)\r
if not Flag:\r
- self.FvInfFile.writelines("EFI_FILE_NAME = " + \\r
+ self.FvInfFile.append("EFI_FILE_NAME = " + \\r
FileName + \\r
TAB_LINE_BREAK)\r
if not Flag:\r
- SaveFileOnChange(self.InfFileName, self.FvInfFile.getvalue(), False)\r
- self.FvInfFile.close()\r
+ FvInfFile = ''.join(self.FvInfFile)\r
+ SaveFileOnChange(self.InfFileName, FvInfFile, False)\r
#\r
# Call GenFv tool\r
#\r
\r
if FvChildAddr != []:\r
# Update Ffs again\r
- for FfsFile in self.FfsList :\r
+ for FfsFile in self.FfsList:\r
FileName = FfsFile.GenFfs(MacroDict, FvChildAddr, BaseAddress, IsMakefile=Flag, FvName=self.UiFvName)\r
\r
if GenFdsGlobalVariable.LargeFileInFvFlags[-1]:\r
#\r
# Write the Fv contents to Buffer\r
#\r
- if os.path.isfile(FvOutputFile):\r
+ if os.path.isfile(FvOutputFile) and os.path.getsize(FvOutputFile) >= 0x48:\r
FvFileObj = open(FvOutputFile, 'rb')\r
- GenFdsGlobalVariable.VerboseLogger("\nGenerate %s FV Successfully" % self.UiFvName)\r
- GenFdsGlobalVariable.SharpCounter = 0\r
-\r
- Buffer.write(FvFileObj.read())\r
- FvFileObj.seek(0)\r
# PI FvHeader is 0x48 byte\r
FvHeaderBuffer = FvFileObj.read(0x48)\r
- # FV alignment position.\r
- FvAlignmentValue = 1 << (ord(FvHeaderBuffer[0x2E]) & 0x1F)\r
- if FvAlignmentValue >= 0x400:\r
- if FvAlignmentValue >= 0x100000:\r
- if FvAlignmentValue >= 0x1000000:\r
- #The max alignment supported by FFS is 16M.\r
- self.FvAlignment = "16M"\r
+ Signature = FvHeaderBuffer[0x28:0x32]\r
+ if Signature and Signature.startswith(b'_FVH'):\r
+ GenFdsGlobalVariable.VerboseLogger("\nGenerate %s FV Successfully" % self.UiFvName)\r
+ GenFdsGlobalVariable.SharpCounter = 0\r
+\r
+ FvFileObj.seek(0)\r
+ Buffer.write(FvFileObj.read())\r
+ # FV alignment position.\r
+ FvAlignmentValue = 1 << (ord(FvHeaderBuffer[0x2E:0x2F]) & 0x1F)\r
+ if FvAlignmentValue >= 0x400:\r
+ if FvAlignmentValue >= 0x100000:\r
+ if FvAlignmentValue >= 0x1000000:\r
+ #The max alignment supported by FFS is 16M.\r
+ self.FvAlignment = "16M"\r
+ else:\r
+ self.FvAlignment = str(FvAlignmentValue // 0x100000) + "M"\r
else:\r
- self.FvAlignment = str(FvAlignmentValue / 0x100000) + "M"\r
+ self.FvAlignment = str(FvAlignmentValue // 0x400) + "K"\r
else:\r
- self.FvAlignment = str(FvAlignmentValue / 0x400) + "K"\r
+ # FvAlignmentValue is less than 1K\r
+ self.FvAlignment = str (FvAlignmentValue)\r
+ FvFileObj.close()\r
+ GenFdsGlobalVariable.ImageBinDict[self.UiFvName.upper() + 'fv'] = FvOutputFile\r
+ GenFdsGlobalVariable.LargeFileInFvFlags.pop()\r
else:\r
- # FvAlignmentValue is less than 1K\r
- self.FvAlignment = str (FvAlignmentValue)\r
- FvFileObj.close()\r
- GenFdsGlobalVariable.ImageBinDict[self.UiFvName.upper() + 'fv'] = FvOutputFile\r
- GenFdsGlobalVariable.LargeFileInFvFlags.pop()\r
+ GenFdsGlobalVariable.ErrorLogger("Invalid FV file %s." % self.UiFvName)\r
else:\r
GenFdsGlobalVariable.ErrorLogger("Failed to generate %s FV file." %self.UiFvName)\r
return FvOutputFile\r
return True\r
return False\r
\r
- ## __InitializeInf__()\r
+ ## _InitializeInf()\r
#\r
- # Initilize the inf file to create FV\r
+ # Initialize the inf file to create FV\r
#\r
# @param self The object pointer\r
# @param BaseAddress base address of FV\r
# @param BlockSize block size of FV\r
# @param BlockNum How many blocks in FV\r
# @param ErasePolarity Flash erase polarity\r
- # @param VtfDict VTF objects\r
#\r
- def __InitializeInf__ (self, BaseAddress = None, BlockSize= None, BlockNum = None, ErasePloarity='1', VtfDict=None) :\r
+ def _InitializeInf (self, BaseAddress = None, BlockSize= None, BlockNum = None, ErasePloarity='1'):\r
#\r
# Create FV inf file\r
#\r
self.InfFileName = os.path.join(GenFdsGlobalVariable.FvDir,\r
self.UiFvName + '.inf')\r
- self.FvInfFile = BytesIO()\r
+ self.FvInfFile = []\r
\r
#\r
# Add [Options]\r
#\r
- self.FvInfFile.writelines("[options]" + TAB_LINE_BREAK)\r
- if BaseAddress is not None :\r
- self.FvInfFile.writelines("EFI_BASE_ADDRESS = " + \\r
+ self.FvInfFile.append("[options]" + TAB_LINE_BREAK)\r
+ if BaseAddress is not None:\r
+ self.FvInfFile.append("EFI_BASE_ADDRESS = " + \\r
BaseAddress + \\r
TAB_LINE_BREAK)\r
\r
if BlockSize is not None:\r
- self.FvInfFile.writelines("EFI_BLOCK_SIZE = " + \\r
+ self.FvInfFile.append("EFI_BLOCK_SIZE = " + \\r
'0x%X' %BlockSize + \\r
TAB_LINE_BREAK)\r
if BlockNum is not None:\r
- self.FvInfFile.writelines("EFI_NUM_BLOCKS = " + \\r
+ self.FvInfFile.append("EFI_NUM_BLOCKS = " + \\r
' 0x%X' %BlockNum + \\r
TAB_LINE_BREAK)\r
else:\r
if self.BlockSizeList == []:\r
if not self._GetBlockSize():\r
#set default block size is 1\r
- self.FvInfFile.writelines("EFI_BLOCK_SIZE = 0x1" + TAB_LINE_BREAK)\r
+ self.FvInfFile.append("EFI_BLOCK_SIZE = 0x1" + TAB_LINE_BREAK)\r
\r
- for BlockSize in self.BlockSizeList :\r
+ for BlockSize in self.BlockSizeList:\r
if BlockSize[0] is not None:\r
- self.FvInfFile.writelines("EFI_BLOCK_SIZE = " + \\r
+ self.FvInfFile.append("EFI_BLOCK_SIZE = " + \\r
'0x%X' %BlockSize[0] + \\r
TAB_LINE_BREAK)\r
\r
if BlockSize[1] is not None:\r
- self.FvInfFile.writelines("EFI_NUM_BLOCKS = " + \\r
+ self.FvInfFile.append("EFI_NUM_BLOCKS = " + \\r
' 0x%X' %BlockSize[1] + \\r
TAB_LINE_BREAK)\r
\r
if self.BsBaseAddress is not None:\r
- self.FvInfFile.writelines('EFI_BOOT_DRIVER_BASE_ADDRESS = ' + \\r
+ self.FvInfFile.append('EFI_BOOT_DRIVER_BASE_ADDRESS = ' + \\r
'0x%X' %self.BsBaseAddress)\r
if self.RtBaseAddress is not None:\r
- self.FvInfFile.writelines('EFI_RUNTIME_DRIVER_BASE_ADDRESS = ' + \\r
+ self.FvInfFile.append('EFI_RUNTIME_DRIVER_BASE_ADDRESS = ' + \\r
'0x%X' %self.RtBaseAddress)\r
#\r
# Add attribute\r
#\r
- self.FvInfFile.writelines("[attributes]" + TAB_LINE_BREAK)\r
+ self.FvInfFile.append("[attributes]" + TAB_LINE_BREAK)\r
\r
- self.FvInfFile.writelines("EFI_ERASE_POLARITY = " + \\r
+ self.FvInfFile.append("EFI_ERASE_POLARITY = " + \\r
' %s' %ErasePloarity + \\r
TAB_LINE_BREAK)\r
if not (self.FvAttributeDict is None):\r
- for FvAttribute in self.FvAttributeDict.keys() :\r
+ for FvAttribute in self.FvAttributeDict.keys():\r
if FvAttribute == "FvUsedSizeEnable":\r
- if self.FvAttributeDict[FvAttribute].upper() in ('TRUE', '1') :\r
+ if self.FvAttributeDict[FvAttribute].upper() in ('TRUE', '1'):\r
self.UsedSizeEnable = True\r
continue\r
- self.FvInfFile.writelines("EFI_" + \\r
+ self.FvInfFile.append("EFI_" + \\r
FvAttribute + \\r
' = ' + \\r
self.FvAttributeDict[FvAttribute] + \\r
TAB_LINE_BREAK )\r
if self.FvAlignment is not None:\r
- self.FvInfFile.writelines("EFI_FVB2_ALIGNMENT_" + \\r
+ self.FvInfFile.append("EFI_FVB2_ALIGNMENT_" + \\r
self.FvAlignment.strip() + \\r
" = TRUE" + \\r
TAB_LINE_BREAK)\r
GenFdsGlobalVariable.ErrorLogger("FV Extension Header Entries declared for %s with no FvNameGuid declaration." % (self.UiFvName))\r
else:\r
TotalSize = 16 + 4\r
- Buffer = ''\r
+ Buffer = bytearray()\r
if self.UsedSizeEnable:\r
TotalSize += (4 + 4)\r
## define EFI_FV_EXT_TYPE_USED_SIZE_TYPE 0x03\r
Guid = FV_UI_EXT_ENTY_GUID.split('-')\r
#\r
# Layout:\r
- # EFI_FIRMWARE_VOLUME_EXT_ENTRY : size 4\r
- # GUID : size 16\r
+ # EFI_FIRMWARE_VOLUME_EXT_ENTRY: size 4\r
+ # GUID: size 16\r
# FV UI name\r
#\r
Buffer += (pack('HH', (FvUiLen + 16 + 4), 0x0002)\r
+ PackGUID(Guid)\r
- + self.UiFvName)\r
+ + self.UiFvName.encode('utf-8'))\r
\r
for Index in range (0, len(self.FvExtEntryType)):\r
if self.FvExtEntryType[Index] == 'FILE':\r
if Changed:\r
if os.path.exists (self.InfFileName):\r
os.remove (self.InfFileName)\r
- self.FvInfFile.writelines("EFI_FV_EXT_HEADER_FILE_NAME = " + \\r
+ self.FvInfFile.append("EFI_FV_EXT_HEADER_FILE_NAME = " + \\r
FvExtHeaderFileName + \\r
TAB_LINE_BREAK)\r
\r
-\r
#\r
# Add [Files]\r
#\r
- self.FvInfFile.writelines("[files]" + TAB_LINE_BREAK)\r
- if VtfDict and self.UiFvName in VtfDict:\r
- self.FvInfFile.writelines("EFI_FILE_NAME = " + \\r
- VtfDict[self.UiFvName] + \\r
- TAB_LINE_BREAK)\r
+ self.FvInfFile.append("[files]" + TAB_LINE_BREAK)\r