SecureBootConfigDevicePath.c revision 4fd606d1f5abe38e1f42c38de1d2e895166bd0f4
1N/A/** @file
1N/A Internal function defines the default device path string for SecureBoot configuration module.
1N/A
1N/ACopyright (c) 2012, Intel Corporation. All rights reserved.<BR>
1N/AThis program and the accompanying materials
1N/Aare licensed and made available under the terms and conditions of the BSD License
1N/Awhich accompanies this distribution. The full text of the license may be found at
1N/Ahttp://opensource.org/licenses/bsd-license.php
1N/A
1N/ATHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
1N/AWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
1N/A
1N/A**/
1N/A
1N/A#include "SecureBootConfigImpl.h"
1N/A
1N/A/**
1N/A Concatenates a formatted unicode string to allocated pool.
1N/A The caller must free the resulting buffer.
1N/A
1N/A @param[in, out] Str Tracks the allocated pool, size in use, and amount of pool allocated.
1N/A @param[in] Fmt The format string
1N/A @param[in] ... The data will be printed.
1N/A
1N/A @return Allocated buffer with the formatted string printed in it.
1N/A The caller must free the allocated buffer.
1N/A The buffer allocation is not packed.
1N/A
1N/A**/
1N/ACHAR16 *
1N/AEFIAPI
1N/ACatPrint (
1N/A IN OUT POOL_PRINT *Str,
1N/A IN CHAR16 *Fmt,
1N/A ...
1N/A )
1N/A{
1N/A UINT16 *AppendStr;
1N/A VA_LIST Args;
1N/A UINTN StringSize;
1N/A
1N/A AppendStr = AllocateZeroPool (0x1000);
1N/A if (AppendStr == NULL) {
1N/A return Str->Str;
1N/A }
1N/A
1N/A VA_START (Args, Fmt);
1N/A UnicodeVSPrint (AppendStr, 0x1000, Fmt, Args);
1N/A VA_END (Args);
1N/A if (NULL == Str->Str) {
1N/A StringSize = StrSize (AppendStr);
1N/A Str->Str = AllocateZeroPool (StringSize);
1N/A ASSERT (Str->Str != NULL);
1N/A } else {
1N/A StringSize = StrSize (AppendStr);
1N/A StringSize += (StrSize (Str->Str) - sizeof (UINT16));
1N/A
1N/A Str->Str = ReallocatePool (
1N/A StrSize (Str->Str),
1N/A StringSize,
1N/A Str->Str
1N/A );
1N/A ASSERT (Str->Str != NULL);
1N/A }
1N/A
1N/A Str->Maxlen = MAX_CHAR * sizeof (UINT16);
1N/A if (StringSize < Str->Maxlen) {
1N/A StrCat (Str->Str, AppendStr);
1N/A Str->Len = StringSize - sizeof (UINT16);
1N/A }
1N/A
1N/A FreePool (AppendStr);
1N/A return Str->Str;
1N/A}
1N/A
1N/A/**
1N/A Convert Device Path to a Unicode string for printing.
1N/A
1N/A @param[in, out] Str The buffer holding the output string.
1N/A This buffer contains the length of the string and
1N/A the maixmum length reserved for the string buffer.
1N/A @param[in] DevPath The device path.
1N/A
1N/A**/
1N/AVOID
1N/ADevPathPci (
1N/A IN OUT POOL_PRINT *Str,
1N/A IN VOID *DevPath
1N/A )
1N/A{
1N/A PCI_DEVICE_PATH *Pci;
1N/A
1N/A Pci = DevPath;
1N/A CatPrint (Str, L"Pci(%x|%x)", (UINTN) Pci->Device, (UINTN) Pci->Function);
1N/A}
1N/A
1N/A/**
1N/A Convert Device Path to a Unicode string for printing.
1N/A
1N/A @param[in, out] Str The buffer holding the output string.
1N/A This buffer contains the length of the string and
1N/A the maixmum length reserved for the string buffer.
1N/A @param[in] DevPath The device path.
1N/A
1N/A**/
1N/AVOID
1N/ADevPathPccard (
1N/A IN OUT POOL_PRINT *Str,
1N/A IN VOID *DevPath
1N/A )
1N/A{
1N/A PCCARD_DEVICE_PATH *Pccard;
1N/A
1N/A Pccard = DevPath;
1N/A CatPrint (Str, L"Pcmcia(Function%x)", (UINTN) Pccard->FunctionNumber);
1N/A}
1N/A
1N/A/**
1N/A Convert Device Path to a Unicode string for printing.
1N/A
1N/A @param[in, out] Str The buffer holding the output string.
1N/A This buffer contains the length of the string and
1N/A the maixmum length reserved for the string buffer.
1N/A @param[in] DevPath The device path.
1N/A
1N/A**/
1N/AVOID
1N/ADevPathMemMap (
1N/A IN OUT POOL_PRINT *Str,
1N/A IN VOID *DevPath
1N/A )
1N/A{
1N/A MEMMAP_DEVICE_PATH *MemMap;
1N/A
1N/A MemMap = DevPath;
1N/A CatPrint (
1N/A Str,
1N/A L"MemMap(%d:%lx-%lx)",
1N/A (UINTN) MemMap->MemoryType,
1N/A MemMap->StartingAddress,
1N/A MemMap->EndingAddress
1N/A );
1N/A}
1N/A
1N/A/**
1N/A Convert Device Path to a Unicode string for printing.
1N/A
1N/A @param[in, out] Str The buffer holding the output string.
1N/A This buffer contains the length of the string and
1N/A the maixmum length reserved for the string buffer.
1N/A @param[in] DevPath The device path.
1N/A
1N/A**/
1N/AVOID
1N/ADevPathController (
1N/A IN OUT POOL_PRINT *Str,
1N/A IN VOID *DevPath
1N/A )
1N/A{
1N/A CONTROLLER_DEVICE_PATH *Controller;
1N/A
1N/A Controller = DevPath;
1N/A CatPrint (Str, L"Ctrl(%d)", (UINTN) Controller->ControllerNumber);
1N/A}
1N/A
1N/A
1N/A/**
1N/A Convert Vendor device path to device name.
1N/A
1N/A @param[in, out] Str The buffer store device name
1N/A @param[in] DevPath Pointer to vendor device path
1N/A
1N/A**/
1N/AVOID
1N/ADevPathVendor (
1N/A IN OUT POOL_PRINT *Str,
1N/A IN VOID *DevPath
1N/A )
1N/A{
1N/A VENDOR_DEVICE_PATH *Vendor;
1N/A CHAR16 *Type;
1N/A UINTN DataLength;
1N/A UINTN Index;
1N/A UINT32 FlowControlMap;
1N/A
1N/A UINT16 Info;
1N/A
1N/A Vendor = DevPath;
1N/A
1N/A switch (DevicePathType (&Vendor->Header)) {
1N/A case HARDWARE_DEVICE_PATH:
1N/A Type = L"Hw";
break;
case MESSAGING_DEVICE_PATH:
Type = L"Msg";
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, &gEfiUartDevicePathGuid )) {
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, &gEfiSasDevicePathGuid)) {
CatPrint (
Str,
L"SAS(%lx,%lx,%x,",
((SAS_DEVICE_PATH *) Vendor)->SasAddress,
((SAS_DEVICE_PATH *) Vendor)->Lun,
(UINTN) ((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)) != 0) ? L"SATA" : L"SAS",
((Info & (0x1 << 5)) != 0) ? L"External" : L"Internal",
((Info & (0x1 << 6)) != 0) ? L"Expanded" : L"Direct"
);
if ((Info & 0x0f) == 1) {
CatPrint (Str, L"0,");
} else {
CatPrint (Str, L"%x,", (UINTN) ((Info >> 8) & 0xff));
}
} else {
CatPrint (Str, L"0,0,0,0,");
}
CatPrint (Str, L"%x)", (UINTN) ((SAS_DEVICE_PATH *) Vendor)->Reserved);
return ;
} else if (CompareGuid (&Vendor->Guid, &gEfiDebugPortProtocolGuid)) {
CatPrint (Str, L"DebugPort()");
return ;
}
break;
case MEDIA_DEVICE_PATH:
Type = L"Media";
break;
default:
Type = L"?";
break;
}
CatPrint (Str, L"Ven%s(%g", Type, &Vendor->Guid);
DataLength = DevicePathNodeLength (&Vendor->Header) - sizeof (VENDOR_DEVICE_PATH);
if (DataLength > 0) {
CatPrint (Str, L",");
for (Index = 0; Index < DataLength; Index++) {
CatPrint (Str, L"%02x", (UINTN) ((VENDOR_DEVICE_PATH_WITH_DATA *) Vendor)->VendorDefinedData[Index]);
}
}
CatPrint (Str, L")");
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathAcpi (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
ACPI_HID_DEVICE_PATH *Acpi;
Acpi = DevPath;
if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
CatPrint (Str, L"Acpi(PNP%04x,%x)", (UINTN) EISA_ID_TO_NUM (Acpi->HID), (UINTN) Acpi->UID);
} else {
CatPrint (Str, L"Acpi(%08x,%x)", (UINTN) Acpi->HID, (UINTN) Acpi->UID);
}
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathExtendedAcpi (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
ACPI_EXTENDED_HID_DEVICE_PATH *ExtendedAcpi;
//
// Index for HID, UID and CID strings, 0 for non-exist
//
UINT16 HIDSTRIdx;
UINT16 UIDSTRIdx;
UINT16 CIDSTRIdx;
UINT16 Index;
UINT16 Length;
UINT16 Anchor;
CHAR8 *AsChar8Array;
HIDSTRIdx = 0;
UIDSTRIdx = 0;
CIDSTRIdx = 0;
ExtendedAcpi = DevPath;
Length = (UINT16) DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) ExtendedAcpi);
AsChar8Array = (CHAR8 *) ExtendedAcpi;
//
// find HIDSTR
//
Anchor = 16;
for (Index = Anchor; Index < Length && AsChar8Array[Index] != '\0'; Index++) {
;
}
if (Index > Anchor) {
HIDSTRIdx = Anchor;
}
//
// find UIDSTR
//
Anchor = (UINT16) (Index + 1);
for (Index = Anchor; Index < Length && AsChar8Array[Index] != '\0'; Index++) {
;
}
if (Index > Anchor) {
UIDSTRIdx = Anchor;
}
//
// find CIDSTR
//
Anchor = (UINT16) (Index + 1);
for (Index = Anchor; Index < Length && AsChar8Array[Index] != '\0'; Index++) {
;
}
if (Index > Anchor) {
CIDSTRIdx = Anchor;
}
if (HIDSTRIdx == 0 && CIDSTRIdx == 0 && ExtendedAcpi->UID == 0) {
CatPrint (Str, L"AcpiExp(");
if ((ExtendedAcpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->HID));
} else {
CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->HID);
}
if ((ExtendedAcpi->CID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->CID));
} else {
CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->CID);
}
if (UIDSTRIdx != 0) {
CatPrint (Str, L"%a)", AsChar8Array + UIDSTRIdx);
} else {
CatPrint (Str, L"\"\")");
}
} else {
CatPrint (Str, L"AcpiEx(");
if ((ExtendedAcpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->HID));
} else {
CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->HID);
}
if ((ExtendedAcpi->CID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->CID));
} else {
CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->CID);
}
CatPrint (Str, L"%x,", (UINTN) ExtendedAcpi->UID);
if (HIDSTRIdx != 0) {
CatPrint (Str, L"%a,", AsChar8Array + HIDSTRIdx);
} else {
CatPrint (Str, L"\"\",");
}
if (CIDSTRIdx != 0) {
CatPrint (Str, L"%a,", AsChar8Array + CIDSTRIdx);
} else {
CatPrint (Str, L"\"\",");
}
if (UIDSTRIdx != 0) {
CatPrint (Str, L"%a)", AsChar8Array + UIDSTRIdx);
} else {
CatPrint (Str, L"\"\")");
}
}
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathAdrAcpi (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
ACPI_ADR_DEVICE_PATH *AcpiAdr;
UINT16 Index;
UINT16 Length;
UINT16 AdditionalAdrCount;
AcpiAdr = DevPath;
Length = (UINT16) DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr);
AdditionalAdrCount = (UINT16) ((Length - 8) / 4);
CatPrint (Str, L"AcpiAdr(%x", (UINTN) AcpiAdr->ADR);
for (Index = 0; Index < AdditionalAdrCount; Index++) {
CatPrint (Str, L",%x", (UINTN) *(UINT32 *) ((UINT8 *) AcpiAdr + 8 + Index * 4));
}
CatPrint (Str, L")");
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathAtapi (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
ATAPI_DEVICE_PATH *Atapi;
Atapi = DevPath;
CatPrint (
Str,
L"Ata(%s,%s)",
(Atapi->PrimarySecondary != 0)? L"Secondary" : L"Primary",
(Atapi->SlaveMaster != 0)? L"Slave" : L"Master"
);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathScsi (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
SCSI_DEVICE_PATH *Scsi;
Scsi = DevPath;
CatPrint (Str, L"Scsi(Pun%x,Lun%x)", (UINTN) Scsi->Pun, (UINTN) Scsi->Lun);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathFibre (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
FIBRECHANNEL_DEVICE_PATH *Fibre;
Fibre = DevPath;
CatPrint (Str, L"Fibre(Wwn%lx,Lun%x)", Fibre->WWN, Fibre->Lun);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPath1394 (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
F1394_DEVICE_PATH *F1394Path;
F1394Path = DevPath;
CatPrint (Str, L"1394(%lx)", &F1394Path->Guid);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathUsb (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
USB_DEVICE_PATH *Usb;
Usb = DevPath;
CatPrint (Str, L"Usb(%x,%x)", (UINTN) Usb->ParentPortNumber, (UINTN) Usb->InterfaceNumber);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathUsbWWID (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
USB_WWID_DEVICE_PATH *UsbWWId;
UsbWWId = DevPath;
CatPrint (
Str,
L"UsbWwid(%x,%x,%x,\"WWID\")",
(UINTN) UsbWWId->VendorId,
(UINTN) UsbWWId->ProductId,
(UINTN) UsbWWId->InterfaceNumber
);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathLogicalUnit (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;
LogicalUnit = DevPath;
CatPrint (Str, L"Unit(%x)", (UINTN) LogicalUnit->Lun);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathUsbClass (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
USB_CLASS_DEVICE_PATH *UsbClass;
UsbClass = DevPath;
CatPrint (
Str,
L"Usb Class(%x,%x,%x,%x,%x)",
(UINTN) UsbClass->VendorId,
(UINTN) UsbClass->ProductId,
(UINTN) UsbClass->DeviceClass,
(UINTN) UsbClass->DeviceSubClass,
(UINTN) UsbClass->DeviceProtocol
);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathSata (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
SATA_DEVICE_PATH *Sata;
Sata = DevPath;
if ((Sata->PortMultiplierPortNumber & SATA_HBA_DIRECT_CONNECT_FLAG) != 0) {
CatPrint (
Str,
L"Sata(%x,%x)",
(UINTN) Sata->HBAPortNumber,
(UINTN) Sata->Lun
);
} else {
CatPrint (
Str,
L"Sata(%x,%x,%x)",
(UINTN) Sata->HBAPortNumber,
(UINTN) Sata->PortMultiplierPortNumber,
(UINTN) Sata->Lun
);
}
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathI2O (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
I2O_DEVICE_PATH *I2OPath;
I2OPath = DevPath;
CatPrint (Str, L"I2O(%x)", (UINTN) I2OPath->Tid);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathMacAddr (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
MAC_ADDR_DEVICE_PATH *MACDevPath;
UINTN HwAddressSize;
UINTN Index;
MACDevPath = DevPath;
HwAddressSize = sizeof (EFI_MAC_ADDRESS);
if (MACDevPath->IfType == 0x01 || MACDevPath->IfType == 0x00) {
HwAddressSize = 6;
}
CatPrint (Str, L"Mac(");
for (Index = 0; Index < HwAddressSize; Index++) {
CatPrint (Str, L"%02x", (UINTN) MACDevPath->MacAddress.Addr[Index]);
}
CatPrint (Str, L")");
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathIPv4 (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
IPv4_DEVICE_PATH *IPDevPath;
IPDevPath = DevPath;
CatPrint (
Str,
L"IPv4(%d.%d.%d.%d:%d)",
(UINTN) IPDevPath->RemoteIpAddress.Addr[0],
(UINTN) IPDevPath->RemoteIpAddress.Addr[1],
(UINTN) IPDevPath->RemoteIpAddress.Addr[2],
(UINTN) IPDevPath->RemoteIpAddress.Addr[3],
(UINTN) IPDevPath->RemotePort
);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathIPv6 (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
IPv6_DEVICE_PATH *IPv6DevPath;
IPv6DevPath = DevPath;
CatPrint (
Str,
L"IPv6(%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x)",
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[0],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[1],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[2],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[3],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[4],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[5],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[6],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[7],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[8],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[9],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[10],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[11],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[12],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[13],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[14],
(UINTN) IPv6DevPath->RemoteIpAddress.Addr[15]
);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathInfiniBand (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
INFINIBAND_DEVICE_PATH *InfiniBand;
InfiniBand = DevPath;
CatPrint (
Str,
L"Infiniband(%x,%g,%lx,%lx,%lx)",
(UINTN) InfiniBand->ResourceFlags,
InfiniBand->PortGid,
InfiniBand->ServiceId,
InfiniBand->TargetPortId,
InfiniBand->DeviceId
);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathUart (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
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,%c,", Parity);
} else {
CatPrint (Str, L"Uart(%ld,%c,", Uart->BaudRate, Parity);
}
if (Uart->DataBits == 0) {
CatPrint (Str, L"D,");
} else {
CatPrint (Str, L"%d,", (UINTN) Uart->DataBits);
}
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;
}
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathiSCSI (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
ISCSI_DEVICE_PATH_WITH_NAME *IScsi;
UINT16 Options;
IScsi = DevPath;
CatPrint (
Str,
L"iSCSI(%a,%x,%lx,",
IScsi->TargetName,
(UINTN) IScsi->TargetPortalGroupTag,
IScsi->Lun
);
Options = IScsi->LoginOption;
CatPrint (Str, L"%s,", (((Options >> 1) & 0x0001) != 0) ? L"CRC32C" : L"None");
CatPrint (Str, L"%s,", (((Options >> 3) & 0x0001) != 0) ? L"CRC32C" : L"None");
if (((Options >> 11) & 0x0001) != 0) {
CatPrint (Str, L"%s,", L"None");
} else if (((Options >> 12) & 0x0001) != 0) {
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");
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathVlan (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
VLAN_DEVICE_PATH *Vlan;
Vlan = DevPath;
CatPrint (Str, L"Vlan(%d)", (UINTN) Vlan->VlanId);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathHardDrive (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
HARDDRIVE_DEVICE_PATH *Hd;
Hd = DevPath;
switch (Hd->SignatureType) {
case SIGNATURE_TYPE_MBR:
CatPrint (
Str,
L"HD(Part%d,Sig%08x)",
(UINTN) Hd->PartitionNumber,
(UINTN) *((UINT32 *) (&(Hd->Signature[0])))
);
break;
case SIGNATURE_TYPE_GUID:
CatPrint (
Str,
L"HD(Part%d,Sig%g)",
(UINTN) Hd->PartitionNumber,
(EFI_GUID *) &(Hd->Signature[0])
);
break;
default:
CatPrint (
Str,
L"HD(Part%d,MBRType=%02x,SigType=%02x)",
(UINTN) Hd->PartitionNumber,
(UINTN) Hd->MBRType,
(UINTN) Hd->SignatureType
);
break;
}
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathCDROM (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
CDROM_DEVICE_PATH *Cd;
Cd = DevPath;
CatPrint (Str, L"CDROM(Entry%x)", (UINTN) Cd->BootEntry);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathFilePath (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
FILEPATH_DEVICE_PATH *Fp;
Fp = DevPath;
CatPrint (Str, L"%s", Fp->PathName);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathMediaProtocol (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
MEDIA_PROTOCOL_DEVICE_PATH *MediaProt;
MediaProt = DevPath;
CatPrint (Str, L"Media(%g)", &MediaProt->Protocol);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathFvFilePath (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFilePath;
FvFilePath = DevPath;
CatPrint (Str, L"%g", &FvFilePath->FvFileName);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathRelativeOffsetRange (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;
Offset = DevPath;
CatPrint (
Str,
L"Offset(%lx,%lx)",
Offset->StartingOffset,
Offset->EndingOffset
);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathBssBss (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
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"Harddrive";
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"Net";
break;
case BBS_TYPE_BEV:
Type = L"BEV";
break;
default:
Type = L"?";
break;
}
CatPrint (Str, L"Legacy-%s", Type);
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathEndInstance (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
CatPrint (Str, L",");
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathNodeUnknown (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
CatPrint (Str, L"?");
}
/**
Convert Device Path to a Unicode string for printing.
@param[in, out] Str The buffer holding the output string.
This buffer contains the length of the string and
the maixmum length reserved for the string buffer.
@param[in] DevPath The device path.
**/
VOID
DevPathFvPath (
IN OUT POOL_PRINT *Str,
IN VOID *DevPath
)
{
MEDIA_FW_VOL_DEVICE_PATH *FvPath;
FvPath = DevPath;
CatPrint (Str, L"Fv(%g)", &FvPath->FvName);
}
DEVICE_PATH_STRING_TABLE DevPathTable[] = {
{
HARDWARE_DEVICE_PATH,
HW_PCI_DP,
DevPathPci
},
{
HARDWARE_DEVICE_PATH,
HW_PCCARD_DP,
DevPathPccard
},
{
HARDWARE_DEVICE_PATH,
HW_MEMMAP_DP,
DevPathMemMap
},
{
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
DevPathVendor
},
{
HARDWARE_DEVICE_PATH,
HW_CONTROLLER_DP,
DevPathController
},
{
ACPI_DEVICE_PATH,
ACPI_DP,
DevPathAcpi
},
{
ACPI_DEVICE_PATH,
ACPI_EXTENDED_DP,
DevPathExtendedAcpi
},
{
ACPI_DEVICE_PATH,
ACPI_ADR_DP,
DevPathAdrAcpi
},
{
MESSAGING_DEVICE_PATH,
MSG_ATAPI_DP,
DevPathAtapi
},
{
MESSAGING_DEVICE_PATH,
MSG_SCSI_DP,
DevPathScsi
},
{
MESSAGING_DEVICE_PATH,
MSG_FIBRECHANNEL_DP,
DevPathFibre
},
{
MESSAGING_DEVICE_PATH,
MSG_1394_DP,
DevPath1394
},
{
MESSAGING_DEVICE_PATH,
MSG_USB_DP,
DevPathUsb
},
{
MESSAGING_DEVICE_PATH,
MSG_USB_WWID_DP,
DevPathUsbWWID
},
{
MESSAGING_DEVICE_PATH,
MSG_DEVICE_LOGICAL_UNIT_DP,
DevPathLogicalUnit
},
{
MESSAGING_DEVICE_PATH,
MSG_USB_CLASS_DP,
DevPathUsbClass
},
{
MESSAGING_DEVICE_PATH,
MSG_SATA_DP,
DevPathSata
},
{
MESSAGING_DEVICE_PATH,
MSG_I2O_DP,
DevPathI2O
},
{
MESSAGING_DEVICE_PATH,
MSG_MAC_ADDR_DP,
DevPathMacAddr
},
{
MESSAGING_DEVICE_PATH,
MSG_IPv4_DP,
DevPathIPv4
},
{
MESSAGING_DEVICE_PATH,
MSG_IPv6_DP,
DevPathIPv6
},
{
MESSAGING_DEVICE_PATH,
MSG_INFINIBAND_DP,
DevPathInfiniBand
},
{
MESSAGING_DEVICE_PATH,
MSG_UART_DP,
DevPathUart
},
{
MESSAGING_DEVICE_PATH,
MSG_VENDOR_DP,
DevPathVendor
},
{
MESSAGING_DEVICE_PATH,
MSG_ISCSI_DP,
DevPathiSCSI
},
{
MESSAGING_DEVICE_PATH,
MSG_VLAN_DP,
DevPathVlan
},
{
MEDIA_DEVICE_PATH,
MEDIA_HARDDRIVE_DP,
DevPathHardDrive
},
{
MEDIA_DEVICE_PATH,
MEDIA_CDROM_DP,
DevPathCDROM
},
{
MEDIA_DEVICE_PATH,
MEDIA_VENDOR_DP,
DevPathVendor
},
{
MEDIA_DEVICE_PATH,
MEDIA_FILEPATH_DP,
DevPathFilePath
},
{
MEDIA_DEVICE_PATH,
MEDIA_PROTOCOL_DP,
DevPathMediaProtocol
},
{
MEDIA_DEVICE_PATH,
MEDIA_PIWG_FW_VOL_DP,
DevPathFvPath,
},
{
MEDIA_DEVICE_PATH,
MEDIA_PIWG_FW_FILE_DP,
DevPathFvFilePath
},
{
MEDIA_DEVICE_PATH,
MEDIA_RELATIVE_OFFSET_RANGE_DP,
DevPathRelativeOffsetRange,
},
{
BBS_DEVICE_PATH,
BBS_BBS_DP,
DevPathBssBss
},
{
END_DEVICE_PATH_TYPE,
END_INSTANCE_DEVICE_PATH_SUBTYPE,
DevPathEndInstance
},
{
0,
0,
NULL
}
};
/**
This function converts an input device structure to a Unicode string.
@param[in] DevPath A pointer to the device path structure.
@return A new allocated Unicode string that represents the device path.
**/
CHAR16 *
EFIAPI
DevicePathToStr (
IN EFI_DEVICE_PATH_PROTOCOL *DevPath
)
{
POOL_PRINT Str;
EFI_DEVICE_PATH_PROTOCOL *DevPathNode;
VOID (*DumpNode) (POOL_PRINT *, VOID *);
UINTN Index;
UINTN NewSize;
EFI_STATUS Status;
CHAR16 *ToText;
EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText;
ZeroMem (&Str, sizeof (Str));
if (DevPath == NULL) {
goto Done;
}
Status = gBS->LocateProtocol (
&gEfiDevicePathToTextProtocolGuid,
NULL,
(VOID **) &DevPathToText
);
if (!EFI_ERROR (Status)) {
ToText = DevPathToText->ConvertDevicePathToText (
DevPath,
FALSE,
TRUE
);
ASSERT (ToText != NULL);
return ToText;
}
//
// Process each device path node
//
DevPathNode = DevPath;
while (!IsDevicePathEnd (DevPathNode)) {
//
// Find the handler to dump this device path node
//
DumpNode = NULL;
for (Index = 0; DevPathTable[Index].Function != NULL; Index += 1) {
if (DevicePathType (DevPathNode) == DevPathTable[Index].Type &&
DevicePathSubType (DevPathNode) == DevPathTable[Index].SubType
) {
DumpNode = DevPathTable[Index].Function;
break;
}
}
//
// If not found, use a generic function
//
if (!DumpNode) {
DumpNode = DevPathNodeUnknown;
}
//
// Put a path seperator in if needed
//
if ((Str.Len != 0) && (DumpNode != DevPathEndInstance)) {
CatPrint (&Str, L"/");
}
//
// Print this node of the device path
//
DumpNode (&Str, DevPathNode);
//
// Next device path node
//
DevPathNode = NextDevicePathNode (DevPathNode);
}
Done:
NewSize = (Str.Len + 1) * sizeof (CHAR16);
Str.Str = ReallocatePool (NewSize, NewSize, Str.Str);
ASSERT (Str.Str != NULL);
Str.Str[Str.Len] = 0;
return Str.Str;
}