Contributed-under: TianoCore Contribution Agreement 1.0

Signed-off-by: Michael Kinney <michael.d.kinney@intel.com>
Reviewed-by: Jaben Carsey <Jaben.carsey@intel.com>

1) ShellPkg/Library/UefiHandleParsingLib
    a. UefiHandleParsingLib.c – ConvertHandleToHandleIndex() and ConvertHandleIndexToHandle()
        i. Update to work correctly when handles are destroyed due to driver disconnect operations.  Same handle index is never reused.
    b. UefiHandleParsingLib.c – ParseHandleDatabaseByRelationshipWithType() and ParseHandleDatabaseForChildControllers()
        i. Expand to handle Service Binding Protocol usage such as Network stack.
2) ShellPkg/Library/UefiShellDriver1CommandsLib
    a. DevTree.c – Fix bug where the same handle is shown more than once.
    b. Dh.c – Fix use of GetDriverName() and GetDriverImageName().  The status returned must always be evaluated. 
    c. Disconnect.c – Remove requirement that a handle being disconnected must support Device Path Protocol.  This prevents driver model handles without device paths from being disconnected (i.e. Network Stack)
    d. OpenInfo.c – Fix bug when showing open info about a ControllerHandle that has been destroyed due to a disconnect or an unload operation.
    e. UefiShellDriver1CommandsLib.uni – Fix “drivers” command formatting when handle indexes have more than 2 characters.


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13786 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
mdkinney
2012-10-05 22:26:25 +00:00
parent c42c9cac8c
commit f330ff35dc
6 changed files with 241 additions and 124 deletions

View File

@ -948,7 +948,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;
}
@ -960,9 +964,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;
@ -988,23 +1017,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;
}
/**
@ -1052,6 +1094,7 @@ ParseHandleDatabaseByRelationshipWithType (
UINTN OpenInfoCount;
UINTN OpenInfoIndex;
UINTN ChildIndex;
INTN DriverBindingHandleIndex;
ASSERT(HandleCount != NULL);
ASSERT(HandleBuffer != NULL);
@ -1079,6 +1122,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
@ -1088,102 +1138,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)) {
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 (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 (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 (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) {
for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {
(*HandleType)[ChildIndex] |= HR_DEVICE_DRIVER;
}
}
}
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;
}
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].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {
(*HandleType)[HandleIndex] |= HR_PARENT_HANDLE;
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);
}
}
}
}
FreePool (OpenInfo);
} 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) != 0) {
if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {
for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {
(*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE);
}
}
}
FreePool (ProtocolGuidArray);
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);
}
if (*HandleBuffer != NULL) {
FreePool (*HandleBuffer);
}
*HandleCount = 0;
*HandleBuffer = NULL;
*HandleType = NULL;
}
return Status;
return EFI_SUCCESS;
}
/**
@ -1338,14 +1436,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) {
@ -1365,7 +1462,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);
@ -1386,18 +1483,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);