]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/PiSmmCore/PiSmmCore.c
Fixed one bug: gSmmCorePrivate->InSmm is not set to FALSE correctly before exiting
[mirror_edk2.git] / MdeModulePkg / Core / PiSmmCore / PiSmmCore.c
index 9c7dd83223defd9a1103537103df2f6108b876ce..c1b3563d013d277be9e7dd36446171ef7947818b 100644 (file)
@@ -76,7 +76,7 @@ BOOLEAN  mInLegacyBoot = FALSE;
 //\r
 SMM_CORE_SMI_HANDLERS  mSmmCoreSmiHandlers[] = {\r
   { SmmDriverDispatchHandler, &gEfiEventDxeDispatchGuid,          NULL, TRUE  },\r
-  { SmmReadyToLockHandler,    &gEfiDxeSmmReadyToLockProtocolGuid, NULL, FALSE }, \r
+  { SmmReadyToLockHandler,    &gEfiDxeSmmReadyToLockProtocolGuid, NULL, TRUE }, \r
   { SmmLegacyBootHandler,     &gEfiEventLegacyBootGuid,           NULL, FALSE },\r
   { NULL,                     NULL,                               NULL, FALSE }\r
 };\r
@@ -245,6 +245,7 @@ SmmEntryPoint (
 {\r
   EFI_STATUS                  Status;\r
   EFI_SMM_COMMUNICATE_HEADER  *CommunicateHeader;\r
+  BOOLEAN                     InLegacyBoot;\r
 \r
   PERF_START (NULL, "SMM", NULL, 0) ;\r
 \r
@@ -261,49 +262,44 @@ SmmEntryPoint (
   //\r
   // If a legacy boot has occured, then make sure gSmmCorePrivate is not accessed\r
   //\r
-  if (mInLegacyBoot) {\r
+  InLegacyBoot = mInLegacyBoot;\r
+  if (!InLegacyBoot) {\r
     //\r
-    // Asynchronous SMI\r
+    // Mark the InSmm flag as TRUE, it will be used by SmmBase2 protocol\r
     //\r
-    SmiManage (NULL, NULL, NULL, NULL);\r
-    return;\r
-  }\r
-\r
-  //\r
-  // Mark the InSmm flag as TRUE, it will be used by SmmBase2 protocol\r
-  //\r
-  gSmmCorePrivate->InSmm = TRUE;\r
-\r
-  //\r
-  // Check to see if this is a Synchronous SMI sent through the SMM Communication \r
-  // Protocol or an Asynchronous SMI\r
-  //\r
-  if (gSmmCorePrivate->CommunicationBuffer != NULL) {\r
-    //\r
-    // Synchronous SMI for SMM Core or request from Communicate protocol\r
-    //\r
-    CommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *)gSmmCorePrivate->CommunicationBuffer;\r
-    gSmmCorePrivate->BufferSize -= OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);\r
-    Status = SmiManage (\r
-               &CommunicateHeader->HeaderGuid, \r
-               NULL, \r
-               CommunicateHeader->Data, \r
-               &gSmmCorePrivate->BufferSize\r
-               );\r
+    gSmmCorePrivate->InSmm = TRUE;\r
 \r
     //\r
-    // Update CommunicationBuffer, BufferSize and ReturnStatus\r
-    // Communicate service finished, reset the pointer to CommBuffer to NULL\r
+    // Check to see if this is a Synchronous SMI sent through the SMM Communication \r
+    // Protocol or an Asynchronous SMI\r
     //\r
-    gSmmCorePrivate->BufferSize += OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);\r
-    gSmmCorePrivate->CommunicationBuffer = NULL;\r
-    gSmmCorePrivate->ReturnStatus = (Status == EFI_SUCCESS) ? EFI_SUCCESS : EFI_NOT_FOUND;\r
-  } else {\r
-    //\r
-    // Asynchronous SMI\r
-    //\r
-    SmiManage (NULL, NULL, NULL, NULL);\r
+    if (gSmmCorePrivate->CommunicationBuffer != NULL) {\r
+      //\r
+      // Synchronous SMI for SMM Core or request from Communicate protocol\r
+      //\r
+      CommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *)gSmmCorePrivate->CommunicationBuffer;\r
+      gSmmCorePrivate->BufferSize -= OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);\r
+      Status = SmiManage (\r
+                 &CommunicateHeader->HeaderGuid, \r
+                 NULL, \r
+                 CommunicateHeader->Data, \r
+                 &gSmmCorePrivate->BufferSize\r
+                 );\r
+\r
+      //\r
+      // Update CommunicationBuffer, BufferSize and ReturnStatus\r
+      // Communicate service finished, reset the pointer to CommBuffer to NULL\r
+      //\r
+      gSmmCorePrivate->BufferSize += OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);\r
+      gSmmCorePrivate->CommunicationBuffer = NULL;\r
+      gSmmCorePrivate->ReturnStatus = (Status == EFI_SUCCESS) ? EFI_SUCCESS : EFI_NOT_FOUND;\r
+    }\r
   }\r
+\r
+  //\r
+  // Process Asynchronous SMI sources\r
+  //\r
+  SmiManage (NULL, NULL, NULL, NULL);\r
   \r
   //\r
   // Call platform hook after Smm Dispatch\r
@@ -311,9 +307,14 @@ SmmEntryPoint (
   PlatformHookAfterSmmDispatch ();\r
 \r
   //\r
-  // Clear the InSmm flag as we are going to leave SMM\r
+  // If a legacy boot has occured, then make sure gSmmCorePrivate is not accessed\r
   //\r
-  gSmmCorePrivate->InSmm = FALSE;\r
+  if (!InLegacyBoot) {\r
+    //\r
+    // Clear the InSmm flag as we are going to leave SMM\r
+    //\r
+    gSmmCorePrivate->InSmm = FALSE;\r
+  }\r
 \r
   PERF_END (NULL, "SMM", NULL, 0) ;\r
 }\r