]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Hand/DriverSupport.c
Update DxeCore for the performance infrastructure updates: Use Raw sting to replace...
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Hand / DriverSupport.c
index 29b457297f1467146078344d47e6fa8247cd8b67..71676d0ef7fa250023d8f8f7db54af2431bae229 100644 (file)
@@ -1,44 +1,43 @@
-/*++\r
+/** @file\r
+  Support functions to connect/disconnect UEFI Driver model Protocol\r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \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 - 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
-Module Name:\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
 \r
-    DriverSupport.c\r
-    \r
-Abstract:\r
+**/\r
 \r
-    EFI Driver Support Protocol\r
+#include "DxeMain.h"\r
+#include "Handle.h"\r
 \r
-Revision History\r
-\r
---*/\r
-\r
-#include <DxeMain.h>\r
-\r
-BOOLEAN mRepairLoadedImage = FALSE;\r
-\r
-//\r
-// Driver Support Function Prototypes\r
-//\r
-EFI_STATUS \r
-CoreConnectSingleController (\r
-  IN  EFI_HANDLE                ControllerHandle,\r
-  IN  EFI_HANDLE                *DriverImageHandle    OPTIONAL,\r
-  IN  EFI_DEVICE_PATH_PROTOCOL  *RemainingDevicePath  OPTIONAL\r
-  );\r
 \r
 //\r
 // Driver Support Functions\r
 //\r
-EFI_STATUS \r
+/**\r
+  Connects one or more drivers to a controller.\r
+\r
+  @param  ControllerHandle                      Handle of the controller to be\r
+                                                connected.\r
+  @param  DriverImageHandle                     DriverImageHandle A pointer to an\r
+                                                ordered list of driver image\r
+                                                handles.\r
+  @param  RemainingDevicePath                   RemainingDevicePath A pointer to\r
+                                                the device path that specifies a\r
+                                                child of the controller specified\r
+                                                by ControllerHandle.\r
+  @param  Recursive                             Whether the function would be\r
+                                                called recursively or not.\r
+\r
+  @return Status code.\r
+\r
+**/\r
+EFI_STATUS\r
 EFIAPI\r
 CoreConnectController (\r
   IN  EFI_HANDLE                ControllerHandle,\r
@@ -46,28 +45,6 @@ CoreConnectController (
   IN  EFI_DEVICE_PATH_PROTOCOL  *RemainingDevicePath  OPTIONAL,\r
   IN  BOOLEAN                   Recursive\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Connects one or more drivers to a controller.\r
-\r
-Arguments:\r
-\r
-  ControllerHandle            - Handle of the controller to be connected.\r
-\r
-  DriverImageHandle           - DriverImageHandle A pointer to an ordered list of driver image handles.\r
-\r
-  RemainingDevicePath         - RemainingDevicePath A pointer to the device path that specifies a child of the\r
-                                controller specified by ControllerHandle.\r
-    \r
-  Recursive                   - Whether the function would be called recursively or not.\r
-\r
-Returns:\r
-\r
-  Status code.\r
-\r
---*/\r
 {\r
   EFI_STATUS                           Status;\r
   EFI_STATUS                           ReturnStatus;\r
@@ -80,12 +57,7 @@ Returns:
   EFI_HANDLE                           *ChildHandleBuffer;\r
   UINTN                                ChildHandleCount;\r
   UINTN                                Index;\r
-  EFI_HANDLE                           *LoadedImageHandleBuffer;\r
-  UINTN                                LoadedImageHandleCount;\r
-  LOADED_IMAGE_PRIVATE_DATA            *Image;\r
-  EFI_HANDLE                           DeviceHandle;\r
-  EFI_DEVICE_PATH_PROTOCOL             *DevicePath;\r
-  \r
+\r
   //\r
   // Make sure ControllerHandle is valid\r
   //\r
@@ -101,7 +73,11 @@ Returns:
   //\r
   AlignedRemainingDevicePath = NULL;\r
   if (RemainingDevicePath != NULL) {\r
-    AlignedRemainingDevicePath = CoreDuplicateDevicePath (RemainingDevicePath);\r
+    AlignedRemainingDevicePath = DuplicateDevicePath (RemainingDevicePath);\r
+\r
+    if (AlignedRemainingDevicePath == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
   }\r
 \r
   //\r
@@ -112,10 +88,10 @@ Returns:
   //\r
   do {\r
     ReturnStatus = CoreConnectSingleController (\r
-                    ControllerHandle,\r
-                    DriverImageHandle,\r
-                    AlignedRemainingDevicePath\r
-                    );\r
+                     ControllerHandle,\r
+                     DriverImageHandle,\r
+                     AlignedRemainingDevicePath\r
+                     );\r
   } while (ReturnStatus == EFI_NOT_READY);\r
 \r
   //\r
@@ -153,8 +129,8 @@ Returns:
     //\r
     for (Link = Handle->Protocols.ForwardLink, ChildHandleCount = 0; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
       Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
-      for (ProtLink = Prot->OpenList.ForwardLink; \r
-          ProtLink != &Prot->OpenList; \r
+      for (ProtLink = Prot->OpenList.ForwardLink;\r
+          ProtLink != &Prot->OpenList;\r
           ProtLink = ProtLink->ForwardLink) {\r
         OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
         if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
@@ -166,15 +142,19 @@ Returns:
     //\r
     // Allocate a handle buffer for ControllerHandle's children\r
     //\r
-    ChildHandleBuffer = CoreAllocateBootServicesPool (ChildHandleCount * sizeof(EFI_HANDLE));\r
+    ChildHandleBuffer = AllocatePool (ChildHandleCount * sizeof(EFI_HANDLE));\r
+    if (ChildHandleBuffer == NULL) {\r
+      CoreReleaseProtocolLock ();\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
 \r
     //\r
     // Fill in a handle buffer with ControllerHandle's children\r
     //\r
     for (Link = Handle->Protocols.ForwardLink, ChildHandleCount = 0; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
       Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
-      for (ProtLink = Prot->OpenList.ForwardLink; \r
-          ProtLink != &Prot->OpenList; \r
+      for (ProtLink = Prot->OpenList.ForwardLink;\r
+          ProtLink != &Prot->OpenList;\r
           ProtLink = ProtLink->ForwardLink) {\r
         OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
         if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
@@ -198,7 +178,7 @@ Returns:
         NULL,\r
         NULL,\r
         TRUE\r
-        ); \r
+        );\r
     }\r
 \r
     //\r
@@ -207,102 +187,38 @@ Returns:
     CoreFreePool (ChildHandleBuffer);\r
   }\r
 \r
-  //\r
-  // If a Stop() function has been called one or more time successfully, then attempt to \r
-  // repair the stale DeviceHandle fields of the Loaded Image Protocols\r
-  //\r
-  if (mRepairLoadedImage) {\r
-    //\r
-    // Assume that all Loaded Image Protocols can be repaired\r
-    //\r
-    mRepairLoadedImage = FALSE;\r
-\r
-    //\r
-    // Get list of all Loaded Image Protocol Instances\r
-    //\r
-    Status = CoreLocateHandleBuffer (\r
-              ByProtocol,   \r
-              &gEfiLoadedImageProtocolGuid,  \r
-              NULL,\r
-              &LoadedImageHandleCount, \r
-              &LoadedImageHandleBuffer\r
-              );\r
-    if (!EFI_ERROR (Status) && LoadedImageHandleCount != 0) {\r
-      for (Index = 0; Index < LoadedImageHandleCount; Index++) {\r
-        //\r
-        // Retrieve the Loaded Image Protocol\r
-        //\r
-        Image = CoreLoadedImageInfo (LoadedImageHandleBuffer[Index]);\r
-        if (Image != NULL) {\r
-          //\r
-          // Check to see if the DeviceHandle field is a valid handle\r
-          //\r
-          Status = CoreValidateHandle (Image->Info.DeviceHandle);\r
-          if (EFI_ERROR (Status)) {\r
-            //\r
-            // The DeviceHandle field is not valid.\r
-            // Attempt to locate a device handle with a device path that matches the one\r
-            // that was used to originally load the image\r
-            //\r
-            DevicePath = Image->DeviceHandleDevicePath;\r
-            if (DevicePath != NULL) {\r
-              Status = CoreLocateDevicePath (&gEfiDevicePathProtocolGuid, &DevicePath, &DeviceHandle);\r
-              if (!EFI_ERROR (Status) && (DeviceHandle != NULL_HANDLE) && IsDevicePathEnd(DevicePath)) {\r
-                //\r
-                // A device handle with a matching device path was found, so update the Loaded Image Protocol\r
-                // with the device handle discovered\r
-                //\r
-                Image->Info.DeviceHandle = DeviceHandle;\r
-              } else {\r
-                //\r
-                // There is still at least one Loaded Image Protocol that requires repair\r
-                //\r
-                mRepairLoadedImage = TRUE;\r
-              }\r
-            }\r
-          }\r
-        }\r
-      }\r
-      CoreFreePool (LoadedImageHandleBuffer);\r
-    }\r
-  }\r
-\r
   return ReturnStatus;\r
 }\r
 \r
+\r
+/**\r
+  Add Driver Binding Protocols from Context Driver Image Handles to sorted\r
+  Driver Binding Protocol list.\r
+\r
+  @param  DriverBindingHandle                   Handle of the driver binding\r
+                                                protocol.\r
+  @param  NumberOfSortedDriverBindingProtocols  Number Of sorted driver binding\r
+                                                protocols\r
+  @param  SortedDriverBindingProtocols          The sorted protocol list.\r
+  @param  DriverBindingHandleCount              Driver Binding Handle Count.\r
+  @param  DriverBindingHandleBuffer             The buffer of driver binding\r
+                                                protocol to be modified.\r
+  @param  IsImageHandle                         Indicate whether\r
+                                                DriverBindingHandle is an image\r
+                                                handle\r
+\r
+  @return None.\r
+\r
+**/\r
 VOID\r
 AddSortedDriverBindingProtocol (\r
   IN      EFI_HANDLE                   DriverBindingHandle,\r
-  IN OUT  UINTN                        *NumberOfSortedDriverBindingProtocols, \r
+  IN OUT  UINTN                        *NumberOfSortedDriverBindingProtocols,\r
   IN OUT  EFI_DRIVER_BINDING_PROTOCOL  **SortedDriverBindingProtocols,\r
   IN      UINTN                        DriverBindingHandleCount,\r
   IN OUT  EFI_HANDLE                   *DriverBindingHandleBuffer,\r
   IN      BOOLEAN                      IsImageHandle\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Add Driver Binding Protocols from Context Driver Image Handles to sorted \r
-   Driver Binding Protocol list.\r
-\r
-Arguments:\r
-\r
-  DriverBindingHandle - Handle of the driver binding protocol.\r
-\r
-  NumberOfSortedDriverBindingProtocols - Number Of sorted driver binding protocols\r
-\r
-  SortedDriverBindingProtocols - The sorted protocol list.                        \r
-    \r
-  DriverBindingHandleCount - Driver Binding Handle Count.\r
-\r
-  DriverBindingHandleBuffer - The buffer of driver binding protocol to be modified.\r
-\r
-Returns:\r
-\r
-  None.\r
-\r
---*/\r
 {\r
   EFI_STATUS                   Status;\r
   EFI_DRIVER_BINDING_PROTOCOL  *DriverBinding;\r
@@ -331,8 +247,12 @@ Returns:
       Status = CoreHandleProtocol (\r
                 DriverBindingHandleBuffer[Index],\r
                 &gEfiDriverBindingProtocolGuid,\r
-                (VOID **)&DriverBinding\r
+                (VOID **) &DriverBinding\r
                 );\r
+      if (EFI_ERROR (Status) || DriverBinding == NULL) {\r
+        continue;\r
+      }\r
+\r
       //\r
       // If the ImageHandle associated with DriverBinding matches DriverBindingHandle,\r
       // then add the DriverBindingProtocol[Index] to the sorted list\r
@@ -340,7 +260,7 @@ Returns:
       if (DriverBinding->ImageHandle == DriverBindingHandle) {\r
         AddSortedDriverBindingProtocol (\r
           DriverBindingHandleBuffer[Index],\r
-          NumberOfSortedDriverBindingProtocols, \r
+          NumberOfSortedDriverBindingProtocols,\r
           SortedDriverBindingProtocols,\r
           DriverBindingHandleCount,\r
           DriverBindingHandleBuffer,\r
@@ -357,7 +277,7 @@ Returns:
   Status = CoreHandleProtocol(\r
              DriverBindingHandle,\r
              &gEfiDriverBindingProtocolGuid,\r
-             (VOID **)&DriverBinding\r
+             (VOID **) &DriverBinding\r
              );\r
   //\r
   // If DriverBindingHandle does not support the Driver Binding Protocol then return\r
@@ -392,33 +312,35 @@ Returns:
     }\r
   }\r
 }\r
\r
-EFI_STATUS \r
-CoreConnectSingleController (\r
-  IN  EFI_HANDLE                ControllerHandle,\r
-  IN  EFI_HANDLE                *ContextDriverImageHandles OPTIONAL,\r
-  IN  EFI_DEVICE_PATH_PROTOCOL  *RemainingDevicePath       OPTIONAL     \r
-  )\r
-/*++\r
 \r
-Routine Description:\r
 \r
+/**\r
   Connects a controller to a driver.\r
 \r
-Arguments:\r
-\r
-  ControllerHandle            - Handle of the controller to be connected.\r
-  ContextDriverImageHandles   - DriverImageHandle A pointer to an ordered list of driver image handles.\r
-  RemainingDevicePath         - RemainingDevicePath A pointer to the device path that specifies a child \r
-                                of the controller specified by ControllerHandle.\r
-    \r
-Returns:\r
-\r
-  EFI_SUCCESS           - One or more drivers were connected to ControllerHandle.\r
-  EFI_OUT_OF_RESOURCES  - No enough system resources to complete the request.\r
-  EFI_NOT_FOUND         - No drivers were connected to ControllerHandle.\r
-\r
---*/\r
+  @param  ControllerHandle                      Handle of the controller to be\r
+                                                connected.\r
+  @param  ContextDriverImageHandles             DriverImageHandle A pointer to an\r
+                                                ordered list of driver image\r
+                                                handles.\r
+  @param  RemainingDevicePath                   RemainingDevicePath A pointer to\r
+                                                the device path that specifies a\r
+                                                child  of the controller\r
+                                                specified by ControllerHandle.\r
+\r
+  @retval EFI_SUCCESS                           One or more drivers were\r
+                                                connected to ControllerHandle.\r
+  @retval EFI_OUT_OF_RESOURCES                  No enough system resources to\r
+                                                complete the request.\r
+  @retval EFI_NOT_FOUND                         No drivers were connected to\r
+                                                ControllerHandle.\r
+\r
+**/\r
+EFI_STATUS\r
+CoreConnectSingleController (\r
+  IN  EFI_HANDLE                ControllerHandle,\r
+  IN  EFI_HANDLE                *ContextDriverImageHandles OPTIONAL,\r
+  IN  EFI_DEVICE_PATH_PROTOCOL  *RemainingDevicePath       OPTIONAL\r
+  )\r
 {\r
   EFI_STATUS                                 Status;\r
   UINTN                                      Index;\r
@@ -427,6 +349,8 @@ Returns:
   EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL  *BusSpecificDriverOverride;\r
   UINTN                                      DriverBindingHandleCount;\r
   EFI_HANDLE                                 *DriverBindingHandleBuffer;\r
+  UINTN                                      NewDriverBindingHandleCount;\r
+  EFI_HANDLE                                 *NewDriverBindingHandleBuffer;\r
   EFI_DRIVER_BINDING_PROTOCOL                *DriverBinding;\r
   UINTN                                      NumberOfSortedDriverBindingProtocols;\r
   EFI_DRIVER_BINDING_PROTOCOL                **SortedDriverBindingProtocols;\r
@@ -448,10 +372,10 @@ Returns:
   // Get list of all Driver Binding Protocol Instances\r
   //\r
   Status = CoreLocateHandleBuffer (\r
-             ByProtocol,   \r
-             &gEfiDriverBindingProtocolGuid,  \r
+             ByProtocol,\r
+             &gEfiDriverBindingProtocolGuid,\r
              NULL,\r
-             &DriverBindingHandleCount, \r
+             &DriverBindingHandleCount,\r
              &DriverBindingHandleBuffer\r
              );\r
   if (EFI_ERROR (Status) || (DriverBindingHandleCount == 0)) {\r
@@ -461,7 +385,7 @@ Returns:
   //\r
   // Allocate a duplicate array for the sorted Driver Binding Protocol Instances\r
   //\r
-  SortedDriverBindingProtocols = CoreAllocateBootServicesPool (sizeof (VOID *) * DriverBindingHandleCount);\r
+  SortedDriverBindingProtocols = AllocatePool (sizeof (VOID *) * DriverBindingHandleCount);\r
   if (SortedDriverBindingProtocols == NULL) {\r
     CoreFreePool (DriverBindingHandleBuffer);\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -474,7 +398,7 @@ Returns:
     for (Index = 0; ContextDriverImageHandles[Index] != NULL; Index++) {\r
       AddSortedDriverBindingProtocol (\r
         ContextDriverImageHandles[Index],\r
-        &NumberOfSortedDriverBindingProtocols, \r
+        &NumberOfSortedDriverBindingProtocols,\r
         SortedDriverBindingProtocols,\r
         DriverBindingHandleCount,\r
         DriverBindingHandleBuffer,\r
@@ -487,9 +411,9 @@ Returns:
   // Add the Platform Driver Override Protocol drivers for ControllerHandle next\r
   //\r
   Status = CoreLocateProtocol (\r
-             &gEfiPlatformDriverOverrideProtocolGuid, \r
-             NULL, \r
-             (VOID **)&PlatformDriverOverride\r
+             &gEfiPlatformDriverOverrideProtocolGuid,\r
+             NULL,\r
+             (VOID **) &PlatformDriverOverride\r
              );\r
   if (!EFI_ERROR (Status) && (PlatformDriverOverride != NULL)) {\r
     DriverImageHandle = NULL;\r
@@ -502,7 +426,7 @@ Returns:
       if (!EFI_ERROR (Status)) {\r
         AddSortedDriverBindingProtocol (\r
           DriverImageHandle,\r
-          &NumberOfSortedDriverBindingProtocols, \r
+          &NumberOfSortedDriverBindingProtocols,\r
           SortedDriverBindingProtocols,\r
           DriverBindingHandleCount,\r
           DriverBindingHandleBuffer,\r
@@ -516,9 +440,9 @@ Returns:
   // Get the Bus Specific Driver Override Protocol instance on the Controller Handle\r
   //\r
   Status = CoreHandleProtocol (\r
-             ControllerHandle,  \r
-             &gEfiBusSpecificDriverOverrideProtocolGuid, \r
-             (VOID **)&BusSpecificDriverOverride\r
+             ControllerHandle,\r
+             &gEfiBusSpecificDriverOverrideProtocolGuid,\r
+             (VOID **) &BusSpecificDriverOverride\r
              );\r
   if (!EFI_ERROR (Status) && (BusSpecificDriverOverride != NULL)) {\r
     DriverImageHandle = NULL;\r
@@ -530,7 +454,7 @@ Returns:
       if (!EFI_ERROR (Status)) {\r
         AddSortedDriverBindingProtocol (\r
           DriverImageHandle,\r
-          &NumberOfSortedDriverBindingProtocols, \r
+          &NumberOfSortedDriverBindingProtocols,\r
           SortedDriverBindingProtocols,\r
           DriverBindingHandleCount,\r
           DriverBindingHandleBuffer,\r
@@ -547,7 +471,7 @@ Returns:
   for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
     AddSortedDriverBindingProtocol (\r
       DriverBindingHandleBuffer[Index],\r
-      &NumberOfSortedDriverBindingProtocols, \r
+      &NumberOfSortedDriverBindingProtocols,\r
       SortedDriverBindingProtocols,\r
       DriverBindingHandleCount,\r
       DriverBindingHandleBuffer,\r
@@ -564,7 +488,15 @@ Returns:
   // If the number of Driver Binding Protocols has increased since this function started, then return\r
   // EFI_NOT_READY, so it will be restarted\r
   //\r
-  if (NumberOfSortedDriverBindingProtocols > DriverBindingHandleCount) {\r
+  Status = CoreLocateHandleBuffer (\r
+             ByProtocol,\r
+             &gEfiDriverBindingProtocolGuid,\r
+             NULL,\r
+             &NewDriverBindingHandleCount,\r
+             &NewDriverBindingHandleBuffer\r
+             );\r
+  CoreFreePool (NewDriverBindingHandleBuffer);\r
+  if (NewDriverBindingHandleCount > DriverBindingHandleCount) {\r
     //\r
     // Free any buffers that were allocated with AllocatePool()\r
     //\r
@@ -601,7 +533,7 @@ Returns:
 \r
     //\r
     // Loop through the sorted Driver Binding Protocol Instances in order, and see if\r
-    // any of the Driver Binding Protocols support the controller specified by \r
+    // any of the Driver Binding Protocols support the controller specified by\r
     // ControllerHandle.\r
     //\r
     DriverBinding = NULL;\r
@@ -609,11 +541,13 @@ Returns:
     for (Index = 0; (Index < NumberOfSortedDriverBindingProtocols) && !DriverFound; Index++) {\r
       if (SortedDriverBindingProtocols[Index] != NULL) {\r
         DriverBinding = SortedDriverBindingProtocols[Index];\r
+        PERF_START (DriverBinding->DriverBindingHandle, "DB:Support:", NULL, 0);\r
         Status = DriverBinding->Supported(\r
-                                  DriverBinding, \r
+                                  DriverBinding,\r
                                   ControllerHandle,\r
                                   RemainingDevicePath\r
                                   );\r
+        PERF_END (DriverBinding->DriverBindingHandle, "DB:Support:", NULL, 0);\r
         if (!EFI_ERROR (Status)) {\r
           SortedDriverBindingProtocols[Index] = NULL;\r
           DriverFound = TRUE;\r
@@ -622,13 +556,13 @@ Returns:
           // A driver was found that supports ControllerHandle, so attempt to start the driver\r
           // on ControllerHandle.\r
           //\r
-          PERF_START (DriverBinding->DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
+          PERF_START (DriverBinding->DriverBindingHandle, "DB:Start:", NULL, 0);\r
           Status = DriverBinding->Start (\r
-                                    DriverBinding, \r
+                                    DriverBinding,\r
                                     ControllerHandle,\r
                                     RemainingDevicePath\r
                                     );\r
-          PERF_END (DriverBinding->DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
+          PERF_END (DriverBinding->DriverBindingHandle, "DB:Start:", NULL, 0);\r
 \r
           if (!EFI_ERROR (Status)) {\r
             //\r
@@ -651,7 +585,7 @@ Returns:
   //\r
   if (OneStarted) {\r
     return EFI_SUCCESS;\r
-  } \r
+  }\r
 \r
   //\r
   // If no drivers started and RemainingDevicePath is an End Device Path Node, then return EFI_SUCCESS\r
@@ -660,7 +594,7 @@ Returns:
     if (IsDevicePathEnd (RemainingDevicePath)) {\r
       return EFI_SUCCESS;\r
     }\r
-  } \r
+  }\r
 \r
   //\r
   // Otherwise, no drivers were started on ControllerHandle, so return EFI_NOT_FOUND\r
@@ -669,38 +603,47 @@ Returns:
 }\r
 \r
 \r
-EFI_STATUS \r
+\r
+/**\r
+  Disonnects a controller from a driver\r
+\r
+  @param  ControllerHandle                      ControllerHandle The handle of\r
+                                                the controller from which\r
+                                                driver(s)  are to be\r
+                                                disconnected.\r
+  @param  DriverImageHandle                     DriverImageHandle The driver to\r
+                                                disconnect from ControllerHandle.\r
+  @param  ChildHandle                           ChildHandle The handle of the\r
+                                                child to destroy.\r
+\r
+  @retval EFI_SUCCESS                           One or more drivers were\r
+                                                disconnected from the controller.\r
+  @retval EFI_SUCCESS                           On entry, no drivers are managing\r
+                                                ControllerHandle.\r
+  @retval EFI_SUCCESS                           DriverImageHandle is not NULL,\r
+                                                and on entry DriverImageHandle is\r
+                                                not managing ControllerHandle.\r
+  @retval EFI_INVALID_PARAMETER                 ControllerHandle is not a valid\r
+                                                EFI_HANDLE.\r
+  @retval EFI_INVALID_PARAMETER                 DriverImageHandle is not NULL,\r
+                                                and it is not a valid EFI_HANDLE.\r
+  @retval EFI_INVALID_PARAMETER                 ChildHandle is not NULL, and it\r
+                                                is not a valid EFI_HANDLE.\r
+  @retval EFI_OUT_OF_RESOURCES                  There are not enough resources\r
+                                                available to disconnect any\r
+                                                drivers from ControllerHandle.\r
+  @retval EFI_DEVICE_ERROR                      The controller could not be\r
+                                                disconnected because of a device\r
+                                                error.\r
+\r
+**/\r
+EFI_STATUS\r
 EFIAPI\r
 CoreDisconnectController (\r
   IN  EFI_HANDLE  ControllerHandle,\r
   IN  EFI_HANDLE  DriverImageHandle  OPTIONAL,\r
   IN  EFI_HANDLE  ChildHandle        OPTIONAL\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Disonnects a controller from a driver\r
-\r
-Arguments:\r
-\r
-  ControllerHandle  - ControllerHandle The handle of the controller from which driver(s) \r
-                        are to be disconnected.\r
-  DriverImageHandle - DriverImageHandle The driver to disconnect from ControllerHandle.\r
-  ChildHandle       - ChildHandle The handle of the child to destroy.\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS           -  One or more drivers were disconnected from the controller.\r
-  EFI_SUCCESS           -  On entry, no drivers are managing ControllerHandle.\r
-  EFI_SUCCESS           -  DriverImageHandle is not NULL, and on entry DriverImageHandle is not managing ControllerHandle.\r
-  EFI_INVALID_PARAMETER -  ControllerHandle is not a valid EFI_HANDLE.\r
-  EFI_INVALID_PARAMETER -  DriverImageHandle is not NULL, and it is not a valid EFI_HANDLE.\r
-  EFI_INVALID_PARAMETER -  ChildHandle is not NULL, and it is not a valid EFI_HANDLE.\r
-  EFI_OUT_OF_RESOURCES  -  There are not enough resources available to disconnect any drivers from ControllerHandle.\r
-  EFI_DEVICE_ERROR      -  The controller could not be disconnected because of a device error.\r
-\r
---*/\r
 {\r
   EFI_STATUS                          Status;\r
   IHANDLE                             *Handle;\r
@@ -720,9 +663,6 @@ Returns:
   OPEN_PROTOCOL_DATA                  *OpenData;\r
   PROTOCOL_INTERFACE                  *Prot;\r
   EFI_DRIVER_BINDING_PROTOCOL         *DriverBinding;\r
-  EFI_HANDLE                          *LoadedImageHandleBuffer;\r
-  UINTN                               LoadedImageHandleCount;\r
-  LOADED_IMAGE_PRIVATE_DATA           *Image;\r
 \r
   //\r
   // Make sure ControllerHandle is valid\r
@@ -748,8 +688,8 @@ Returns:
   // Get list of drivers that are currently managing ControllerHandle\r
   //\r
   DriverImageHandleBuffer = NULL;\r
-  DriverImageHandleCount  = 1;  \r
-  \r
+  DriverImageHandleCount  = 1;\r
+\r
   if (DriverImageHandle == NULL) {\r
     //\r
     // Look at each protocol interface for a match\r
@@ -759,8 +699,8 @@ Returns:
     CoreAcquireProtocolLock ();\r
     for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
       Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
-      for (ProtLink = Prot->OpenList.ForwardLink; \r
-           ProtLink != &Prot->OpenList; \r
+      for (ProtLink = Prot->OpenList.ForwardLink;\r
+           ProtLink != &Prot->OpenList;\r
            ProtLink = ProtLink->ForwardLink) {\r
         OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
         if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
@@ -769,7 +709,7 @@ Returns:
       }\r
     }\r
     CoreReleaseProtocolLock ();\r
-    \r
+\r
     //\r
     // If there are no drivers managing this controller, then return EFI_SUCCESS\r
     //\r
@@ -778,7 +718,7 @@ Returns:
       goto Done;\r
     }\r
 \r
-    DriverImageHandleBuffer = CoreAllocateBootServicesPool (sizeof (EFI_HANDLE) * DriverImageHandleCount);\r
+    DriverImageHandleBuffer = AllocatePool (sizeof (EFI_HANDLE) * DriverImageHandleCount);\r
     if (DriverImageHandleBuffer == NULL) {\r
       Status = EFI_OUT_OF_RESOURCES;\r
       goto Done;\r
@@ -789,8 +729,8 @@ Returns:
     CoreAcquireProtocolLock ();\r
     for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
       Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
-      for (ProtLink = Prot->OpenList.ForwardLink; \r
-           ProtLink != &Prot->OpenList; \r
+      for (ProtLink = Prot->OpenList.ForwardLink;\r
+           ProtLink != &Prot->OpenList;\r
            ProtLink = ProtLink->ForwardLink) {\r
         OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
         if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
@@ -822,8 +762,8 @@ Returns:
     // Get the Driver Binding Protocol of the driver that is managing this controller\r
     //\r
     Status = CoreHandleProtocol (\r
-               DriverImageHandle,  \r
-               &gEfiDriverBindingProtocolGuid,   \r
+               DriverImageHandle,\r
+               &gEfiDriverBindingProtocolGuid,\r
                (VOID **)&DriverBinding\r
                );\r
     if (EFI_ERROR (Status)) {\r
@@ -840,14 +780,14 @@ Returns:
     CoreAcquireProtocolLock ();\r
     for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
       Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
-      for (ProtLink = Prot->OpenList.ForwardLink; \r
-           ProtLink != &Prot->OpenList; \r
+      for (ProtLink = Prot->OpenList.ForwardLink;\r
+           ProtLink != &Prot->OpenList;\r
            ProtLink = ProtLink->ForwardLink) {\r
         OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
         if (OpenData->AgentHandle == DriverImageHandle) {\r
           if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
             ChildBufferCount++;\r
-          } \r
+          }\r
           if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
             DriverImageHandleValid = TRUE;\r
           }\r
@@ -860,7 +800,7 @@ Returns:
       ChildHandleValid = FALSE;\r
       ChildBuffer = NULL;\r
       if (ChildBufferCount != 0) {\r
-        ChildBuffer = CoreAllocateBootServicesPool (sizeof (EFI_HANDLE) * ChildBufferCount);\r
+        ChildBuffer = AllocatePool (sizeof (EFI_HANDLE) * ChildBufferCount);\r
         if (ChildBuffer == NULL) {\r
           Status = EFI_OUT_OF_RESOURCES;\r
           goto Done;\r
@@ -871,8 +811,8 @@ Returns:
         CoreAcquireProtocolLock ();\r
         for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
           Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
-          for (ProtLink = Prot->OpenList.ForwardLink; \r
-               ProtLink != &Prot->OpenList; \r
+          for (ProtLink = Prot->OpenList.ForwardLink;\r
+               ProtLink != &Prot->OpenList;\r
                ProtLink = ProtLink->ForwardLink) {\r
             OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
             if ((OpenData->AgentHandle == DriverImageHandle) &&\r
@@ -924,55 +864,12 @@ Returns:
   }\r
 \r
   if (StopCount > 0) {\r
-    //\r
-    // If the Loaded Image Protocols do not already need to be repaired, then\r
-    // check the status of the DeviceHandle field of all Loaded Image Protocols\r
-    // to determine if any of them now need repair because a sucessful Stop()\r
-    // may have destroyed the DeviceHandle value in the Loaded Image Protocol\r
-    //\r
-    if (!mRepairLoadedImage) {\r
-      //\r
-      // Get list of all Loaded Image Protocol Instances\r
-      //\r
-      Status = CoreLocateHandleBuffer (\r
-                ByProtocol,   \r
-                &gEfiLoadedImageProtocolGuid,  \r
-                NULL,\r
-                &LoadedImageHandleCount, \r
-                &LoadedImageHandleBuffer\r
-                );\r
-      if (!EFI_ERROR (Status) && LoadedImageHandleCount != 0) {\r
-        for (Index = 0; Index < LoadedImageHandleCount; Index++) {\r
-          //\r
-          // Retrieve the Loaded Image Protocol\r
-          //\r
-          Image = CoreLoadedImageInfo (LoadedImageHandleBuffer[Index]);\r
-          if (Image != NULL) {\r
-            //\r
-            // Check to see if the DeviceHandle field is a valid handle\r
-            //\r
-            Status = CoreValidateHandle (Image->Info.DeviceHandle);\r
-            if (EFI_ERROR (Status)) {\r
-              //\r
-              // The DeviceHandle field is not longer a valid handle.  This means\r
-              // that future calls to ConnectController() need to attemp to repair\r
-              // the Loaded Image Protocols with invalid DeviceHandle fields.  Set \r
-              // the flag used by ConnectController().\r
-              //\r
-              mRepairLoadedImage = TRUE;\r
-              break;\r
-            }\r
-          }\r
-        }\r
-        CoreFreePool (LoadedImageHandleBuffer);\r
-      }\r
-    }\r
     Status = EFI_SUCCESS;\r
   } else {\r
     Status = EFI_NOT_FOUND;\r
   }\r
-  \r
-Done:  \r
+\r
+Done:\r
 \r
   if (DriverImageHandleBuffer != NULL) {\r
     CoreFreePool (DriverImageHandleBuffer);\r