import StringIO\r
from CommonDataClass.FdfClass import RegionClassObject\r
import os\r
+from stat import *\r
from Common import EdkLogger\r
from Common.BuildToolError import *\r
\r
-\r
## generate Region\r
#\r
#\r
# @retval string Generated FV file path\r
#\r
\r
- def AddToBuffer(self, Buffer, BaseAddress, BlockSizeList, ErasePolarity, FvBinDict, vtfDict = None, MacroDict = {}):\r
+ def AddToBuffer(self, Buffer, BaseAddress, BlockSizeList, ErasePolarity, ImageBinDict, vtfDict = None, MacroDict = {}):\r
Size = self.Size\r
- GenFdsGlobalVariable.InfLogger('Generate Region at Offset 0x%X' % self.Offset)\r
+ GenFdsGlobalVariable.InfLogger('\nGenerate Region at Offset 0x%X' % self.Offset)\r
GenFdsGlobalVariable.InfLogger(" Region Size = 0x%X" %Size)\r
GenFdsGlobalVariable.SharpCounter = 0\r
\r
#\r
# Get Fv from FvDict\r
#\r
- FvBuffer = StringIO.StringIO('')\r
RegionBlockSize = self.BlockSizeOfRegion(BlockSizeList)\r
RegionBlockNum = self.BlockNumOfRegion(RegionBlockSize)\r
\r
self.FvAddress = int(BaseAddress, 16) + self.Offset\r
- FvBaseAddress = '0x%X' %self.FvAddress\r
-\r
+ FvBaseAddress = '0x%X' %self.FvAddress\r
+ FvOffset = 0\r
for RegionData in self.RegionDataList:\r
-\r
+ FileName = None\r
if RegionData.endswith(".fv"):\r
RegionData = GenFdsGlobalVariable.MacroExtend(RegionData, MacroDict)\r
GenFdsGlobalVariable.InfLogger(' Region FV File Name = .fv : %s'%RegionData)\r
if not os.path.exists(RegionData):\r
EdkLogger.error("GenFds", FILE_NOT_FOUND, ExtraData=RegionData)\r
\r
- BinFile = open (RegionData, 'r+b')\r
- FvBuffer.write(BinFile.read())\r
- if FvBuffer.len > Size:\r
+ FileName = RegionData\r
+ elif RegionData.upper() + 'fv' in ImageBinDict.keys():\r
+ GenFdsGlobalVariable.InfLogger(' Region Name = FV')\r
+ FileName = ImageBinDict[RegionData.upper() + 'fv']\r
+ else:\r
+ #\r
+ # Generate FvImage.\r
+ #\r
+ FvObj = None\r
+ if RegionData.upper() in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys():\r
+ FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(RegionData.upper())\r
+\r
+ if FvObj != None :\r
+ GenFdsGlobalVariable.InfLogger(' Region Name = FV')\r
+ #\r
+ # Call GenFv tool\r
+ #\r
+ BlockSize = RegionBlockSize\r
+ BlockNum = RegionBlockNum\r
+ if FvObj.BlockSizeList != []:\r
+ if FvObj.BlockSizeList[0][0] != None:\r
+ BlockSize = FvObj.BlockSizeList[0][0]\r
+ if FvObj.BlockSizeList[0][1] != None:\r
+ BlockNum = FvObj.BlockSizeList[0][1]\r
+ self.FvAddress = self.FvAddress + FvOffset\r
+ FvAlignValue = self.GetFvAlignValue(FvObj.FvAlignment)\r
+ if self.FvAddress % FvAlignValue != 0:\r
+ EdkLogger.error("GenFds", GENFDS_ERROR,\r
+ "FV (%s) is NOT %s Aligned!" % (FvObj.UiFvName, FvObj.FvAlignment))\r
+ FvBuffer = StringIO.StringIO('')\r
+ FvBaseAddress = '0x%X' %self.FvAddress\r
+ FvObj.AddToBuffer(FvBuffer, FvBaseAddress, BlockSize, BlockNum, ErasePolarity, vtfDict)\r
+ if FvBuffer.len > Size:\r
+ FvBuffer.close()\r
+ EdkLogger.error("GenFds", GENFDS_ERROR,\r
+ "Size of FV (%s) is larger than Region Size 0x%X specified." % (RegionData, Size))\r
+ #\r
+ # Put the generated image into FD buffer.\r
+ #\r
+ Buffer.write(FvBuffer.getvalue())\r
+ FvBuffer.close()\r
+ FvOffset = FvOffset + FvBuffer.len\r
+ Size = Size - FvBuffer.len\r
+ continue\r
+ else:\r
+ EdkLogger.error("GenFds", GENFDS_ERROR, "FV (%s) is NOT described in FDF file!" % (RegionData))\r
+ #\r
+ # Add the exist Fv image into FD buffer\r
+ #\r
+ if FileName != None:\r
+ FileLength = os.stat(FileName)[ST_SIZE]\r
+ if FileLength > Size:\r
EdkLogger.error("GenFds", GENFDS_ERROR,\r
"Size of FV File (%s) is larger than Region Size 0x%X specified." \\r
% (RegionData, Size))\r
- break\r
-\r
- if RegionData.upper() in FvBinDict.keys():\r
- continue\r
+ BinFile = open (FileName, 'r+b')\r
+ Buffer.write(BinFile.read())\r
+ BinFile.close()\r
+ Size = Size - FileLength\r
+ #\r
+ # Pad the left buffer\r
+ #\r
+ if Size > 0:\r
+ if (ErasePolarity == '1') :\r
+ PadData = 0xFF\r
+ else :\r
+ PadData = 0\r
+ for i in range(0, Size):\r
+ Buffer.write(pack('B', PadData))\r
\r
- FvObj = None\r
- if RegionData.upper() in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys():\r
- FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(RegionData.upper())\r
+ if self.RegionType == 'CAPSULE':\r
+ #\r
+ # Get Capsule from Capsule Dict\r
+ #\r
+ for RegionData in self.RegionDataList:\r
+ if RegionData.endswith(".cap"):\r
+ RegionData = GenFdsGlobalVariable.MacroExtend(RegionData, MacroDict)\r
+ GenFdsGlobalVariable.InfLogger(' Region CAPSULE Image Name = .cap : %s'%RegionData)\r
+ if RegionData[1] != ':' :\r
+ RegionData = os.path.join (GenFdsGlobalVariable.WorkSpaceDir, RegionData)\r
+ if not os.path.exists(RegionData):\r
+ EdkLogger.error("GenFds", FILE_NOT_FOUND, ExtraData=RegionData)\r
\r
- if FvObj != None :\r
- GenFdsGlobalVariable.InfLogger(' Region Name = FV')\r
+ FileName = RegionData\r
+ elif RegionData.upper() + 'cap' in ImageBinDict.keys():\r
+ GenFdsGlobalVariable.InfLogger(' Region Name = CAPSULE')\r
+ FileName = ImageBinDict[RegionData.upper() + 'cap']\r
+ else:\r
#\r
- # Call GenFv tool\r
+ # Generate Capsule image and Put it into FD buffer\r
#\r
- BlockSize = RegionBlockSize\r
- BlockNum = RegionBlockNum\r
- if FvObj.BlockSizeList != []:\r
- if FvObj.BlockSizeList[0][0] != None:\r
- BlockSize = FvObj.BlockSizeList[0][0]\r
- if FvObj.BlockSizeList[0][1] != None:\r
- BlockNum = FvObj.BlockSizeList[0][1]\r
- self.FvAddress = self.FvAddress + FvBuffer.len\r
- FvAlignValue = self.GetFvAlignValue(FvObj.FvAlignment)\r
- if self.FvAddress % FvAlignValue != 0:\r
- EdkLogger.error("GenFds", GENFDS_ERROR,\r
- "FV (%s) is NOT %s Aligned!" % (FvObj.UiFvName, FvObj.FvAlignment))\r
- FvBaseAddress = '0x%X' %self.FvAddress\r
- FileName = FvObj.AddToBuffer(FvBuffer, FvBaseAddress, BlockSize, BlockNum, ErasePolarity, vtfDict)\r
-\r
- if FvBuffer.len > Size:\r
- EdkLogger.error("GenFds", GENFDS_ERROR,\r
- "Size of FV (%s) is larger than Region Size 0x%X specified." % (RegionData, Size))\r
- else:\r
- EdkLogger.error("GenFds", GENFDS_ERROR, "FV (%s) is NOT described in FDF file!" % (RegionData))\r
+ CapsuleObj = None\r
+ if RegionData.upper() in GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict.keys():\r
+ CapsuleObj = GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict[RegionData.upper()]\r
\r
+ if CapsuleObj != None :\r
+ CapsuleObj.CapsuleName = RegionData.upper()\r
+ GenFdsGlobalVariable.InfLogger(' Region Name = CAPSULE')\r
+ #\r
+ # Call GenFv tool to generate Capsule Image\r
+ #\r
+ FileName = CapsuleObj.GenCapsule()\r
+ CapsuleObj.CapsuleName = None\r
+ else:\r
+ EdkLogger.error("GenFds", GENFDS_ERROR, "Capsule (%s) is NOT described in FDF file!" % (RegionData))\r
\r
- if FvBuffer.len > 0:\r
- Buffer.write(FvBuffer.getvalue())\r
- else:\r
- BinFile = open (FileName, 'rb')\r
+ #\r
+ # Add the capsule image into FD buffer\r
+ #\r
+ FileLength = os.stat(FileName)[ST_SIZE]\r
+ if FileLength > Size:\r
+ EdkLogger.error("GenFds", GENFDS_ERROR,\r
+ "Size 0x%X of Capsule File (%s) is larger than Region Size 0x%X specified." \\r
+ % (FileLength, RegionData, Size))\r
+ BinFile = open (FileName, 'r+b')\r
Buffer.write(BinFile.read())\r
-\r
- FvBuffer.close()\r
+ BinFile.close()\r
+ Size = Size - FileLength\r
+ #\r
+ # Pad the left buffer\r
+ #\r
+ if Size > 0:\r
+ if (ErasePolarity == '1') :\r
+ PadData = 0xFF\r
+ else :\r
+ PadData = 0\r
+ for i in range(0, Size):\r
+ Buffer.write(pack('B', PadData))\r
\r
if self.RegionType == 'FILE':\r
- FvBuffer = StringIO.StringIO('')\r
for RegionData in self.RegionDataList:\r
RegionData = GenFdsGlobalVariable.MacroExtend(RegionData, MacroDict)\r
- GenFdsGlobalVariable.InfLogger(' Region File Name = FILE: %s'%RegionData)\r
if RegionData[1] != ':' :\r
RegionData = os.path.join (GenFdsGlobalVariable.WorkSpaceDir, RegionData)\r
if not os.path.exists(RegionData):\r
EdkLogger.error("GenFds", FILE_NOT_FOUND, ExtraData=RegionData)\r
-\r
- BinFile = open (RegionData, 'r+b')\r
- FvBuffer.write(BinFile.read())\r
- if FvBuffer.len > Size :\r
+ #\r
+ # Add the file image into FD buffer\r
+ #\r
+ FileLength = os.stat(RegionData)[ST_SIZE]\r
+ if FileLength > Size:\r
EdkLogger.error("GenFds", GENFDS_ERROR,\r
- "Size of File (%s) large than Region Size " % RegionData)\r
-\r
+ "Size of File (%s) is larger than Region Size 0x%X specified." \\r
+ % (RegionData, Size))\r
+ GenFdsGlobalVariable.InfLogger(' Region File Name = %s'%RegionData)\r
+ BinFile = open (RegionData, 'r+b')\r
+ Buffer.write(BinFile.read())\r
+ BinFile.close()\r
+ Size = Size - FileLength\r
#\r
- # If File contents less than region size, append "0xff" after it\r
+ # Pad the left buffer\r
#\r
- if FvBuffer.len < Size:\r
- for index in range(0, (Size-FvBuffer.len)):\r
- if (ErasePolarity == '1'):\r
- FvBuffer.write(pack('B', int('0xFF', 16)))\r
- else:\r
- FvBuffer.write(pack('B', int('0x00', 16)))\r
- Buffer.write(FvBuffer.getvalue())\r
- FvBuffer.close()\r
+ if Size > 0:\r
+ if (ErasePolarity == '1') :\r
+ PadData = 0xFF\r
+ else :\r
+ PadData = 0\r
+ for i in range(0, Size):\r
+ Buffer.write(pack('B', PadData))\r
\r
if self.RegionType == 'DATA' :\r
GenFdsGlobalVariable.InfLogger(' Region Name = DATA')\r
else:\r
for item in Data :\r
Buffer.write(pack('B', int(item, 16)))\r
- if DataSize < Size:\r
- if (ErasePolarity == '1'):\r
+ Size = Size - DataSize\r
+ #\r
+ # Pad the left buffer\r
+ #\r
+ if Size > 0:\r
+ if (ErasePolarity == '1') :\r
PadData = 0xFF\r
- else:\r
+ else :\r
PadData = 0\r
- for i in range(Size - DataSize):\r
+ for i in range(0, Size):\r
Buffer.write(pack('B', PadData))\r
\r
if self.RegionType == None:\r