+STATIC\r
+VOID\r
+HandleCapsules (\r
+ VOID\r
+ )\r
+{\r
+ ESRT_MANAGEMENT_PROTOCOL *EsrtManagement;\r
+ EFI_PEI_HOB_POINTERS HobPointer;\r
+ EFI_CAPSULE_HEADER *CapsuleHeader;\r
+ BOOLEAN NeedReset;\r
+ EFI_STATUS Status;\r
+\r
+ DEBUG ((DEBUG_INFO, "%a: processing capsules ...\n", __FUNCTION__));\r
+\r
+ Status = gBS->LocateProtocol (&gEsrtManagementProtocolGuid, NULL,\r
+ (VOID **)&EsrtManagement);\r
+ if (!EFI_ERROR (Status)) {\r
+ EsrtManagement->SyncEsrtFmp ();\r
+ }\r
+\r
+ //\r
+ // Find all capsule images from hob\r
+ //\r
+ HobPointer.Raw = GetHobList ();\r
+ NeedReset = FALSE;\r
+ while ((HobPointer.Raw = GetNextHob (EFI_HOB_TYPE_UEFI_CAPSULE,\r
+ HobPointer.Raw)) != NULL) {\r
+ CapsuleHeader = (VOID *)(UINTN)HobPointer.Capsule->BaseAddress;\r
+\r
+ Status = ProcessCapsuleImage (CapsuleHeader);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "%a: failed to process capsule %p - %r\n",\r
+ __FUNCTION__, CapsuleHeader, Status));\r
+ return;\r
+ }\r
+\r
+ NeedReset = TRUE;\r
+ HobPointer.Raw = GET_NEXT_HOB (HobPointer);\r
+ }\r
+\r
+ if (NeedReset) {\r
+ DEBUG ((DEBUG_WARN, "%a: capsule update successful, resetting ...\n",\r
+ __FUNCTION__));\r
+\r
+ gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
+ CpuDeadLoop();\r
+ }\r
+}\r
+\r
+\r