MdeModulePkg SmmLockBoxSmmLib: Add DESTRUCTOR SmmLockBoxSmmDestructor

SmmLockBoxSmmLib is linked to SMM modules. If the module entry-point
function returns error, the module will be unloaded and the global
variables will point to undefined memory.

This patch is to add DESTRUCTOR SmmLockBoxSmmDestructor to uninstall
SmmLockBoxCommunication configuration table if it has been installed
in Constructor.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
Star Zeng 2016-05-26 13:21:08 +08:00
parent da9d39c28e
commit 738df706c1
2 changed files with 40 additions and 0 deletions

View File

@ -30,6 +30,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
SMM_LOCK_BOX_CONTEXT mSmmLockBoxContext; SMM_LOCK_BOX_CONTEXT mSmmLockBoxContext;
LIST_ENTRY mLockBoxQueue = INITIALIZE_LIST_HEAD_VARIABLE (mLockBoxQueue); LIST_ENTRY mLockBoxQueue = INITIALIZE_LIST_HEAD_VARIABLE (mLockBoxQueue);
BOOLEAN mSmmConfigurationTableInstalled = FALSE;
/** /**
This function return SmmLockBox context from SMST. This function return SmmLockBox context from SMST.
@ -114,6 +116,7 @@ SmmLockBoxSmmConstructor (
sizeof(mSmmLockBoxContext) sizeof(mSmmLockBoxContext)
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
mSmmConfigurationTableInstalled = TRUE;
DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxContext - %x\n", (UINTN)&mSmmLockBoxContext)); DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxContext - %x\n", (UINTN)&mSmmLockBoxContext));
DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib LockBoxDataAddress - %x\n", (UINTN)&mLockBoxQueue)); DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib LockBoxDataAddress - %x\n", (UINTN)&mLockBoxQueue));
@ -122,6 +125,42 @@ SmmLockBoxSmmConstructor (
return Status; return Status;
} }
/**
Destructor for SmmLockBox library.
This is used to uninstall SmmLockBoxCommunication configuration table
if it has been installed in Constructor.
@param[in] ImageHandle Image handle of this driver.
@param[in] SystemTable A Pointer to the EFI System Table.
@retval EFI_SUCEESS The destructor always returns EFI_SUCCESS.
**/
EFI_STATUS
EFIAPI
SmmLockBoxSmmDestructor (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxSmmDestructor in %a module\n", gEfiCallerBaseName));
if (mSmmConfigurationTableInstalled) {
Status = gSmst->SmmInstallConfigurationTable (
gSmst,
&gEfiSmmLockBoxCommunicationGuid,
NULL,
0
);
ASSERT_EFI_ERROR (Status);
DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib uninstall SmmLockBoxCommunication configuration table\n"));
}
return EFI_SUCCESS;
}
/** /**
This function return SmmLockBox queue address. This function return SmmLockBox queue address.

View File

@ -23,6 +23,7 @@
VERSION_STRING = 1.0 VERSION_STRING = 1.0
LIBRARY_CLASS = LockBoxLib|DXE_SMM_DRIVER LIBRARY_CLASS = LockBoxLib|DXE_SMM_DRIVER
CONSTRUCTOR = SmmLockBoxSmmConstructor CONSTRUCTOR = SmmLockBoxSmmConstructor
DESTRUCTOR = SmmLockBoxSmmDestructor
# #
# The following information is for reference only and not required by the build tools. # The following information is for reference only and not required by the build tools.