]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Library/SmmRuntimeDxeReportStatusCodeLibFramework/SmmRuntimeDxeSupport.c
use the GUIDed versions of events: EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE and EVT_SIGNAL_E...
[mirror_edk2.git] / IntelFrameworkModulePkg / Library / SmmRuntimeDxeReportStatusCodeLibFramework / SmmRuntimeDxeSupport.c
index fae6df1041195b7e6a2ddd098c4c2687c9196056..c68016083137bea2a26a27bca4154f8fb0f01993 100644 (file)
 #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
@@ -54,12 +50,17 @@ InternalGetReportStatusCode (
 \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
@@ -73,7 +74,6 @@ InternalGetReportStatusCode (
   @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
@@ -89,12 +89,11 @@ ReportStatusCodeLibVirtualAddressChange (
 }\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
@@ -120,20 +119,18 @@ ReportStatusCodeLibConstruct (
   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
@@ -161,11 +158,12 @@ ReportStatusCodeLibConstruct (
   //\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
@@ -174,11 +172,12 @@ ReportStatusCodeLibConstruct (
   //\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
@@ -186,7 +185,13 @@ ReportStatusCodeLibConstruct (
   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
@@ -196,21 +201,24 @@ ReportStatusCodeLibDestruct (
 {\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
@@ -294,3 +302,4 @@ InternalReportStatusCodeEx (
   }\r
   return  InternalReportStatusCode (Type, Value, Instance, CallerId, mStatusCodeData);\r
 }\r
+\r