]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/PiSmmCore/Smi.c
MdeModulePkg/MdeModulePkg.uni: Add missing strings for PCD
[mirror_edk2.git] / MdeModulePkg / Core / PiSmmCore / Smi.c
index ad483a1877ce129d71d3440a73bfb75841a32727..488af6754faf3b2ba69fa495a8ca886333bc8af6 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   SMI management.\r
 \r
-  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials are licensed and made available \r
-  under the terms and conditions of the BSD License which accompanies this \r
-  distribution.  The full text of the license may be found at        \r
-  http://opensource.org/licenses/bsd-license.php                                            \r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -113,7 +107,7 @@ SmiManage (
   SMI_HANDLER  *SmiHandler;\r
   BOOLEAN      SuccessReturn;\r
   EFI_STATUS   Status;\r
-  \r
+\r
   Status = EFI_NOT_FOUND;\r
   SuccessReturn = FALSE;\r
   if (HandlerType == NULL) {\r
@@ -171,7 +165,7 @@ SmiManage (
     case EFI_WARN_INTERRUPT_SOURCE_QUIESCED:\r
       //\r
       // If at least one of the handlers returns EFI_WARN_INTERRUPT_SOURCE_QUIESCED\r
-      // then the function will return EFI_SUCCESS. \r
+      // then the function will return EFI_SUCCESS.\r
       //\r
       SuccessReturn = TRUE;\r
       break;\r
@@ -276,14 +270,41 @@ SmiHandlerUnRegister (
 {\r
   SMI_HANDLER  *SmiHandler;\r
   SMI_ENTRY    *SmiEntry;\r
+  LIST_ENTRY   *EntryLink;\r
+  LIST_ENTRY   *HandlerLink;\r
 \r
-  SmiHandler = (SMI_HANDLER *) DispatchHandle;\r
-\r
-  if (SmiHandler == NULL) {\r
+  if (DispatchHandle == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (SmiHandler->Signature != SMI_HANDLER_SIGNATURE) {\r
+  //\r
+  // Look for it in root SMI handlers\r
+  //\r
+  SmiHandler = NULL;\r
+  for ( HandlerLink = GetFirstNode (&mRootSmiEntry.SmiHandlers)\r
+      ; !IsNull (&mRootSmiEntry.SmiHandlers, HandlerLink) && ((EFI_HANDLE) SmiHandler != DispatchHandle)\r
+      ; HandlerLink = GetNextNode (&mRootSmiEntry.SmiHandlers, HandlerLink)\r
+      ) {\r
+    SmiHandler = CR (HandlerLink, SMI_HANDLER, Link, SMI_HANDLER_SIGNATURE);\r
+  }\r
+\r
+  //\r
+  // Look for it in non-root SMI handlers\r
+  //\r
+  for ( EntryLink = GetFirstNode (&mSmiEntryList)\r
+      ; !IsNull (&mSmiEntryList, EntryLink) && ((EFI_HANDLE) SmiHandler != DispatchHandle)\r
+      ; EntryLink = GetNextNode (&mSmiEntryList, EntryLink)\r
+      ) {\r
+    SmiEntry = CR (EntryLink, SMI_ENTRY, AllEntries, SMI_ENTRY_SIGNATURE);\r
+    for ( HandlerLink = GetFirstNode (&SmiEntry->SmiHandlers)\r
+        ; !IsNull (&SmiEntry->SmiHandlers, HandlerLink) && ((EFI_HANDLE) SmiHandler != DispatchHandle)\r
+        ; HandlerLink = GetNextNode (&SmiEntry->SmiHandlers, HandlerLink)\r
+        ) {\r
+      SmiHandler = CR (HandlerLink, SMI_HANDLER, Link, SMI_HANDLER_SIGNATURE);\r
+    }\r
+  }\r
+\r
+  if ((EFI_HANDLE) SmiHandler != DispatchHandle) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r