diff --git a/OvmfPkg/AcpiS3SaveDxe/AcpiS3Save.c b/OvmfPkg/AcpiS3SaveDxe/AcpiS3Save.c index f05764af8b..5eb33e0587 100644 --- a/OvmfPkg/AcpiS3SaveDxe/AcpiS3Save.c +++ b/OvmfPkg/AcpiS3SaveDxe/AcpiS3Save.c @@ -29,6 +29,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include <Guid/AcpiVariableCompatibility.h> #include <Guid/AcpiS3Context.h> #include <Guid/Acpi.h> +#include <Guid/EventGroup.h> #include <Protocol/AcpiS3Save.h> #include <Protocol/S3SaveState.h> #include <Protocol/DxeSmmReadyToLock.h> @@ -570,6 +571,40 @@ S3Ready ( return EFI_SUCCESS; } +/** + Callback function executed when the EndOfDxe event group is signaled. + + @param[in] Event Event whose notification function is being invoked. + @param[in] Context The pointer to the notification function's context, which + is implementation-dependent. +**/ +VOID +EFIAPI +OnEndOfDxe ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + + // + // Our S3Ready() function ignores both of its parameters, and always + // succeeds. + // + Status = S3Ready ( + NULL, // This + NULL // LegacyMemoryAddress + ); + ASSERT_EFI_ERROR (Status); + + // + // Close the event, deregistering the callback and freeing resources. + // + Status = gBS->CloseEvent (Event); + ASSERT_EFI_ERROR (Status); +} + + /** The Driver Entry Point. @@ -591,6 +626,7 @@ InstallAcpiS3Save ( ) { EFI_STATUS Status; + EFI_EVENT EndOfDxeEvent; if (!QemuFwCfgS3Enabled()) { return EFI_LOAD_ERROR; @@ -612,5 +648,15 @@ InstallAcpiS3Save ( NULL ); ASSERT_EFI_ERROR (Status); + + Status = gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + OnEndOfDxe, + NULL, /* NotifyContext */ + &gEfiEndOfDxeEventGroupGuid, + &EndOfDxeEvent + ); + ASSERT_EFI_ERROR (Status); return Status; } diff --git a/OvmfPkg/AcpiS3SaveDxe/AcpiS3SaveDxe.inf b/OvmfPkg/AcpiS3SaveDxe/AcpiS3SaveDxe.inf index ae56a2079c..81da2fb80c 100644 --- a/OvmfPkg/AcpiS3SaveDxe/AcpiS3SaveDxe.inf +++ b/OvmfPkg/AcpiS3SaveDxe/AcpiS3SaveDxe.inf @@ -58,6 +58,7 @@ gEfiAcpiS3ContextGuid # ALWAYS_CONSUMED gEfiAcpi20TableGuid # ALWAYS_CONSUMED System Table gEfiAcpi10TableGuid # ALWAYS_CONSUMED System Table + gEfiEndOfDxeEventGroupGuid ## CONSUMES ## Event [Protocols] gEfiAcpiS3SaveProtocolGuid # PROTOCOL ALWAYS_PRODUCED