## @file\r
# generate capsule\r
#\r
-# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>\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 GenFdsGlobalVariable import GenFdsGlobalVariable\r
+from __future__ import absolute_import\r
+from .GenFdsGlobalVariable import GenFdsGlobalVariable, FindExtendTool\r
from CommonDataClass.FdfClass import CapsuleClassObject\r
import Common.LongFilePathOs as os\r
-import subprocess\r
-import StringIO\r
-from Common.Misc import SaveFileOnChange\r
-from GenFds import GenFds\r
-from Common.Misc import PackRegistryFormatGuid\r
+from io import BytesIO\r
+from Common.Misc import SaveFileOnChange, PackGUID\r
import uuid\r
from struct import pack\r
-from GenFds import FindExtendTool\r
from Common import EdkLogger\r
-from Common.BuildToolError import *\r
-\r
+from Common.BuildToolError import GENFDS_ERROR\r
+from Common.DataType import TAB_LINE_BREAK\r
\r
-T_CHAR_LF = '\n'\r
-WIN_CERT_REVISION = 0x0200\r
+WIN_CERT_REVISION = 0x0200\r
WIN_CERT_TYPE_EFI_GUID = 0x0EF1\r
EFI_CERT_TYPE_PKCS7_GUID = uuid.UUID('{4aafd29d-68df-49ee-8aa9-347d375665a7}')\r
EFI_CERT_TYPE_RSA2048_SHA256_GUID = uuid.UUID('{a7717414-c616-4977-9420-844712a735bf}')\r
## create inf file describes what goes into capsule and call GenFv to generate capsule\r
#\r
#\r
-class Capsule (CapsuleClassObject) :\r
+class Capsule (CapsuleClassObject):\r
## The constructor\r
#\r
# @param self The object pointer\r
# UINT32 CapsuleImageSize;\r
# } EFI_CAPSULE_HEADER;\r
#\r
- Header = StringIO.StringIO()\r
+ Header = BytesIO()\r
#\r
# Use FMP capsule GUID: 6DCBD5ED-E82D-4C44-BDA1-7194199AD92A\r
#\r
- Header.write(PackRegistryFormatGuid('6DCBD5ED-E82D-4C44-BDA1-7194199AD92A'))\r
+ Header.write(PackGUID('6DCBD5ED-E82D-4C44-BDA1-7194199AD92A'.split('-')))\r
HdrSize = 0\r
if 'CAPSULE_HEADER_SIZE' in self.TokensDict:\r
Header.write(pack('=I', int(self.TokensDict['CAPSULE_HEADER_SIZE'], 16)))\r
# // UINT64 ItemOffsetList[];\r
# } EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER;\r
#\r
- FwMgrHdr = StringIO.StringIO()\r
+ FwMgrHdr = BytesIO()\r
if 'CAPSULE_HEADER_INIT_VERSION' in self.TokensDict:\r
FwMgrHdr.write(pack('=I', int(self.TokensDict['CAPSULE_HEADER_INIT_VERSION'], 16)))\r
else:\r
#\r
\r
PreSize = FwMgrHdrSize\r
- Content = StringIO.StringIO()\r
+ Content = BytesIO()\r
for driver in self.CapsuleDataList:\r
FileName = driver.GenCapsuleSubItem()\r
FwMgrHdr.write(pack('=Q', PreSize))\r
Content.write(File.read())\r
File.close()\r
for fmp in self.FmpPayloadList:\r
+ if fmp.Existed:\r
+ FwMgrHdr.write(pack('=Q', PreSize))\r
+ PreSize += len(fmp.Buffer)\r
+ Content.write(fmp.Buffer)\r
+ continue\r
+ if fmp.ImageFile:\r
+ for Obj in fmp.ImageFile:\r
+ fmp.ImageFile = Obj.GenCapsuleSubItem()\r
+ if fmp.VendorCodeFile:\r
+ for Obj in fmp.VendorCodeFile:\r
+ fmp.VendorCodeFile = Obj.GenCapsuleSubItem()\r
if fmp.Certificate_Guid:\r
ExternalTool, ExternalOption = FindExtendTool([], GenFdsGlobalVariable.ArchList, fmp.Certificate_Guid)\r
CmdOption = ''\r
if not os.path.isabs(fmp.ImageFile):\r
CapInputFile = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, fmp.ImageFile)\r
CapOutputTmp = os.path.join(GenFdsGlobalVariable.FvDir, self.UiCapsuleName) + '.tmp'\r
- if ExternalTool == None:\r
+ if ExternalTool is None:\r
EdkLogger.error("GenFds", GENFDS_ERROR, "No tool found with GUID %s" % fmp.Certificate_Guid)\r
else:\r
CmdOption += ExternalTool\r
dwLength = 4 + 2 + 2 + 16 + 16 + 256 + 256\r
fmp.ImageFile = CapOutputTmp\r
AuthData = [fmp.MonotonicCount, dwLength, WIN_CERT_REVISION, WIN_CERT_TYPE_EFI_GUID, fmp.Certificate_Guid]\r
- Buffer = fmp.GenCapsuleSubItem(AuthData)\r
+ fmp.Buffer = fmp.GenCapsuleSubItem(AuthData)\r
else:\r
- Buffer = fmp.GenCapsuleSubItem()\r
+ fmp.Buffer = fmp.GenCapsuleSubItem()\r
FwMgrHdr.write(pack('=Q', PreSize))\r
- PreSize += len(Buffer)\r
- Content.write(Buffer)\r
+ PreSize += len(fmp.Buffer)\r
+ Content.write(fmp.Buffer)\r
BodySize = len(FwMgrHdr.getvalue()) + len(Content.getvalue())\r
Header.write(pack('=I', HdrSize + BodySize))\r
#\r
# The real capsule header structure is 28 bytes\r
#\r
- Header.write('\x00'*(HdrSize-28))\r
+ Header.write(b'\x00'*(HdrSize-28))\r
Header.write(FwMgrHdr.getvalue())\r
Header.write(Content.getvalue())\r
#\r
# @retval string Generated Capsule file path\r
#\r
def GenCapsule(self):\r
- if self.UiCapsuleName.upper() + 'cap' in GenFds.ImageBinDict.keys():\r
- return GenFds.ImageBinDict[self.UiCapsuleName.upper() + 'cap']\r
+ if self.UiCapsuleName.upper() + 'cap' in GenFdsGlobalVariable.ImageBinDict:\r
+ return GenFdsGlobalVariable.ImageBinDict[self.UiCapsuleName.upper() + 'cap']\r
\r
GenFdsGlobalVariable.InfLogger( "\nGenerate %s Capsule" %self.UiCapsuleName)\r
- if ('CAPSULE_GUID' in self.TokensDict and \r
+ if ('CAPSULE_GUID' in self.TokensDict and\r
uuid.UUID(self.TokensDict['CAPSULE_GUID']) == uuid.UUID('6DCBD5ED-E82D-4C44-BDA1-7194199AD92A')):\r
return self.GenFmpCapsule()\r
\r
CapInfFile = self.GenCapInf()\r
- CapInfFile.writelines("[files]" + T_CHAR_LF)\r
+ CapInfFile.append("[files]" + TAB_LINE_BREAK)\r
CapFileList = []\r
- for CapsuleDataObj in self.CapsuleDataList :\r
+ for CapsuleDataObj in self.CapsuleDataList:\r
CapsuleDataObj.CapsuleName = self.CapsuleName\r
FileName = CapsuleDataObj.GenCapsuleSubItem()\r
CapsuleDataObj.CapsuleName = None\r
CapFileList.append(FileName)\r
- CapInfFile.writelines("EFI_FILE_NAME = " + \\r
+ CapInfFile.append("EFI_FILE_NAME = " + \\r
FileName + \\r
- T_CHAR_LF)\r
- SaveFileOnChange(self.CapInfFileName, CapInfFile.getvalue(), False)\r
- CapInfFile.close()\r
+ TAB_LINE_BREAK)\r
+ SaveFileOnChange(self.CapInfFileName, ''.join(CapInfFile), False)\r
#\r
# Call GenFv tool to generate capsule\r
#\r
\r
GenFdsGlobalVariable.VerboseLogger( "\nGenerate %s Capsule Successfully" %self.UiCapsuleName)\r
GenFdsGlobalVariable.SharpCounter = 0\r
- GenFds.ImageBinDict[self.UiCapsuleName.upper() + 'cap'] = CapOutputFile\r
+ GenFdsGlobalVariable.ImageBinDict[self.UiCapsuleName.upper() + 'cap'] = CapOutputFile\r
return CapOutputFile\r
\r
## Generate inf file for capsule\r
def GenCapInf(self):\r
self.CapInfFileName = os.path.join(GenFdsGlobalVariable.FvDir,\r
self.UiCapsuleName + "_Cap" + '.inf')\r
- CapInfFile = StringIO.StringIO() #open (self.CapInfFileName , 'w+')\r
+ CapInfFile = []\r
\r
- CapInfFile.writelines("[options]" + T_CHAR_LF)\r
+ CapInfFile.append("[options]" + TAB_LINE_BREAK)\r
\r
- for Item in self.TokensDict.keys():\r
- CapInfFile.writelines("EFI_" + \\r
+ for Item in self.TokensDict:\r
+ CapInfFile.append("EFI_" + \\r
Item + \\r
' = ' + \\r
- self.TokensDict.get(Item) + \\r
- T_CHAR_LF)\r
+ self.TokensDict[Item] + \\r
+ TAB_LINE_BREAK)\r
\r
return CapInfFile\r