Runtime Library should not use the gRT directly, since it may be converted to virtual...
authoryshang1 <yshang1@de2fecce-e211-0410-80a6-f3fac2684e05>
Tue, 22 Jan 2008 02:09:25 +0000 (02:09 +0000)
committeryshang1 <yshang1@de2fecce-e211-0410-80a6-f3fac2684e05>
Tue, 22 Jan 2008 02:09:25 +0000 (02:09 +0000)
git-svn-id: https://edk2.tianocore.org/svn/edk2/trunk@4604 de2fecce-e211-0410-80a6-f3fac2684e05

edk2/IntelFrameworkModulePkg/Library/SmmRuntimeDxeReportStatusCodeLibFramework/SmmRuntimeDxeSupport.c

index b632a94..f953721 100644 (file)
@@ -32,6 +32,9 @@ EFI_STATUS_CODE_DATA  *mStatusCodeData;
 STATIC\r
 EFI_SMM_BASE_PROTOCOL *mSmmBase;\r
 \r
+STATIC\r
+EFI_RUNTIME_SERVICES  *mRT;\r
+\r
 STATIC\r
 BOOLEAN               mHaveExitedBootServices = FALSE;\r
 \r
@@ -56,8 +59,8 @@ InternalGetReportStatusCode (
       return (EFI_REPORT_STATUS_CODE) OemHookStatusCodeReport;\r
     }\r
   }\r
-  if (gRT->Hdr.Revision < 0x20000) {\r
-    return ((FRAMEWORK_EFI_RUNTIME_SERVICES*)gRT)->ReportStatusCode;\r
+  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
@@ -84,13 +87,13 @@ ReportStatusCodeLibVirtualAddressChange (
   )\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
+    mRT->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
@@ -149,6 +152,12 @@ ReportStatusCodeLibConstruct (
     }\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
+\r
   gBS->AllocatePool (EfiRuntimeServicesData, sizeof (EFI_STATUS_CODE_DATA) + EFI_STATUS_CODE_DATA_MAX_SIZE, (VOID **)&mStatusCodeData);\r
   ASSERT (NULL != mStatusCodeData);\r
   //\r