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


gaoliming
 

That's OK. Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> for this
patch.

-----邮件原件-----
发件人: Wu, Jiaxin <jiaxin.wu@intel.com>
发送时间: 2021年3月4日 11:22
收件人: gaoliming <gaoliming@byosoft.com.cn>; devel@edk2.groups.io
抄送: Kinney, Michael D <michael.d.kinney@intel.com>; Liu, Zhiguang
<zhiguang.liu@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>
主题: RE: [edk2-devel] [PATCH v1] MdePkg: Support standalone MM Driver
Unload capability

Hi Liming,

We internal verified the new added unload logic, works well.

Thanks,
Jiaxin

-----Original Message-----
From: gaoliming <gaoliming@byosoft.com.cn>
Sent: Thursday, March 4, 2021 10:21 AM
To: devel@edk2.groups.io; Wu, Jiaxin <jiaxin.wu@intel.com>
Cc: Kinney, Michael D <michael.d.kinney@intel.com>; Liu, Zhiguang
<zhiguang.liu@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>
Subject: 回复: [edk2-devel] [PATCH v1] MdePkg: Support standalone MM
Driver Unload capability

Jiaxin:
Have you created the test case to verify the new added unload logic?

Thanks
Liming
-----邮件原件-----
发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Wu,
Jiaxin
发送时间: 2021年3月3日 16:49
收件人: devel@edk2.groups.io; Wu, Jiaxin <jiaxin.wu@intel.com>
抄送: 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>
主题: Re: [edk2-devel] [PATCH v1] MdePkg: Support standalone MM
Driver
Unload capability

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