mirror of https://github.com/acidanthera/audk.git
216 lines
8.4 KiB
Python
216 lines
8.4 KiB
Python
## @file
|
|
# process FV generation
|
|
#
|
|
# Copyright (c) 2007, 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
|
|
# which accompanies this distribution. The full text of the license may be found at
|
|
# http://opensource.org/licenses/bsd-license.php
|
|
#
|
|
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
#
|
|
|
|
##
|
|
# Import Modules
|
|
#
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
import StringIO
|
|
|
|
import Ffs
|
|
import AprioriSection
|
|
from GenFdsGlobalVariable import GenFdsGlobalVariable
|
|
from GenFds import GenFds
|
|
from CommonDataClass.FdfClass import FvClassObject
|
|
from Common.Misc import SaveFileOnChange
|
|
|
|
T_CHAR_LF = '\n'
|
|
|
|
## generate FV
|
|
#
|
|
#
|
|
class FV (FvClassObject):
|
|
## The constructor
|
|
#
|
|
# @param self The object pointer
|
|
#
|
|
def __init__(self):
|
|
FvClassObject.__init__(self)
|
|
self.FvInfFile = None
|
|
self.FvAddressFile = None
|
|
self.BaseAddress = None
|
|
self.InfFileName = None
|
|
self.FvAddressFileName = None
|
|
|
|
## AddToBuffer()
|
|
#
|
|
# Generate Fv and add it to the Buffer
|
|
#
|
|
# @param self The object pointer
|
|
# @param Buffer The buffer generated FV data will be put
|
|
# @param BaseAddress base address of FV
|
|
# @param BlockSize block size of FV
|
|
# @param BlockNum How many blocks in FV
|
|
# @param ErasePolarity Flash erase polarity
|
|
# @param VtfDict VTF objects
|
|
# @param MacroDict macro value pair
|
|
# @retval string Generated FV file path
|
|
#
|
|
def AddToBuffer (self, Buffer, BaseAddress=None, BlockSize= None, BlockNum=None, ErasePloarity='1', VtfDict=None, MacroDict = {}) :
|
|
|
|
if self.UiFvName.upper() in GenFds.FvBinDict.keys():
|
|
return GenFds.FvBinDict[self.UiFvName.upper()]
|
|
|
|
GenFdsGlobalVariable.InfLogger( "\nGenerating %s FV ..." %self.UiFvName)
|
|
|
|
self.__InitializeInf__(BaseAddress, BlockSize, BlockNum, ErasePloarity, VtfDict)
|
|
#
|
|
# First Process the Apriori section
|
|
#
|
|
MacroDict.update(self.DefineVarDict)
|
|
|
|
GenFdsGlobalVariable.VerboseLogger('First generate Apriori file !')
|
|
FfsFileList = []
|
|
for AprSection in self.AprioriSectionList:
|
|
FileName = AprSection.GenFfs (self.UiFvName, MacroDict)
|
|
FfsFileList.append(FileName)
|
|
# Add Apriori file name to Inf file
|
|
self.FvInfFile.writelines("EFI_FILE_NAME = " + \
|
|
FileName + \
|
|
T_CHAR_LF)
|
|
|
|
# Process Modules in FfsList
|
|
for FfsFile in self.FfsList :
|
|
FileName = FfsFile.GenFfs(MacroDict)
|
|
FfsFileList.append(FileName)
|
|
self.FvInfFile.writelines("EFI_FILE_NAME = " + \
|
|
FileName + \
|
|
T_CHAR_LF)
|
|
|
|
SaveFileOnChange(self.InfFileName, self.FvInfFile.getvalue(), False)
|
|
self.FvInfFile.close()
|
|
#
|
|
# Call GenFv tool
|
|
#
|
|
FvOutputFile = os.path.join(GenFdsGlobalVariable.FvDir, self.UiFvName)
|
|
FvOutputFile = FvOutputFile + '.Fv'
|
|
# BUGBUG: FvOutputFile could be specified from FDF file (FV section, CreateFile statement)
|
|
if self.CreateFileName != None:
|
|
FvOutputFile = self.CreateFileName
|
|
|
|
FvInfoFileName = os.path.join(GenFdsGlobalVariable.FfsDir, self.UiFvName + '.inf')
|
|
shutil.copy(GenFdsGlobalVariable.FvAddressFileName, FvInfoFileName)
|
|
GenFdsGlobalVariable.GenerateFirmwareVolume(
|
|
FvOutputFile,
|
|
[self.InfFileName],
|
|
AddressFile=FvInfoFileName,
|
|
FfsList=FfsFileList
|
|
)
|
|
|
|
#
|
|
# Write the Fv contents to Buffer
|
|
#
|
|
FvFileObj = open ( FvOutputFile,'r+b')
|
|
|
|
GenFdsGlobalVariable.InfLogger( "\nGenerate %s FV Successfully" %self.UiFvName)
|
|
GenFdsGlobalVariable.SharpCounter = 0
|
|
|
|
Buffer.write(FvFileObj.read())
|
|
FvFileObj.close()
|
|
GenFds.FvBinDict[self.UiFvName.upper()] = FvOutputFile
|
|
return FvOutputFile
|
|
|
|
## __InitializeInf__()
|
|
#
|
|
# Initilize the inf file to create FV
|
|
#
|
|
# @param self The object pointer
|
|
# @param BaseAddress base address of FV
|
|
# @param BlockSize block size of FV
|
|
# @param BlockNum How many blocks in FV
|
|
# @param ErasePolarity Flash erase polarity
|
|
# @param VtfDict VTF objects
|
|
#
|
|
def __InitializeInf__ (self, BaseAddress = None, BlockSize= None, BlockNum = None, ErasePloarity='1', VtfDict=None) :
|
|
#
|
|
# Create FV inf file
|
|
#
|
|
self.InfFileName = os.path.join(GenFdsGlobalVariable.FvDir,
|
|
self.UiFvName + '.inf')
|
|
self.FvInfFile = StringIO.StringIO()
|
|
|
|
#
|
|
# Add [Options]
|
|
#
|
|
self.FvInfFile.writelines("[options]" + T_CHAR_LF)
|
|
if BaseAddress != None :
|
|
self.FvInfFile.writelines("EFI_BASE_ADDRESS = " + \
|
|
BaseAddress + \
|
|
T_CHAR_LF)
|
|
|
|
if BlockSize != None:
|
|
self.FvInfFile.writelines("EFI_BLOCK_SIZE = " + \
|
|
'0x%X' %BlockSize + \
|
|
T_CHAR_LF)
|
|
if BlockNum != None:
|
|
self.FvInfFile.writelines("EFI_NUM_BLOCKS = " + \
|
|
' 0x%X' %BlockNum + \
|
|
T_CHAR_LF)
|
|
else:
|
|
for BlockSize in self.BlockSizeList :
|
|
if BlockSize[0] != None:
|
|
self.FvInfFile.writelines("EFI_BLOCK_SIZE = " + \
|
|
'0x%X' %BlockSize[0] + \
|
|
T_CHAR_LF)
|
|
|
|
if BlockSize[1] != None:
|
|
self.FvInfFile.writelines("EFI_NUM_BLOCKS = " + \
|
|
' 0x%X' %BlockSize[1] + \
|
|
T_CHAR_LF)
|
|
|
|
if self.BsBaseAddress != None:
|
|
self.FvInfFile.writelines('EFI_BOOT_DRIVER_BASE_ADDRESS = ' + \
|
|
'0x%X' %self.BsBaseAddress)
|
|
if self.RtBaseAddress != None:
|
|
self.FvInfFile.writelines('EFI_RUNTIME_DRIVER_BASE_ADDRESS = ' + \
|
|
'0x%X' %self.RtBaseAddress)
|
|
#
|
|
# Add attribute
|
|
#
|
|
self.FvInfFile.writelines("[attributes]" + T_CHAR_LF)
|
|
|
|
self.FvInfFile.writelines("EFI_ERASE_POLARITY = " + \
|
|
' %s' %ErasePloarity + \
|
|
T_CHAR_LF)
|
|
if not (self.FvAttributeDict == None):
|
|
for FvAttribute in self.FvAttributeDict.keys() :
|
|
self.FvInfFile.writelines("EFI_" + \
|
|
FvAttribute + \
|
|
' = ' + \
|
|
self.FvAttributeDict[FvAttribute] + \
|
|
T_CHAR_LF )
|
|
if self.FvAlignment != None:
|
|
self.FvInfFile.writelines("EFI_FVB2_ALIGNMENT_" + \
|
|
self.FvAlignment.strip() + \
|
|
" = TRUE" + \
|
|
T_CHAR_LF)
|
|
|
|
if self.FvNameGuid != None:
|
|
self.FvInfFile.writelines("EFI_FVNAME_GUID" + \
|
|
" = %s" % self.FvNameGuid + \
|
|
T_CHAR_LF)
|
|
#
|
|
# Add [Files]
|
|
#
|
|
|
|
self.FvInfFile.writelines("[files]" + T_CHAR_LF)
|
|
if VtfDict != None and self.UiFvName in VtfDict.keys():
|
|
self.FvInfFile.writelines("EFI_FILE_NAME = " + \
|
|
VtfDict.get(self.UiFvName) + \
|
|
T_CHAR_LF)
|
|
|
|
|