[edk2-devel] [PATCH v1] MdePkg: Support standalone MM Driver Unload capability

Wu, Jiaxin posted 1 patch 3 years, 1 month ago
Failed in applying to current master (apply log)
.../Include/Library/StandaloneMmDriverEntryPoint.h | 25 ++++++++++
.../StandaloneMmDriverEntryPoint.c                 | 56 +++++++++++++++++++++-
.../StandaloneMmDriverEntryPoint.inf               |  5 +-
3 files changed, 84 insertions(+), 2 deletions(-)
[edk2-devel] [PATCH v1] MdePkg: Support standalone MM Driver Unload capability
Posted by Wu, Jiaxin 3 years, 1 month ago
https://bugzilla.tianocore.org/show_bug.cgi?id=3240

This patch is to support standalone MM Driver Unload capability
by providing _DriverUnloadHandler() function.

Change-Id: I26cdbfccb7052685c464d6394e472c7579b7b67e
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>
Cc: Siyuan Fu <siyuan.fu@intel.com>
Signed-off-by: Jiaxin Wu <Jiaxin.wu@intel.com>
---
 .../Include/Library/StandaloneMmDriverEntryPoint.h | 25 ++++++++++
 .../StandaloneMmDriverEntryPoint.c                 | 56 +++++++++++++++++++++-
 .../StandaloneMmDriverEntryPoint.inf               |  5 +-
 3 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/MdePkg/Include/Library/StandaloneMmDriverEntryPoint.h b/MdePkg/Include/Library/StandaloneMmDriverEntryPoint.h
index 25b2d8d68d..12f7886640 100644
--- a/MdePkg/Include/Library/StandaloneMmDriverEntryPoint.h
+++ b/MdePkg/Include/Library/StandaloneMmDriverEntryPoint.h
@@ -16,10 +16,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 /// Declare the PI Specification Revision that this driver requires to execute
 /// correctly.
 ///
 extern CONST UINT32                   _gMmRevision;
 
+///
+/// Declare the number of unload handler in the image.
+///
+extern CONST UINT8                    _gDriverUnloadImageCount;
+
 /**
   The entry point of PE/COFF Image for a Standalone MM Driver.
 
   This function is the entry point for a Standalone MM Driver.
   This function must call ProcessLibraryConstructorList() and
@@ -120,6 +125,26 @@ EFIAPI
 ProcessModuleEntryPointList (
   IN EFI_HANDLE             ImageHandle,
   IN EFI_MM_SYSTEM_TABLE    *MmSystemTable
   );
 
+/**
+  Autogenerated function that calls a set of module unload handlers.
+
+  This function must be called from the unload handler registered by _ModuleEntryPoint().
+  This function calls the set of module unload handlers.
+  This function is autogenerated by build tools and those build tools are responsible
+  for collecting the module unload handlers and calling them in a specified order.
+
+  @param  ImageHandle  The image handle of the DXE Driver, DXE Runtime Driver, DXE SMM Driver, or UEFI Driver.
+
+  @retval  EFI_SUCCESS  The unload handlers executed normally.
+  @retval  !EFI_SUCCESS The unload handlers failed to execute normally.
+
+**/
+EFI_STATUS
+EFIAPI
+ProcessModuleUnloadList (
+  IN EFI_HANDLE  ImageHandle
+  );
+
 #endif
diff --git a/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntryPoint.c b/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntryPoint.c
index 2c41e23a03..d74c9bdfed 100644
--- a/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntryPoint.c
+++ b/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntryPoint.c
@@ -1,23 +1,63 @@
 /** @file
   Entry point to a Standalone MM driver.
 
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
 Copyright (c) 2016 - 2018, ARM Ltd. All rights reserved.<BR>
 Copyright (c) 2018, Linaro, Limited. All rights reserved.<BR>
 
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
 
 #include <PiMm.h>
 
+#include <Protocol/LoadedImage.h>
 #include <Library/BaseLib.h>
 #include <Library/DebugLib.h>
 #include <Library/MmServicesTableLib.h>
 #include <Library/StandaloneMmDriverEntryPoint.h>
 
+/**
+  Unloads an image from memory.
+
+  This function is a callback that a driver registers to do cleanup
+  when the UnloadImage boot service function is called.
+
+  @param  ImageHandle The handle to the image to unload.
+
+  @return Status returned by all unload().
+
+**/
+EFI_STATUS
+EFIAPI
+_DriverUnloadHandler (
+  EFI_HANDLE ImageHandle
+  )
+{
+  EFI_STATUS  Status;
+
+  //
+  // If an UnloadImage() handler is specified, then call it
+  //
+  Status = ProcessModuleUnloadList (ImageHandle);
+
+  //
+  // If the driver specific unload handler does not return an error, then call all of the
+  // library destructors.  If the unload handler returned an error, then the driver can not be
+  // unloaded, and the library destructors should not be called
+  //
+  if (!EFI_ERROR (Status)) {
+    ProcessLibraryDestructorList (ImageHandle, gMmst);
+  }
+
+  //
+  // Return the status from the driver specific unload handler
+  //
+  return Status;
+}
+
 /**
   The entry point of PE/COFF Image for a Standalone MM Driver.
 
   This function is the entry point for a Standalone MM Driver.
   This function must call ProcessLibraryConstructorList() and
@@ -44,10 +84,11 @@ _ModuleEntryPoint (
   IN EFI_HANDLE               ImageHandle,
   IN IN EFI_MM_SYSTEM_TABLE   *MmSystemTable
   )
 {
   EFI_STATUS                 Status;
+  EFI_LOADED_IMAGE_PROTOCOL  *LoadedImage;
 
   if (_gMmRevision != 0) {
     //
     // Make sure that the MM spec revision of the platform
     // is >= MM spec revision of the driver
@@ -60,10 +101,23 @@ _ModuleEntryPoint (
   //
   // Call constructor for all libraries
   //
   ProcessLibraryConstructorList (ImageHandle, MmSystemTable);
 
+  //
+  //  Install unload handler...
+  //
+  if (_gDriverUnloadImageCount != 0) {
+    Status = gMmst->MmHandleProtocol (
+                      ImageHandle,
+                      &gEfiLoadedImageProtocolGuid,
+                      (VOID **)&LoadedImage
+                      );
+    ASSERT_EFI_ERROR (Status);
+    LoadedImage->Unload = _DriverUnloadHandler;
+  }
+
   //
   // Call the driver entry point
   //
   Status = ProcessModuleEntryPointList (ImageHandle, MmSystemTable);
 
diff --git a/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntryPoint.inf b/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntryPoint.inf
index 2f33a6d4ad..9303566309 100644
--- a/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntryPoint.inf
+++ b/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntryPoint.inf
@@ -1,9 +1,9 @@
 ## @file
 # Module entry point library for Standalone MM driver.
 #
-# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
 # Copyright (c) 2016-2018, ARM Ltd. All rights reserved.<BR>
 # Copyright (c) 2018, Linaro, Limited. All rights reserved.<BR>
 #
 #  SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -34,5 +34,8 @@
 
 [LibraryClasses]
   BaseLib
   DebugLib
   MmServicesTableLib
+
+[Protocols]
+  gEfiLoadedImageProtocolGuid      ## SOMETIMES_CONSUMES
-- 
2.16.2.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#72264): https://edk2.groups.io/g/devel/message/72264
Mute This Topic: https://groups.io/mt/80992105/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-