]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Library/SmmRuntimeDxeReportStatusCodeLibFramework/SmmRuntimeDxeSupport.c
Update the library to compliant with SMMCis 0.91 and 0.9 both. 0.91 requires the...
[mirror_edk2.git] / IntelFrameworkModulePkg / Library / SmmRuntimeDxeReportStatusCodeLibFramework / SmmRuntimeDxeSupport.c
index b632a94a1a8873720d076b9506464a22ee423771..fae6df1041195b7e6a2ddd098c4c2687c9196056 100644 (file)
@@ -30,7 +30,10 @@ STATIC
 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
@@ -47,17 +50,12 @@ InternalGetReportStatusCode (
   )\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
@@ -84,13 +82,10 @@ 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
-  }\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
@@ -125,20 +120,20 @@ ReportStatusCodeLibConstruct (
   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
@@ -149,6 +144,13 @@ 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
+  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