]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Hand/Locate.c
MdeModulePkg/Core: Merge memory map after filtering paging capability
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Hand / Locate.c
index 861cf12ee60e5502871f9403cdd4cb3e0e994c30..3cc146f3814c6aee7031408c82e0b5d34b48a6ec 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
   Locate handle functions\r
 \r
-Copyright (c) 2006 - 2009, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2017, 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
@@ -200,6 +200,7 @@ CoreLocateHandle (
     return Status;\r
   }\r
 \r
+  ASSERT (GetNext != NULL);\r
   //\r
   // Enumerate out the matching handles\r
   //\r
@@ -246,6 +247,7 @@ CoreLocateHandle (
       // 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
@@ -404,18 +406,19 @@ CoreGetNextLocateByProtocol (
 \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
@@ -434,6 +437,7 @@ CoreLocateDevicePath (
   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
@@ -445,11 +449,8 @@ CoreLocateDevicePath (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (Device == NULL) {\r
-    return  EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  *Device = NULL;\r
+  Handles = NULL;\r
+  BestDevice = NULL;\r
   SourcePath = *DevicePath;\r
   TmpDevicePath = SourcePath;\r
   while (!IsDevicePathEnd (TmpDevicePath)) {\r
@@ -465,14 +466,6 @@ CoreLocateDevicePath (
 \r
   SourceSize = (UINTN) TmpDevicePath - (UINTN) SourcePath;\r
 \r
-  //\r
-  // The source path can only have 1 instance\r
-  //\r
-  if (IsDevicePathMultiInstance (SourcePath)) {\r
-    DEBUG((DEBUG_ERROR, "LocateDevicePath: Device path has too many instances\n"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
   //\r
   // Get a list of all handles that support the requested protocol\r
   //\r
@@ -496,7 +489,8 @@ CoreLocateDevicePath (
     // Check if DevicePath is first part of SourcePath\r
     //\r
     Size = GetDevicePathSize (TmpDevicePath) - sizeof(EFI_DEVICE_PATH_PROTOCOL);\r
-    if ((Size <= SourceSize) && CompareMem (SourcePath, TmpDevicePath, Size) == 0) {\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 duplicate device path for 2 different device\r
@@ -509,7 +503,7 @@ CoreLocateDevicePath (
       //\r
       if (Size > BestMatch) {\r
         BestMatch = Size;\r
-        *Device = Handle;\r
+        BestDevice = Handle;\r
       }\r
     }\r
   }\r
@@ -524,6 +518,11 @@ CoreLocateDevicePath (
     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
@@ -561,14 +560,10 @@ CoreLocateProtocol (
   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
@@ -582,7 +577,10 @@ CoreLocateProtocol (
   //\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
@@ -638,7 +636,7 @@ Done:
   @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