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;
|
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.
|
The entry point of PE/COFF Image for a Standalone MM Driver.
|
||||||
|
|
||||||
|
@ -122,4 +127,24 @@ ProcessModuleEntryPointList (
|
||||||
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
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
|
#endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
Entry point to a Standalone MM driver.
|
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) 2016 - 2018, ARM Ltd. All rights reserved.<BR>
|
||||||
Copyright (c) 2018, Linaro, Limited. 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 <PiMm.h>
|
||||||
|
|
||||||
|
#include <Protocol/LoadedImage.h>
|
||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
#include <Library/MmServicesTableLib.h>
|
#include <Library/MmServicesTableLib.h>
|
||||||
#include <Library/StandaloneMmDriverEntryPoint.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.
|
The entry point of PE/COFF Image for a Standalone MM Driver.
|
||||||
|
|
||||||
|
@ -46,6 +86,7 @@ _ModuleEntryPoint (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
||||||
|
|
||||||
if (_gMmRevision != 0) {
|
if (_gMmRevision != 0) {
|
||||||
//
|
//
|
||||||
|
@ -62,6 +103,19 @@ _ModuleEntryPoint (
|
||||||
//
|
//
|
||||||
ProcessLibraryConstructorList (ImageHandle, MmSystemTable);
|
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
|
// Call the driver entry point
|
||||||
//
|
//
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
## @file
|
## @file
|
||||||
# Module entry point library for Standalone MM driver.
|
# 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) 2016-2018, ARM Ltd. All rights reserved.<BR>
|
||||||
# Copyright (c) 2018, Linaro, Limited. All rights reserved.<BR>
|
# Copyright (c) 2018, Linaro, Limited. All rights reserved.<BR>
|
||||||
#
|
#
|
||||||
|
@ -36,3 +36,6 @@
|
||||||
BaseLib
|
BaseLib
|
||||||
DebugLib
|
DebugLib
|
||||||
MmServicesTableLib
|
MmServicesTableLib
|
||||||
|
|
||||||
|
[Protocols]
|
||||||
|
gEfiLoadedImageProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
|
Loading…
Reference in New Issue