]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellCommandLib/ConsistMapping.c
ShellPkg/ConsistMapping: Remove unneeded memory reallocation
[mirror_edk2.git] / ShellPkg / Library / UefiShellCommandLib / ConsistMapping.c
old mode 100644 (file)
new mode 100755 (executable)
index a009609..3b13e62
@@ -1,7 +1,7 @@
 /** @file\r
   Main file for support of shell consist mapping.\r
 \r
-  Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution. The full text of the license may be found at\r
 #include "UefiShellCommandLib.h"\r
 #include <Library/DevicePathLib.h>\r
 #include <Library/SortLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Protocol/UsbIo.h>\r
+#include <Protocol/BlockIo.h>\r
+#include <Protocol/SimpleFileSystem.h>\r
+\r
+\r
 \r
 typedef enum {\r
   MTDTypeUnknown,\r
@@ -40,10 +46,28 @@ typedef struct {
   CHAR16    *Name;\r
 } MTD_NAME;\r
 \r
+/**\r
+  Serial Decode function.\r
+\r
+  @param  DevPath          The Device path info.\r
+  @param  MapInfo          The map info.\r
+  @param  OrigDevPath      The original device path protocol.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
+**/\r
+typedef \r
+EFI_STATUS \r
+(*SERIAL_DECODE_FUNCTION) (\r
+  EFI_DEVICE_PATH_PROTOCOL    *DevPath, \r
+  DEVICE_CONSIST_MAPPING_INFO *MapInfo,\r
+  EFI_DEVICE_PATH_PROTOCOL    *OrigDevPath\r
+  );\r
+\r
 typedef struct {\r
   UINT8 Type;\r
   UINT8 SubType;\r
-  VOID (EFIAPI *SerialFun) (EFI_DEVICE_PATH_PROTOCOL *DevPath, DEVICE_CONSIST_MAPPING_INFO *MapInfo);\r
+  SERIAL_DECODE_FUNCTION SerialFun;\r
   INTN (EFIAPI *CompareFun) (EFI_DEVICE_PATH_PROTOCOL *DevPath, EFI_DEVICE_PATH_PROTOCOL *DevPath2);\r
 } DEV_PATH_CONSIST_MAPPING_TABLE;\r
 \r
@@ -56,12 +80,11 @@ typedef struct {
   @param  Fmt      The format string\r
   @param  ...      The data will be printed.\r
 \r
-  @return Allocated buffer with the formatted string printed in it.\r
-          The caller must free the allocated buffer.\r
-          The buffer allocation is not packed.\r
+  @retval EFI_SUCCESS          The string is concatenated successfully.\r
+  @retval EFI_OUT_OF_RESOURCES Out of resources.\r
 \r
 **/\r
-CHAR16 *\r
+EFI_STATUS\r
 EFIAPI\r
 CatPrint (\r
   IN OUT POOL_PRINT   *Str,\r
@@ -72,37 +95,40 @@ CatPrint (
   UINT16  *AppendStr;\r
   VA_LIST Args;\r
   UINTN   StringSize;\r
+  CHAR16  *NewStr;\r
 \r
   AppendStr = AllocateZeroPool (0x1000);\r
   if (AppendStr == NULL) {\r
-    ASSERT(FALSE);\r
-    return Str->Str;\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   VA_START (Args, Fmt);\r
   UnicodeVSPrint (AppendStr, 0x1000, Fmt, Args);\r
   VA_END (Args);\r
   if (NULL == Str->Str) {\r
-    StringSize   = StrSize (AppendStr);\r
-    Str->Str  = AllocateZeroPool (StringSize);\r
-    ASSERT (Str->Str != NULL);\r
+    StringSize = StrSize (AppendStr);\r
+    NewStr = AllocateZeroPool (StringSize);\r
   } else {\r
     StringSize = StrSize (AppendStr);\r
     StringSize += (StrSize (Str->Str) - sizeof (UINT16));\r
 \r
-    Str->Str = ReallocatePool (\r
-                StrSize (Str->Str),\r
-                StringSize,\r
-                Str->Str\r
+    NewStr = ReallocatePool (\r
+               StrSize (Str->Str),\r
+               StringSize,\r
+               Str->Str\r
                );\r
-    ASSERT (Str->Str != NULL);\r
+  }\r
+  if (NewStr == NULL) {\r
+    FreePool (AppendStr);\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  StrnCat (Str->Str, AppendStr, StringSize/sizeof(CHAR16) - 1 - StrLen(Str->Str));\r
+  Str->Str = NewStr;\r
+  StrCatS (Str->Str, StringSize/sizeof(CHAR16), AppendStr);\r
   Str->Len = StringSize;\r
 \r
   FreePool (AppendStr);\r
-  return Str->Str;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 MTD_NAME  mMTDName[] = {\r
@@ -134,30 +160,30 @@ MTD_NAME  mMTDName[] = {
   @param[in, out] Str          The string so append onto.\r
   @param[in]      Num          The number to divide and append.\r
 \r
-  @retval EFI_INVALID_PARAMETER   A parameter was NULL.\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
   @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 AppendCSDNum2 (\r
   IN OUT POOL_PRINT       *Str,\r
   IN UINT64               Num\r
   )\r
 {\r
-  UINT64  Result;\r
-  UINT32   Rem;\r
+  EFI_STATUS Status;\r
+  UINT64     Result;\r
+  UINT32     Rem;\r
 \r
-  if (Str == NULL) {\r
-    return (EFI_INVALID_PARAMETER);\r
-  }\r
+  ASSERT (Str != NULL);\r
 \r
   Result = DivU64x32Remainder (Num, 25, &Rem);\r
   if (Result > 0) {\r
-    AppendCSDNum2 (Str, Result);\r
+    Status = AppendCSDNum2 (Str, Result);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
   }\r
 \r
-  CatPrint (Str, L"%c", Rem + 'a');\r
-  return (EFI_SUCCESS);\r
+  return CatPrint (Str, L"%c", Rem + 'a');\r
 }\r
 \r
 /**\r
@@ -166,29 +192,30 @@ AppendCSDNum2 (
   @param[in, out] MappingItem  The mapping info object to append onto.\r
   @param[in]      Num          The info to append.\r
 \r
-  @retval EFI_INVALID_PARAMETER   A parameter was NULL.\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
   @retval EFI_SUCCESS             The appending was successful.\r
+\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 AppendCSDNum (\r
   IN OUT DEVICE_CONSIST_MAPPING_INFO            *MappingItem,\r
   IN     UINT64                                 Num\r
   )\r
 {\r
-  if (MappingItem == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
+  EFI_STATUS Status;\r
+  ASSERT (MappingItem != NULL);\r
 \r
   if (MappingItem->Digital) {\r
-    CatPrint (&MappingItem->Csd, L"%ld", Num);\r
+    Status = CatPrint (&MappingItem->Csd, L"%ld", Num);\r
   } else {\r
-    AppendCSDNum2 (&MappingItem->Csd, Num);\r
+    Status = AppendCSDNum2 (&MappingItem->Csd, Num);\r
   }\r
 \r
-  MappingItem->Digital = (BOOLEAN)!(MappingItem->Digital);\r
+  if (!EFI_ERROR (Status)) {\r
+    MappingItem->Digital = (BOOLEAN) !(MappingItem->Digital);\r
+  }\r
 \r
-  return (EFI_SUCCESS);\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -197,21 +224,21 @@ AppendCSDNum (
   @param[in, out] MappingItem  The mapping info object to append onto.\r
   @param[in]      Str          The info to append.\r
 \r
-  @retval EFI_INVALID_PARAMETER   A parameter was NULL.\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
   @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 AppendCSDStr (\r
   IN OUT DEVICE_CONSIST_MAPPING_INFO            *MappingItem,\r
   IN     CHAR16                                 *Str\r
   )\r
 {\r
-  CHAR16  *Index;\r
+  CHAR16     *Index;\r
+  EFI_STATUS Status;\r
 \r
-  if (Str == NULL || MappingItem == NULL) {\r
-    return (EFI_INVALID_PARAMETER);\r
-  }\r
+  ASSERT (Str != NULL && MappingItem != NULL);\r
+\r
+  Status = EFI_SUCCESS;\r
 \r
   if (MappingItem->Digital) {\r
     //\r
@@ -230,11 +257,11 @@ AppendCSDStr (
       case '7':\r
       case '8':\r
       case '9':\r
-        CatPrint (&MappingItem->Csd, L"%c", *Index);\r
+        Status = CatPrint (&MappingItem->Csd, L"%c", *Index);\r
         break;\r
 \r
       case '1':\r
-        CatPrint (&MappingItem->Csd, L"16");\r
+        Status = CatPrint (&MappingItem->Csd, L"16");\r
         break;\r
 \r
       case 'a':\r
@@ -243,7 +270,7 @@ AppendCSDStr (
       case 'd':\r
       case 'e':\r
       case 'f':\r
-        CatPrint (&MappingItem->Csd, L"1%c", *Index - 'a' + '0');\r
+        Status = CatPrint (&MappingItem->Csd, L"1%c", *Index - 'a' + '0');\r
         break;\r
 \r
       case 'A':\r
@@ -252,9 +279,13 @@ AppendCSDStr (
       case 'D':\r
       case 'E':\r
       case 'F':\r
-        CatPrint (&MappingItem->Csd, L"1%c", *Index - 'A' + '0');\r
+        Status = CatPrint (&MappingItem->Csd, L"1%c", *Index - 'A' + '0');\r
         break;\r
       }\r
+\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
+      }\r
     }\r
   } else {\r
     for (Index = Str; *Index != 0; Index++) {\r
@@ -264,11 +295,15 @@ AppendCSDStr (
       //  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p\r
       //\r
       if (*Index >= '0' && *Index <= '9') {\r
-        CatPrint (&MappingItem->Csd, L"%c", *Index - '0' + 'a');\r
+        Status = CatPrint (&MappingItem->Csd, L"%c", *Index - '0' + 'a');\r
       } else if (*Index >= 'a' && *Index <= 'f') {\r
-        CatPrint (&MappingItem->Csd, L"%c", *Index - 'a' + 'k');\r
+        Status = CatPrint (&MappingItem->Csd, L"%c", *Index - 'a' + 'k');\r
       } else if (*Index >= 'A' && *Index <= 'F') {\r
-        CatPrint (&MappingItem->Csd, L"%c", *Index - 'A' + 'k');\r
+        Status = CatPrint (&MappingItem->Csd, L"%c", *Index - 'A' + 'k');\r
+      }\r
+\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
       }\r
     }\r
   }\r
@@ -284,11 +319,10 @@ AppendCSDStr (
   @param[in, out] MappingItem  The item to append onto.\r
   @param[in]      Guid         The guid to append.\r
 \r
-  @retval EFI_SUCCESS           The appending operation was successful.\r
-  @retval EFI_INVALID_PARAMETER A parameter was NULL.\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 AppendCSDGuid (\r
   DEVICE_CONSIST_MAPPING_INFO            *MappingItem,\r
   EFI_GUID                               *Guid\r
@@ -296,9 +330,7 @@ AppendCSDGuid (
 {\r
   CHAR16  Buffer[64];\r
 \r
-  if (Guid == NULL || MappingItem == NULL) {\r
-    return (EFI_INVALID_PARAMETER);\r
-  }\r
+  ASSERT (Guid != NULL && MappingItem != NULL);\r
 \r
   UnicodeSPrint (\r
     Buffer,\r
@@ -307,9 +339,7 @@ AppendCSDGuid (
     Guid\r
    );\r
 \r
-  AppendCSDStr (MappingItem, Buffer);\r
-\r
-  return (EFI_SUCCESS);\r
+  return AppendCSDStr (MappingItem, Buffer);\r
 }\r
 \r
 /**\r
@@ -422,12 +452,16 @@ DevPathCompareDefault (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialHardDrive (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   HARDDRIVE_DEVICE_PATH *Hd;\r
@@ -440,7 +474,7 @@ DevPathSerialHardDrive (
     MappingItem->Mtd = MTDTypeHardDisk;\r
   }\r
 \r
-  AppendCSDNum (MappingItem, Hd->PartitionNumber);\r
+  return AppendCSDNum (MappingItem, Hd->PartitionNumber);\r
 }\r
 \r
 /**\r
@@ -448,12 +482,16 @@ DevPathSerialHardDrive (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialAtapi (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   ATAPI_DEVICE_PATH *Atapi;\r
@@ -462,7 +500,7 @@ DevPathSerialAtapi (
   ASSERT(MappingItem != NULL);\r
 \r
   Atapi = (ATAPI_DEVICE_PATH *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, (Atapi->PrimarySecondary * 2 + Atapi->SlaveMaster));\r
+  return AppendCSDNum (MappingItem, (Atapi->PrimarySecondary * 2 + Atapi->SlaveMaster));\r
 }\r
 \r
 /**\r
@@ -470,12 +508,16 @@ DevPathSerialAtapi (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialCdRom (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   CDROM_DEVICE_PATH *Cd;\r
@@ -485,7 +527,7 @@ DevPathSerialCdRom (
 \r
   Cd                = (CDROM_DEVICE_PATH *) DevicePathNode;\r
   MappingItem->Mtd  = MTDTypeCDRom;\r
-  AppendCSDNum (MappingItem, Cd->BootEntry);\r
+  return AppendCSDNum (MappingItem, Cd->BootEntry);\r
 }\r
 \r
 /**\r
@@ -493,22 +535,30 @@ DevPathSerialCdRom (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialFibre (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
+  EFI_STATUS                Status;\r
   FIBRECHANNEL_DEVICE_PATH  *Fibre;\r
 \r
   ASSERT(DevicePathNode != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
   Fibre = (FIBRECHANNEL_DEVICE_PATH *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, Fibre->WWN);\r
-  AppendCSDNum (MappingItem, Fibre->Lun);\r
+  Status = AppendCSDNum (MappingItem, Fibre->WWN);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Fibre->Lun);\r
+  }\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -516,24 +566,36 @@ DevPathSerialFibre (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialUart (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
-  UART_DEVICE_PATH  *Uart;\r
+  EFI_STATUS                Status;\r
+  UART_DEVICE_PATH          *Uart;\r
 \r
   ASSERT(DevicePathNode != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
   Uart = (UART_DEVICE_PATH *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, Uart->BaudRate);\r
-  AppendCSDNum (MappingItem, Uart->DataBits);\r
-  AppendCSDNum (MappingItem, Uart->Parity);\r
-  AppendCSDNum (MappingItem, Uart->StopBits);\r
+  Status = AppendCSDNum (MappingItem, Uart->BaudRate);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Uart->DataBits);\r
+  }\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Uart->Parity);\r
+  }\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Uart->StopBits);\r
+  }\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -541,22 +603,67 @@ DevPathSerialUart (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialUsb (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
-  USB_DEVICE_PATH *Usb;\r
+  USB_DEVICE_PATH           *Usb;\r
+  EFI_USB_IO_PROTOCOL       *UsbIo;\r
+  EFI_HANDLE                TempHandle;\r
+  EFI_STATUS                Status;\r
+  USB_INTERFACE_DESCRIPTOR  InterfaceDesc;\r
+\r
 \r
   ASSERT(DevicePathNode != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
   Usb = (USB_DEVICE_PATH *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, Usb->ParentPortNumber);\r
-  AppendCSDNum (MappingItem, Usb->InterfaceNumber);\r
+  Status = AppendCSDNum (MappingItem, Usb->ParentPortNumber);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Usb->InterfaceNumber);\r
+  }\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (PcdGetBool(PcdUsbExtendedDecode)) {\r
+    Status = gBS->LocateDevicePath( &gEfiUsbIoProtocolGuid, &DevicePath, &TempHandle );\r
+    UsbIo = NULL;\r
+    if (!EFI_ERROR(Status)) {\r
+      Status = gBS->OpenProtocol(TempHandle, &gEfiUsbIoProtocolGuid, (VOID**)&UsbIo, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
+    } \r
+\r
+    if (!EFI_ERROR(Status)) {\r
+      ASSERT(UsbIo != NULL);\r
+      Status = UsbIo->UsbGetInterfaceDescriptor(UsbIo, &InterfaceDesc);\r
+      if (!EFI_ERROR(Status)) {\r
+        if (InterfaceDesc.InterfaceClass == USB_MASS_STORE_CLASS && MappingItem->Mtd == MTDTypeUnknown) {\r
+          switch (InterfaceDesc.InterfaceSubClass){\r
+            case USB_MASS_STORE_SCSI:\r
+              MappingItem->Mtd = MTDTypeHardDisk;\r
+              break;\r
+            case USB_MASS_STORE_8070I:\r
+            case USB_MASS_STORE_UFI:\r
+              MappingItem->Mtd = MTDTypeFloppy;\r
+              break;\r
+            case USB_MASS_STORE_8020I:\r
+              MappingItem->Mtd  = MTDTypeCDRom;\r
+              break;\r
+          }\r
+        }\r
+      }\r
+    } \r
+  }\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -564,32 +671,81 @@ DevPathSerialUsb (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
 \r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialVendor (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
+  EFI_STATUS          Status;\r
   VENDOR_DEVICE_PATH  *Vendor;\r
   SAS_DEVICE_PATH     *Sas;\r
+  UINTN               TargetNameLength;\r
+  UINTN               Index;\r
+  CHAR16              *Buffer;\r
+  CHAR16              *NewBuffer;\r
 \r
-  if (DevicePathNode == NULL || MappingItem == NULL) {\r
-    return;\r
-  }\r
+  ASSERT(DevicePathNode != NULL);\r
+  ASSERT(MappingItem != NULL);\r
 \r
   Vendor = (VENDOR_DEVICE_PATH *) DevicePathNode;\r
-  AppendCSDGuid (MappingItem, &Vendor->Guid);\r
+  Status = AppendCSDGuid (MappingItem, &Vendor->Guid);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
 \r
   if (CompareGuid (&gEfiSasDevicePathGuid, &Vendor->Guid)) {\r
     Sas = (SAS_DEVICE_PATH *) Vendor;\r
-    AppendCSDNum (MappingItem, Sas->SasAddress);\r
-    AppendCSDNum (MappingItem, Sas->Lun);\r
-    AppendCSDNum (MappingItem, Sas->DeviceTopology);\r
-    AppendCSDNum (MappingItem, Sas->RelativeTargetPort);\r
+    Status = AppendCSDNum (MappingItem, Sas->SasAddress);\r
+    if (!EFI_ERROR (Status)) {\r
+      Status = AppendCSDNum (MappingItem, Sas->Lun);\r
+    }\r
+    if (!EFI_ERROR (Status)) {\r
+      Status = AppendCSDNum (MappingItem, Sas->DeviceTopology);\r
+    }\r
+    if (!EFI_ERROR (Status)) {\r
+      Status = AppendCSDNum (MappingItem, Sas->RelativeTargetPort);\r
+    }\r
+  } else {\r
+    TargetNameLength = MIN(DevicePathNodeLength (DevicePathNode) - sizeof (VENDOR_DEVICE_PATH), PcdGet32(PcdShellVendorExtendedDecode));\r
+    if (TargetNameLength != 0) {\r
+      //\r
+      // String is 2 chars per data byte, plus NULL terminator\r
+      //\r
+      Buffer = AllocateZeroPool (((TargetNameLength * 2) + 1) * sizeof(CHAR16));\r
+      if (Buffer == NULL) {\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+\r
+      //\r
+      // Build the string data\r
+      //\r
+      for (Index = 0; Index < TargetNameLength; Index++) {\r
+        NewBuffer = CatSPrint (Buffer, L"%02x", *((UINT8*)Vendor + sizeof (VENDOR_DEVICE_PATH) + Index));\r
+        if (NewBuffer == NULL) {\r
+          Status = EFI_OUT_OF_RESOURCES;\r
+          break;\r
+        }\r
+        Buffer = NewBuffer;\r
+      }\r
+\r
+      //\r
+      // Append the new data block\r
+      //\r
+      if (!EFI_ERROR (Status)) {\r
+        Status = AppendCSDStr (MappingItem, Buffer);\r
+      }\r
+\r
+      FreePool(Buffer);\r
+    }\r
   }\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -597,12 +753,16 @@ DevPathSerialVendor (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialLun (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   DEVICE_LOGICAL_UNIT_DEVICE_PATH *Lun;\r
@@ -611,7 +771,7 @@ DevPathSerialLun (
   ASSERT(MappingItem != NULL);\r
 \r
   Lun = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, Lun->Lun);\r
+  return AppendCSDNum (MappingItem, Lun->Lun);\r
 }\r
 \r
 /**\r
@@ -619,23 +779,33 @@ DevPathSerialLun (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialSata (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
+  EFI_STATUS        Status;\r
   SATA_DEVICE_PATH  *Sata;\r
 \r
   ASSERT(DevicePathNode != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
   Sata = (SATA_DEVICE_PATH  *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, Sata->HBAPortNumber);\r
-  AppendCSDNum (MappingItem, Sata->PortMultiplierPortNumber);\r
-  AppendCSDNum (MappingItem, Sata->Lun);\r
+  Status = AppendCSDNum (MappingItem, Sata->HBAPortNumber);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Sata->PortMultiplierPortNumber);\r
+  }\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Sata->Lun);\r
+  }\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -643,21 +813,19 @@ DevPathSerialSata (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialIScsi (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
-///@todo make this a PCD\r
-//\r
-// As Csd of ISCSI node is quite long, we comment\r
-// the code below to keep the consistent mapping\r
-// short. Uncomment if you really need it.\r
-//\r
-/*\r
+  EFI_STATUS         Status;\r
   ISCSI_DEVICE_PATH  *IScsi;\r
   UINT8              *IScsiTargetName;\r
   CHAR16             *TargetName;\r
@@ -667,24 +835,39 @@ DevPathSerialIScsi (
   ASSERT(DevicePathNode != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
-  IScsi = (ISCSI_DEVICE_PATH  *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, IScsi->NetworkProtocol);\r
-  AppendCSDNum (MappingItem, IScsi->LoginOption);\r
-  AppendCSDNum (MappingItem, IScsi->Lun);\r
-  AppendCSDNum (MappingItem, IScsi->TargetPortalGroupTag);\r
-  TargetNameLength = DevicePathNodeLength (DevicePathNode) - sizeof (ISCSI_DEVICE_PATH);\r
-  if (TargetNameLength > 0) {\r
-    TargetName = AllocateZeroPool ((TargetNameLength + 1) * sizeof (CHAR16));\r
-    if (TargetName != NULL) {\r
-      IScsiTargetName = (UINT8 *) (IScsi + 1);\r
-      for (Index = 0; Index < TargetNameLength; Index++) {\r
-        TargetName[Index] = (CHAR16) IScsiTargetName[Index];\r
+  Status = EFI_SUCCESS;\r
+\r
+  if (PcdGetBool(PcdShellDecodeIScsiMapNames)) {\r
+    IScsi = (ISCSI_DEVICE_PATH  *) DevicePathNode;\r
+    Status = AppendCSDNum (MappingItem, IScsi->NetworkProtocol);\r
+    if (!EFI_ERROR (Status)) {\r
+      Status = AppendCSDNum (MappingItem, IScsi->LoginOption);\r
+    }\r
+    if (!EFI_ERROR (Status)) {\r
+      Status = AppendCSDNum (MappingItem, IScsi->Lun);\r
+    }\r
+    if (!EFI_ERROR (Status)) {\r
+      Status = AppendCSDNum (MappingItem, IScsi->TargetPortalGroupTag);\r
+    }\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+    TargetNameLength = DevicePathNodeLength (DevicePathNode) - sizeof (ISCSI_DEVICE_PATH);\r
+    if (TargetNameLength > 0) {\r
+      TargetName = AllocateZeroPool ((TargetNameLength + 1) * sizeof (CHAR16));\r
+      if (TargetName == NULL) {\r
+        Status = EFI_OUT_OF_RESOURCES;\r
+      } else {\r
+        IScsiTargetName = (UINT8 *) (IScsi + 1);\r
+        for (Index = 0; Index < TargetNameLength; Index++) {\r
+          TargetName[Index] = (CHAR16) IScsiTargetName[Index];\r
+        }\r
+        Status = AppendCSDStr (MappingItem, TargetName);\r
+        FreePool (TargetName);\r
       }\r
-      AppendCSDStr (MappingItem, TargetName);\r
-      FreePool (TargetName);\r
     }\r
   }\r
- */\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -692,12 +875,16 @@ DevPathSerialIScsi (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialI2O (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   I2O_DEVICE_PATH *DevicePath_I20;\r
@@ -706,7 +893,7 @@ DevPathSerialI2O (
   ASSERT(MappingItem != NULL);\r
 \r
   DevicePath_I20 = (I2O_DEVICE_PATH *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, DevicePath_I20->Tid);\r
+  return AppendCSDNum (MappingItem, DevicePath_I20->Tid);\r
 }\r
 \r
 /**\r
@@ -714,12 +901,16 @@ DevPathSerialI2O (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialMacAddr (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   MAC_ADDR_DEVICE_PATH  *Mac;\r
@@ -742,7 +933,7 @@ DevPathSerialMacAddr (
     UnicodeSPrint (PBuffer, 0, L"%02x", (UINTN) Mac->MacAddress.Addr[Index]);\r
   }\r
 \r
-  AppendCSDStr (MappingItem, Buffer);\r
+  return AppendCSDStr (MappingItem, Buffer);\r
 }\r
 \r
 /**\r
@@ -750,14 +941,19 @@ DevPathSerialMacAddr (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialInfiniBand (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
+  EFI_STATUS              Status;\r
   INFINIBAND_DEVICE_PATH  *InfiniBand;\r
   UINTN                   Index;\r
   CHAR16                  Buffer[64];\r
@@ -771,10 +967,17 @@ DevPathSerialInfiniBand (
     UnicodeSPrint (PBuffer, 0, L"%02x", (UINTN) InfiniBand->PortGid[Index]);\r
   }\r
 \r
-  AppendCSDStr (MappingItem, Buffer);\r
-  AppendCSDNum (MappingItem, InfiniBand->ServiceId);\r
-  AppendCSDNum (MappingItem, InfiniBand->TargetPortId);\r
-  AppendCSDNum (MappingItem, InfiniBand->DeviceId);\r
+  Status = AppendCSDStr (MappingItem, Buffer);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, InfiniBand->ServiceId);\r
+  }\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, InfiniBand->TargetPortId);\r
+  }\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, InfiniBand->DeviceId);\r
+  }\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -782,14 +985,19 @@ DevPathSerialInfiniBand (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialIPv4 (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
+  EFI_STATUS        Status;\r
   IPv4_DEVICE_PATH  *Ip;\r
   CHAR16            Buffer[10];\r
 \r
@@ -806,19 +1014,26 @@ DevPathSerialIPv4 (
     (UINTN) Ip->LocalIpAddress.Addr[2],\r
     (UINTN) Ip->LocalIpAddress.Addr[3]\r
    );\r
-  AppendCSDStr (MappingItem, Buffer);\r
-  AppendCSDNum (MappingItem, Ip->LocalPort);\r
-  UnicodeSPrint (\r
-    Buffer,\r
-    0,\r
-    L"%02x%02x%02x%02x",\r
-    (UINTN) Ip->RemoteIpAddress.Addr[0],\r
-    (UINTN) Ip->RemoteIpAddress.Addr[1],\r
-    (UINTN) Ip->RemoteIpAddress.Addr[2],\r
-    (UINTN) Ip->RemoteIpAddress.Addr[3]\r
-   );\r
-  AppendCSDStr (MappingItem, Buffer);\r
-  AppendCSDNum (MappingItem, Ip->RemotePort);\r
+  Status = AppendCSDStr (MappingItem, Buffer);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Ip->LocalPort);\r
+  }\r
+  if (!EFI_ERROR (Status)) {\r
+    UnicodeSPrint (\r
+      Buffer,\r
+      0,\r
+      L"%02x%02x%02x%02x",\r
+      (UINTN) Ip->RemoteIpAddress.Addr[0],\r
+      (UINTN) Ip->RemoteIpAddress.Addr[1],\r
+      (UINTN) Ip->RemoteIpAddress.Addr[2],\r
+      (UINTN) Ip->RemoteIpAddress.Addr[3]\r
+     );\r
+    Status = AppendCSDStr (MappingItem, Buffer);\r
+  }\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Ip->RemotePort);\r
+  }\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -826,14 +1041,19 @@ DevPathSerialIPv4 (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialIPv6 (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
+  EFI_STATUS        Status;\r
   IPv6_DEVICE_PATH  *Ip;\r
   UINTN             Index;\r
   CHAR16            Buffer[64];\r
@@ -847,14 +1067,21 @@ DevPathSerialIPv6 (
     UnicodeSPrint (PBuffer, 0, L"%02x", (UINTN) Ip->LocalIpAddress.Addr[Index]);\r
   }\r
 \r
-  AppendCSDStr (MappingItem, Buffer);\r
-  AppendCSDNum (MappingItem, Ip->LocalPort);\r
-  for (Index = 0, PBuffer = Buffer; Index < 16; Index++, PBuffer += 2) {\r
-    UnicodeSPrint (PBuffer, 0, L"%02x", (UINTN) Ip->RemoteIpAddress.Addr[Index]);\r
+  Status = AppendCSDStr (MappingItem, Buffer);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Ip->LocalPort);\r
   }\r
+  if (!EFI_ERROR (Status)) {\r
+    for (Index = 0, PBuffer = Buffer; Index < 16; Index++, PBuffer += 2) {\r
+      UnicodeSPrint (PBuffer, 0, L"%02x", (UINTN) Ip->RemoteIpAddress.Addr[Index]);\r
+    }\r
 \r
-  AppendCSDStr (MappingItem, Buffer);\r
-  AppendCSDNum (MappingItem, Ip->RemotePort);\r
+    Status = AppendCSDStr (MappingItem, Buffer);\r
+  }\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Ip->RemotePort);\r
+  }\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -862,22 +1089,30 @@ DevPathSerialIPv6 (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialScsi (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
+  EFI_STATUS        Status;\r
   SCSI_DEVICE_PATH  *Scsi;\r
 \r
   ASSERT(DevicePathNode != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
   Scsi = (SCSI_DEVICE_PATH *) DevicePathNode;\r
-  AppendCSDNum (MappingItem, Scsi->Pun);\r
-  AppendCSDNum (MappingItem, Scsi->Lun);\r
+  Status = AppendCSDNum (MappingItem, Scsi->Pun);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = AppendCSDNum (MappingItem, Scsi->Lun);\r
+  }\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -885,12 +1120,16 @@ DevPathSerialScsi (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerial1394 (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   F1394_DEVICE_PATH *DevicePath_F1394;\r
@@ -901,7 +1140,7 @@ DevPathSerial1394 (
 \r
   DevicePath_F1394 = (F1394_DEVICE_PATH *) DevicePathNode;\r
   UnicodeSPrint (Buffer, 0, L"%lx", DevicePath_F1394->Guid);\r
-  AppendCSDStr (MappingItem, Buffer);\r
+  return AppendCSDStr (MappingItem, Buffer);\r
 }\r
 \r
 /**\r
@@ -909,12 +1148,16 @@ DevPathSerial1394 (
 \r
   @param[in] DevicePathNode   The node to get info on.\r
   @param[in] MappingItem      The info item to populate.\r
+  @param[in] DevicePath       Ignored.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialAcpi (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
   ACPI_HID_DEVICE_PATH  *Acpi;\r
@@ -926,9 +1169,10 @@ DevPathSerialAcpi (
   if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {\r
     if (EISA_ID_TO_NUM (Acpi->HID) == 0x0604) {\r
       MappingItem->Mtd = MTDTypeFloppy;\r
-      AppendCSDNum (MappingItem, Acpi->UID);\r
+      return AppendCSDNum (MappingItem, Acpi->UID);\r
     }\r
   }\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -936,17 +1180,19 @@ DevPathSerialAcpi (
 \r
   @param[in] DevicePathNode       Ignored.\r
   @param[in] MappingItem          Ignored.\r
+  @param[in] DevicePath           Ignored.\r
 \r
-  Does nothing.\r
+  @retval EFI_OUT_OF_RESOURCES    Out of resources.\r
+  @retval EFI_SUCCESS             The appending was successful.\r
 **/\r
-VOID\r
-EFIAPI\r
+EFI_STATUS\r
 DevPathSerialDefault (\r
   IN EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode,\r
-  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem\r
+  IN DEVICE_CONSIST_MAPPING_INFO  *MappingItem,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
-  return;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 DEV_PATH_CONSIST_MAPPING_TABLE  DevPathConsistMappingTable[] = {\r
@@ -1087,7 +1333,6 @@ DEV_PATH_CONSIST_MAPPING_TABLE  DevPathConsistMappingTable[] = {
   @retval FALSE   The node is not Hi.\r
 **/\r
 BOOLEAN\r
-EFIAPI\r
 IsHIDevicePathNode (\r
   IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode\r
   )\r
@@ -1124,7 +1369,6 @@ IsHIDevicePathNode (
   @return   the device path portion that is Hi.\r
 **/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
-EFIAPI\r
 GetHIDevicePath (\r
   IN EFI_DEVICE_PATH_PROTOCOL        *DevicePath\r
   )\r
@@ -1179,27 +1423,28 @@ GetHIDevicePath (
   @return EFI_SUCCESS         Always returns success.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 GetDeviceConsistMappingInfo (\r
   IN DEVICE_CONSIST_MAPPING_INFO    *MappingItem,\r
   IN EFI_DEVICE_PATH_PROTOCOL       *DevicePath\r
   )\r
 {\r
-  VOID (EFIAPI *SerialFun) (EFI_DEVICE_PATH_PROTOCOL *, DEVICE_CONSIST_MAPPING_INFO *);\r
-\r
-  UINTN Index;\r
+  EFI_STATUS                Status;\r
+  SERIAL_DECODE_FUNCTION    SerialFun;\r
+  UINTN                     Index;\r
+  EFI_DEVICE_PATH_PROTOCOL  *OriginalDevicePath;\r
 \r
   ASSERT(DevicePath != NULL);\r
   ASSERT(MappingItem != NULL);\r
 \r
   SetMem (&MappingItem->Csd, sizeof (POOL_PRINT), 0);\r
+  OriginalDevicePath = DevicePath;\r
 \r
   while (!IsDevicePathEnd (DevicePath)) {\r
     //\r
-    // Find the handler to dump this device path node\r
+    // Find the handler to dump this device path node and\r
+    // initialize with generic function in case nothing is found\r
     //\r
-    SerialFun = NULL;\r
-    for (Index = 0; DevPathConsistMappingTable[Index].SerialFun != NULL; Index += 1) {\r
+    for (SerialFun = DevPathSerialDefault, Index = 0; DevPathConsistMappingTable[Index].SerialFun != NULL; Index += 1) {\r
 \r
       if (DevicePathType (DevicePath) == DevPathConsistMappingTable[Index].Type &&\r
           DevicePathSubType (DevicePath) == DevPathConsistMappingTable[Index].SubType\r
@@ -1208,14 +1453,12 @@ GetDeviceConsistMappingInfo (
         break;\r
       }\r
     }\r
-    //\r
-    // If not found, use a generic function\r
-    //\r
-    if (!SerialFun) {\r
-      SerialFun = DevPathSerialDefault;\r
-    }\r
 \r
-    SerialFun (DevicePath, MappingItem);\r
+    Status = SerialFun (DevicePath, MappingItem, OriginalDevicePath);\r
+    if (EFI_ERROR (Status)) {\r
+      SHELL_FREE_NON_NULL (MappingItem->Csd.Str);\r
+      return Status;\r
+    }\r
 \r
     //\r
     // Next device path node\r
@@ -1239,20 +1482,22 @@ ShellCommandConsistMappingInitialize (
   OUT EFI_DEVICE_PATH_PROTOCOL           ***Table\r
   )\r
 {\r
-  EFI_HANDLE                *HandleBuffer;\r
-  UINTN                     HandleNum;\r
-  UINTN                     HandleLoop;\r
-  EFI_DEVICE_PATH_PROTOCOL  **TempTable;\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *HIDevicePath;\r
-  UINTN                     Index;\r
-  EFI_STATUS                Status;\r
+  EFI_HANDLE                      *HandleBuffer;\r
+  UINTN                           HandleNum;\r
+  UINTN                           HandleLoop;\r
+  EFI_DEVICE_PATH_PROTOCOL        **TempTable;\r
+  EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL        *HIDevicePath;\r
+  EFI_BLOCK_IO_PROTOCOL           *BlockIo;\r
+  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;\r
+  UINTN                           Index;\r
+  EFI_STATUS                      Status;\r
 \r
   HandleBuffer              = NULL;\r
 \r
   Status = gBS->LocateHandleBuffer (\r
-              AllHandles,\r
-              NULL,\r
+              ByProtocol,\r
+              &gEfiDevicePathProtocolGuid,\r
               NULL,\r
               &HandleNum,\r
               &HandleBuffer\r
@@ -1275,6 +1520,21 @@ ShellCommandConsistMappingInitialize (
       continue;\r
     }\r
 \r
+    Status = gBS->HandleProtocol( HandleBuffer[HandleLoop], \r
+                                  &gEfiBlockIoProtocolGuid, \r
+                                  (VOID **)&BlockIo\r
+                                  );\r
+    if (EFI_ERROR(Status)) {\r
+      Status = gBS->HandleProtocol( HandleBuffer[HandleLoop], \r
+                                    &gEfiSimpleFileSystemProtocolGuid, \r
+                                    (VOID **)&SimpleFileSystem\r
+                                    );\r
+      if (EFI_ERROR(Status)) {\r
+        FreePool (HIDevicePath);\r
+        continue;\r
+      }\r
+    }\r
+\r
     for (Index = 0; TempTable[Index] != NULL; Index++) {\r
       if (DevicePathCompare (&TempTable[Index], &HIDevicePath) == 0) {\r
         FreePool (HIDevicePath);\r
@@ -1345,11 +1605,11 @@ ShellCommandConsistMappingGenMappingName (
   IN EFI_DEVICE_PATH_PROTOCOL    **Table\r
   )\r
 {\r
+  EFI_STATUS                  Status;\r
   POOL_PRINT                  Str;\r
   DEVICE_CONSIST_MAPPING_INFO MappingInfo;\r
   EFI_DEVICE_PATH_PROTOCOL    *HIDevicePath;\r
   UINTN                       Index;\r
-  UINTN                       NewSize;\r
 \r
   ASSERT(DevicePath         != NULL);\r
   ASSERT(Table  != NULL);\r
@@ -1374,7 +1634,10 @@ ShellCommandConsistMappingGenMappingName (
   MappingInfo.Mtd     = MTDTypeUnknown;\r
   MappingInfo.Digital = FALSE;\r
 \r
-  GetDeviceConsistMappingInfo (&MappingInfo, DevicePath);\r
+  Status = GetDeviceConsistMappingInfo (&MappingInfo, DevicePath);\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
 \r
   SetMem (&Str, sizeof (Str), 0);\r
   for (Index = 0; mMTDName[Index].MTDType != MTDTypeEnd; Index++) {\r
@@ -1384,25 +1647,25 @@ ShellCommandConsistMappingGenMappingName (
   }\r
 \r
   if (mMTDName[Index].MTDType != MTDTypeEnd) {\r
-    CatPrint (&Str, L"%s", mMTDName[Index].Name);\r
+    Status = CatPrint (&Str, L"%s", mMTDName[Index].Name);\r
   }\r
 \r
-  CatPrint (&Str, L"%d", (UINTN) MappingInfo.Hi);\r
-  if (MappingInfo.Csd.Str != NULL) {\r
-    CatPrint (&Str, L"%s", MappingInfo.Csd.Str);\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = CatPrint (&Str, L"%d", (UINTN) MappingInfo.Hi);\r
+  }\r
+  if (!EFI_ERROR (Status) && MappingInfo.Csd.Str != NULL) {\r
+    Status = CatPrint (&Str, L"%s", MappingInfo.Csd.Str);\r
     FreePool (MappingInfo.Csd.Str);\r
   }\r
 \r
-  if (Str.Str != NULL) {\r
-    CatPrint (&Str, L":");\r
+  if (!EFI_ERROR (Status) && Str.Str != NULL) {\r
+    Status = CatPrint (&Str, L":");\r
   }\r
-\r
-  NewSize           = (Str.Len + 1) * sizeof (CHAR16);\r
-  Str.Str           = ReallocatePool (Str.Len, NewSize, Str.Str);\r
-  if (Str.Str == NULL) {\r
-    return (NULL);\r
+  if (EFI_ERROR (Status)) {\r
+    SHELL_FREE_NON_NULL (Str.Str);\r
+    return NULL;\r
   }\r
-  Str.Str[Str.Len]  = CHAR_NULL;\r
+\r
   return Str.Str;\r
 }\r
 \r