);\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
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
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
}\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
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