BaseTools: Fix the bug use same FMP_PAYLOAD in different capsule file

Fix the bug that use same FMP_PAYLOAD in different capsule file. Because
in previous FMP generation, the FMP already be generated, so we don't
need to regenerate again.

Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Yonghong Zhu 2017-06-06 13:28:07 +08:00
parent 4a1167dfef
commit d4c558e83d
2 changed files with 13 additions and 5 deletions

View File

@ -1,7 +1,7 @@
## @file ## @file
# generate capsule # generate capsule
# #
# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -141,6 +141,11 @@ class Capsule (CapsuleClassObject) :
Content.write(File.read()) Content.write(File.read())
File.close() File.close()
for fmp in self.FmpPayloadList: for fmp in self.FmpPayloadList:
if fmp.Existed:
FwMgrHdr.write(pack('=Q', PreSize))
PreSize += len(fmp.Buffer)
Content.write(fmp.Buffer)
continue
if fmp.ImageFile: if fmp.ImageFile:
for Obj in fmp.ImageFile: for Obj in fmp.ImageFile:
fmp.ImageFile = Obj.GenCapsuleSubItem() fmp.ImageFile = Obj.GenCapsuleSubItem()
@ -169,12 +174,12 @@ class Capsule (CapsuleClassObject) :
dwLength = 4 + 2 + 2 + 16 + 16 + 256 + 256 dwLength = 4 + 2 + 2 + 16 + 16 + 256 + 256
fmp.ImageFile = CapOutputTmp fmp.ImageFile = CapOutputTmp
AuthData = [fmp.MonotonicCount, dwLength, WIN_CERT_REVISION, WIN_CERT_TYPE_EFI_GUID, fmp.Certificate_Guid] AuthData = [fmp.MonotonicCount, dwLength, WIN_CERT_REVISION, WIN_CERT_TYPE_EFI_GUID, fmp.Certificate_Guid]
Buffer = fmp.GenCapsuleSubItem(AuthData) fmp.Buffer = fmp.GenCapsuleSubItem(AuthData)
else: else:
Buffer = fmp.GenCapsuleSubItem() fmp.Buffer = fmp.GenCapsuleSubItem()
FwMgrHdr.write(pack('=Q', PreSize)) FwMgrHdr.write(pack('=Q', PreSize))
PreSize += len(Buffer) PreSize += len(fmp.Buffer)
Content.write(Buffer) Content.write(fmp.Buffer)
BodySize = len(FwMgrHdr.getvalue()) + len(Content.getvalue()) BodySize = len(FwMgrHdr.getvalue()) + len(Content.getvalue())
Header.write(pack('=I', HdrSize + BodySize)) Header.write(pack('=I', HdrSize + BodySize))
# #

View File

@ -183,6 +183,8 @@ class CapsulePayload(CapsuleData):
self.VendorCodeFile = [] self.VendorCodeFile = []
self.Certificate_Guid = None self.Certificate_Guid = None
self.MonotonicCount = None self.MonotonicCount = None
self.Existed = False
self.Buffer = None
def GenCapsuleSubItem(self, AuthData=[]): def GenCapsuleSubItem(self, AuthData=[]):
if not self.Version: if not self.Version:
@ -239,4 +241,5 @@ class CapsulePayload(CapsuleData):
VendorFile = open(self.VendorCodeFile, 'rb') VendorFile = open(self.VendorCodeFile, 'rb')
Buffer += VendorFile.read() Buffer += VendorFile.read()
VendorFile.close() VendorFile.close()
self.Existed = True
return Buffer return Buffer