]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Add support for version 3 of FMP Image Header structure
authorSughosh Ganu <sughosh.ganu@linaro.org>
Thu, 22 Apr 2021 07:50:59 +0000 (15:50 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Wed, 12 May 2021 01:03:53 +0000 (01:03 +0000)
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>
BaseTools/Source/Python/Capsule/GenerateCapsule.py
BaseTools/Source/Python/Common/Uefi/Capsule/FmpCapsuleHeader.py

index a8de988253cf2c32b226acb73aeea654109c90a2..b8039db878299bfdd8080bb655228f6f2ad66766 100644 (file)
@@ -561,6 +561,7 @@ if __name__ == '__main__':
                 print ('GenerateCapsule: error:' + str(Msg))\r
                 sys.exit (1)\r
         for SinglePayloadDescriptor in PayloadDescriptorList:\r
+            ImageCapsuleSupport = 0x0000000000000000\r
             Result = SinglePayloadDescriptor.Payload\r
             try:\r
                 FmpPayloadHeader.FwVersion              = SinglePayloadDescriptor.FwVersion\r
@@ -575,6 +576,7 @@ if __name__ == '__main__':
             if SinglePayloadDescriptor.UseDependency:\r
                 CapsuleDependency.Payload = Result\r
                 CapsuleDependency.DepexExp = SinglePayloadDescriptor.DepexExp\r
+                ImageCapsuleSupport        |= FmpCapsuleHeader.CAPSULE_SUPPORT_DEPENDENCY\r
                 Result = CapsuleDependency.Encode ()\r
                 if args.Verbose:\r
                     CapsuleDependency.DumpInfo ()\r
@@ -607,13 +609,14 @@ if __name__ == '__main__':
                     FmpAuthHeader.MonotonicCount = SinglePayloadDescriptor.MonotonicCount\r
                     FmpAuthHeader.CertData       = CertData\r
                     FmpAuthHeader.Payload        = Result\r
+                    ImageCapsuleSupport          |= FmpCapsuleHeader.CAPSULE_SUPPORT_AUTHENTICATION\r
                     Result = FmpAuthHeader.Encode ()\r
                     if args.Verbose:\r
                         FmpAuthHeader.DumpInfo ()\r
                 except:\r
                     print ('GenerateCapsule: error: can not encode FMP Auth Header')\r
                     sys.exit (1)\r
-            FmpCapsuleHeader.AddPayload (SinglePayloadDescriptor.Guid, Result, HardwareInstance = SinglePayloadDescriptor.HardwareInstance, UpdateImageIndex = SinglePayloadDescriptor.UpdateImageIndex)\r
+            FmpCapsuleHeader.AddPayload (SinglePayloadDescriptor.Guid, Result, HardwareInstance = SinglePayloadDescriptor.HardwareInstance, UpdateImageIndex = SinglePayloadDescriptor.UpdateImageIndex, CapsuleSupport = ImageCapsuleSupport)\r
         try:\r
             for EmbeddedDriver in EmbeddedDriverDescriptorList:\r
                 FmpCapsuleHeader.AddEmbeddedDriver(EmbeddedDriver)\r
index 91d24919c49c7428a564085cd0edd72df623efa4..8abb449c6fd7b9e37b3e7e9eb1067dd619c464ba 100644 (file)
@@ -47,14 +47,19 @@ class FmpCapsuleImageHeaderClass (object):
     #   /// therefore can be modified without changing the Auth data.\r
     #   ///\r
     #   UINT64   UpdateHardwareInstance;\r
+    #\r
+    #   ///\r
+    #   /// Bits which indicate authentication and depex information for the image that follows this structure\r
+    #   ///\r
+    #   UINT64   ImageCapsuleSupport\r
     # } EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER;\r
     #\r
-    #  #define EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION 0x00000002\r
+    #  #define EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION 0x00000003\r
 \r
-    _StructFormat = '<I16sB3BIIQ'\r
+    _StructFormat = '<I16sB3BIIQQ'\r
     _StructSize   = struct.calcsize (_StructFormat)\r
 \r
-    EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION = 0x00000002\r
+    EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER_INIT_VERSION = 0x00000003\r
 \r
     def __init__ (self):\r
         self._Valid                 = False\r
@@ -64,6 +69,7 @@ class FmpCapsuleImageHeaderClass (object):
         self.UpdateImageSize        = 0\r
         self.UpdateVendorCodeSize   = 0\r
         self.UpdateHardwareInstance = 0x0000000000000000\r
+        self.ImageCapsuleSupport    = 0x0000000000000000\r
         self.Payload                = b''\r
         self.VendorCodeBytes        = b''\r
 \r
@@ -78,7 +84,8 @@ class FmpCapsuleImageHeaderClass (object):
                                          0,0,0,\r
                                          self.UpdateImageSize,\r
                                          self.UpdateVendorCodeSize,\r
-                                         self.UpdateHardwareInstance\r
+                                         self.UpdateHardwareInstance,\r
+                                         self.ImageCapsuleSupport\r
                                          )\r
         self._Valid = True\r
         return FmpCapsuleImageHeader + self.Payload + self.VendorCodeBytes\r
@@ -86,7 +93,7 @@ class FmpCapsuleImageHeaderClass (object):
     def Decode (self, Buffer):\r
         if len (Buffer) < self._StructSize:\r
             raise ValueError\r
-        (Version, UpdateImageTypeId, UpdateImageIndex, r0, r1, r2, UpdateImageSize, UpdateVendorCodeSize, UpdateHardwareInstance) = \\r
+        (Version, UpdateImageTypeId, UpdateImageIndex, r0, r1, r2, UpdateImageSize, UpdateVendorCodeSize, UpdateHardwareInstance, ImageCapsuleSupport) = \\r
             struct.unpack (\r
                      self._StructFormat,\r
                      Buffer[0:self._StructSize]\r
@@ -105,6 +112,7 @@ class FmpCapsuleImageHeaderClass (object):
         self.UpdateImageSize        = UpdateImageSize\r
         self.UpdateVendorCodeSize   = UpdateVendorCodeSize\r
         self.UpdateHardwareInstance = UpdateHardwareInstance\r
+        self.ImageCapsuleSupport    = ImageCapsuleSupport\r
         self.Payload                = Buffer[self._StructSize:self._StructSize + UpdateImageSize]\r
         self.VendorCodeBytes        = Buffer[self._StructSize + UpdateImageSize:]\r
         self._Valid                 = True\r
@@ -119,6 +127,7 @@ class FmpCapsuleImageHeaderClass (object):
         print ('EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER.UpdateImageSize        = {UpdateImageSize:08X}'.format (UpdateImageSize = self.UpdateImageSize))\r
         print ('EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER.UpdateVendorCodeSize   = {UpdateVendorCodeSize:08X}'.format (UpdateVendorCodeSize = self.UpdateVendorCodeSize))\r
         print ('EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER.UpdateHardwareInstance = {UpdateHardwareInstance:016X}'.format (UpdateHardwareInstance = self.UpdateHardwareInstance))\r
+        print ('EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER.ImageCapsuleSupport    = {ImageCapsuleSupport:016X}'.format (ImageCapsuleSupport = self.ImageCapsuleSupport))\r
         print ('sizeof (Payload)                                                    = {Size:08X}'.format (Size = len (self.Payload)))\r
         print ('sizeof (VendorCodeBytes)                                            = {Size:08X}'.format (Size = len (self.VendorCodeBytes)))\r
 \r
@@ -153,6 +162,8 @@ class FmpCapsuleHeaderClass (object):
     _ItemOffsetSize   = struct.calcsize (_ItemOffsetFormat)\r
 \r
     EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER_INIT_VERSION = 0x00000001\r
+    CAPSULE_SUPPORT_AUTHENTICATION = 0x0000000000000001\r
+    CAPSULE_SUPPORT_DEPENDENCY     = 0x0000000000000002\r
 \r
     def __init__ (self):\r
         self._Valid                     = False\r
@@ -172,8 +183,8 @@ class FmpCapsuleHeaderClass (object):
             raise ValueError\r
         return self._EmbeddedDriverList[Index]\r
 \r
-    def AddPayload (self, UpdateImageTypeId, Payload = b'', VendorCodeBytes = b'', HardwareInstance = 0, UpdateImageIndex = 1):\r
-        self._PayloadList.append ((UpdateImageTypeId, Payload, VendorCodeBytes, HardwareInstance, UpdateImageIndex))\r
+    def AddPayload (self, UpdateImageTypeId, Payload = b'', VendorCodeBytes = b'', HardwareInstance = 0, UpdateImageIndex = 1, CapsuleSupport = 0):\r
+        self._PayloadList.append ((UpdateImageTypeId, Payload, VendorCodeBytes, HardwareInstance, UpdateImageIndex, CapsuleSupport))\r
 \r
     def GetFmpCapsuleImageHeader (self, Index):\r
         if Index >= len (self._FmpCapsuleImageHeaderList):\r
@@ -198,13 +209,14 @@ class FmpCapsuleHeaderClass (object):
             self._ItemOffsetList.append (Offset)\r
             Offset = Offset + len (EmbeddedDriver)\r
         Index = 1\r
-        for (UpdateImageTypeId, Payload, VendorCodeBytes, HardwareInstance, UpdateImageIndex) in self._PayloadList:\r
+        for (UpdateImageTypeId, Payload, VendorCodeBytes, HardwareInstance, UpdateImageIndex, CapsuleSupport) in self._PayloadList:\r
             FmpCapsuleImageHeader = FmpCapsuleImageHeaderClass ()\r
             FmpCapsuleImageHeader.UpdateImageTypeId      = UpdateImageTypeId\r
             FmpCapsuleImageHeader.UpdateImageIndex       = UpdateImageIndex\r
             FmpCapsuleImageHeader.Payload                = Payload\r
             FmpCapsuleImageHeader.VendorCodeBytes        = VendorCodeBytes\r
             FmpCapsuleImageHeader.UpdateHardwareInstance = HardwareInstance\r
+            FmpCapsuleImageHeader.ImageCapsuleSupport    = CapsuleSupport\r
             FmpCapsuleImage = FmpCapsuleImageHeader.Encode ()\r
             FmpCapsuleData = FmpCapsuleData + FmpCapsuleImage\r
 \r