/** @file Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include #include #include VOID TestPointDumpDevicePath ( VOID ) { UINTN Index; EFI_HANDLE *HandleBuf; UINTN HandleCount; EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_STATUS Status; CHAR16 *Str; DEBUG ((DEBUG_INFO, "==== TestPointDumpDevicePath - Enter\n")); HandleBuf = NULL; Status = gBS->LocateHandleBuffer ( ByProtocol, &gEfiDevicePathProtocolGuid, NULL, &HandleCount, &HandleBuf ); if (EFI_ERROR (Status)) { goto Done ; } DEBUG ((DEBUG_INFO, "DeviceList:\n")); for (Index = 0; Index < HandleCount; Index++) { Status = gBS->HandleProtocol ( HandleBuf[Index], &gEfiDevicePathProtocolGuid, (VOID**)&DevicePath ); if (EFI_ERROR (Status)) { continue; } Str = ConvertDevicePathToText(DevicePath, TRUE, TRUE); DEBUG ((DEBUG_INFO, " %s\n", Str)); if (Str != NULL) { FreePool (Str); } } Done: if (HandleBuf != NULL) { FreePool (HandleBuf); } DEBUG ((DEBUG_INFO, "==== TestPointDumpDevicePath - Exit\n")); return ; } /** The DevicePathNode is a single instance. The DevicePathNodeSize must not include END_DEVICE_PATH. **/ BOOLEAN IsDevicePathNodeExist ( IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, IN UINTN DevicePathNodeSize ) { UINTN Index; EFI_HANDLE *HandleBuf; UINTN HandleCount; EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_STATUS Status; BOOLEAN Result; UINTN DevicePathSize; if (DevicePathType (DevicePathNode) == HARDWARE_DEVICE_PATH || DevicePathType (DevicePathNode) == ACPI_DEVICE_PATH) { Result = FALSE; HandleBuf = NULL; Status = gBS->LocateHandleBuffer ( ByProtocol, &gEfiDevicePathProtocolGuid, NULL, &HandleCount, &HandleBuf ); if (EFI_ERROR (Status)) { goto Done ; } for (Index = 0; Index < HandleCount; Index++) { Status = gBS->HandleProtocol ( HandleBuf[Index], &gEfiDevicePathProtocolGuid, (VOID**)&DevicePath ); if (EFI_ERROR (Status)) { continue; } DevicePathSize = GetDevicePathSize(DevicePath); if (DevicePathSize != DevicePathNodeSize + sizeof(EFI_DEVICE_PATH_PROTOCOL)) { continue; } if (CompareMem (DevicePath, DevicePathNode, DevicePathNodeSize) == 0) { Result = TRUE; break; } } Done: if (HandleBuf != NULL) { FreePool (HandleBuf); } return Result; } if (DevicePathType (DevicePathNode) == MESSAGING_DEVICE_PATH) { return TRUE; } if (DevicePathType (DevicePathNode) == MEDIA_DEVICE_PATH) { return TRUE; } if (DevicePathType (DevicePathNode) == BBS_DEVICE_PATH) { return TRUE; } return TRUE; } /** The DevicePathTarget might be multiple instance. The DevicePathTarget must be ended with END_ENTIRE_DEVICE_PATH_SUBTYPE. **/ BOOLEAN IsDevicePathExist ( IN EFI_DEVICE_PATH_PROTOCOL *DevicePath ) { EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePathNode; BOOLEAN Result; TmpDevicePath = DevicePath; DevicePathNode = DevicePath; while (!IsDevicePathEnd (TmpDevicePath)) { if (IsDevicePathEndInstance (TmpDevicePath)) { // // DevicePath is a multi-instance device path // Result = IsDevicePathNodeExist (DevicePathNode, (UINTN)TmpDevicePath - (UINTN)DevicePathNode); if (!Result) { return FALSE; } DevicePathNode = NextDevicePathNode (TmpDevicePath); } TmpDevicePath = NextDevicePathNode (TmpDevicePath); } Result = IsDevicePathNodeExist (DevicePathNode, (UINTN)TmpDevicePath - (UINTN)DevicePathNode); if (!Result) { return FALSE; } return TRUE; }