]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c
MdeModulePkg DxeCapsuleLib: Use Attr to know whether reset is required
[mirror_edk2.git] / MdeModulePkg / Library / DxeCapsuleLibFmp / DxeCapsuleProcessLib.c
index 26ca4e295f20bd26fc5d5596ce6c9c36f989f432..176dea196026cdb9db8b9ec23785592aab34d18e 100644 (file)
@@ -99,12 +99,32 @@ IsValidCapsuleHeader (
   );\r
 \r
 extern BOOLEAN                   mDxeCapsuleLibEndOfDxe;\r
-BOOLEAN                          mNeedReset;\r
+BOOLEAN                          mNeedReset = FALSE;\r
 \r
 VOID                        **mCapsulePtr;\r
 EFI_STATUS                  *mCapsuleStatusArray;\r
 UINT32                      mCapsuleTotalNumber;\r
 \r
+/**\r
+  The firmware implements to process the capsule image.\r
+\r
+  Caution: This function may receive untrusted input.\r
+\r
+  @param[in]  CapsuleHeader         Points to a capsule header.\r
+  @param[out] ResetRequired         Indicates whether reset is required or not.\r
+\r
+  @retval EFI_SUCESS            Process Capsule Image successfully.\r
+  @retval EFI_UNSUPPORTED       Capsule image is not supported by the firmware.\r
+  @retval EFI_VOLUME_CORRUPTED  FV volume in the capsule is corrupted.\r
+  @retval EFI_OUT_OF_RESOURCES  Not enough memory.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ProcessThisCapsuleImage (\r
+  IN EFI_CAPSULE_HEADER  *CapsuleHeader,\r
+  OUT BOOLEAN            *ResetRequired OPTIONAL\r
+  );\r
+\r
 /**\r
   Function indicate the current completion progress of the firmware\r
   update. Platform may override with own specific progress function.\r
@@ -381,6 +401,7 @@ ProcessTheseCapsules (
   UINT32                      Index;\r
   ESRT_MANAGEMENT_PROTOCOL    *EsrtManagement;\r
   UINT16                      EmbeddedDriverCount;\r
+  BOOLEAN                     ResetRequired;\r
 \r
   REPORT_STATUS_CODE(EFI_PROGRESS_CODE, (EFI_SOFTWARE | PcdGet32(PcdStatusCodeSubClassCapsule) | PcdGet32(PcdCapsuleStatusCodeProcessCapsulesBegin)));\r
 \r
@@ -416,11 +437,11 @@ ProcessTheseCapsules (
   for (Index = 0; Index < mCapsuleTotalNumber; Index++) {\r
     CapsuleHeader = (EFI_CAPSULE_HEADER*) mCapsulePtr [Index];\r
     if (CompareGuid (&CapsuleHeader->CapsuleGuid, &gWindowsUxCapsuleGuid)) {\r
-      DEBUG ((DEBUG_INFO, "ProcessCapsuleImage (Ux) - 0x%x\n", CapsuleHeader));\r
+      DEBUG ((DEBUG_INFO, "ProcessThisCapsuleImage (Ux) - 0x%x\n", CapsuleHeader));\r
       DEBUG ((DEBUG_INFO, "Display logo capsule is found.\n"));\r
-      Status = ProcessCapsuleImage (CapsuleHeader);\r
+      Status = ProcessThisCapsuleImage (CapsuleHeader, NULL);\r
       mCapsuleStatusArray [Index] = EFI_SUCCESS;\r
-      DEBUG((DEBUG_INFO, "ProcessCapsuleImage (Ux) - %r\n", Status));\r
+      DEBUG((DEBUG_INFO, "ProcessThisCapsuleImage (Ux) - %r\n", Status));\r
       break;\r
     }\r
   }\r
@@ -454,10 +475,11 @@ ProcessTheseCapsules (
       }\r
 \r
       if ((!FirstRound) || (EmbeddedDriverCount == 0)) {\r
-        DEBUG((DEBUG_INFO, "ProcessCapsuleImage - 0x%x\n", CapsuleHeader));\r
-        Status = ProcessCapsuleImage (CapsuleHeader);\r
+        DEBUG((DEBUG_INFO, "ProcessThisCapsuleImage - 0x%x\n", CapsuleHeader));\r
+        ResetRequired = FALSE;\r
+        Status = ProcessThisCapsuleImage (CapsuleHeader, &ResetRequired);\r
         mCapsuleStatusArray [Index] = Status;\r
-        DEBUG((DEBUG_INFO, "ProcessCapsuleImage - %r\n", Status));\r
+        DEBUG((DEBUG_INFO, "ProcessThisCapsuleImage - %r\n", Status));\r
 \r
         if (Status != EFI_NOT_READY) {\r
           if (EFI_ERROR(Status)) {\r
@@ -467,8 +489,8 @@ ProcessTheseCapsules (
             REPORT_STATUS_CODE(EFI_PROGRESS_CODE, (EFI_SOFTWARE | PcdGet32(PcdStatusCodeSubClassCapsule) | PcdGet32(PcdCapsuleStatusCodeUpdateFirmwareSuccess)));\r
           }\r
 \r
-          if ((CapsuleHeader->Flags & PcdGet16(PcdSystemRebootAfterCapsuleProcessFlag)) != 0 ||\r
-              IsFmpCapsule(CapsuleHeader)) {\r
+          mNeedReset |= ResetRequired;\r
+          if ((CapsuleHeader->Flags & PcdGet16(PcdSystemRebootAfterCapsuleProcessFlag)) != 0) {\r
             mNeedReset = TRUE;\r
           }\r
         }\r