summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiaxin Wu <Jiaxin.wu@intel.com>2021-03-01 12:06:44 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2021-03-18 04:16:21 +0000
commit9fd7e88c23f6fb056d25fbc3f8e2e7c1a53859d1 (patch)
tree0d9a9e1a49797293204a849ac8e98d2d6582934c
parentf9c53a69edeb94ae8c65276b885c1a7efe4f613a (diff)
downloadedk2-9fd7e88c23f6fb056d25fbc3f8e2e7c1a53859d1.tar.gz
edk2-9fd7e88c23f6fb056d25fbc3f8e2e7c1a53859d1.tar.bz2
edk2-9fd7e88c23f6fb056d25fbc3f8e2e7c1a53859d1.zip
MdePkg: Support standalone MM Driver Unload capability
https://bugzilla.tianocore.org/show_bug.cgi?id=3240 This patch is to support standalone MM Driver Unload capability by providing _DriverUnloadHandler() function. 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> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
-rw-r--r--MdePkg/Include/Library/StandaloneMmDriverEntryPoint.h25
-rw-r--r--MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntryPoint.c56
-rw-r--r--MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntryPoint.inf5
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
@@ -18,6 +18,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
///
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.
@@ -122,4 +127,24 @@ ProcessModuleEntryPointList (
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,7 +1,7 @@
/** @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>
@@ -11,12 +11,52 @@ 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.
@@ -46,6 +86,7 @@ _ModuleEntryPoint (
)
{
EFI_STATUS Status;
+ EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
if (_gMmRevision != 0) {
//
@@ -63,6 +104,19 @@ _ModuleEntryPoint (
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,7 +1,7 @@
## @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>
#
@@ -36,3 +36,6 @@
BaseLib
DebugLib
MmServicesTableLib
+
+[Protocols]
+ gEfiLoadedImageProtocolGuid ## SOMETIMES_CONSUMES