/** @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
+Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+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
**/\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
//\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