STATIC\r
BOOLEAN mInSmm;\r
\r
+EFI_SMM_BASE_PROTOCOL *mSmmBase;\r
+\r
STATIC\r
EFI_RUNTIME_SERVICES *mRT;\r
\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_SMM_BASE_PROTOCOL *SmmBase;\r
EFI_STATUS Status;\r
\r
mBS = SystemTable->BootServices;\r
// the SMM driver must be success to locate protocol.\r
// \r
ASSERT (mBS != NULL);\r
- Status = mBS->LocateProtocol (&gEfiSmmBaseProtocolGuid, NULL, (VOID **) &SmmBase);\r
+ Status = mBS->LocateProtocol (&gEfiSmmBaseProtocolGuid, NULL, (VOID **) &mSmmBase);\r
if (!EFI_ERROR (Status)) {\r
- SmmBase->InSmm (SmmBase, &mInSmm);\r
+ mSmmBase->InSmm (mSmmBase, &mInSmm);\r
if (mInSmm) {\r
- Status = SmmBase->SmmAllocatePool (\r
- SmmBase,\r
+ Status = mSmmBase->SmmAllocatePool (\r
+ mSmmBase,\r
EfiRuntimeServicesData, \r
sizeof (EFI_STATUS_CODE_DATA) + EFI_STATUS_CODE_DATA_MAX_SIZE, \r
(VOID **) &mStatusCodeData\r
{\r
EFI_STATUS Status;\r
\r
- //\r
- // Close SetVirtualAddressMap () notify function\r
- //\r
- ASSERT (mBS != NULL);\r
- Status = mBS->CloseEvent (mVirtualAddressChangeEvent);\r
- ASSERT_EFI_ERROR (Status);\r
- Status = mBS->CloseEvent (mExitBootServicesEvent);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- mBS->FreePool (mStatusCodeData);\r
+ if (!mInSmm) {\r
+ //\r
+ // Close SetVirtualAddressMap () notify function\r
+ //\r
+ ASSERT (mBS != NULL);\r
+ Status = mBS->CloseEvent (mVirtualAddressChangeEvent);\r
+ ASSERT_EFI_ERROR (Status);\r
+ Status = mBS->CloseEvent (mExitBootServicesEvent);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ mBS->FreePool (mStatusCodeData);\r
+ } else {\r
+ mSmmBase->SmmFreePool (mSmmBase, mStatusCodeData);\r
+ }\r
\r
- return Status;\r
+ return EFI_SUCCESS;\r
}\r
\r
/**\r