Remove logic to repair image handles

Fix bug when new image handles are generated by Platform Driver Override or Bus Specific Driver Override


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4374 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
mdkinney 2007-12-10 00:43:22 +00:00
parent f58f873c3b
commit 70279390ba
1 changed files with 17 additions and 114 deletions

View File

@ -23,8 +23,6 @@ Revision History
#include <DxeMain.h>
BOOLEAN mRepairLoadedImage = FALSE;
//
// Driver Support Function Prototypes
//
@ -80,11 +78,6 @@ Returns:
EFI_HANDLE *ChildHandleBuffer;
UINTN ChildHandleCount;
UINTN Index;
EFI_HANDLE *LoadedImageHandleBuffer;
UINTN LoadedImageHandleCount;
LOADED_IMAGE_PRIVATE_DATA *Image;
EFI_HANDLE DeviceHandle;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
//
// Make sure ControllerHandle is valid
@ -207,66 +200,6 @@ Returns:
CoreFreePool (ChildHandleBuffer);
}
//
// If a Stop() function has been called one or more time successfully, then attempt to
// repair the stale DeviceHandle fields of the Loaded Image Protocols
//
if (mRepairLoadedImage) {
//
// Assume that all Loaded Image Protocols can be repaired
//
mRepairLoadedImage = FALSE;
//
// Get list of all Loaded Image Protocol Instances
//
Status = CoreLocateHandleBuffer (
ByProtocol,
&gEfiLoadedImageProtocolGuid,
NULL,
&LoadedImageHandleCount,
&LoadedImageHandleBuffer
);
if (!EFI_ERROR (Status) && LoadedImageHandleCount != 0) {
for (Index = 0; Index < LoadedImageHandleCount; Index++) {
//
// Retrieve the Loaded Image Protocol
//
Image = CoreLoadedImageInfo (LoadedImageHandleBuffer[Index]);
if (Image != NULL) {
//
// Check to see if the DeviceHandle field is a valid handle
//
Status = CoreValidateHandle (Image->Info.DeviceHandle);
if (EFI_ERROR (Status)) {
//
// The DeviceHandle field is not valid.
// Attempt to locate a device handle with a device path that matches the one
// that was used to originally load the image
//
DevicePath = Image->DeviceHandleDevicePath;
if (DevicePath != NULL) {
Status = CoreLocateDevicePath (&gEfiDevicePathProtocolGuid, &DevicePath, &DeviceHandle);
if (!EFI_ERROR (Status) && (DeviceHandle != NULL_HANDLE) && IsDevicePathEnd(DevicePath)) {
//
// A device handle with a matching device path was found, so update the Loaded Image Protocol
// with the device handle discovered
//
Image->Info.DeviceHandle = DeviceHandle;
} else {
//
// There is still at least one Loaded Image Protocol that requires repair
//
mRepairLoadedImage = TRUE;
}
}
}
}
}
CoreFreePool (LoadedImageHandleBuffer);
}
}
return ReturnStatus;
}
@ -298,6 +231,8 @@ Arguments:
DriverBindingHandleBuffer - The buffer of driver binding protocol to be modified.
IsImageHandle - Indicate whether DriverBindingHandle is an image handle
Returns:
None.
@ -333,6 +268,10 @@ Returns:
&gEfiDriverBindingProtocolGuid,
(VOID **)&DriverBinding
);
if (EFI_ERROR (Status) || DriverBinding == NULL) {
continue;
}
//
// If the ImageHandle associated with DriverBinding matches DriverBindingHandle,
// then add the DriverBindingProtocol[Index] to the sorted list
@ -427,6 +366,8 @@ Returns:
EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;
UINTN DriverBindingHandleCount;
EFI_HANDLE *DriverBindingHandleBuffer;
UINTN NewDriverBindingHandleCount;
EFI_HANDLE *NewDriverBindingHandleBuffer;
EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;
UINTN NumberOfSortedDriverBindingProtocols;
EFI_DRIVER_BINDING_PROTOCOL **SortedDriverBindingProtocols;
@ -564,7 +505,15 @@ Returns:
// If the number of Driver Binding Protocols has increased since this function started, then return
// EFI_NOT_READY, so it will be restarted
//
if (NumberOfSortedDriverBindingProtocols > DriverBindingHandleCount) {
Status = CoreLocateHandleBuffer (
ByProtocol,
&gEfiDriverBindingProtocolGuid,
NULL,
&NewDriverBindingHandleCount,
&NewDriverBindingHandleBuffer
);
CoreFreePool (NewDriverBindingHandleBuffer);
if (NewDriverBindingHandleCount > DriverBindingHandleCount) {
//
// Free any buffers that were allocated with AllocatePool()
//
@ -720,9 +669,6 @@ Returns:
OPEN_PROTOCOL_DATA *OpenData;
PROTOCOL_INTERFACE *Prot;
EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;
EFI_HANDLE *LoadedImageHandleBuffer;
UINTN LoadedImageHandleCount;
LOADED_IMAGE_PRIVATE_DATA *Image;
//
// Make sure ControllerHandle is valid
@ -924,49 +870,6 @@ Returns:
}
if (StopCount > 0) {
//
// If the Loaded Image Protocols do not already need to be repaired, then
// check the status of the DeviceHandle field of all Loaded Image Protocols
// to determine if any of them now need repair because a sucessful Stop()
// may have destroyed the DeviceHandle value in the Loaded Image Protocol
//
if (!mRepairLoadedImage) {
//
// Get list of all Loaded Image Protocol Instances
//
Status = CoreLocateHandleBuffer (
ByProtocol,
&gEfiLoadedImageProtocolGuid,
NULL,
&LoadedImageHandleCount,
&LoadedImageHandleBuffer
);
if (!EFI_ERROR (Status) && LoadedImageHandleCount != 0) {
for (Index = 0; Index < LoadedImageHandleCount; Index++) {
//
// Retrieve the Loaded Image Protocol
//
Image = CoreLoadedImageInfo (LoadedImageHandleBuffer[Index]);
if (Image != NULL) {
//
// Check to see if the DeviceHandle field is a valid handle
//
Status = CoreValidateHandle (Image->Info.DeviceHandle);
if (EFI_ERROR (Status)) {
//
// The DeviceHandle field is not longer a valid handle. This means
// that future calls to ConnectController() need to attemp to repair
// the Loaded Image Protocols with invalid DeviceHandle fields. Set
// the flag used by ConnectController().
//
mRepairLoadedImage = TRUE;
break;
}
}
}
CoreFreePool (LoadedImageHandleBuffer);
}
}
Status = EFI_SUCCESS;
} else {
Status = EFI_NOT_FOUND;