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:
committed by
mergify[bot]
parent
6933c78e4d
commit
5531fd48de
@ -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)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user