//\r
// If a legacy boot has occured, then make sure gSmmCorePrivate is not accessed\r
//\r
- if (mInLegacyBoot) {\r
+ if (!mInLegacyBoot) {\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
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 (!mInLegacyBoot) {\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