/** @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
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
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
{\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