X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;ds=sidebyside;f=ShellPkg%2FLibrary%2FUefiHandleParsingLib%2FUefiHandleParsingLib.c;h=0c78d0da20253d98d42802c5c8c5b6efd1aae9c9;hb=c683aa9cd1074135a1d22b11c0ca85631e9a7813;hp=44ad4c0b55d6cc36e7ab8426b2c81bd3d4fb7a6d;hpb=dee34318467c96af32cd123b0082e8498173e24a;p=mirror_edk2.git diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c index 44ad4c0b55..0c78d0da20 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c @@ -13,6 +13,7 @@ **/ #include "UefiHandleParsingLib.h" +#include "IndustryStandard/Acpi10.h" EFI_HANDLE mHandleParsingHiiHandle; HANDLE_INDEX_LIST mHandleList = {{{NULL,NULL},0,0},0}; @@ -160,6 +161,130 @@ LoadedImageProtocolDumpInformation( } */ +/** + Function to dump information about PciRootBridgeIo. + + This will allocate the return buffer from boot services pool. + + @param[in] TheHandle The handle that has PciRootBridgeIo installed. + @param[in] Verbose TRUE for additional information, FALSE otherwise. + + @retval A poitner to a string containing the information. +**/ +CHAR16* +EFIAPI +PciRootBridgeIoDumpInformation( + IN CONST EFI_HANDLE TheHandle, + IN CONST BOOLEAN Verbose + ) +{ + EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo; + EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Configuration; + UINT64 Supports; + UINT64 Attributes; + CHAR16 *Temp; + CHAR16 *Temp2; + CHAR16 *RetVal; + EFI_STATUS Status; + + RetVal = NULL; + + if (!Verbose) { + return (CatSPrint(NULL, L"PciRootBridgeIo")); + } + + Status = gBS->HandleProtocol( + TheHandle, + &gEfiPciRootBridgeIoProtocolGuid, + (VOID**)&PciRootBridgeIo); + + if (EFI_ERROR(Status)) { + return NULL; + } + + Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_PH), NULL); + ASSERT (Temp != NULL); + Temp2 = CatSPrint(L"\r\n", Temp, PciRootBridgeIo->ParentHandle); + FreePool(Temp); + RetVal = Temp2; + Temp2 = NULL; + + Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SEG), NULL); + ASSERT (Temp != NULL); + Temp2 = CatSPrint(RetVal, Temp, PciRootBridgeIo->SegmentNumber); + FreePool(Temp); + FreePool(RetVal); + RetVal = Temp2; + Temp2 = NULL; + + Supports = 0; + Attributes = 0; + Status = PciRootBridgeIo->GetAttributes (PciRootBridgeIo, &Supports, &Attributes); + if (!EFI_ERROR(Status)) { + Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_ATT), NULL); + ASSERT (Temp != NULL); + Temp2 = CatSPrint(RetVal, Temp, Attributes); + FreePool(Temp); + FreePool(RetVal); + RetVal = Temp2; + Temp2 = NULL; + + Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SUPPORTS), NULL); + ASSERT (Temp != NULL); + Temp2 = CatSPrint(RetVal, Temp, Supports); + FreePool(Temp); + FreePool(RetVal); + RetVal = Temp2; + Temp2 = NULL; + } + + Configuration = NULL; + Status = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **) &Configuration); + if (!EFI_ERROR(Status) && Configuration != NULL) { + Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_TITLE), NULL); + ASSERT (Temp != NULL); + Temp2 = CatSPrint(RetVal, Temp, Supports); + FreePool(Temp); + FreePool(RetVal); + RetVal = Temp2; + Temp2 = NULL; + while (Configuration->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) { + Temp = NULL; + switch (Configuration->ResType) { + case ACPI_ADDRESS_SPACE_TYPE_MEM: + Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_MEM), NULL); + break; + case ACPI_ADDRESS_SPACE_TYPE_IO: + Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_IO), NULL); + break; + case ACPI_ADDRESS_SPACE_TYPE_BUS: + Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_BUS), NULL); + break; + } + if (Temp != NULL) { + Temp2 = CatSPrint(RetVal, L"%s", Temp); + FreePool(Temp); + FreePool(RetVal); + RetVal = Temp2; + Temp2 = NULL; + } + + Temp2 = CatSPrint(RetVal, + L"%H%02x %016lx %016lx %02x%N\r\n", + Configuration->SpecificFlag, + Configuration->AddrRangeMin, + Configuration->AddrRangeMax, + Configuration->AddrSpaceGranularity + ); + FreePool(RetVal); + RetVal = Temp2; + Temp2 = NULL; + Configuration++; + } + } + return (RetVal); +} + /** Function to dump information about SimpleTextOut. @@ -224,8 +349,8 @@ TxtOutProtocolDumpInformation( Temp == NULL?L"":Temp, Index == Dev->Mode->Mode ? L'*' : L' ', Index, - !EFI_ERROR(Status)?Col:-1, - !EFI_ERROR(Status)?Row:-1 + !EFI_ERROR(Status)?(INTN)Col:-1, + !EFI_ERROR(Status)?(INTN)Row:-1 ); } FreePool(Temp); @@ -289,19 +414,15 @@ DevicePathProtocolDumpInformation( CHAR16 *Temp; CHAR16 *Temp2; EFI_STATUS Status; - EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText; Temp = NULL; - Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID**)&DevPathToText); + Status = gBS->OpenProtocol(TheHandle, &gEfiDevicePathProtocolGuid, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (!EFI_ERROR(Status)) { - Status = gBS->OpenProtocol(TheHandle, &gEfiDevicePathProtocolGuid, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); - if (!EFI_ERROR(Status)) { - // - // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line) - // - Temp = DevPathToText->ConvertDevicePathToText(DevPath, TRUE, TRUE); - gBS->CloseProtocol(TheHandle, &gEfiDevicePathProtocolGuid, gImageHandle, NULL); - } + // + // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line) + // + Temp = ConvertDevicePathToText(DevPath, TRUE, TRUE); + gBS->CloseProtocol(TheHandle, &gEfiDevicePathProtocolGuid, gImageHandle, NULL); } if (!Verbose && Temp != NULL && StrLen(Temp) > 30) { Temp2 = NULL; @@ -317,17 +438,17 @@ DevicePathProtocolDumpInformation( // #define LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID \ { \ - 0x58c518b1, 0x76f3, 0x11d4, 0xbc, 0xea, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 \ + 0x58c518b1, 0x76f3, 0x11d4, { 0xbc, 0xea, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \ } #define LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID \ { \ - 0x96eb4ad6, 0xa32a, 0x11d4, 0xbc, 0xfd, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 \ + 0x96eb4ad6, 0xa32a, 0x11d4, { 0xbc, 0xfd, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \ } #define LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID \ { \ - 0xc95a93d, 0xa006, 0x11d4, 0xbc, 0xfa, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 \ + 0xc95a93d, 0xa006, 0x11d4, { 0xbc, 0xfa, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \ } STATIC CONST EFI_GUID WinNtThunkProtocolGuid = LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID; STATIC CONST EFI_GUID WinNtIoProtocolGuid = LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID; @@ -381,7 +502,7 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = { {STRING_TOKEN(STR_BLK_IO), &gEfiBlockIoProtocolGuid, NULL}, {STRING_TOKEN(STR_UC), &gEfiUnicodeCollationProtocolGuid, NULL}, {STRING_TOKEN(STR_UC2), &gEfiUnicodeCollation2ProtocolGuid, NULL}, - {STRING_TOKEN(STR_PCIRB_IO), &gEfiPciRootBridgeIoProtocolGuid, NULL}, + {STRING_TOKEN(STR_PCIRB_IO), &gEfiPciRootBridgeIoProtocolGuid, PciRootBridgeIoDumpInformation}, {STRING_TOKEN(STR_PCI_IO), &gEfiPciIoProtocolGuid, NULL}, {STRING_TOKEN(STR_SCSI_PT), &gEfiScsiPassThruProtocolGuid, NULL}, {STRING_TOKEN(STR_SCSI_IO), &gEfiScsiIoProtocolGuid, NULL}, @@ -654,6 +775,44 @@ GetGuidFromStringName( return (EFI_NOT_FOUND); } +/** + Get best support language for this driver. + + First base on the current platform used language to search,Second base on the + default language to search. The caller need to free the buffer of the best + language. + + @param[in] SupportedLanguages The support languages for this driver. + @param[in] Iso639Language Whether get language for ISO639. + + @return The best support language for this driver. +**/ +CHAR8 * +GetBestLanguageForDriver ( + IN CONST CHAR8 *SupportedLanguages, + IN BOOLEAN Iso639Language + ) +{ + CHAR8 *LanguageVariable; + CHAR8 *BestLanguage; + + LanguageVariable = GetVariable (Iso639Language ? L"Lang" : L"PlatformLang", &gEfiGlobalVariableGuid); + + BestLanguage = GetBestLanguage( + SupportedLanguages, + Iso639Language, + (LanguageVariable != NULL) ? LanguageVariable : "", + Iso639Language ? "en" : "en-US", + NULL + ); + + if (LanguageVariable != NULL) { + FreePool (LanguageVariable); + } + + return BestLanguage; +} + /** Function to retrieve the driver name (if possible) from the ComponentName or ComponentName2 protocol @@ -674,6 +833,9 @@ GetStringNameFromHandle( EFI_COMPONENT_NAME2_PROTOCOL *CompNameStruct; EFI_STATUS Status; CHAR16 *RetVal; + CHAR8 *BestLang; + + BestLang = NULL; Status = gBS->OpenProtocol( TheHandle, @@ -683,7 +845,16 @@ GetStringNameFromHandle( NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (!EFI_ERROR(Status)) { + if (Language == NULL) { + BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, FALSE); + Language = BestLang; + } Status = CompNameStruct->GetDriverName(CompNameStruct, (CHAR8*)Language, &RetVal); + + if (BestLang != NULL) { + FreePool (BestLang); + BestLang = NULL; + } if (!EFI_ERROR(Status)) { return (RetVal); } @@ -696,7 +867,15 @@ GetStringNameFromHandle( NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (!EFI_ERROR(Status)) { + if (Language == NULL) { + BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, FALSE); + Language = BestLang; + } Status = CompNameStruct->GetDriverName(CompNameStruct, (CHAR8*)Language, &RetVal); + + if (BestLang != NULL) { + FreePool (BestLang); + } if (!EFI_ERROR(Status)) { return (RetVal); } @@ -765,7 +944,11 @@ ConvertHandleToHandleIndex( IN CONST EFI_HANDLE TheHandle ) { - HANDLE_LIST *ListWalker; + EFI_STATUS Status; + EFI_GUID **ProtocolBuffer; + UINTN ProtocolCount; + HANDLE_LIST *ListWalker; + if (TheHandle == NULL) { return 0; } @@ -777,9 +960,34 @@ ConvertHandleToHandleIndex( ; ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link) ){ if (ListWalker->TheHandle == TheHandle) { + // + // Verify that TheHandle is still present in the Handle Database + // + Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount); + if (EFI_ERROR (Status)) { + // + // TheHandle is not present in the Handle Database, so delete from the handle list + // + RemoveEntryList (&ListWalker->Link); + return 0; + } + FreePool (ProtocolBuffer); return (ListWalker->TheIndex); } } + + // + // Verify that TheHandle is valid handle + // + Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount); + if (EFI_ERROR (Status)) { + // + // TheHandle is not valid, so do not add to handle list + // + return 0; + } + FreePool (ProtocolBuffer); + ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST)); ASSERT(ListWalker != NULL); ListWalker->TheHandle = TheHandle; @@ -805,23 +1013,36 @@ ConvertHandleIndexToHandle( IN CONST UINTN TheIndex ) { + EFI_STATUS Status; + EFI_GUID **ProtocolBuffer; + UINTN ProtocolCount; HANDLE_LIST *ListWalker; InternalShellInitHandleList(); if (TheIndex >= mHandleList.NextIndex) { - return (NULL); + return NULL; } for (ListWalker = (HANDLE_LIST*)GetFirstNode(&mHandleList.List.Link) ; !IsNull(&mHandleList.List.Link,&ListWalker->Link) ; ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link) ){ - if (ListWalker->TheIndex == TheIndex) { + if (ListWalker->TheIndex == TheIndex && ListWalker->TheHandle != NULL) { + // + // Verify that LinkWalker->TheHandle is valid handle + // + Status = gBS->ProtocolsPerHandle(ListWalker->TheHandle, &ProtocolBuffer, &ProtocolCount); + if (EFI_ERROR (Status)) { + // + // TheHandle is not valid, so do not add to handle list + // + ListWalker->TheHandle = NULL; + } return (ListWalker->TheHandle); } } - return (NULL); + return NULL; } /** @@ -869,6 +1090,7 @@ ParseHandleDatabaseByRelationshipWithType ( UINTN OpenInfoCount; UINTN OpenInfoIndex; UINTN ChildIndex; + INTN DriverBindingHandleIndex; ASSERT(HandleCount != NULL); ASSERT(HandleBuffer != NULL); @@ -896,6 +1118,13 @@ ParseHandleDatabaseByRelationshipWithType ( *HandleType = AllocateZeroPool (*HandleCount * sizeof (UINTN)); ASSERT(*HandleType != NULL); + DriverBindingHandleIndex = -1; + for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) { + if (DriverBindingHandle != NULL && (*HandleBuffer)[HandleIndex] == DriverBindingHandle) { + DriverBindingHandleIndex = (INTN)HandleIndex; + } + } + for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) { // // Retrieve the list of all the protocols on each handle @@ -905,102 +1134,150 @@ ParseHandleDatabaseByRelationshipWithType ( &ProtocolGuidArray, &ArrayCount ); - if (!EFI_ERROR (Status)) { + if (EFI_ERROR (Status)) { + continue; + } - for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) { + for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) { - // - // Set the bit describing what this handle has - // - if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid) ) { - (*HandleType)[HandleIndex] |= HR_IMAGE_HANDLE; - } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid) ) { - (*HandleType)[HandleIndex] |= HR_DRIVER_BINDING_HANDLE; - } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid)) { - (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE; - } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid) ) { - (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE; - } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid) ) { - (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE; - } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid) ) { - (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE; - } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid) ) { - (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE; - } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid) ) { - (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE; - } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid) ) { - (*HandleType)[HandleIndex] |= HR_DEVICE_HANDLE; - } else { - DEBUG_CODE_BEGIN(); - ASSERT((*HandleType)[HandleIndex] == (*HandleType)[HandleIndex]); - DEBUG_CODE_END(); - } - // - // Retrieve the list of agents that have opened each protocol - // - Status = gBS->OpenProtocolInformation ( + // + // Set the bit describing what this handle has + // + if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid) ) { + (*HandleType)[HandleIndex] |= HR_IMAGE_HANDLE; + } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid) ) { + (*HandleType)[HandleIndex] |= HR_DRIVER_BINDING_HANDLE; + } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid)) { + (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE; + } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid) ) { + (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE; + } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid) ) { + (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE; + } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid) ) { + (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE; + } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid) ) { + (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE; + } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid) ) { + (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE; + } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid) ) { + (*HandleType)[HandleIndex] |= HR_DEVICE_HANDLE; + } else { + DEBUG_CODE_BEGIN(); + ASSERT((*HandleType)[HandleIndex] == (*HandleType)[HandleIndex]); + DEBUG_CODE_END(); + } + // + // Retrieve the list of agents that have opened each protocol + // + Status = gBS->OpenProtocolInformation ( (*HandleBuffer)[HandleIndex], ProtocolGuidArray[ProtocolIndex], &OpenInfo, &OpenInfoCount ); - if (!EFI_ERROR (Status)) { + if (EFI_ERROR (Status)) { + continue; + } + + if (ControllerHandle == NULL) { + // + // ControllerHandle == NULL and DriverBindingHandle != NULL. + // Return information on all the controller handles that the driver specified by DriverBindingHandle is managing + // + for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) { + if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) { + (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE); + if (DriverBindingHandleIndex != -1) { + (*HandleType)[DriverBindingHandleIndex] |= HR_DEVICE_DRIVER; + } + } + if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) { + (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE); + if (DriverBindingHandleIndex != -1) { + (*HandleType)[DriverBindingHandleIndex] |= (HR_BUS_DRIVER | HR_DEVICE_DRIVER); + } + for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) { + if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) { + (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE); + } + } + } + } + } + if (DriverBindingHandle == NULL && ControllerHandle != NULL) { + if (ControllerHandle == (*HandleBuffer)[HandleIndex]) { + (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE); for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) { - if (DriverBindingHandle != NULL && OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) { - if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) { - (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE); + if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) { + for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) { + if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) { + (*HandleType)[ChildIndex] |= HR_DEVICE_DRIVER; + } } - if (ControllerHandle != NULL && (*HandleBuffer)[HandleIndex] == ControllerHandle) { - if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) { - for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) { - if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].ControllerHandle) { - (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE); - } - } + } + if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) { + for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) { + if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) { + (*HandleType)[ChildIndex] |= (HR_BUS_DRIVER | HR_DEVICE_DRIVER); + } + if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) { + (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE); } } } - if (DriverBindingHandle == NULL && OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) { - if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) { - for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) { - if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].AgentHandle) { - (*HandleType)[ChildIndex] |= HR_DEVICE_DRIVER; - } + } + } else { + for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) { + if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) { + if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) { + (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_PARENT_HANDLE); + } + } + } + } + } + if (DriverBindingHandle != NULL && ControllerHandle != NULL) { + if (ControllerHandle == (*HandleBuffer)[HandleIndex]) { + (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE); + for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) { + if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) { + if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) { + if (DriverBindingHandleIndex != -1) { + (*HandleType)[DriverBindingHandleIndex] |= HR_DEVICE_DRIVER; } } - if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) { - (*HandleType)[HandleIndex] |= HR_PARENT_HANDLE; + } + if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) { + if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) { for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) { - if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].AgentHandle) { - (*HandleType)[ChildIndex] |= HR_BUS_DRIVER; + if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) { + (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE); } } } + + for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) { + if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) { + (*HandleType)[ChildIndex] |= (HR_BUS_DRIVER | HR_DEVICE_DRIVER); + } + } + } + } + } else { + for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) { + if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) { + if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) { + (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_PARENT_HANDLE); + } } } - - FreePool (OpenInfo); } } - - FreePool (ProtocolGuidArray); - } - } - - if (EFI_ERROR(Status)) { - if (*HandleType != NULL) { - FreePool (*HandleType); + FreePool (OpenInfo); } - if (*HandleBuffer != NULL) { - FreePool (*HandleBuffer); - } - - *HandleCount = 0; - *HandleBuffer = NULL; - *HandleType = NULL; + FreePool (ProtocolGuidArray); } - - return Status; + return EFI_SUCCESS; } /** @@ -1155,14 +1432,13 @@ ParseHandleDatabaseForChildControllers( ) { EFI_STATUS Status; -// UINTN HandleIndex; + UINTN HandleIndex; UINTN DriverBindingHandleCount; EFI_HANDLE *DriverBindingHandleBuffer; UINTN DriverBindingHandleIndex; UINTN ChildControllerHandleCount; EFI_HANDLE *ChildControllerHandleBuffer; UINTN ChildControllerHandleIndex; -// BOOLEAN Found; EFI_HANDLE *HandleBufferForReturn; if (MatchingHandleCount == NULL) { @@ -1182,7 +1458,7 @@ ParseHandleDatabaseForChildControllers( // // Get a buffer big enough for all the controllers. // - HandleBufferForReturn = GetHandleListByProtocol(&gEfiDevicePathProtocolGuid); + HandleBufferForReturn = GetHandleListByProtocol(NULL); if (HandleBufferForReturn == NULL) { FreePool (DriverBindingHandleBuffer); return (EFI_NOT_FOUND); @@ -1203,18 +1479,14 @@ ParseHandleDatabaseForChildControllers( ChildControllerHandleIndex < ChildControllerHandleCount; ChildControllerHandleIndex++ ) { -// Found = FALSE; - HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex]; -// for (HandleIndex = 0; HandleBufferForReturn[HandleIndex] != NULL; HandleIndex++) { -// if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) { -// Found = TRUE; -// break; -// } -// } - -// if (Found) { -// HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex]; -// } + for (HandleIndex = 0; HandleIndex < *MatchingHandleCount; HandleIndex++) { + if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) { + break; + } + } + if (HandleIndex >= *MatchingHandleCount) { + HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex]; + } } FreePool (ChildControllerHandleBuffer);