diff --git a/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c b/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c index 4e03666a46..a42a045d52 100644 --- a/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c +++ b/ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c @@ -14,6 +14,7 @@ #include "UefiShellCommandLib.h" #include #include +#include typedef enum { MTDTypeUnknown, @@ -575,6 +576,9 @@ DevPathSerialVendor ( { VENDOR_DEVICE_PATH *Vendor; SAS_DEVICE_PATH *Sas; + UINTN TargetNameLength; + UINTN Index; + CHAR16 *Buffer; if (DevicePathNode == NULL || MappingItem == NULL) { return; @@ -589,6 +593,32 @@ DevPathSerialVendor ( AppendCSDNum (MappingItem, Sas->Lun); AppendCSDNum (MappingItem, Sas->DeviceTopology); AppendCSDNum (MappingItem, Sas->RelativeTargetPort); + } else { + TargetNameLength = MIN(DevicePathNodeLength (DevicePathNode) - sizeof (VENDOR_DEVICE_PATH), PcdGet32(PcdShellVendorExtendedDecode)); + if (TargetNameLength != 0) { + // + // String is 2 chars per data byte, plus NULL terminator + // + Buffer = AllocateZeroPool (((TargetNameLength * 2) + 1) * sizeof(CHAR16)); + ASSERT(Buffer != NULL); + if (Buffer == NULL) { + return; + } + + // + // Build the string data + // + for (Index = 0; Index < TargetNameLength; Index++) { + Buffer = CatSPrint (Buffer, L"%02x", *((UINT8*)Vendor + sizeof (VENDOR_DEVICE_PATH) + Index)); + } + + // + // Append the new data block + // + AppendCSDStr (MappingItem, Buffer); + + FreePool(Buffer); + } } } diff --git a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf index 5ef82c64d7..6550690713 100644 --- a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf +++ b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf @@ -61,6 +61,7 @@ gEfiShellPkgTokenSpaceGuid.PcdShellSupportLevel ## ALWAYS_CONSUMED gEfiShellPkgTokenSpaceGuid.PcdShellMapNameLength ## ALWAYS_CONSUMED gEfiShellPkgTokenSpaceGuid.PcdShellDecodeIScsiMapNames ## SOMETIMES_CONSUMED + gEfiShellPkgTokenSpaceGuid.PcdShellVendorExtendedDecode ## SOMETIMES_CONSUMED [Depex] gEfiUnicodeCollation2ProtocolGuid diff --git a/ShellPkg/ShellPkg.dec b/ShellPkg/ShellPkg.dec index 254c5b46cb..df847d31bb 100644 --- a/ShellPkg/ShellPkg.dec +++ b/ShellPkg/ShellPkg.dec @@ -132,3 +132,8 @@ ## Do iSCSI decode for map names. # This is disabled by default due to the length of generated strings gEfiShellPkgTokenSpaceGuid.PcdShellDecodeIScsiMapNames|FALSE|BOOLEAN|0x00000012 + + ## Controls Extended decode for Vendor device path nodes for map names. + # Up to this many bytes of vendor specific data will be used. Default is 0 + # (disabled). + gEfiShellPkgTokenSpaceGuid.PcdShellVendorExtendedDecode|0|UINT32|0x00000013