git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1117 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			1462 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1462 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*++
 | 
						|
 | 
						|
Copyright (c) 2006, Intel Corporation                                                         
 | 
						|
All rights reserved. This program and the accompanying materials                          
 | 
						|
are licensed and made available under the terms and conditions of the BSD License         
 | 
						|
which 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.             
 | 
						|
 | 
						|
Module Name:
 | 
						|
 | 
						|
  DevicePathToText.c
 | 
						|
 | 
						|
Abstract:
 | 
						|
 | 
						|
  DevicePathToText protocol as defined in the UEFI 2.0 specification.
 | 
						|
 | 
						|
--*/
 | 
						|
 | 
						|
#include "DevicePath.h"
 | 
						|
 | 
						|
EFI_DEVICE_PATH_PROTOCOL *
 | 
						|
UnpackDevicePath (
 | 
						|
  IN EFI_DEVICE_PATH_PROTOCOL  *DevPath
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Function unpacks a device path data structure so that all the nodes of a device path 
 | 
						|
    are naturally aligned.
 | 
						|
 | 
						|
  Arguments:
 | 
						|
    DevPath        - A pointer to a device path data structure
 | 
						|
 | 
						|
  Returns:
 | 
						|
    If the memory for the device path is successfully allocated, then a pointer to the 
 | 
						|
    new device path is returned.  Otherwise, NULL is returned.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *Src;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *Dest;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *NewPath;
 | 
						|
  UINTN                     Size;
 | 
						|
 | 
						|
  if (DevPath == NULL) {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
  //
 | 
						|
  // Walk device path and round sizes to valid boundries
 | 
						|
  //
 | 
						|
  Src   = DevPath;
 | 
						|
  Size  = 0;
 | 
						|
  for (;;) {
 | 
						|
    Size += DevicePathNodeLength (Src);
 | 
						|
    Size += ALIGN_SIZE (Size);
 | 
						|
 | 
						|
    if (IsDevicePathEnd (Src)) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    Src = (EFI_DEVICE_PATH_PROTOCOL *) NextDevicePathNode (Src);
 | 
						|
  }
 | 
						|
  //
 | 
						|
  // Allocate space for the unpacked path
 | 
						|
  //
 | 
						|
  NewPath = AllocateZeroPool (Size);
 | 
						|
  if (NewPath != NULL) {
 | 
						|
 | 
						|
    ASSERT (((UINTN) NewPath) % MIN_ALIGNMENT_SIZE == 0);
 | 
						|
 | 
						|
    //
 | 
						|
    // Copy each node
 | 
						|
    //
 | 
						|
    Src   = DevPath;
 | 
						|
    Dest  = NewPath;
 | 
						|
    for (;;) {
 | 
						|
      Size = DevicePathNodeLength (Src);
 | 
						|
      CopyMem (Dest, Src, Size);
 | 
						|
      Size += ALIGN_SIZE (Size);
 | 
						|
      SetDevicePathNodeLength (Dest, Size);
 | 
						|
      Dest->Type |= EFI_DP_TYPE_UNPACKED;
 | 
						|
      Dest = (EFI_DEVICE_PATH_PROTOCOL *) (((UINT8 *) Dest) + Size);
 | 
						|
 | 
						|
      if (IsDevicePathEnd (Src)) {
 | 
						|
        break;
 | 
						|
      }
 | 
						|
 | 
						|
      Src = (EFI_DEVICE_PATH_PROTOCOL *) NextDevicePathNode (Src);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return NewPath;
 | 
						|
}
 | 
						|
 | 
						|
VOID *
 | 
						|
ReallocatePool (
 | 
						|
  IN VOID                 *OldPool,
 | 
						|
  IN UINTN                OldSize,
 | 
						|
  IN UINTN                NewSize
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Adjusts the size of a previously allocated buffer.
 | 
						|
 | 
						|
  Arguments:
 | 
						|
    OldPool               - A pointer to the buffer whose size is being adjusted.
 | 
						|
    OldSize               - The size of the current buffer.
 | 
						|
    NewSize               - The size of the new buffer.
 | 
						|
 | 
						|
  Returns:
 | 
						|
    EFI_SUCEESS           - The requested number of bytes were allocated.
 | 
						|
    EFI_OUT_OF_RESOURCES  - The pool requested could not be allocated.
 | 
						|
    EFI_INVALID_PARAMETER - The buffer was invalid.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  VOID  *NewPool;
 | 
						|
 | 
						|
  NewPool = NULL;
 | 
						|
  if (NewSize) {
 | 
						|
    NewPool = AllocateZeroPool (NewSize);
 | 
						|
  }
 | 
						|
 | 
						|
  if (OldPool) {
 | 
						|
    if (NewPool) {
 | 
						|
      CopyMem (NewPool, OldPool, OldSize < NewSize ? OldSize : NewSize);
 | 
						|
    }
 | 
						|
 | 
						|
    gBS->FreePool (OldPool);
 | 
						|
  }
 | 
						|
 | 
						|
  return NewPool;
 | 
						|
}
 | 
						|
 | 
						|
CHAR16 *
 | 
						|
CatPrint (
 | 
						|
  IN OUT POOL_PRINT   *Str,
 | 
						|
  IN CHAR16           *Fmt,
 | 
						|
  ...
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Concatenates a formatted unicode string to allocated pool.  
 | 
						|
    The caller must free the resulting buffer.
 | 
						|
 | 
						|
  Arguments:
 | 
						|
    Str         - Tracks the allocated pool, size in use, and 
 | 
						|
                  amount of pool allocated.
 | 
						|
    Fmt         - The format string
 | 
						|
 | 
						|
  Returns:
 | 
						|
    Allocated buffer with the formatted string printed in it.  
 | 
						|
    The caller must free the allocated buffer.   The buffer
 | 
						|
    allocation is not packed.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  UINT16  *AppendStr;
 | 
						|
  VA_LIST Args;
 | 
						|
  UINTN   Size;
 | 
						|
 | 
						|
  AppendStr = AllocateZeroPool (0x1000);
 | 
						|
  if (AppendStr == NULL) {
 | 
						|
    return Str->Str;
 | 
						|
  }
 | 
						|
 | 
						|
  VA_START (Args, Fmt);
 | 
						|
  UnicodeVSPrint (AppendStr, 0x1000, Fmt, Args);
 | 
						|
  VA_END (Args);
 | 
						|
  if (NULL == Str->Str) {
 | 
						|
    Size   = StrSize (AppendStr);
 | 
						|
    Str->Str  = AllocateZeroPool (Size);
 | 
						|
    ASSERT (Str->Str != NULL);
 | 
						|
  } else {
 | 
						|
    Size = StrSize (AppendStr) + StrSize (Str->Str) - sizeof (UINT16);
 | 
						|
    Str->Str = ReallocatePool (
 | 
						|
                Str->Str,
 | 
						|
                StrSize (Str->Str),
 | 
						|
                Size
 | 
						|
                );
 | 
						|
    ASSERT (Str->Str != NULL);
 | 
						|
  }
 | 
						|
 | 
						|
  Str->MaxLen = MAX_CHAR * sizeof (UINT16);
 | 
						|
  if (Size < Str->MaxLen) {
 | 
						|
    StrCat (Str->Str, AppendStr);
 | 
						|
    Str->Len = Size - sizeof (UINT16);
 | 
						|
  }
 | 
						|
 | 
						|
  gBS->FreePool (AppendStr);
 | 
						|
  return Str->Str;
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextPci (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  PCI_DEVICE_PATH *Pci;
 | 
						|
 | 
						|
  Pci = DevPath;
 | 
						|
  CatPrint (Str, L"Pci(%x,%x)", Pci->Function, Pci->Device);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextPccard (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  PCCARD_DEVICE_PATH  *Pccard;
 | 
						|
 | 
						|
  Pccard = DevPath;
 | 
						|
  CatPrint (Str, L"PcCard(%x)", Pccard->FunctionNumber);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextMemMap (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  MEMMAP_DEVICE_PATH  *MemMap;
 | 
						|
 | 
						|
  MemMap = DevPath;
 | 
						|
  CatPrint (
 | 
						|
    Str,
 | 
						|
    L"MemoryMapped(%lx,%lx)",
 | 
						|
    MemMap->StartingAddress,
 | 
						|
    MemMap->EndingAddress
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextVendor (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  VENDOR_DEVICE_PATH  *Vendor;
 | 
						|
  CHAR16              *Type;
 | 
						|
  UINTN               Index;
 | 
						|
  UINT32              FlowControlMap;
 | 
						|
  UINT16              Info;
 | 
						|
 | 
						|
  Vendor = (VENDOR_DEVICE_PATH *) DevPath;
 | 
						|
  switch (DevicePathType (&Vendor->Header)) {
 | 
						|
  case HARDWARE_DEVICE_PATH:
 | 
						|
    Type = L"Hw";
 | 
						|
    break;
 | 
						|
 | 
						|
  case MESSAGING_DEVICE_PATH:
 | 
						|
    Type = L"Msg";
 | 
						|
    if (AllowShortcuts) {
 | 
						|
      if (CompareGuid (&Vendor->Guid, &gEfiPcAnsiGuid)) {
 | 
						|
        CatPrint (Str, L"VenPcAnsi()");
 | 
						|
        return ;
 | 
						|
      } else if (CompareGuid (&Vendor->Guid, &gEfiVT100Guid)) {
 | 
						|
        CatPrint (Str, L"VenVt100()");
 | 
						|
        return ;
 | 
						|
      } else if (CompareGuid (&Vendor->Guid, &gEfiVT100PlusGuid)) {
 | 
						|
        CatPrint (Str, L"VenVt100Plus()");
 | 
						|
        return ;
 | 
						|
      } else if (CompareGuid (&Vendor->Guid, &gEfiVTUTF8Guid)) {
 | 
						|
        CatPrint (Str, L"VenUft8()");
 | 
						|
        return ;
 | 
						|
      } else if (CompareGuid (&Vendor->Guid, &mEfiDevicePathMessagingUartFlowControlGuid)) {
 | 
						|
        FlowControlMap = (((UART_FLOW_CONTROL_DEVICE_PATH *) Vendor)->FlowControlMap);
 | 
						|
        switch (FlowControlMap & 0x00000003) {
 | 
						|
        case 0:
 | 
						|
          CatPrint (Str, L"UartFlowCtrl(%s)", L"None");
 | 
						|
          break;
 | 
						|
 | 
						|
        case 1:
 | 
						|
          CatPrint (Str, L"UartFlowCtrl(%s)", L"Hardware");
 | 
						|
          break;
 | 
						|
 | 
						|
        case 2:
 | 
						|
          CatPrint (Str, L"UartFlowCtrl(%s)", L"XonXoff");
 | 
						|
          break;
 | 
						|
 | 
						|
        default:
 | 
						|
          break;
 | 
						|
        }
 | 
						|
 | 
						|
        return ;
 | 
						|
      } else if (CompareGuid (&Vendor->Guid, &mEfiDevicePathMessagingSASGuid)) {
 | 
						|
        CatPrint (
 | 
						|
          Str,
 | 
						|
          L"SAS(%lx,%lx,%x,",
 | 
						|
          ((SAS_DEVICE_PATH *) Vendor)->SasAddress,
 | 
						|
          ((SAS_DEVICE_PATH *) Vendor)->Lun,
 | 
						|
          ((SAS_DEVICE_PATH *) Vendor)->RelativeTargetPort
 | 
						|
          );
 | 
						|
        Info = (((SAS_DEVICE_PATH *) Vendor)->DeviceTopology);
 | 
						|
        if ((Info & 0x0f) == 0) {
 | 
						|
          CatPrint (Str, L"NoTopology,0,0,0,");
 | 
						|
        } else if (((Info & 0x0f) == 1) || ((Info & 0x0f) == 2)) {
 | 
						|
          CatPrint (
 | 
						|
            Str,
 | 
						|
            L"%s,%s,%s,",
 | 
						|
            (Info & (0x1 << 4)) ? L"SATA" : L"SAS",
 | 
						|
            (Info & (0x1 << 5)) ? L"External" : L"Internal",
 | 
						|
            (Info & (0x1 << 6)) ? L"Expanded" : L"Direct"
 | 
						|
            );
 | 
						|
          if ((Info & 0x0f) == 1) {
 | 
						|
            CatPrint (Str, L"0,");
 | 
						|
          } else {
 | 
						|
            CatPrint (Str, L"%x,", (Info >> 8) & 0xff);
 | 
						|
          }
 | 
						|
        } else {
 | 
						|
          CatPrint (Str, L"0,0,0,0,");
 | 
						|
        }
 | 
						|
 | 
						|
        CatPrint (Str, L"%x)", ((SAS_DEVICE_PATH *) Vendor)->Reserved);
 | 
						|
        return ;
 | 
						|
      } else if (CompareGuid (&Vendor->Guid, &gEfiDebugPortProtocolGuid)) {
 | 
						|
        CatPrint (Str, L"DebugPort()");
 | 
						|
        return ;
 | 
						|
      } else {
 | 
						|
        return ;
 | 
						|
        //
 | 
						|
        // reserved
 | 
						|
        //
 | 
						|
      }
 | 
						|
    }
 | 
						|
    break;
 | 
						|
 | 
						|
  case MEDIA_DEVICE_PATH:
 | 
						|
    Type = L"Media";
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    Type = L"?";
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (Str, L"Ven%s(%g,", Type, &Vendor->Guid);
 | 
						|
  for (Index = 0; Index < DevicePathNodeLength (&Vendor->Header) - sizeof (VENDOR_DEVICE_PATH); Index++) {
 | 
						|
    CatPrint (Str, L"%02x", ((VENDOR_DEVICE_PATH_WITH_DATA *) Vendor)->VendorDefinedData[Index]);
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (Str, L")");
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextController (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  CONTROLLER_DEVICE_PATH  *Controller;
 | 
						|
 | 
						|
  Controller = DevPath;
 | 
						|
  CatPrint (
 | 
						|
    Str,
 | 
						|
    L"Ctrl(%x)",
 | 
						|
    Controller->ControllerNumber
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextAcpi (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  ACPI_HID_DEVICE_PATH  *Acpi;
 | 
						|
 | 
						|
  Acpi = DevPath;
 | 
						|
  if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
 | 
						|
    if (AllowShortcuts) {
 | 
						|
      switch (EISA_ID_TO_NUM (Acpi->HID)) {
 | 
						|
      case 0x0a03:
 | 
						|
        CatPrint (Str, L"PciRoot(%x)", Acpi->UID);
 | 
						|
        break;
 | 
						|
 | 
						|
      case 0x0604:
 | 
						|
        CatPrint (Str, L"Floppy(%x)", Acpi->UID);
 | 
						|
        break;
 | 
						|
 | 
						|
      case 0x0301:
 | 
						|
        CatPrint (Str, L"Keyboard(%x)", Acpi->UID);
 | 
						|
        break;
 | 
						|
 | 
						|
      case 0x0501:
 | 
						|
        CatPrint (Str, L"Serial(%x)", Acpi->UID);
 | 
						|
        break;
 | 
						|
 | 
						|
      case 0x0401:
 | 
						|
        CatPrint (Str, L"ParallelPort(%x)", Acpi->UID);
 | 
						|
        break;
 | 
						|
 | 
						|
      default:
 | 
						|
        break;
 | 
						|
      }
 | 
						|
 | 
						|
      return ;
 | 
						|
    }
 | 
						|
 | 
						|
    CatPrint (Str, L"Acpi(PNP%04x,%x)", EISA_ID_TO_NUM (Acpi->HID), Acpi->UID);
 | 
						|
  } else {
 | 
						|
    CatPrint (Str, L"Acpi(%08x,%x)", Acpi->HID, Acpi->UID);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
#define NextStrA(a) ((UINT8 *) (((UINT8 *) (a)) + AsciiStrLen ((CHAR8 *) (a)) + 1))
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextExtAcpi (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR  *AcpiExt;
 | 
						|
 | 
						|
  AcpiExt = DevPath;
 | 
						|
 | 
						|
  if (AllowShortcuts) {
 | 
						|
    if ((*(AcpiExt->HidUidCidStr) == '\0') &&
 | 
						|
        (*(NextStrA (NextStrA (AcpiExt->HidUidCidStr))) == '\0') &&
 | 
						|
        (AcpiExt->UID == 0)
 | 
						|
        ) {
 | 
						|
      if ((AcpiExt->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
 | 
						|
        CatPrint (
 | 
						|
          Str,
 | 
						|
          L"AcpiExp(PNP%04x,%x,%a)",
 | 
						|
          EISA_ID_TO_NUM (AcpiExt->HID),
 | 
						|
          AcpiExt->CID,
 | 
						|
          NextStrA (AcpiExt->HidUidCidStr)
 | 
						|
          );
 | 
						|
      } else {
 | 
						|
        CatPrint (
 | 
						|
          Str,
 | 
						|
          L"AcpiExp(%08x,%x,%a)",
 | 
						|
          AcpiExt->HID,
 | 
						|
          AcpiExt->CID,
 | 
						|
          NextStrA (AcpiExt->HidUidCidStr)
 | 
						|
          );
 | 
						|
      }
 | 
						|
    }
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  if ((AcpiExt->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
 | 
						|
    CatPrint (
 | 
						|
      Str,
 | 
						|
      L"AcpiEx(PNP%04x,%x,%x,%a,%a,%a)",
 | 
						|
      EISA_ID_TO_NUM (AcpiExt->HID),
 | 
						|
      AcpiExt->CID,
 | 
						|
      AcpiExt->UID,
 | 
						|
      AcpiExt->HidUidCidStr,
 | 
						|
      NextStrA (NextStrA (AcpiExt->HidUidCidStr)),
 | 
						|
      NextStrA (AcpiExt->HidUidCidStr)
 | 
						|
      );
 | 
						|
  } else {
 | 
						|
    CatPrint (
 | 
						|
      Str,
 | 
						|
      L"AcpiEx(%08x,%x,%x,%a,%a,%a)",
 | 
						|
      AcpiExt->HID,
 | 
						|
      AcpiExt->CID,
 | 
						|
      AcpiExt->UID,
 | 
						|
      AcpiExt->HidUidCidStr,
 | 
						|
      NextStrA (NextStrA (AcpiExt->HidUidCidStr)),
 | 
						|
      NextStrA (AcpiExt->HidUidCidStr)
 | 
						|
      );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextAtapi (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  ATAPI_DEVICE_PATH *Atapi;
 | 
						|
 | 
						|
  Atapi = DevPath;
 | 
						|
 | 
						|
  if (DisplayOnly) {
 | 
						|
    CatPrint (Str, L"Ata(%x)", Atapi->Lun);
 | 
						|
  } else {
 | 
						|
    CatPrint (
 | 
						|
      Str,
 | 
						|
      L"Ata(%s,%s,%x)",
 | 
						|
      Atapi->PrimarySecondary ? L"Secondary" : L"Primary",
 | 
						|
      Atapi->SlaveMaster ? L"Slave" : L"Master",
 | 
						|
      Atapi->Lun
 | 
						|
      );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextScsi (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  SCSI_DEVICE_PATH  *Scsi;
 | 
						|
 | 
						|
  Scsi = DevPath;
 | 
						|
  CatPrint (Str, L"Scsi(%x,%x)", Scsi->Pun, Scsi->Lun);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextFibre (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  FIBRECHANNEL_DEVICE_PATH  *Fibre;
 | 
						|
 | 
						|
  Fibre = DevPath;
 | 
						|
  CatPrint (Str, L"Fibre(%lx,%lx)", Fibre->WWN, Fibre->Lun);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToText1394 (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  F1394_DEVICE_PATH *F1394;
 | 
						|
 | 
						|
  F1394 = DevPath;
 | 
						|
  CatPrint (Str, L"I1394(%lx)", F1394->Guid);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextUsb (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  USB_DEVICE_PATH *Usb;
 | 
						|
 | 
						|
  Usb = DevPath;
 | 
						|
  CatPrint (Str, L"USB(%x,%x)", Usb->ParentPortNumber, Usb->InterfaceNumber);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextUsbWWID (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  USB_WWID_DEVICE_PATH  *UsbWWId;
 | 
						|
 | 
						|
  UsbWWId = DevPath;
 | 
						|
  CatPrint (
 | 
						|
    Str,
 | 
						|
    L"UsbWwid(%x,%x,%x,\"WWID\")",
 | 
						|
    UsbWWId->VendorId,
 | 
						|
    UsbWWId->ProductId,
 | 
						|
    UsbWWId->InterfaceNumber
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextLogicalUnit (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;
 | 
						|
 | 
						|
  LogicalUnit = DevPath;
 | 
						|
  CatPrint (Str, L"Unit(%x)", LogicalUnit->Lun);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextUsbClass (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  USB_CLASS_DEVICE_PATH *UsbClass;
 | 
						|
 | 
						|
  UsbClass = DevPath;
 | 
						|
 | 
						|
  if (AllowShortcuts == TRUE) {
 | 
						|
    switch (UsbClass->DeviceClass) {
 | 
						|
    case 1:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbAudio(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 2:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbCDCControl(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 3:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbHID(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 6:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbImage(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 7:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbPrinter(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 8:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbMassStorage(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 9:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbHub(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 10:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbCDCData(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 11:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbSmartCard(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 14:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbVideo(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 220:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbDiagnostic(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 224:
 | 
						|
      CatPrint (
 | 
						|
        Str,
 | 
						|
        L"UsbWireless(%x,%x,%x,%x)",
 | 
						|
        UsbClass->VendorId,
 | 
						|
        UsbClass->ProductId,
 | 
						|
        UsbClass->DeviceSubClass,
 | 
						|
        UsbClass->DeviceProtocol
 | 
						|
        );
 | 
						|
      break;
 | 
						|
 | 
						|
    case 254:
 | 
						|
      if (UsbClass->DeviceSubClass == 1) {
 | 
						|
        CatPrint (
 | 
						|
          Str,
 | 
						|
          L"UsbDeviceFirmwareUpdate(%x,%x,%x)",
 | 
						|
          UsbClass->VendorId,
 | 
						|
          UsbClass->ProductId,
 | 
						|
          UsbClass->DeviceProtocol
 | 
						|
          );
 | 
						|
      } else if (UsbClass->DeviceSubClass == 2) {
 | 
						|
        CatPrint (
 | 
						|
          Str,
 | 
						|
          L"UsbIrdaBridge(%x,%x,%x)",
 | 
						|
          UsbClass->VendorId,
 | 
						|
          UsbClass->ProductId,
 | 
						|
          UsbClass->DeviceProtocol
 | 
						|
          );
 | 
						|
      } else if (UsbClass->DeviceSubClass == 3) {
 | 
						|
        CatPrint (
 | 
						|
          Str,
 | 
						|
          L"UsbTestAndMeasurement(%x,%x,%x)",
 | 
						|
          UsbClass->VendorId,
 | 
						|
          UsbClass->ProductId,
 | 
						|
          UsbClass->DeviceProtocol
 | 
						|
          );
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    default:
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (
 | 
						|
    Str,
 | 
						|
    L"UsbClass(%x,%x,%x,%x,%x)",
 | 
						|
    UsbClass->VendorId,
 | 
						|
    UsbClass->ProductId,
 | 
						|
    UsbClass->DeviceClass,
 | 
						|
    UsbClass->DeviceSubClass,
 | 
						|
    UsbClass->DeviceProtocol
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextI2O (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  I2O_DEVICE_PATH *I2O;
 | 
						|
 | 
						|
  I2O = DevPath;
 | 
						|
  CatPrint (Str, L"I2O(%x)", I2O->Tid);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextMacAddr (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  MAC_ADDR_DEVICE_PATH  *MAC;
 | 
						|
  UINTN                 HwAddressSize;
 | 
						|
  UINTN                 Index;
 | 
						|
 | 
						|
  MAC           = DevPath;
 | 
						|
 | 
						|
  HwAddressSize = sizeof (EFI_MAC_ADDRESS);
 | 
						|
  if (MAC->IfType == 0x01 || MAC->IfType == 0x00) {
 | 
						|
    HwAddressSize = 6;
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (Str, L"MAC(");
 | 
						|
 | 
						|
  for (Index = 0; Index < HwAddressSize; Index++) {
 | 
						|
    CatPrint (Str, L"%02x", MAC->MacAddress.Addr[Index]);
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (Str, L",%x)", MAC->IfType);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextIPv4 (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  IPv4_DEVICE_PATH  *IP;
 | 
						|
 | 
						|
  IP = DevPath;
 | 
						|
  if (DisplayOnly == TRUE) {
 | 
						|
    CatPrint (
 | 
						|
      Str,
 | 
						|
      L"IPv4(%d.%d.%d.%d)",
 | 
						|
      IP->RemoteIpAddress.Addr[0],
 | 
						|
      IP->RemoteIpAddress.Addr[1],
 | 
						|
      IP->RemoteIpAddress.Addr[2],
 | 
						|
      IP->RemoteIpAddress.Addr[3]
 | 
						|
      );
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (
 | 
						|
    Str,
 | 
						|
    L"IPv4(%d.%d.%d.%d,%s,%s,%d.%d.%d.%d)",
 | 
						|
    IP->RemoteIpAddress.Addr[0],
 | 
						|
    IP->RemoteIpAddress.Addr[1],
 | 
						|
    IP->RemoteIpAddress.Addr[2],
 | 
						|
    IP->RemoteIpAddress.Addr[3],
 | 
						|
    IP->Protocol ? L"TCP" : L"UDP",
 | 
						|
    (IP->StaticIpAddress == TRUE) ? L"Static" : L"DHCP",
 | 
						|
    IP->LocalIpAddress.Addr[0],
 | 
						|
    IP->LocalIpAddress.Addr[1],
 | 
						|
    IP->LocalIpAddress.Addr[2],
 | 
						|
    IP->LocalIpAddress.Addr[3]
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextIPv6 (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  IPv6_DEVICE_PATH  *IP;
 | 
						|
 | 
						|
  IP = DevPath;
 | 
						|
  if (DisplayOnly == TRUE) {
 | 
						|
    CatPrint (
 | 
						|
      Str,
 | 
						|
      L"IPv6(%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x)",
 | 
						|
      IP->RemoteIpAddress.Addr[0],
 | 
						|
      IP->RemoteIpAddress.Addr[1],
 | 
						|
      IP->RemoteIpAddress.Addr[2],
 | 
						|
      IP->RemoteIpAddress.Addr[3],
 | 
						|
      IP->RemoteIpAddress.Addr[4],
 | 
						|
      IP->RemoteIpAddress.Addr[5],
 | 
						|
      IP->RemoteIpAddress.Addr[6],
 | 
						|
      IP->RemoteIpAddress.Addr[7],
 | 
						|
      IP->RemoteIpAddress.Addr[8],
 | 
						|
      IP->RemoteIpAddress.Addr[9],
 | 
						|
      IP->RemoteIpAddress.Addr[10],
 | 
						|
      IP->RemoteIpAddress.Addr[11],
 | 
						|
      IP->RemoteIpAddress.Addr[12],
 | 
						|
      IP->RemoteIpAddress.Addr[13],
 | 
						|
      IP->RemoteIpAddress.Addr[14],
 | 
						|
      IP->RemoteIpAddress.Addr[15]
 | 
						|
      );
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (
 | 
						|
    Str,
 | 
						|
    L"IPv6(%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x,%s,%s,%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x)",
 | 
						|
    IP->RemoteIpAddress.Addr[0],
 | 
						|
    IP->RemoteIpAddress.Addr[1],
 | 
						|
    IP->RemoteIpAddress.Addr[2],
 | 
						|
    IP->RemoteIpAddress.Addr[3],
 | 
						|
    IP->RemoteIpAddress.Addr[4],
 | 
						|
    IP->RemoteIpAddress.Addr[5],
 | 
						|
    IP->RemoteIpAddress.Addr[6],
 | 
						|
    IP->RemoteIpAddress.Addr[7],
 | 
						|
    IP->RemoteIpAddress.Addr[8],
 | 
						|
    IP->RemoteIpAddress.Addr[9],
 | 
						|
    IP->RemoteIpAddress.Addr[10],
 | 
						|
    IP->RemoteIpAddress.Addr[11],
 | 
						|
    IP->RemoteIpAddress.Addr[12],
 | 
						|
    IP->RemoteIpAddress.Addr[13],
 | 
						|
    IP->RemoteIpAddress.Addr[14],
 | 
						|
    IP->RemoteIpAddress.Addr[15],
 | 
						|
    IP->Protocol ? L"TCP" : L"UDP",
 | 
						|
    (IP->StaticIpAddress == TRUE) ? L"Static" : L"DHCP",
 | 
						|
    IP->LocalIpAddress.Addr[0],
 | 
						|
    IP->LocalIpAddress.Addr[1],
 | 
						|
    IP->LocalIpAddress.Addr[2],
 | 
						|
    IP->LocalIpAddress.Addr[3],
 | 
						|
    IP->LocalIpAddress.Addr[4],
 | 
						|
    IP->LocalIpAddress.Addr[5],
 | 
						|
    IP->LocalIpAddress.Addr[6],
 | 
						|
    IP->LocalIpAddress.Addr[7],
 | 
						|
    IP->LocalIpAddress.Addr[8],
 | 
						|
    IP->LocalIpAddress.Addr[9],
 | 
						|
    IP->LocalIpAddress.Addr[10],
 | 
						|
    IP->LocalIpAddress.Addr[11],
 | 
						|
    IP->LocalIpAddress.Addr[12],
 | 
						|
    IP->LocalIpAddress.Addr[13],
 | 
						|
    IP->LocalIpAddress.Addr[14],
 | 
						|
    IP->LocalIpAddress.Addr[15]
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextInfiniBand (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  INFINIBAND_DEVICE_PATH  *InfiniBand;
 | 
						|
 | 
						|
  InfiniBand = DevPath;
 | 
						|
  CatPrint (
 | 
						|
    Str,
 | 
						|
    L"Infiniband(%x,%g,%lx,%lx,%lx)",
 | 
						|
    InfiniBand->ResourceFlags,
 | 
						|
    InfiniBand->PortGid,
 | 
						|
    InfiniBand->ServiceId,
 | 
						|
    InfiniBand->TargetPortId,
 | 
						|
    InfiniBand->DeviceId
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextUart (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  UART_DEVICE_PATH  *Uart;
 | 
						|
  CHAR8             Parity;
 | 
						|
 | 
						|
  Uart = DevPath;
 | 
						|
  switch (Uart->Parity) {
 | 
						|
  case 0:
 | 
						|
    Parity = 'D';
 | 
						|
    break;
 | 
						|
 | 
						|
  case 1:
 | 
						|
    Parity = 'N';
 | 
						|
    break;
 | 
						|
 | 
						|
  case 2:
 | 
						|
    Parity = 'E';
 | 
						|
    break;
 | 
						|
 | 
						|
  case 3:
 | 
						|
    Parity = 'O';
 | 
						|
    break;
 | 
						|
 | 
						|
  case 4:
 | 
						|
    Parity = 'M';
 | 
						|
    break;
 | 
						|
 | 
						|
  case 5:
 | 
						|
    Parity = 'S';
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    Parity = 'x';
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  if (Uart->BaudRate == 0) {
 | 
						|
    CatPrint (Str, L"Uart(DEFAULT,");
 | 
						|
  } else {
 | 
						|
    CatPrint (Str, L"Uart(%ld,", Uart->BaudRate);
 | 
						|
  }
 | 
						|
 | 
						|
  if (Uart->DataBits == 0) {
 | 
						|
    CatPrint (Str, L"DEFAULT,");
 | 
						|
  } else {
 | 
						|
    CatPrint (Str, L"%d,", Uart->DataBits);
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (Str, L"%c,", Parity);
 | 
						|
 | 
						|
  switch (Uart->StopBits) {
 | 
						|
  case 0:
 | 
						|
    CatPrint (Str, L"D)");
 | 
						|
    break;
 | 
						|
 | 
						|
  case 1:
 | 
						|
    CatPrint (Str, L"1)");
 | 
						|
    break;
 | 
						|
 | 
						|
  case 2:
 | 
						|
    CatPrint (Str, L"1.5)");
 | 
						|
    break;
 | 
						|
 | 
						|
  case 3:
 | 
						|
    CatPrint (Str, L"2)");
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    CatPrint (Str, L"x)");
 | 
						|
    break;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextiSCSI (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  ISCSI_DEVICE_PATH_WITH_NAME *iSCSI;
 | 
						|
  UINT16                      Options;
 | 
						|
 | 
						|
  iSCSI = DevPath;
 | 
						|
  CatPrint (
 | 
						|
    Str,
 | 
						|
    L"iSCSI(%s,%x,%lx,",
 | 
						|
    iSCSI->iSCSITargetName,
 | 
						|
    iSCSI->TargetPortalGroupTag,
 | 
						|
    iSCSI->Lun
 | 
						|
    );
 | 
						|
 | 
						|
  Options = iSCSI->LoginOption;
 | 
						|
  CatPrint (Str, L"%s,", ((Options >> 1) & 0x0001) ? L"CRC32C" : L"None");
 | 
						|
  CatPrint (Str, L"%s,", ((Options >> 3) & 0x0001) ? L"CRC32C" : L"None");
 | 
						|
  if ((Options >> 11) & 0x0001) {
 | 
						|
    CatPrint (Str, L"%s,", L"None");
 | 
						|
  } else if ((Options >> 12) & 0x0001) {
 | 
						|
    CatPrint (Str, L"%s,", L"CHAP_UNI");
 | 
						|
  } else {
 | 
						|
    CatPrint (Str, L"%s,", L"CHAP_BI");
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (Str, L"%s)", (iSCSI->NetworkProtocol == 0) ? L"TCP" : L"reserved");
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextHardDrive (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  HARDDRIVE_DEVICE_PATH *Hd;
 | 
						|
 | 
						|
  Hd = DevPath;
 | 
						|
  switch (Hd->SignatureType) {
 | 
						|
  case 0:
 | 
						|
    CatPrint (
 | 
						|
      Str,
 | 
						|
      L"HD(%d,%s,0,",
 | 
						|
      Hd->PartitionNumber,
 | 
						|
      L"None"
 | 
						|
      );
 | 
						|
    break;
 | 
						|
 | 
						|
  case SIGNATURE_TYPE_MBR:
 | 
						|
    CatPrint (
 | 
						|
      Str,
 | 
						|
      L"HD(%d,%s,%08x,",
 | 
						|
      Hd->PartitionNumber,
 | 
						|
      L"MBR",
 | 
						|
      *((UINT32 *) (&(Hd->Signature[0])))
 | 
						|
      );
 | 
						|
    break;
 | 
						|
 | 
						|
  case SIGNATURE_TYPE_GUID:
 | 
						|
    CatPrint (
 | 
						|
      Str,
 | 
						|
      L"HD(%d,%s,%g,",
 | 
						|
      Hd->PartitionNumber,
 | 
						|
      L"GUID",
 | 
						|
      (EFI_GUID *) &(Hd->Signature[0])
 | 
						|
      );
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (Str, L"%lx,%lx)", Hd->PartitionStart, Hd->PartitionSize);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextCDROM (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  CDROM_DEVICE_PATH *Cd;
 | 
						|
 | 
						|
  Cd = DevPath;
 | 
						|
  if (DisplayOnly == TRUE) {
 | 
						|
    CatPrint (Str, L"CDROM(%x)", Cd->BootEntry);
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (Str, L"CDROM(%x,%lx,%lx)", Cd->BootEntry, Cd->PartitionStart, Cd->PartitionSize);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextFilePath (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  FILEPATH_DEVICE_PATH  *Fp;
 | 
						|
 | 
						|
  Fp = DevPath;
 | 
						|
  CatPrint (Str, L"%s", Fp->PathName);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextMediaProtocol (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  MEDIA_PROTOCOL_DEVICE_PATH  *MediaProt;
 | 
						|
 | 
						|
  MediaProt = DevPath;
 | 
						|
  CatPrint (Str, L"Media(%g)", &MediaProt->Protocol);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextBBS (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  BBS_BBS_DEVICE_PATH *Bbs;
 | 
						|
  CHAR16              *Type;
 | 
						|
 | 
						|
  Bbs = DevPath;
 | 
						|
  switch (Bbs->DeviceType) {
 | 
						|
  case BBS_TYPE_FLOPPY:
 | 
						|
    Type = L"Floppy";
 | 
						|
    break;
 | 
						|
 | 
						|
  case BBS_TYPE_HARDDRIVE:
 | 
						|
    Type = L"HD";
 | 
						|
    break;
 | 
						|
 | 
						|
  case BBS_TYPE_CDROM:
 | 
						|
    Type = L"CDROM";
 | 
						|
    break;
 | 
						|
 | 
						|
  case BBS_TYPE_PCMCIA:
 | 
						|
    Type = L"PCMCIA";
 | 
						|
    break;
 | 
						|
 | 
						|
  case BBS_TYPE_USB:
 | 
						|
    Type = L"USB";
 | 
						|
    break;
 | 
						|
 | 
						|
  case BBS_TYPE_EMBEDDED_NETWORK:
 | 
						|
    Type = L"Network";
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    Type = L"?";
 | 
						|
    break;
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (Str, L"BBS(%s,%a", Type, Bbs->String);
 | 
						|
 | 
						|
  if (DisplayOnly == TRUE) {
 | 
						|
    CatPrint (Str, L")");
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  CatPrint (Str, L",%x)", Bbs->StatusFlag);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextEndInstance (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  CatPrint (Str, L",");
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
DevPathToTextNodeUnknown (
 | 
						|
  IN OUT POOL_PRINT  *Str,
 | 
						|
  IN VOID            *DevPath,
 | 
						|
  IN BOOLEAN         DisplayOnly,
 | 
						|
  IN BOOLEAN         AllowShortcuts
 | 
						|
  )
 | 
						|
{
 | 
						|
  CatPrint (Str, L"?");
 | 
						|
}
 | 
						|
 | 
						|
DEVICE_PATH_TO_TEXT_TABLE DevPathToTextTable[] = {
 | 
						|
  {HARDWARE_DEVICE_PATH, HW_PCI_DP, DevPathToTextPci},
 | 
						|
  {HARDWARE_DEVICE_PATH, HW_PCCARD_DP, DevPathToTextPccard},
 | 
						|
  {HARDWARE_DEVICE_PATH, HW_MEMMAP_DP, DevPathToTextMemMap},
 | 
						|
  {HARDWARE_DEVICE_PATH, HW_VENDOR_DP, DevPathToTextVendor},
 | 
						|
  {HARDWARE_DEVICE_PATH, HW_CONTROLLER_DP, DevPathToTextController},
 | 
						|
  {ACPI_DEVICE_PATH, ACPI_DP, DevPathToTextAcpi},
 | 
						|
  {ACPI_DEVICE_PATH, ACPI_EXTENDED_DP, DevPathToTextExtAcpi},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_ATAPI_DP, DevPathToTextAtapi},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_SCSI_DP, DevPathToTextScsi},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_FIBRECHANNEL_DP, DevPathToTextFibre},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_1394_DP, DevPathToText1394},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_USB_DP, DevPathToTextUsb},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_USB_WWID_DP, DevPathToTextUsbWWID},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_DEVICE_LOGICAL_UNIT_DP, DevPathToTextLogicalUnit},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_USB_CLASS_DP, DevPathToTextUsbClass},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_I2O_DP, DevPathToTextI2O},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_MAC_ADDR_DP, DevPathToTextMacAddr},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_IPv4_DP, DevPathToTextIPv4},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_IPv6_DP, DevPathToTextIPv6},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP, DevPathToTextInfiniBand},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_UART_DP, DevPathToTextUart},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_VENDOR_DP, DevPathToTextVendor},
 | 
						|
  {MESSAGING_DEVICE_PATH, MSG_ISCSI_DP, DevPathToTextiSCSI},
 | 
						|
  {MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP, DevPathToTextHardDrive},
 | 
						|
  {MEDIA_DEVICE_PATH, MEDIA_CDROM_DP, DevPathToTextCDROM},
 | 
						|
  {MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, DevPathToTextVendor},
 | 
						|
  {MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, DevPathToTextFilePath},
 | 
						|
  {MEDIA_DEVICE_PATH, MEDIA_PROTOCOL_DP, DevPathToTextMediaProtocol},
 | 
						|
  {MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, DevPathToTextFilePath},
 | 
						|
  {BBS_DEVICE_PATH, BBS_BBS_DP, DevPathToTextBBS},
 | 
						|
  {END_DEVICE_PATH_TYPE, END_INSTANCE_DEVICE_PATH_SUBTYPE, DevPathToTextEndInstance},
 | 
						|
  {0, 0, NULL}
 | 
						|
};
 | 
						|
 | 
						|
CHAR16 *
 | 
						|
ConvertDeviceNodeToText (
 | 
						|
  IN CONST EFI_DEVICE_PATH_PROTOCOL  *DeviceNode,
 | 
						|
  IN BOOLEAN                         DisplayOnly,
 | 
						|
  IN BOOLEAN                         AllowShortcuts
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Convert a device node to its text representation.
 | 
						|
 | 
						|
  Arguments:
 | 
						|
    DeviceNode       -   Points to the device node to be converted.
 | 
						|
    DisplayOnly      -   If DisplayOnly is TRUE, then the shorter text representation
 | 
						|
                         of the display node is used, where applicable. If DisplayOnly
 | 
						|
                         is FALSE, then the longer text representation of the display node
 | 
						|
                         is used.
 | 
						|
    AllowShortcuts   -   If AllowShortcuts is TRUE, then the shortcut forms of text
 | 
						|
                         representation for a device node can be used, where applicable.
 | 
						|
 | 
						|
  Returns:
 | 
						|
    A pointer        -   a pointer to the allocated text representation of the device node.
 | 
						|
    NULL             -   if DeviceNode is NULL or there was insufficient memory.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  POOL_PRINT  Str;
 | 
						|
  UINTN       Index;
 | 
						|
  UINTN       NewSize;
 | 
						|
  VOID        (*DumpNode)(POOL_PRINT *, VOID *, BOOLEAN, BOOLEAN);
 | 
						|
 | 
						|
  if (DeviceNode == NULL) {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  ZeroMem (&Str, sizeof (Str));
 | 
						|
 | 
						|
  //
 | 
						|
  // Process the device path node
 | 
						|
  //
 | 
						|
  DumpNode = NULL;
 | 
						|
  for (Index = 0; DevPathToTextTable[Index].Function != NULL; Index++) {
 | 
						|
    if (DevicePathType (DeviceNode) == DevPathToTextTable[Index].Type &&
 | 
						|
        DevicePathSubType (DeviceNode) == DevPathToTextTable[Index].SubType
 | 
						|
        ) {
 | 
						|
      DumpNode = DevPathToTextTable[Index].Function;
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  //
 | 
						|
  // If not found, use a generic function
 | 
						|
  //
 | 
						|
  if (DumpNode == NULL) {
 | 
						|
    DumpNode = DevPathToTextNodeUnknown;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Print this node
 | 
						|
  //
 | 
						|
  DumpNode (&Str, (VOID *) DeviceNode, DisplayOnly, AllowShortcuts);
 | 
						|
 | 
						|
  //
 | 
						|
  // Shrink pool used for string allocation
 | 
						|
  //
 | 
						|
  NewSize = (Str.Len + 1) * sizeof (CHAR16);
 | 
						|
  Str.Str = ReallocatePool (Str.Str, NewSize, NewSize);
 | 
						|
  ASSERT (Str.Str != NULL);
 | 
						|
  Str.Str[Str.Len] = 0;
 | 
						|
  return Str.Str;
 | 
						|
}
 | 
						|
 | 
						|
CHAR16 *
 | 
						|
ConvertDevicePathToText (
 | 
						|
  IN CONST EFI_DEVICE_PATH_PROTOCOL   *DevicePath,
 | 
						|
  IN BOOLEAN                          DisplayOnly,
 | 
						|
  IN BOOLEAN                          AllowShortcuts
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Convert a device path to its text representation.
 | 
						|
 | 
						|
  Arguments:
 | 
						|
    DeviceNode       -   Points to the device path to be converted.
 | 
						|
    DisplayOnly      -   If DisplayOnly is TRUE, then the shorter text representation
 | 
						|
                         of the display node is used, where applicable. If DisplayOnly
 | 
						|
                         is FALSE, then the longer text representation of the display node
 | 
						|
                         is used.
 | 
						|
    AllowShortcuts   -   If AllowShortcuts is TRUE, then the shortcut forms of text
 | 
						|
                         representation for a device node can be used, where applicable.
 | 
						|
 | 
						|
  Returns:
 | 
						|
    A pointer        -   a pointer to the allocated text representation of the device path.
 | 
						|
    NULL             -   if DeviceNode is NULL or there was insufficient memory.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  POOL_PRINT                Str;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *DevPathNode;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *UnpackDevPath;
 | 
						|
  UINTN                     Index;
 | 
						|
  UINTN                     NewSize;
 | 
						|
  VOID                      (*DumpNode) (POOL_PRINT *, VOID *, BOOLEAN, BOOLEAN);
 | 
						|
 | 
						|
  if (DevicePath == NULL) {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  ZeroMem (&Str, sizeof (Str));
 | 
						|
 | 
						|
  //
 | 
						|
  // Unpacked the device path
 | 
						|
  //
 | 
						|
  UnpackDevPath = UnpackDevicePath ((EFI_DEVICE_PATH_PROTOCOL *) DevicePath);
 | 
						|
  ASSERT (UnpackDevPath != NULL);
 | 
						|
 | 
						|
  //
 | 
						|
  // Process each device path node
 | 
						|
  //
 | 
						|
  DevPathNode = UnpackDevPath;
 | 
						|
  while (!IsDevicePathEnd (DevPathNode)) {
 | 
						|
    //
 | 
						|
    // Find the handler to dump this device path node
 | 
						|
    //
 | 
						|
    DumpNode = NULL;
 | 
						|
    for (Index = 0; DevPathToTextTable[Index].Function; Index += 1) {
 | 
						|
 | 
						|
      if (DevicePathType (DevPathNode) == DevPathToTextTable[Index].Type &&
 | 
						|
          DevicePathSubType (DevPathNode) == DevPathToTextTable[Index].SubType
 | 
						|
          ) {
 | 
						|
        DumpNode = DevPathToTextTable[Index].Function;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
    //
 | 
						|
    // If not found, use a generic function
 | 
						|
    //
 | 
						|
    if (!DumpNode) {
 | 
						|
      DumpNode = DevPathToTextNodeUnknown;
 | 
						|
    }
 | 
						|
    //
 | 
						|
    //  Put a path seperator in if needed
 | 
						|
    //
 | 
						|
    if (Str.Len && DumpNode != DevPathToTextEndInstance) {
 | 
						|
      if (*(Str.Str + Str.Len / sizeof (CHAR16) - 1) != L',') {	
 | 
						|
        CatPrint (&Str, L"/");
 | 
						|
      }	  
 | 
						|
    }
 | 
						|
    //
 | 
						|
    // Print this node of the device path
 | 
						|
    //
 | 
						|
    DumpNode (&Str, DevPathNode, DisplayOnly, AllowShortcuts);
 | 
						|
 | 
						|
    //
 | 
						|
    // Next device path node
 | 
						|
    //
 | 
						|
    DevPathNode = NextDevicePathNode (DevPathNode);
 | 
						|
  }
 | 
						|
  //
 | 
						|
  // Shrink pool used for string allocation
 | 
						|
  //
 | 
						|
  gBS->FreePool (UnpackDevPath);
 | 
						|
 | 
						|
  NewSize = (Str.Len + 1) * sizeof (CHAR16);
 | 
						|
  Str.Str = ReallocatePool (Str.Str, NewSize, NewSize);
 | 
						|
  ASSERT (Str.Str != NULL);
 | 
						|
  Str.Str[Str.Len] = 0;
 | 
						|
  return Str.Str;
 | 
						|
}
 |