From: "Michael D Kinney" <michael.d.kinney@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
"sughosh.ganu@linaro.org" <sughosh.ganu@linaro.org>,
"Kinney, Michael D" <michael.d.kinney@intel.com>
Cc: "Feng, Bob C" <bob.c.feng@intel.com>,
Liming Gao <gaoliming@byosoft.com.cn>,
"Chen, Christine" <yuwei.chen@intel.com>
Subject: Re: [edk2-devel] [PATCH] BaseTools: GenerateCapsule.py: Add support for version 3 of FMP Image Header structure
Date: Tue, 20 Apr 2021 15:56:00 +0000 [thread overview]
Message-ID: <CO1PR11MB4929C6C9B5765898DF1559B4D2489@CO1PR11MB4929.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20210419114004.16505-1-sughosh.ganu@linaro.org>
Hi,
I think this patch is functional, but there are a few things that can be improved.
1) We should not use of the hard coded constants for the ImageCapsuleSupport values.
The UEFI spec has #defines for these values, and we need to figure out how to add
those define values in the scope of the FMP Capsule Image Header. Perhaps add the
values to FmpCapsuleImageHeaderClass in FmpCapsuleHeader.py:
class FmpCapsuleImageHeaderClass (object):
CAPSULE_SUPPORT_AUTHENTICATION = 0x0000000000000001
CAPSULE_SUPPORT_DEPENDENCY = 0x0000000000000002
From GenerateCapsule.py, you can use these values to set ImageCapsuleSupport.
Value 0 is not defined by the UEFI Spec. Though that appears to be the value used
for a raw payload without authentication or dependency information.
Since GenerateCapsule does not import FmpCapsuleImageHeaderClass, these defines
may have to be added to the FmpCapsuleHeaderClass instead.
2) The ImageCapsuleSupport parameter is added in the middle of the python function arguments.
Since this is a new field added at the end of the V3 structure, I recommend we add arguments
at the end of the argument list. This will be an optional argument, so any existing use
of these methods for V2 use cases will not be impacted. These python methods can be
potentially used by other consumers, so we should always consider backwards compatibility
when updating BaseTools/Source/Python/Common areas.
Thanks,
Mike
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Sughosh Ganu
> Sent: Monday, April 19, 2021 4:40 AM
> To: devel@edk2.groups.io
> Cc: Feng, Bob C <bob.c.feng@intel.com>; Liming Gao <gaoliming@byosoft.com.cn>; Chen, Christine <yuwei.chen@intel.com>;
> Sughosh Ganu <sughosh.ganu@linaro.org>
> Subject: [edk2-devel] [PATCH] BaseTools: GenerateCapsule.py: 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>
> ---
> .../Source/Python/Capsule/GenerateCapsule.py | 5 +++-
> .../Common/Uefi/Capsule/FmpCapsuleHeader.py | 26 +++++++++++++------
> 2 files changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/BaseTools/Source/Python/Capsule/GenerateCapsule.py b/BaseTools/Source/Python/Capsule/GenerateCapsule.py
> index a8de988253..6419a2ac6f 100644
> --- a/BaseTools/Source/Python/Capsule/GenerateCapsule.py
> +++ b/BaseTools/Source/Python/Capsule/GenerateCapsule.py
> @@ -561,6 +561,7 @@ if __name__ == '__main__':
> print ('GenerateCapsule: error:' + str(Msg))
> sys.exit (1)
> for SinglePayloadDescriptor in PayloadDescriptorList:
> + ImageCapsuleSupport = 0x0000000000000000
> Result = SinglePayloadDescriptor.Payload
> try:
> FmpPayloadHeader.FwVersion = SinglePayloadDescriptor.FwVersion
> @@ -575,6 +576,7 @@ if __name__ == '__main__':
> if SinglePayloadDescriptor.UseDependency:
> CapsuleDependency.Payload = Result
> CapsuleDependency.DepexExp = SinglePayloadDescriptor.DepexExp
> + ImageCapsuleSupport |= 0x0000000000000002
> Result = CapsuleDependency.Encode ()
> if args.Verbose:
> CapsuleDependency.DumpInfo ()
> @@ -607,13 +609,14 @@ if __name__ == '__main__':
> FmpAuthHeader.MonotonicCount = SinglePayloadDescriptor.MonotonicCount
> FmpAuthHeader.CertData = CertData
> FmpAuthHeader.Payload = Result
> + ImageCapsuleSupport |= 0x0000000000000001
> Result = FmpAuthHeader.Encode ()
> if args.Verbose:
> FmpAuthHeader.DumpInfo ()
> except:
> print ('GenerateCapsule: error: can not encode FMP Auth Header')
> sys.exit (1)
> - FmpCapsuleHeader.AddPayload (SinglePayloadDescriptor.Guid, Result, HardwareInstance =
> SinglePayloadDescriptor.HardwareInstance, UpdateImageIndex = SinglePayloadDescriptor.UpdateImageIndex)
> + FmpCapsuleHeader.AddPayload (SinglePayloadDescriptor.Guid, Result, ImageCapsuleSupport, HardwareInstance =
> SinglePayloadDescriptor.HardwareInstance, UpdateImageIndex = SinglePayloadDescriptor.UpdateImageIndex)
> try:
> for EmbeddedDriver in EmbeddedDriverDescriptorList:
> FmpCapsuleHeader.AddEmbeddedDriver(EmbeddedDriver)
> diff --git a/BaseTools/Source/Python/Common/Uefi/Capsule/FmpCapsuleHeader.py
> b/BaseTools/Source/Python/Common/Uefi/Capsule/FmpCapsuleHeader.py
> index 91d24919c4..a2a5cf0db8 100644
> --- a/BaseTools/Source/Python/Common/Uefi/Capsule/FmpCapsuleHeader.py
> +++ b/BaseTools/Source/Python/Common/Uefi/Capsule/FmpCapsuleHeader.py
> @@ -47,14 +47,19 @@ class FmpCapsuleImageHeaderClass (object):
> # /// therefore can be modified without changing the Auth data.
> # ///
> # UINT64 UpdateHardwareInstance;
> + #
> + # ///
> + # /// Bits which indicate authentication and depex information for the image that follows this structure
> + # ///
> + # UINT64 ImageCapsuleSupport
> # } 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)
>
> - EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION = 0x00000002
> + EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION = 0x00000003
>
> def __init__ (self):
> self._Valid = False
> @@ -64,6 +69,7 @@ class FmpCapsuleImageHeaderClass (object):
> self.UpdateImageSize = 0
> self.UpdateVendorCodeSize = 0
> self.UpdateHardwareInstance = 0x0000000000000000
> + self.ImageCapsuleSupport = 0x0000000000000000
> self.Payload = b''
> self.VendorCodeBytes = b''
>
> @@ -78,7 +84,8 @@ class FmpCapsuleImageHeaderClass (object):
> 0,0,0,
> self.UpdateImageSize,
> self.UpdateVendorCodeSize,
> - self.UpdateHardwareInstance
> + self.UpdateHardwareInstance,
> + self.ImageCapsuleSupport
> )
> self._Valid = True
> return FmpCapsuleImageHeader + self.Payload + self.VendorCodeBytes
> @@ -86,7 +93,7 @@ class FmpCapsuleImageHeaderClass (object):
> def Decode (self, Buffer):
> if len (Buffer) < self._StructSize:
> raise ValueError
> - (Version, UpdateImageTypeId, UpdateImageIndex, r0, r1, r2, UpdateImageSize, UpdateVendorCodeSize,
> UpdateHardwareInstance) = \
> + (Version, UpdateImageTypeId, UpdateImageIndex, r0, r1, r2, UpdateImageSize, UpdateVendorCodeSize,
> UpdateHardwareInstance, ImageCapsuleSupport) = \
> struct.unpack (
> self._StructFormat,
> Buffer[0:self._StructSize]
> @@ -105,6 +112,7 @@ class FmpCapsuleImageHeaderClass (object):
> self.UpdateImageSize = UpdateImageSize
> self.UpdateVendorCodeSize = UpdateVendorCodeSize
> self.UpdateHardwareInstance = UpdateHardwareInstance
> + self.ImageCapsuleSupport = ImageCapsuleSupport
> self.Payload = Buffer[self._StructSize:self._StructSize + UpdateImageSize]
> self.VendorCodeBytes = Buffer[self._StructSize + UpdateImageSize:]
> 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.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.ImageCapsuleSupport = {ImageCapsuleSupport:016X}'.format
> (ImageCapsuleSupport = self.ImageCapsuleSupport))
> print ('sizeof (Payload) = {Size:08X}'.format (Size = len
> (self.Payload)))
> print ('sizeof (VendorCodeBytes) = {Size:08X}'.format (Size = len
> (self.VendorCodeBytes)))
>
> @@ -172,8 +181,8 @@ class FmpCapsuleHeaderClass (object):
> raise ValueError
> return self._EmbeddedDriverList[Index]
>
> - def AddPayload (self, UpdateImageTypeId, Payload = b'', VendorCodeBytes = b'', HardwareInstance = 0, UpdateImageIndex
> = 1):
> - self._PayloadList.append ((UpdateImageTypeId, Payload, VendorCodeBytes, HardwareInstance, UpdateImageIndex))
> + def AddPayload (self, UpdateImageTypeId, Payload = b'', ImageCapsuleSupport = 0, VendorCodeBytes = b'',
> HardwareInstance = 0, UpdateImageIndex = 1):
> + self._PayloadList.append ((UpdateImageTypeId, Payload, ImageCapsuleSupport, VendorCodeBytes, HardwareInstance,
> UpdateImageIndex))
>
> def GetFmpCapsuleImageHeader (self, Index):
> if Index >= len (self._FmpCapsuleImageHeaderList):
> @@ -198,13 +207,14 @@ class FmpCapsuleHeaderClass (object):
> self._ItemOffsetList.append (Offset)
> Offset = Offset + len (EmbeddedDriver)
> Index = 1
> - for (UpdateImageTypeId, Payload, VendorCodeBytes, HardwareInstance, UpdateImageIndex) in self._PayloadList:
> + for (UpdateImageTypeId, Payload, ImageCapsuleSupport, VendorCodeBytes, HardwareInstance, UpdateImageIndex) in
> self._PayloadList:
> FmpCapsuleImageHeader = FmpCapsuleImageHeaderClass ()
> FmpCapsuleImageHeader.UpdateImageTypeId = UpdateImageTypeId
> FmpCapsuleImageHeader.UpdateImageIndex = UpdateImageIndex
> FmpCapsuleImageHeader.Payload = Payload
> FmpCapsuleImageHeader.VendorCodeBytes = VendorCodeBytes
> FmpCapsuleImageHeader.UpdateHardwareInstance = HardwareInstance
> + FmpCapsuleImageHeader.ImageCapsuleSupport = ImageCapsuleSupport
> FmpCapsuleImage = FmpCapsuleImageHeader.Encode ()
> FmpCapsuleData = FmpCapsuleData + FmpCapsuleImage
>
> --
> 2.17.1
>
>
>
>
>
next prev parent reply other threads:[~2021-04-20 15:56 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-19 11:40 [PATCH] BaseTools: GenerateCapsule.py: Add support for version 3 of FMP Image Header structure Sughosh Ganu
2021-04-20 10:10 ` Bob Feng
2021-04-20 15:56 ` Michael D Kinney [this message]
2021-04-21 7:02 ` [edk2-devel] " Sughosh Ganu
2021-04-21 15:34 ` Michael D Kinney
2021-04-22 6:05 ` Sughosh Ganu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CO1PR11MB4929C6C9B5765898DF1559B4D2489@CO1PR11MB4929.namprd11.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox