summaryrefslogtreecommitdiff
path: root/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckDevicePath.c
diff options
context:
space:
mode:
Diffstat (limited to 'Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckDevicePath.c')
-rw-r--r--Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckDevicePath.c188
1 files changed, 188 insertions, 0 deletions
diff --git a/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckDevicePath.c b/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckDevicePath.c
new file mode 100644
index 0000000000..aee43aa051
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/Test/Library/TestPointCheckLib/DxeCheckDevicePath.c
@@ -0,0 +1,188 @@
+/** @file
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Uefi.h>
+#include <PiDxe.h>
+#include <Library/TestPointCheckLib.h>
+#include <Library/TestPointLib.h>
+#include <Library/DebugLib.h>
+#include <Library/UefiLib.h>
+#include <Library/PrintLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Protocol/LoadedImage.h>
+#include <Protocol/DevicePath.h>
+
+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;
+}