BaseTools: Add support for version 3 of FMP Image Header structure

Add support for the ImageCapsuleSupport field, introduced in version 3
of the EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER structure. This
structure member is used to indicate if the corresponding payload has
support for authentication and dependency.

Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
This commit is contained in:
Sughosh Ganu
2021-04-22 15:50:59 +08:00
committed by mergify[bot]
parent 6933c78e4d
commit 5531fd48de
2 changed files with 24 additions and 9 deletions

View File

@ -561,6 +561,7 @@ if __name__ == '__main__':
print ('GenerateCapsule: error:' + str(Msg)) print ('GenerateCapsule: error:' + str(Msg))
sys.exit (1) sys.exit (1)
for SinglePayloadDescriptor in PayloadDescriptorList: for SinglePayloadDescriptor in PayloadDescriptorList:
ImageCapsuleSupport = 0x0000000000000000
Result = SinglePayloadDescriptor.Payload Result = SinglePayloadDescriptor.Payload
try: try:
FmpPayloadHeader.FwVersion = SinglePayloadDescriptor.FwVersion FmpPayloadHeader.FwVersion = SinglePayloadDescriptor.FwVersion
@ -575,6 +576,7 @@ if __name__ == '__main__':
if SinglePayloadDescriptor.UseDependency: if SinglePayloadDescriptor.UseDependency:
CapsuleDependency.Payload = Result CapsuleDependency.Payload = Result
CapsuleDependency.DepexExp = SinglePayloadDescriptor.DepexExp CapsuleDependency.DepexExp = SinglePayloadDescriptor.DepexExp
ImageCapsuleSupport |= FmpCapsuleHeader.CAPSULE_SUPPORT_DEPENDENCY
Result = CapsuleDependency.Encode () Result = CapsuleDependency.Encode ()
if args.Verbose: if args.Verbose:
CapsuleDependency.DumpInfo () CapsuleDependency.DumpInfo ()
@ -607,13 +609,14 @@ if __name__ == '__main__':
FmpAuthHeader.MonotonicCount = SinglePayloadDescriptor.MonotonicCount FmpAuthHeader.MonotonicCount = SinglePayloadDescriptor.MonotonicCount
FmpAuthHeader.CertData = CertData FmpAuthHeader.CertData = CertData
FmpAuthHeader.Payload = Result FmpAuthHeader.Payload = Result
ImageCapsuleSupport |= FmpCapsuleHeader.CAPSULE_SUPPORT_AUTHENTICATION
Result = FmpAuthHeader.Encode () Result = FmpAuthHeader.Encode ()
if args.Verbose: if args.Verbose:
FmpAuthHeader.DumpInfo () FmpAuthHeader.DumpInfo ()
except: except:
print ('GenerateCapsule: error: can not encode FMP Auth Header') print ('GenerateCapsule: error: can not encode FMP Auth Header')
sys.exit (1) sys.exit (1)
FmpCapsuleHeader.AddPayload (SinglePayloadDescriptor.Guid, Result, HardwareInstance = SinglePayloadDescriptor.HardwareInstance, UpdateImageIndex = SinglePayloadDescriptor.UpdateImageIndex) FmpCapsuleHeader.AddPayload (SinglePayloadDescriptor.Guid, Result, HardwareInstance = SinglePayloadDescriptor.HardwareInstance, UpdateImageIndex = SinglePayloadDescriptor.UpdateImageIndex, CapsuleSupport = ImageCapsuleSupport)
try: try:
for EmbeddedDriver in EmbeddedDriverDescriptorList: for EmbeddedDriver in EmbeddedDriverDescriptorList:
FmpCapsuleHeader.AddEmbeddedDriver(EmbeddedDriver) FmpCapsuleHeader.AddEmbeddedDriver(EmbeddedDriver)

View File

@ -47,14 +47,19 @@ class FmpCapsuleImageHeaderClass (object):
# /// therefore can be modified without changing the Auth data. # /// therefore can be modified without changing the Auth data.
# /// # ///
# UINT64 UpdateHardwareInstance; # UINT64 UpdateHardwareInstance;
#
# ///
# /// Bits which indicate authentication and depex information for the image that follows this structure
# ///
# UINT64 ImageCapsuleSupport
# } EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER; # } EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER;
# #
# #define EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION 0x00000002 # #define EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION 0x00000003
_StructFormat = '<I16sB3BIIQ' _StructFormat = '<I16sB3BIIQQ'
_StructSize = struct.calcsize (_StructFormat) _StructSize = struct.calcsize (_StructFormat)
EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION = 0x00000002 EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION = 0x00000003
def __init__ (self): def __init__ (self):
self._Valid = False self._Valid = False
@ -64,6 +69,7 @@ class FmpCapsuleImageHeaderClass (object):
self.UpdateImageSize = 0 self.UpdateImageSize = 0
self.UpdateVendorCodeSize = 0 self.UpdateVendorCodeSize = 0
self.UpdateHardwareInstance = 0x0000000000000000 self.UpdateHardwareInstance = 0x0000000000000000
self.ImageCapsuleSupport = 0x0000000000000000
self.Payload = b'' self.Payload = b''
self.VendorCodeBytes = b'' self.VendorCodeBytes = b''
@ -78,7 +84,8 @@ class FmpCapsuleImageHeaderClass (object):
0,0,0, 0,0,0,
self.UpdateImageSize, self.UpdateImageSize,
self.UpdateVendorCodeSize, self.UpdateVendorCodeSize,
self.UpdateHardwareInstance self.UpdateHardwareInstance,
self.ImageCapsuleSupport
) )
self._Valid = True self._Valid = True
return FmpCapsuleImageHeader + self.Payload + self.VendorCodeBytes return FmpCapsuleImageHeader + self.Payload + self.VendorCodeBytes
@ -86,7 +93,7 @@ class FmpCapsuleImageHeaderClass (object):
def Decode (self, Buffer): def Decode (self, Buffer):
if len (Buffer) < self._StructSize: if len (Buffer) < self._StructSize:
raise ValueError raise ValueError
(Version, UpdateImageTypeId, UpdateImageIndex, r0, r1, r2, UpdateImageSize, UpdateVendorCodeSize, UpdateHardwareInstance) = \ (Version, UpdateImageTypeId, UpdateImageIndex, r0, r1, r2, UpdateImageSize, UpdateVendorCodeSize, UpdateHardwareInstance, ImageCapsuleSupport) = \
struct.unpack ( struct.unpack (
self._StructFormat, self._StructFormat,
Buffer[0:self._StructSize] Buffer[0:self._StructSize]
@ -105,6 +112,7 @@ class FmpCapsuleImageHeaderClass (object):
self.UpdateImageSize = UpdateImageSize self.UpdateImageSize = UpdateImageSize
self.UpdateVendorCodeSize = UpdateVendorCodeSize self.UpdateVendorCodeSize = UpdateVendorCodeSize
self.UpdateHardwareInstance = UpdateHardwareInstance self.UpdateHardwareInstance = UpdateHardwareInstance
self.ImageCapsuleSupport = ImageCapsuleSupport
self.Payload = Buffer[self._StructSize:self._StructSize + UpdateImageSize] self.Payload = Buffer[self._StructSize:self._StructSize + UpdateImageSize]
self.VendorCodeBytes = Buffer[self._StructSize + UpdateImageSize:] self.VendorCodeBytes = Buffer[self._StructSize + UpdateImageSize:]
self._Valid = True self._Valid = True
@ -119,6 +127,7 @@ class FmpCapsuleImageHeaderClass (object):
print ('EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER.UpdateImageSize = {UpdateImageSize:08X}'.format (UpdateImageSize = self.UpdateImageSize)) print ('EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER.UpdateImageSize = {UpdateImageSize:08X}'.format (UpdateImageSize = self.UpdateImageSize))
print ('EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER.UpdateVendorCodeSize = {UpdateVendorCodeSize:08X}'.format (UpdateVendorCodeSize = self.UpdateVendorCodeSize)) print ('EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER.UpdateVendorCodeSize = {UpdateVendorCodeSize:08X}'.format (UpdateVendorCodeSize = self.UpdateVendorCodeSize))
print ('EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER.UpdateHardwareInstance = {UpdateHardwareInstance:016X}'.format (UpdateHardwareInstance = self.UpdateHardwareInstance)) print ('EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER.UpdateHardwareInstance = {UpdateHardwareInstance:016X}'.format (UpdateHardwareInstance = self.UpdateHardwareInstance))
print ('EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER.ImageCapsuleSupport = {ImageCapsuleSupport:016X}'.format (ImageCapsuleSupport = self.ImageCapsuleSupport))
print ('sizeof (Payload) = {Size:08X}'.format (Size = len (self.Payload))) print ('sizeof (Payload) = {Size:08X}'.format (Size = len (self.Payload)))
print ('sizeof (VendorCodeBytes) = {Size:08X}'.format (Size = len (self.VendorCodeBytes))) print ('sizeof (VendorCodeBytes) = {Size:08X}'.format (Size = len (self.VendorCodeBytes)))
@ -153,6 +162,8 @@ class FmpCapsuleHeaderClass (object):
_ItemOffsetSize = struct.calcsize (_ItemOffsetFormat) _ItemOffsetSize = struct.calcsize (_ItemOffsetFormat)
EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER_INIT_VERSION = 0x00000001 EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER_INIT_VERSION = 0x00000001
CAPSULE_SUPPORT_AUTHENTICATION = 0x0000000000000001
CAPSULE_SUPPORT_DEPENDENCY = 0x0000000000000002
def __init__ (self): def __init__ (self):
self._Valid = False self._Valid = False
@ -172,8 +183,8 @@ class FmpCapsuleHeaderClass (object):
raise ValueError raise ValueError
return self._EmbeddedDriverList[Index] return self._EmbeddedDriverList[Index]
def AddPayload (self, UpdateImageTypeId, Payload = b'', VendorCodeBytes = b'', HardwareInstance = 0, UpdateImageIndex = 1): def AddPayload (self, UpdateImageTypeId, Payload = b'', VendorCodeBytes = b'', HardwareInstance = 0, UpdateImageIndex = 1, CapsuleSupport = 0):
self._PayloadList.append ((UpdateImageTypeId, Payload, VendorCodeBytes, HardwareInstance, UpdateImageIndex)) self._PayloadList.append ((UpdateImageTypeId, Payload, VendorCodeBytes, HardwareInstance, UpdateImageIndex, CapsuleSupport))
def GetFmpCapsuleImageHeader (self, Index): def GetFmpCapsuleImageHeader (self, Index):
if Index >= len (self._FmpCapsuleImageHeaderList): if Index >= len (self._FmpCapsuleImageHeaderList):
@ -198,13 +209,14 @@ class FmpCapsuleHeaderClass (object):
self._ItemOffsetList.append (Offset) self._ItemOffsetList.append (Offset)
Offset = Offset + len (EmbeddedDriver) Offset = Offset + len (EmbeddedDriver)
Index = 1 Index = 1
for (UpdateImageTypeId, Payload, VendorCodeBytes, HardwareInstance, UpdateImageIndex) in self._PayloadList: for (UpdateImageTypeId, Payload, VendorCodeBytes, HardwareInstance, UpdateImageIndex, CapsuleSupport) in self._PayloadList:
FmpCapsuleImageHeader = FmpCapsuleImageHeaderClass () FmpCapsuleImageHeader = FmpCapsuleImageHeaderClass ()
FmpCapsuleImageHeader.UpdateImageTypeId = UpdateImageTypeId FmpCapsuleImageHeader.UpdateImageTypeId = UpdateImageTypeId
FmpCapsuleImageHeader.UpdateImageIndex = UpdateImageIndex FmpCapsuleImageHeader.UpdateImageIndex = UpdateImageIndex
FmpCapsuleImageHeader.Payload = Payload FmpCapsuleImageHeader.Payload = Payload
FmpCapsuleImageHeader.VendorCodeBytes = VendorCodeBytes FmpCapsuleImageHeader.VendorCodeBytes = VendorCodeBytes
FmpCapsuleImageHeader.UpdateHardwareInstance = HardwareInstance FmpCapsuleImageHeader.UpdateHardwareInstance = HardwareInstance
FmpCapsuleImageHeader.ImageCapsuleSupport = CapsuleSupport
FmpCapsuleImage = FmpCapsuleImageHeader.Encode () FmpCapsuleImage = FmpCapsuleImageHeader.Encode ()
FmpCapsuleData = FmpCapsuleData + FmpCapsuleImage FmpCapsuleData = FmpCapsuleData + FmpCapsuleImage