X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FLibrary%2FDxeCapsuleLibFmp%2FDxeCapsuleRuntime.c;h=f94044a409185fb1def509f6f9eb31c5b3e1ba99;hp=602921d13c06fd4d65e6546b52881d3fd79f74a8;hb=2c0d39ac4704b76b7efb67b0aee23c2e78045cbc;hpb=9d510e61fceee7b92955ef9a3c20343752d8ce3f diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c index 602921d13c..f94044a409 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c @@ -23,6 +23,7 @@ extern EFI_SYSTEM_RESOURCE_TABLE *mEsrtTable; extern BOOLEAN mIsVirtualAddrConverted; EFI_EVENT mDxeRuntimeCapsuleLibVirtualAddressChangeEvent = NULL; +EFI_EVENT mDxeRuntimeCapsuleLibReadyToBootEvent = NULL; /** Convert EsrtTable physical address to virtual address. @@ -38,8 +39,28 @@ DxeCapsuleLibVirtualAddressChangeEvent ( IN VOID *Context ) { - UINTN Index; - EFI_CONFIGURATION_TABLE *ConfigEntry; + gRT->ConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mEsrtTable); + mIsVirtualAddrConverted = TRUE; +} + +/** + Notify function for event group EFI_EVENT_GROUP_READY_TO_BOOT. + + @param[in] Event The Event that is being processed. + @param[in] Context The Event Context. + +**/ +STATIC +VOID +EFIAPI +DxeCapsuleLibReadyToBootEventNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + UINTN Index; + EFI_CONFIGURATION_TABLE *ConfigEntry; + EFI_SYSTEM_RESOURCE_TABLE *EsrtTable; // // Get Esrt table first @@ -59,16 +80,19 @@ DxeCapsuleLibVirtualAddressChangeEvent ( // // Search Esrt to check given capsule is qualified // - mEsrtTable = (EFI_SYSTEM_RESOURCE_TABLE *) ConfigEntry->VendorTable; + EsrtTable = (EFI_SYSTEM_RESOURCE_TABLE *) ConfigEntry->VendorTable; + + mEsrtTable = AllocateRuntimeCopyPool ( + sizeof (EFI_SYSTEM_RESOURCE_TABLE) + + EsrtTable->FwResourceCount * sizeof (EFI_SYSTEM_RESOURCE_ENTRY), + EsrtTable); + ASSERT (mEsrtTable != NULL); // - // Update protocol pointer to Esrt Table. + // Set FwResourceCountMax to a sane value. // - gRT->ConvertPointer (0x00, (VOID**) &(mEsrtTable)); + mEsrtTable->FwResourceCountMax = mEsrtTable->FwResourceCount; } - - mIsVirtualAddrConverted = TRUE; - } /** @@ -101,6 +125,19 @@ DxeRuntimeCapsuleLibConstructor ( ); ASSERT_EFI_ERROR (Status); + // + // Register notify function to cache the FMP capsule GUIDs at ReadyToBoot. + // + Status = gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + DxeCapsuleLibReadyToBootEventNotify, + NULL, + &gEfiEventReadyToBootGuid, + &mDxeRuntimeCapsuleLibReadyToBootEvent + ); + ASSERT_EFI_ERROR (Status); + return EFI_SUCCESS; } @@ -127,5 +164,11 @@ DxeRuntimeCapsuleLibDestructor ( Status = gBS->CloseEvent (mDxeRuntimeCapsuleLibVirtualAddressChangeEvent); ASSERT_EFI_ERROR (Status); + // + // Close the ReadyToBoot event. + // + Status = gBS->CloseEvent (mDxeRuntimeCapsuleLibReadyToBootEvent); + ASSERT_EFI_ERROR (Status); + return EFI_SUCCESS; }