diff options
author | vanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524> | 2012-09-25 02:44:53 +0000 |
---|---|---|
committer | vanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524> | 2012-09-25 02:44:53 +0000 |
commit | 9fa90bb49168d42ce0e178d1ada97de4f768a922 (patch) | |
tree | 72e2c9757d19eded6b52ad42f17cb21b890cc8e4 /MdeModulePkg/Core/PiSmmCore | |
parent | 565b3c807ccb529b07c3b42ef00429aa4e19f882 (diff) | |
download | edk2-platforms-9fa90bb49168d42ce0e178d1ada97de4f768a922.tar.xz |
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/edk2@13740 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg/Core/PiSmmCore')
-rw-r--r-- | MdeModulePkg/Core/PiSmmCore/PiSmmCore.c | 77 |
1 files changed, 38 insertions, 39 deletions
diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c index 90812ac76a..3c9d863346 100644 --- a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c +++ b/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) ;
}
|