]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c
MdeModulePkg: Add Capsule On Disk APIs into CapsuleLib.
[mirror_edk2.git] / MdeModulePkg / Library / DxeCapsuleLibFmp / DxeCapsuleLib.c
index f38ab69e38fb22543d37c62aa0a331c3637b7609..95aa9de0878b8f7abcd72f74fced4e2ebbc3d0ff 100644 (file)
@@ -10,7 +10,7 @@
   ValidateFmpCapsule(), and DisplayCapsuleImage() receives untrusted input and\r
   performs basic validation.\r
 \r
-  Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>\r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -80,6 +80,7 @@ RecordCapsuleStatusVariable (
   @param[in] PayloadIndex   FMP payload index\r
   @param[in] ImageHeader    FMP image header\r
   @param[in] FmpDevicePath  DevicePath associated with the FMP producer\r
+  @param[in] CapFileName    Capsule file name\r
 \r
   @retval EFI_SUCCESS          The capsule status variable is recorded.\r
   @retval EFI_OUT_OF_RESOURCES No resource to record the capsule status variable.\r
@@ -90,7 +91,8 @@ RecordFmpCapsuleStatusVariable (
   IN EFI_STATUS                                    CapsuleStatus,\r
   IN UINTN                                         PayloadIndex,\r
   IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER  *ImageHeader,\r
-  IN EFI_DEVICE_PATH_PROTOCOL                      *FmpDevicePath OPTIONAL\r
+  IN EFI_DEVICE_PATH_PROTOCOL                      *FmpDevicePath, OPTIONAL\r
+  IN CHAR16                                        *CapFileName    OPTIONAL\r
   );\r
 \r
 /**\r
@@ -109,6 +111,22 @@ UpdateImageProgress (
   IN UINTN  Completion\r
   );\r
 \r
+/**\r
+  Return if this capsule is a capsule name capsule, based upon CapsuleHeader.\r
+\r
+  @param[in] CapsuleHeader A pointer to EFI_CAPSULE_HEADER\r
+\r
+  @retval TRUE  It is a capsule name capsule.\r
+  @retval FALSE It is not a capsule name capsule.\r
+**/\r
+BOOLEAN\r
+IsCapsuleNameCapsule (\r
+  IN EFI_CAPSULE_HEADER         *CapsuleHeader\r
+  )\r
+{\r
+  return CompareGuid (&CapsuleHeader->CapsuleGuid, &gEdkiiCapsuleOnDiskNameGuid);\r
+}\r
+\r
 /**\r
   Return if this CapsuleGuid is a FMP capsule GUID or not.\r
 \r
@@ -1034,11 +1052,12 @@ StartFmpImage (
 /**\r
   Record FMP capsule status.\r
 \r
-  @param[in]  Handle        A FMP handle.\r
+  @param[in] Handle         A FMP handle.\r
   @param[in] CapsuleHeader  The capsule image header\r
   @param[in] CapsuleStatus  The capsule process stauts\r
   @param[in] PayloadIndex   FMP payload index\r
   @param[in] ImageHeader    FMP image header\r
+  @param[in] CapFileName    Capsule file name\r
 **/\r
 VOID\r
 RecordFmpCapsuleStatus (\r
@@ -1046,7 +1065,8 @@ RecordFmpCapsuleStatus (
   IN EFI_CAPSULE_HEADER                            *CapsuleHeader,\r
   IN EFI_STATUS                                    CapsuleStatus,\r
   IN UINTN                                         PayloadIndex,\r
-  IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER  *ImageHeader\r
+  IN EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER  *ImageHeader,\r
+  IN CHAR16                                        *CapFileName   OPTIONAL\r
   )\r
 {\r
   EFI_STATUS                                    Status;\r
@@ -1070,7 +1090,8 @@ RecordFmpCapsuleStatus (
     CapsuleStatus,\r
     PayloadIndex,\r
     ImageHeader,\r
-    FmpDevicePath\r
+    FmpDevicePath,\r
+    CapFileName\r
     );\r
 \r
   //\r
@@ -1115,6 +1136,7 @@ RecordFmpCapsuleStatus (
   This function need support nested FMP capsule.\r
 \r
   @param[in]  CapsuleHeader         Points to a capsule header.\r
+  @param[in]  CapFileName           Capsule file name.\r
   @param[out] ResetRequired         Indicates whether reset is required or not.\r
 \r
   @retval EFI_SUCESS            Process Capsule Image successfully.\r
@@ -1126,6 +1148,7 @@ RecordFmpCapsuleStatus (
 EFI_STATUS\r
 ProcessFmpCapsuleImage (\r
   IN EFI_CAPSULE_HEADER  *CapsuleHeader,\r
+  IN CHAR16              *CapFileName,  OPTIONAL\r
   OUT BOOLEAN            *ResetRequired OPTIONAL\r
   )\r
 {\r
@@ -1145,7 +1168,7 @@ ProcessFmpCapsuleImage (
   BOOLEAN                                       Abort;\r
 \r
   if (!IsFmpCapsuleGuid(&CapsuleHeader->CapsuleGuid)) {\r
-    return ProcessFmpCapsuleImage ((EFI_CAPSULE_HEADER *)((UINTN)CapsuleHeader + CapsuleHeader->HeaderSize), ResetRequired);\r
+    return ProcessFmpCapsuleImage ((EFI_CAPSULE_HEADER *)((UINTN)CapsuleHeader + CapsuleHeader->HeaderSize), CapFileName, ResetRequired);\r
   }\r
 \r
   NotReady = FALSE;\r
@@ -1227,7 +1250,8 @@ ProcessFmpCapsuleImage (
         CapsuleHeader,\r
         EFI_NOT_READY,\r
         Index - FmpCapsuleHeader->EmbeddedDriverCount,\r
-        ImageHeader\r
+        ImageHeader,\r
+        CapFileName\r
         );\r
       continue;\r
     }\r
@@ -1239,7 +1263,8 @@ ProcessFmpCapsuleImage (
           CapsuleHeader,\r
           EFI_ABORTED,\r
           Index - FmpCapsuleHeader->EmbeddedDriverCount,\r
-          ImageHeader\r
+          ImageHeader,\r
+          CapFileName\r
           );\r
         continue;\r
       }\r
@@ -1262,7 +1287,8 @@ ProcessFmpCapsuleImage (
         CapsuleHeader,\r
         Status,\r
         Index - FmpCapsuleHeader->EmbeddedDriverCount,\r
-        ImageHeader\r
+        ImageHeader,\r
+        CapFileName\r
         );\r
     }\r
     if (HandleBuffer != NULL) {\r
@@ -1414,6 +1440,13 @@ SupportCapsuleImage (
     return EFI_SUCCESS;\r
   }\r
 \r
+  //\r
+  // Check capsule file name capsule\r
+  //\r
+  if (IsCapsuleNameCapsule(CapsuleHeader)) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
   if (IsFmpCapsule(CapsuleHeader)) {\r
     //\r
     // Fake capsule header is valid case in QueryCapsuleCpapbilities().\r
@@ -1436,6 +1469,7 @@ SupportCapsuleImage (
   Caution: This function may receive untrusted input.\r
 \r
   @param[in]  CapsuleHeader         Points to a capsule header.\r
+  @param[in]  CapFileName           Capsule file name.\r
   @param[out] ResetRequired         Indicates whether reset is required or not.\r
 \r
   @retval EFI_SUCESS            Process Capsule Image successfully.\r
@@ -1447,6 +1481,7 @@ EFI_STATUS
 EFIAPI\r
 ProcessThisCapsuleImage (\r
   IN EFI_CAPSULE_HEADER  *CapsuleHeader,\r
+  IN CHAR16              *CapFileName,  OPTIONAL\r
   OUT BOOLEAN            *ResetRequired OPTIONAL\r
   )\r
 {\r
@@ -1484,7 +1519,7 @@ ProcessThisCapsuleImage (
     // Process EFI FMP Capsule\r
     //\r
     DEBUG((DEBUG_INFO, "ProcessFmpCapsuleImage ...\n"));\r
-    Status = ProcessFmpCapsuleImage(CapsuleHeader, ResetRequired);\r
+    Status = ProcessFmpCapsuleImage(CapsuleHeader, CapFileName, ResetRequired);\r
     DEBUG((DEBUG_INFO, "ProcessFmpCapsuleImage - %r\n", Status));\r
 \r
     return Status;\r
@@ -1511,7 +1546,7 @@ ProcessCapsuleImage (
   IN EFI_CAPSULE_HEADER  *CapsuleHeader\r
   )\r
 {\r
-  return ProcessThisCapsuleImage (CapsuleHeader, NULL);\r
+  return ProcessThisCapsuleImage (CapsuleHeader, NULL, NULL);\r
 }\r
 \r
 /**\r