summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--StandaloneMmPkg/Core/Mmi.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/StandaloneMmPkg/Core/Mmi.c b/StandaloneMmPkg/Core/Mmi.c
index c1a1d76e85..9e52072bf7 100644
--- a/StandaloneMmPkg/Core/Mmi.c
+++ b/StandaloneMmPkg/Core/Mmi.c
@@ -36,8 +36,9 @@ typedef struct {
MMI_ENTRY *MmiEntry;
} MMI_HANDLER;
-LIST_ENTRY mRootMmiHandlerList = INITIALIZE_LIST_HEAD_VARIABLE (mRootMmiHandlerList);
-LIST_ENTRY mMmiEntryList = INITIALIZE_LIST_HEAD_VARIABLE (mMmiEntryList);
+LIST_ENTRY mRootMmiHandlerList = INITIALIZE_LIST_HEAD_VARIABLE (mRootMmiHandlerList);
+LIST_ENTRY mMmiEntryList = INITIALIZE_LIST_HEAD_VARIABLE (mMmiEntryList);
+MMI_HANDLER *mCurrentMmiHandler = NULL;
/**
Finds the MMI entry for the requested handler type.
@@ -161,13 +162,19 @@ MmiManage (
// get next node before handler is executed, since LIST_ENTRY that
// Link points to may be freed if unregister MMI handler.
//
- Link = Link->ForwardLink;
- Status = MmiHandler->Handler (
- (EFI_HANDLE)MmiHandler,
- Context,
- CommBuffer,
- CommBufferSize
- );
+ Link = Link->ForwardLink;
+ //
+ // Assign gCurrentMmiHandle before calling the MMI handler and
+ // set to NULL when it returns.
+ //
+ mCurrentMmiHandler = MmiHandler;
+ Status = MmiHandler->Handler (
+ (EFI_HANDLE)MmiHandler,
+ Context,
+ CommBuffer,
+ CommBufferSize
+ );
+ mCurrentMmiHandler = NULL;
switch (Status) {
case EFI_INTERRUPT_PENDING:
@@ -314,6 +321,13 @@ MmiHandlerUnRegister (
return EFI_INVALID_PARAMETER;
}
+ //
+ // Do not allow to unregister MMI Handler inside other MMI Handler
+ //
+ if ((mCurrentMmiHandler != NULL) && (mCurrentMmiHandler != MmiHandler)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
MmiEntry = MmiHandler->MmiEntry;
RemoveEntryList (&MmiHandler->Link);