diff options
author | Ruiyu Ni <ruiyu.ni@intel.com> | 2016-07-22 10:14:05 +0800 |
---|---|---|
committer | Ruiyu Ni <ruiyu.ni@intel.com> | 2016-07-25 10:20:14 +0800 |
commit | fc41b97f128a0c7f28a9cc250e629a0ad2262ac8 (patch) | |
tree | 486d7fccdaf9a27a9ef13299926a44d2e015a454 /ShellPkg | |
parent | 1b0319535bc751e27846cbf0c4a1eb4d7d690e97 (diff) | |
download | edk2-fc41b97f128a0c7f28a9cc250e629a0ad2262ac8.tar.gz edk2-fc41b97f128a0c7f28a9cc250e629a0ad2262ac8.tar.bz2 edk2-fc41b97f128a0c7f28a9cc250e629a0ad2262ac8.zip |
ShellPkg/LoadPciRom: Fix the ConnectAll() implementation
Old implementation depends on UefiHandleParsingLib and uses
incorrect Index to get handle type.
The simplest ConnectAll() implementation can be just to
locate all handles and call BS.ConnectController() for each
of them recursively. BS.ConnectController() does nothing
to the image handle. Such implementation is borrowed from
BDS core implementation.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Diffstat (limited to 'ShellPkg')
-rw-r--r-- | ShellPkg/Library/UefiShellDebug1CommandsLib/LoadPciRom.c | 91 |
1 files changed, 14 insertions, 77 deletions
diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/LoadPciRom.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/LoadPciRom.c index 1b284c2d87..c9078f7614 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/LoadPciRom.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/LoadPciRom.c @@ -26,7 +26,6 @@ @retval EFI_ABORTED The abort mechanism was received.
**/
EFI_STATUS
-EFIAPI
LoadPciRomConnectAllDriversToAllControllers (
VOID
);
@@ -377,98 +376,36 @@ LoadEfiDriversFromRomImage ( @retval EFI_ABORTED The abort mechanism was received.
**/
EFI_STATUS
-EFIAPI
LoadPciRomConnectAllDriversToAllControllers (
VOID
)
-
{
EFI_STATUS Status;
- UINTN AllHandleCount;
- EFI_HANDLE *AllHandleBuffer;
- UINTN Index;
UINTN HandleCount;
EFI_HANDLE *HandleBuffer;
- UINTN *HandleType;
- UINTN HandleIndex;
- BOOLEAN Parent;
- BOOLEAN Device;
-
- Status = gBS->LocateHandleBuffer(
- AllHandles,
- NULL,
- NULL,
- &AllHandleCount,
- &AllHandleBuffer
- );
+ UINTN Index;
+
+ Status = gBS->LocateHandleBuffer (
+ AllHandles,
+ NULL,
+ NULL,
+ &HandleCount,
+ &HandleBuffer
+ );
if (EFI_ERROR (Status)) {
return Status;
}
- for (Index = 0; Index < AllHandleCount; Index++) {
+ for (Index = 0; Index < HandleCount; Index++) {
if (ShellGetExecutionBreakFlag ()) {
Status = EFI_ABORTED;
- goto Done;
- }
- //
- // Scan the handle database
- //
- Status = ParseHandleDatabaseByRelationshipWithType(
- NULL,
- AllHandleBuffer[Index],
- &HandleCount,
- &HandleBuffer,
- &HandleType
- );
-/*
- Status = LibScanHandleDatabase (
- NULL,
- NULL,
- AllHandleBuffer[Index],
- NULL,
- &HandleCount,
- &HandleBuffer,
- &HandleType
- );
-*/
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- Device = TRUE;
- if ((HandleType[Index] & HR_DRIVER_BINDING_HANDLE) != 0) {
- Device = FALSE;
- }
-
- if ((HandleType[Index] & HR_IMAGE_HANDLE) != 0) {
- Device = FALSE;
- }
-
- if (Device) {
- Parent = FALSE;
- for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
- if ((HandleType[HandleIndex] & HR_PARENT_HANDLE) != 0) {
- Parent = TRUE;
- }
- }
-
- if (!Parent) {
- if ((HandleType[Index] & HR_DEVICE_HANDLE) != 0) {
- Status = gBS->ConnectController (
- AllHandleBuffer[Index],
- NULL,
- NULL,
- TRUE
- );
- }
- }
+ break;
}
+ gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
+ }
+ if (HandleBuffer != NULL) {
FreePool (HandleBuffer);
- FreePool (HandleType);
}
-
-Done:
- FreePool (AllHandleBuffer);
return Status;
}
|