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>
This commit is contained in:
Jiaxin Wu 2021-03-01 12:06:44 +08:00 committed by mergify[bot]
parent f9c53a69ed
commit 9fd7e88c23
3 changed files with 84 additions and 2 deletions

View File

@ -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

View File

@ -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,11 +11,51 @@ 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.
@ -46,6 +86,7 @@ _ModuleEntryPoint (
)
{
EFI_STATUS Status;
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
if (_gMmRevision != 0) {
//
@ -62,6 +103,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
//

View File

@ -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