Re: [PATCH v1] MdePkg: Support standalone MM Driver Unload capability


Wu, Jiaxin
 

Hi Mike & Zhiguang & Liming,

Could you help review this patch?

Thanks,
Jiaxin

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Wu,
Jiaxin
Sent: Monday, March 1, 2021 3:44 PM
To: devel@edk2.groups.io
Cc: Kinney, Michael D <michael.d.kinney@intel.com>; Liming Gao
<gaoliming@byosoft.com.cn>; Liu, Zhiguang <zhiguang.liu@intel.com>; Fu,
Siyuan <siyuan.fu@intel.com>
Subject: [edk2-devel] [PATCH v1] 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.

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/StandaloneMmDriverEnt
ryPoint.c
b/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEnt
ryPoint.c
index 2c41e23a03..d74c9bdfed 100644
---
a/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEnt
ryPoint.c
+++
b/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEnt
ryPoint.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/StandaloneMmDriverEnt
ryPoint.inf
b/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEnt
ryPoint.inf
index 2f33a6d4ad..9303566309 100644
---
a/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEnt
ryPoint.inf
+++
b/MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEnt
ryPoint.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




Join devel@edk2.groups.io to automatically receive all group messages.