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:
@@ -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
|
||||
//
|
||||
|
Reference in New Issue
Block a user