#include <Library/OemHookStatusCodeLib.h>\r
#include <Protocol/SmmBase.h>\r
\r
-STATIC \r
EFI_EVENT mVirtualAddressChangeEvent;\r
\r
-STATIC \r
EFI_EVENT mExitBootServicesEvent;\r
\r
-STATIC\r
EFI_STATUS_CODE_DATA *mStatusCodeData;\r
\r
-STATIC\r
BOOLEAN mInSmm;\r
\r
-STATIC\r
+EFI_SMM_BASE_PROTOCOL *mSmmBase;\r
+\r
EFI_RUNTIME_SERVICES *mRT;\r
\r
-STATIC\r
BOOLEAN mHaveExitedBootServices = FALSE;\r
\r
/**\r
- Locatet he report status code service.\r
+ Locate he report status code service.\r
\r
@return EFI_REPORT_STATUS_CODE function point to\r
ReportStatusCode.\r
\r
if (mInSmm) {\r
return (EFI_REPORT_STATUS_CODE) OemHookStatusCodeReport;\r
- } else if (mRT->Hdr.Revision < 0x20000) {\r
+ } else if (mRT != NULL && mRT->Hdr.Revision < 0x20000) {\r
return ((FRAMEWORK_EFI_RUNTIME_SERVICES*)mRT)->ReportStatusCode;\r
} else if (!mHaveExitedBootServices) {\r
- Status = gBS->LocateProtocol (&gEfiStatusCodeRuntimeProtocolGuid, NULL, (VOID**)&StatusCodeProtocol);\r
- if (!EFI_ERROR (Status) && StatusCodeProtocol != NULL) {\r
- return StatusCodeProtocol->ReportStatusCode;\r
+ //\r
+ // Check gBS just in case. ReportStatusCode is called before gBS is initialized.\r
+ //\r
+ if (gBS != NULL) {\r
+ Status = gBS->LocateProtocol (&gEfiStatusCodeRuntimeProtocolGuid, NULL, (VOID**)&StatusCodeProtocol);\r
+ if (!EFI_ERROR (Status) && StatusCodeProtocol != NULL) {\r
+ return StatusCodeProtocol->ReportStatusCode;\r
+ }\r
}\r
}\r
\r
@param[in] Event The Event that is being processed\r
@param[in] Context Event Context\r
**/\r
-STATIC\r
VOID\r
EFIAPI\r
ReportStatusCodeLibVirtualAddressChange (\r
}\r
\r
/**\r
- Updatet the In Runtime Indicator.\r
+ Update the In Runtime Indicator.\r
\r
@param[in] Event The Event that is being processed\r
@param[in] Context Event Context\r
**/\r
-STATIC\r
VOID\r
EFIAPI\r
ReportStatusCodeLibExitBootServices (\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_SMM_BASE_PROTOCOL *SmmBase;\r
EFI_STATUS Status;\r
\r
//\r
// SMM driver depends on the SMM BASE protocol.\r
// the SMM driver must be success to locate protocol.\r
// \r
- ASSERT (gBS != NULL);\r
- Status = gBS->LocateProtocol (&gEfiSmmBaseProtocolGuid, NULL, (VOID **) &SmmBase);\r
+ Status = gBS->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
// Register the call back of virtual address change\r
// \r
- Status = gBS->CreateEvent (\r
- EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE,\r
+ Status = gBS->CreateEventEx (\r
+ EVT_NOTIFY_SIGNAL,\r
TPL_NOTIFY,\r
ReportStatusCodeLibVirtualAddressChange,\r
NULL,\r
+ &gEfiEventVirtualAddressChangeGuid,\r
&mVirtualAddressChangeEvent\r
);\r
ASSERT_EFI_ERROR (Status);\r
//\r
// Register the call back of virtual address change\r
// \r
- Status = gBS->CreateEvent (\r
- EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
+ Status = gBS->CreateEventEx (\r
+ EVT_NOTIFY_SIGNAL,\r
TPL_NOTIFY,\r
ReportStatusCodeLibExitBootServices,\r
NULL,\r
+ &gEfiEventExitBootServicesGuid,\r
&mExitBootServicesEvent\r
);\r
ASSERT_EFI_ERROR (Status);\r
return Status;\r
}\r
\r
-\r
+/**\r
+ Desctructor of library will close events.\r
+ \r
+ @param ImageHandle callder module's image handle\r
+ @param SystemTable pointer to EFI system table.\r
+ @return the status of close event.\r
+**/\r
EFI_STATUS\r
EFIAPI\r
ReportStatusCodeLibDestruct (\r
{\r
EFI_STATUS Status;\r
\r
- //\r
- // Close SetVirtualAddressMap () notify function\r
- //\r
- ASSERT (gBS != NULL);\r
- Status = gBS->CloseEvent (mVirtualAddressChangeEvent);\r
- ASSERT_EFI_ERROR (Status);\r
- Status = gBS->CloseEvent (mExitBootServicesEvent);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- gBS->FreePool (mStatusCodeData);\r
+ if (!mInSmm) {\r
+ //\r
+ // Close SetVirtualAddressMap () notify function\r
+ //\r
+ ASSERT (gBS != NULL);\r
+ Status = gBS->CloseEvent (mVirtualAddressChangeEvent);\r
+ ASSERT_EFI_ERROR (Status);\r
+ Status = gBS->CloseEvent (mExitBootServicesEvent);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ gBS->FreePool (mStatusCodeData);\r
+ } else {\r
+ mSmmBase->SmmFreePool (mSmmBase, mStatusCodeData);\r
+ }\r
\r
- return Status;\r
+ return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
Reports a status code with full parameters.\r
\r
}\r
return InternalReportStatusCode (Type, Value, Instance, CallerId, mStatusCodeData);\r
}\r
+\r