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

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