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