summaryrefslogtreecommitdiff
path: root/edk2/MdeModulePkg
diff options
context:
space:
mode:
authorvanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>2012-09-25 02:44:53 +0000
committervanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>2012-09-25 02:44:53 +0000
commitcfe264567705478904f031f871bbb192334330ab (patch)
tree2654f3a2319b26c7cf5dd70e2f0c9442b63b994b /edk2/MdeModulePkg
parent24a6108c898f90f8006a48ce37ac6710f129bcbf (diff)
1. Update PiSmmCore to always invoke SmiManage (NULL, NULL, NULL, NULL) when SMI triggered.
2. Fix issue that PlatformHookAfterSmiDispatch() and PERF_END() are not called in the case mInLegacyBoot is TRUE. signed-off-by: Jeff Fan <jeff.fan@intel.com> reviewed-by: Kinney, Michael D <michael.d.kinney@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk@13740 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'edk2/MdeModulePkg')
-rw-r--r--edk2/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c77
1 files changed, 38 insertions, 39 deletions
diff --git a/edk2/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c b/edk2/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c
index 90812ac76..3c9d86334 100644
--- a/edk2/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c
+++ b/edk2/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c
@@ -261,49 +261,43 @@ SmmEntryPoint (
//
// If a legacy boot has occured, then make sure gSmmCorePrivate is not accessed
//
- if (mInLegacyBoot) {
+ if (!mInLegacyBoot) {
//
- // Asynchronous SMI
+ // Mark the InSmm flag as TRUE, it will be used by SmmBase2 protocol
//
- SmiManage (NULL, NULL, NULL, NULL);
- return;
- }
-
- //
- // Mark the InSmm flag as TRUE, it will be used by SmmBase2 protocol
- //
- gSmmCorePrivate->InSmm = TRUE;
-
- //
- // Check to see if this is a Synchronous SMI sent through the SMM Communication
- // Protocol or an Asynchronous SMI
- //
- if (gSmmCorePrivate->CommunicationBuffer != NULL) {
- //
- // Synchronous SMI for SMM Core or request from Communicate protocol
- //
- CommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *)gSmmCorePrivate->CommunicationBuffer;
- gSmmCorePrivate->BufferSize -= OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);
- Status = SmiManage (
- &CommunicateHeader->HeaderGuid,
- NULL,
- CommunicateHeader->Data,
- &gSmmCorePrivate->BufferSize
- );
+ gSmmCorePrivate->InSmm = TRUE;
//
- // Update CommunicationBuffer, BufferSize and ReturnStatus
- // Communicate service finished, reset the pointer to CommBuffer to NULL
+ // Check to see if this is a Synchronous SMI sent through the SMM Communication
+ // Protocol or an Asynchronous SMI
//
- gSmmCorePrivate->BufferSize += OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);
- gSmmCorePrivate->CommunicationBuffer = NULL;
- gSmmCorePrivate->ReturnStatus = (Status == EFI_SUCCESS) ? EFI_SUCCESS : EFI_NOT_FOUND;
- } else {
- //
- // Asynchronous SMI
- //
- SmiManage (NULL, NULL, NULL, NULL);
+ if (gSmmCorePrivate->CommunicationBuffer != NULL) {
+ //
+ // Synchronous SMI for SMM Core or request from Communicate protocol
+ //
+ CommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *)gSmmCorePrivate->CommunicationBuffer;
+ gSmmCorePrivate->BufferSize -= OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);
+ Status = SmiManage (
+ &CommunicateHeader->HeaderGuid,
+ NULL,
+ CommunicateHeader->Data,
+ &gSmmCorePrivate->BufferSize
+ );
+
+ //
+ // Update CommunicationBuffer, BufferSize and ReturnStatus
+ // Communicate service finished, reset the pointer to CommBuffer to NULL
+ //
+ gSmmCorePrivate->BufferSize += OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);
+ gSmmCorePrivate->CommunicationBuffer = NULL;
+ gSmmCorePrivate->ReturnStatus = (Status == EFI_SUCCESS) ? EFI_SUCCESS : EFI_NOT_FOUND;
+ }
}
+
+ //
+ // Process Asynchronous SMI sources
+ //
+ SmiManage (NULL, NULL, NULL, NULL);
//
// Call platform hook after Smm Dispatch
@@ -311,9 +305,14 @@ SmmEntryPoint (
PlatformHookAfterSmmDispatch ();
//
- // Clear the InSmm flag as we are going to leave SMM
+ // If a legacy boot has occured, then make sure gSmmCorePrivate is not accessed
//
- gSmmCorePrivate->InSmm = FALSE;
+ if (!mInLegacyBoot) {
+ //
+ // Clear the InSmm flag as we are going to leave SMM
+ //
+ gSmmCorePrivate->InSmm = FALSE;
+ }
PERF_END (NULL, "SMM", NULL, 0) ;
}