EFI_STATUS_CODE_DATA *mStatusCodeData;\r
\r
STATIC\r
-EFI_SMM_BASE_PROTOCOL *mSmmBase;\r
+BOOLEAN mInSmm;\r
+\r
+STATIC\r
+EFI_RUNTIME_SERVICES *mRT;\r
\r
STATIC\r
BOOLEAN mHaveExitedBootServices = FALSE;\r
)\r
{\r
EFI_STATUS_CODE_PROTOCOL *StatusCodeProtocol;\r
- BOOLEAN InSmm;\r
EFI_STATUS Status;\r
\r
- if (mSmmBase) {\r
- mSmmBase->InSmm (mSmmBase, &InSmm);\r
- if (InSmm) {\r
- return (EFI_REPORT_STATUS_CODE) OemHookStatusCodeReport;\r
- }\r
- }\r
- if (gRT->Hdr.Revision < 0x20000) {\r
- return ((FRAMEWORK_EFI_RUNTIME_SERVICES*)gRT)->ReportStatusCode;\r
+ if (mInSmm) {\r
+ return (EFI_REPORT_STATUS_CODE) OemHookStatusCodeReport;\r
+ } else if (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
)\r
{\r
if (NULL != mReportStatusCode) {\r
- gRT->ConvertPointer (0, (VOID **) &mReportStatusCode);\r
+ mRT->ConvertPointer (0, (VOID **) &mReportStatusCode);\r
}\r
- if (NULL != mSmmBase) {\r
- gRT->ConvertPointer (0, (VOID **) &mSmmBase);\r
- }\r
- gRT->ConvertPointer (0, (VOID **) &mStatusCodeData);\r
- gRT->ConvertPointer (0, (VOID **) &gRT);\r
+ mRT->ConvertPointer (0, (VOID **) &mStatusCodeData);\r
+ mRT->ConvertPointer (0, (VOID **) &mRT);\r
}\r
\r
/**\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
- BOOLEAN InSmm;\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 **) &mSmmBase);\r
+ Status = gBS->LocateProtocol (&gEfiSmmBaseProtocolGuid, NULL, (VOID **) &SmmBase);\r
if (!EFI_ERROR (Status)) {\r
- mSmmBase->InSmm (mSmmBase, &InSmm);\r
- if (InSmm) {\r
- Status = mSmmBase->SmmAllocatePool (\r
- mSmmBase,\r
+ SmmBase->InSmm (SmmBase, &mInSmm);\r
+ if (mInSmm) {\r
+ Status = SmmBase->SmmAllocatePool (\r
+ SmmBase,\r
EfiRuntimeServicesData, \r
sizeof (EFI_STATUS_CODE_DATA) + EFI_STATUS_CODE_DATA_MAX_SIZE, \r
(VOID **) &mStatusCodeData\r
}\r
}\r
\r
+ //\r
+ // Library should not use the gRT directly, since it\r
+ // may be converted by other library instance.\r
+ // \r
+ mRT = gRT;\r
+ mInSmm = FALSE;\r
+\r
gBS->AllocatePool (EfiRuntimeServicesData, sizeof (EFI_STATUS_CODE_DATA) + EFI_STATUS_CODE_DATA_MAX_SIZE, (VOID **)&mStatusCodeData);\r
ASSERT (NULL != mStatusCodeData);\r
//\r