CloseEvent in ReportStatusCodeLibDestruct can only be called when the library instance is not linked with a SMM driver (for example a boot dirver or EFI Runtime capable driver).

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5937 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qwang12
2008-09-21 08:18:48 +00:00
parent 7338117bbf
commit c0522bd7df

View File

@ -32,6 +32,8 @@ EFI_STATUS_CODE_DATA *mStatusCodeData;
STATIC STATIC
BOOLEAN mInSmm; BOOLEAN mInSmm;
EFI_SMM_BASE_PROTOCOL *mSmmBase;
STATIC STATIC
EFI_RUNTIME_SERVICES *mRT; EFI_RUNTIME_SERVICES *mRT;
@ -123,7 +125,6 @@ ReportStatusCodeLibConstruct (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_SMM_BASE_PROTOCOL *SmmBase;
EFI_STATUS Status; EFI_STATUS Status;
mBS = SystemTable->BootServices; mBS = SystemTable->BootServices;
@ -133,12 +134,12 @@ ReportStatusCodeLibConstruct (
// the SMM driver must be success to locate protocol. // the SMM driver must be success to locate protocol.
// //
ASSERT (mBS != NULL); ASSERT (mBS != NULL);
Status = mBS->LocateProtocol (&gEfiSmmBaseProtocolGuid, NULL, (VOID **) &SmmBase); Status = mBS->LocateProtocol (&gEfiSmmBaseProtocolGuid, NULL, (VOID **) &mSmmBase);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
SmmBase->InSmm (SmmBase, &mInSmm); mSmmBase->InSmm (mSmmBase, &mInSmm);
if (mInSmm) { if (mInSmm) {
Status = SmmBase->SmmAllocatePool ( Status = mSmmBase->SmmAllocatePool (
SmmBase, mSmmBase,
EfiRuntimeServicesData, EfiRuntimeServicesData,
sizeof (EFI_STATUS_CODE_DATA) + EFI_STATUS_CODE_DATA_MAX_SIZE, sizeof (EFI_STATUS_CODE_DATA) + EFI_STATUS_CODE_DATA_MAX_SIZE,
(VOID **) &mStatusCodeData (VOID **) &mStatusCodeData
@ -207,18 +208,22 @@ ReportStatusCodeLibDestruct (
{ {
EFI_STATUS Status; EFI_STATUS Status;
// if (!mInSmm) {
// Close SetVirtualAddressMap () notify function //
// // Close SetVirtualAddressMap () notify function
ASSERT (mBS != NULL); //
Status = mBS->CloseEvent (mVirtualAddressChangeEvent); ASSERT (mBS != NULL);
ASSERT_EFI_ERROR (Status); Status = mBS->CloseEvent (mVirtualAddressChangeEvent);
Status = mBS->CloseEvent (mExitBootServicesEvent); ASSERT_EFI_ERROR (Status);
ASSERT_EFI_ERROR (Status); Status = mBS->CloseEvent (mExitBootServicesEvent);
ASSERT_EFI_ERROR (Status);
mBS->FreePool (mStatusCodeData); mBS->FreePool (mStatusCodeData);
} else {
mSmmBase->SmmFreePool (mSmmBase, mStatusCodeData);
}
return Status; return EFI_SUCCESS;
} }
/** /**