]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/UefiDriverEntryPoint/DriverEntryPoint.c
Updated the function comments in UefiDriverEntryLib to fix EDKT502.
[mirror_edk2.git] / MdePkg / Library / UefiDriverEntryPoint / DriverEntryPoint.c
index 60177bc9c5b223fba534dee3f5f1b52ef666fd2d..57b6a755b2535ab7f844d65147b4bc846e1e2346 100644 (file)
@@ -12,6 +12,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 **/\r
 \r
+\r
+EFI_EVENT  _mDriverExitBootServicesNotifyEvent;\r
+\r
 /**\r
   Unload function that is registered in the LoadImage protocol.  It un-installs\r
   protocols produced and deallocates pool used by the driver.  Called by the core\r
@@ -41,6 +44,14 @@ _DriverUnloadHandler (
   // unloaded, and the library destructors should not be called\r
   //\r
   if (!EFI_ERROR (Status)) {\r
+    //\r
+    // Close our ExitBootServices () notify function\r
+    //\r
+    if (_gDriverExitBootServicesEvent[0] != NULL) {\r
+      Status = gBS->CloseEvent (_mDriverExitBootServicesNotifyEvent);\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
+\r
     ProcessLibraryDestructorList (ImageHandle, gST);\r
   }\r
 \r
@@ -50,6 +61,31 @@ _DriverUnloadHandler (
   return Status;\r
 }\r
 \r
+\r
+/**\r
+  Notification Entry of ExitBootService event. In the entry, all notifications in _gDriverExitBootServicesEvent[] \r
+  would be invoked.\r
+\r
+  @param Event   The Event that is being processed.\r
+  @param Context Event Context.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+_DriverExitBootServices (\r
+  IN EFI_EVENT        Event,\r
+  IN VOID             *Context\r
+  )\r
+{\r
+  EFI_EVENT_NOTIFY  ChildNotifyEventHandler;\r
+  UINTN             Index;\r
+\r
+  for (Index = 0; _gDriverExitBootServicesEvent[Index] != NULL; Index++) {\r
+    ChildNotifyEventHandler = _gDriverExitBootServicesEvent[Index];\r
+    ChildNotifyEventHandler (Event, NULL);\r
+  }\r
+}\r
+\r
 /**\r
   Enrty point to DXE Driver.\r
 \r
@@ -84,6 +120,21 @@ _ModuleEntryPoint (
   //\r
   ProcessLibraryConstructorList (ImageHandle, SystemTable);\r
 \r
+  //\r
+  // Register our ExitBootServices () notify function\r
+  //\r
+  if (_gDriverExitBootServicesEvent[0] != NULL) {\r
+    Status = gBS->CreateEvent (\r
+                    EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES,\r
+                    EFI_TPL_NOTIFY,\r
+                    _DriverExitBootServices,\r
+                    NULL,\r
+                    &_mDriverExitBootServicesNotifyEvent\r
+                    );\r
+\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+\r
   //\r
   //  Install unload handler...\r
   //\r
@@ -106,6 +157,14 @@ _ModuleEntryPoint (
   // If all of the drivers returned errors, then invoke all of the library destructors\r
   //\r
   if (EFI_ERROR (Status)) {\r
+    //\r
+    // Close our ExitBootServices () notify function\r
+    //\r
+    if (_gDriverExitBootServicesEvent[0] != NULL) {\r
+      Status = gBS->CloseEvent (_mDriverExitBootServicesNotifyEvent);\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
+\r
     ProcessLibraryDestructorList (ImageHandle, SystemTable);\r
   }\r
 \r