summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg
diff options
context:
space:
mode:
authorArd Biesheuvel <ardb@kernel.org>2024-11-28 12:05:37 +0100
committerLiming Gao <gaoliming@byosoft.com.cn>2024-12-06 08:33:53 +0800
commite8668d2dee2f001a053d9e50f431e2f1f8165b8b (patch)
tree48f837cb05446cc3af84f2cb11434b541bbd336e /MdeModulePkg
parent47e28a6d449c51f10d89e961c3c1afcfdfd99668 (diff)
downloadedk2-e8668d2dee2f001a053d9e50f431e2f1f8165b8b.tar.gz
MdeModulePkg/DxeCore: Call BeforeExitBootServices event group only once
According to UEFI spec 2.10 errata A section 7.4.6 "All events from the EFI_EVENT_GROUP_BEFORE_EXIT_BOOT_SERVICES and EFI_EVENT_GROUP_EXIT_BOOT_SERVICES event notification groups as well as events of type EVT_SIGNAL_EXIT_BOOT_SERVICES must be signaled before ExitBootServices() returns EFI_SUCCESS. The events are only signaled once even if ExitBootServices() is called multiple times." So keep track of whether ExitBootServices() has been called, and signal the event group EFI_EVENT_GROUP_BEFORE_EXIT_BOOT_SERVICES only the first time around. EFI_EVENT_GROUP_EXIT_BOOT_SERVICES will only be signalled if ExitBootServices() is going to run to [successful] completion, after which calling it a second time is not possible anyway. So for this case, no special handling is needed. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Diffstat (limited to 'MdeModulePkg')
-rw-r--r--MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c
index 8a877330dd..5471e4259d 100644
--- a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c
+++ b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c
@@ -203,6 +203,8 @@ EFI_HANDLE gDxeCoreImageHandle = NULL;
BOOLEAN gMemoryMapTerminated = FALSE;
+static BOOLEAN mExitBootServicesCalled = FALSE;
+
//
// EFI Decompress Protocol
//
@@ -778,7 +780,10 @@ CoreExitBootServices (
// Notify other drivers of their last chance to use boot services
// before the memory map is terminated.
//
- CoreNotifySignalList (&gEfiEventBeforeExitBootServicesGuid);
+ if (!mExitBootServicesCalled) {
+ CoreNotifySignalList (&gEfiEventBeforeExitBootServicesGuid);
+ mExitBootServicesCalled = TRUE;
+ }
//
// Disable Timer