/** @file\r
Locate handle functions\r
\r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this 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) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
-#include <DxeMain.h>\r
+#include "DxeMain.h"\r
+#include "Handle.h"\r
\r
//\r
// ProtocolRequest - Last LocateHandle request ID\r
protocol.\r
\r
@return An pointer to IHANDLE if the next Position is not the end of the list.\r
- Otherwise,NULL_HANDLE is returned.\r
+ Otherwise,NULL is returned.\r
\r
**/\r
IHANDLE *\r
protocol.\r
\r
@return An pointer to IHANDLE if the next Position is not the end of the list.\r
- Otherwise,NULL_HANDLE is returned.\r
+ Otherwise,NULL is returned.\r
\r
**/\r
IHANDLE *\r
protocol.\r
\r
@return An pointer to IHANDLE if the next Position is not the end of the list.\r
- Otherwise,NULL_HANDLE is returned.\r
+ Otherwise,NULL is returned.\r
\r
**/\r
IHANDLE *\r
VOID *Interface;\r
\r
if (BufferSize == NULL) {\r
- Status = EFI_INVALID_PARAMETER;\r
+ return EFI_INVALID_PARAMETER;\r
}\r
\r
if ((*BufferSize > 0) && (Buffer == NULL)) {\r
return Status;\r
}\r
\r
+ ASSERT (GetNext != NULL);\r
//\r
// Enumerate out the matching handles\r
//\r
// If this is a search by register notify and a handle was\r
// returned, update the register notification position\r
//\r
+ ASSERT (SearchKey != NULL);\r
ProtNotify = SearchKey;\r
ProtNotify->Position = ProtNotify->Position->ForwardLink;\r
}\r
protocol.\r
\r
@return An pointer to IHANDLE if the next Position is not the end of the list.\r
- Otherwise,NULL_HANDLE is returned.\r
+ Otherwise,NULL is returned.\r
\r
**/\r
IHANDLE *\r
//\r
// If not at the end of the list, get the handle\r
//\r
- Handle = NULL_HANDLE;\r
+ Handle = NULL;\r
*Interface = NULL;\r
if (Position->Position != &gHandleList) {\r
Handle = CR (Position->Position, IHANDLE, AllHandles, EFI_HANDLE_SIGNATURE);\r
protocol.\r
\r
@return An pointer to IHANDLE if the next Position is not the end of the list.\r
- Otherwise,NULL_HANDLE is returned.\r
+ Otherwise,NULL is returned.\r
\r
**/\r
IHANDLE *\r
PROTOCOL_INTERFACE *Prot;\r
LIST_ENTRY *Link;\r
\r
- Handle = NULL_HANDLE;\r
+ Handle = NULL;\r
*Interface = NULL;\r
ProtNotify = Position->SearchKey;\r
\r
Link = ProtNotify->Position->ForwardLink;\r
if (Link != &ProtNotify->Protocol->Protocols) {\r
Prot = CR (Link, PROTOCOL_INTERFACE, ByProtocol, PROTOCOL_INTERFACE_SIGNATURE);\r
- Handle = (IHANDLE *) Prot->Handle;\r
+ Handle = Prot->Handle;\r
*Interface = Prot->Interface;\r
}\r
}\r
protocol.\r
\r
@return An pointer to IHANDLE if the next Position is not the end of the list.\r
- Otherwise,NULL_HANDLE is returned.\r
+ Otherwise,NULL is returned.\r
\r
**/\r
IHANDLE *\r
LIST_ENTRY *Link;\r
PROTOCOL_INTERFACE *Prot;\r
\r
- Handle = NULL_HANDLE;\r
+ Handle = NULL;\r
*Interface = NULL;\r
for (; ;) {\r
//\r
// If not at the end, return the handle\r
//\r
if (Link == &Position->ProtEntry->Protocols) {\r
- Handle = NULL_HANDLE;\r
+ Handle = NULL;\r
break;\r
}\r
\r
// Get the handle\r
//\r
Prot = CR(Link, PROTOCOL_INTERFACE, ByProtocol, PROTOCOL_INTERFACE_SIGNATURE);\r
- Handle = (IHANDLE *) Prot->Handle;\r
+ Handle = Prot->Handle;\r
*Interface = Prot->Interface;\r
\r
//\r
\r
\r
/**\r
- Locates the handle to a device on the device path that best matches the specified protocol.\r
+ Locates the handle to a device on the device path that supports the specified protocol.\r
\r
- @param Protocol The protocol to search for.\r
- @param DevicePath On input, a pointer to a pointer to the device\r
- path. On output, the device path pointer is\r
- modified to point to the remaining part of the\r
- devicepath.\r
- @param Device A pointer to the returned device handle.\r
+ @param Protocol Specifies the protocol to search for.\r
+ @param DevicePath On input, a pointer to a pointer to the device path. On output, the device\r
+ path pointer is modified to point to the remaining part of the device\r
+ path.\r
+ @param Device A pointer to the returned device handle.\r
\r
- @retval EFI_SUCCESS The resulting handle was returned.\r
- @retval EFI_NOT_FOUND No handles matched the search.\r
- @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.\r
+ @retval EFI_SUCCESS The resulting handle was returned.\r
+ @retval EFI_NOT_FOUND No handles match the search.\r
+ @retval EFI_INVALID_PARAMETER Protocol is NULL.\r
+ @retval EFI_INVALID_PARAMETER DevicePath is NULL.\r
+ @retval EFI_INVALID_PARAMETER A handle matched the search and Device is NULL.\r
\r
**/\r
EFI_STATUS\r
EFI_STATUS Status;\r
EFI_HANDLE *Handles;\r
EFI_HANDLE Handle;\r
+ EFI_HANDLE BestDevice;\r
EFI_DEVICE_PATH_PROTOCOL *SourcePath;\r
EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if (Device == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- *Device = NULL_HANDLE;\r
+ Handles = NULL;\r
+ BestDevice = NULL;\r
SourcePath = *DevicePath;\r
- SourceSize = CoreDevicePathSize (SourcePath) - sizeof(EFI_DEVICE_PATH_PROTOCOL);\r
-\r
- //\r
- // The source path can only have 1 instance\r
- //\r
- if (CoreIsDevicePathMultiInstance (SourcePath)) {\r
- DEBUG((DEBUG_ERROR, "LocateDevicePath: Device path has too many instances\n"));\r
- return EFI_INVALID_PARAMETER;\r
+ TmpDevicePath = SourcePath;\r
+ while (!IsDevicePathEnd (TmpDevicePath)) {\r
+ if (IsDevicePathEndInstance (TmpDevicePath)) {\r
+ //\r
+ // If DevicePath is a multi-instance device path,\r
+ // the function will operate on the first instance\r
+ //\r
+ break;\r
+ }\r
+ TmpDevicePath = NextDevicePathNode (TmpDevicePath);\r
}\r
\r
+ SourceSize = (UINTN) TmpDevicePath - (UINTN) SourcePath;\r
+\r
//\r
// Get a list of all handles that support the requested protocol\r
//\r
//\r
// Check if DevicePath is first part of SourcePath\r
//\r
- Size = CoreDevicePathSize (TmpDevicePath) - sizeof(EFI_DEVICE_PATH_PROTOCOL);\r
- if ((Size <= SourceSize) && CompareMem (SourcePath, TmpDevicePath, Size) == 0) {\r
+ Size = GetDevicePathSize (TmpDevicePath) - sizeof(EFI_DEVICE_PATH_PROTOCOL);\r
+ ASSERT (Size >= 0);\r
+ if ((Size <= SourceSize) && CompareMem (SourcePath, TmpDevicePath, (UINTN) Size) == 0) {\r
//\r
// If the size is equal to the best match, then we\r
- // have a duplice device path for 2 different device\r
+ // have a duplicate device path for 2 different device\r
// handles\r
//\r
ASSERT (Size != BestMatch);\r
//\r
if (Size > BestMatch) {\r
BestMatch = Size;\r
- *Device = Handle;\r
+ BestDevice = Handle;\r
}\r
}\r
}\r
return EFI_NOT_FOUND;\r
}\r
\r
+ if (Device == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ *Device = BestDevice;\r
+\r
//\r
// Return the remaining part of the device path\r
//\r
}\r
\r
\r
- /**\r
+/**\r
Return the first Protocol Interface that matches the Protocol GUID. If\r
- Registration is pasased in return a Protocol Instance that was just add\r
- to the system. If Retistration is NULL return the first Protocol Interface\r
+ Registration is passed in, return a Protocol Instance that was just add\r
+ to the system. If Registration is NULL return the first Protocol Interface\r
you find.\r
\r
@param Protocol The protocol to search for\r
PROTOCOL_NOTIFY *ProtNotify;\r
IHANDLE *Handle;\r
\r
- if (Interface == NULL) {\r
+ if ((Interface == NULL) || (Protocol == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if (Protocol == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
*Interface = NULL;\r
Status = EFI_SUCCESS;\r
\r
//\r
// Lock the protocol database\r
//\r
- CoreAcquireProtocolLock ();\r
+ Status = CoreAcquireLockOrFail (&gProtocolDatabaseLock);\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
\r
mEfiLocateHandleRequest += 1;\r
\r
@retval EFI_NOT_FOUND No handles match the search.\r
@retval EFI_OUT_OF_RESOURCES There is not enough pool memory to store the\r
matching results.\r
- @retval EFI_INVALID_PARAMETER One or more paramters are not valid.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are not valid.\r
\r
**/\r
EFI_STATUS\r
return Status;\r
}\r
\r
- *Buffer = CoreAllocateBootServicesPool (BufferSize);\r
+ *Buffer = AllocatePool (BufferSize);\r
if (*Buffer == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r