mirror of https://github.com/acidanthera/audk.git
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:
parent
f9c53a69ed
commit
9fd7e88c23
|
@ -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
|
||||
|
|
|
@ -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
|
||||
//
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue