]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
ShellPkg: Enahance 'dh' command to add more protocols decoding support
[mirror_edk2.git] / ShellPkg / Library / UefiHandleParsingLib / UefiHandleParsingLib.c
index bf41047087324352b22031975c849889335464e8..efafe6f5350dd61759c3677dff9c0a9056e23b6f 100644 (file)
@@ -1,8 +1,9 @@
 /** @file\r
   Provides interface to advanced shell functionality for parsing both handle and protocol database.\r
 \r
+  Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>\r
   (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>\r
-  Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<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
@@ -108,9 +109,9 @@ HandleParsingLibConstructor (
   return (EFI_SUCCESS);\r
 }\r
 \r
-/** \r
+/**\r
   Initialization function for HII packages.\r
\r
+\r
 **/\r
 VOID\r
 HandleParsingHiiInit (VOID)\r
@@ -180,10 +181,7 @@ LoadedImageProtocolDumpInformation(
   HandleParsingHiiInit();\r
 \r
   Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_MAIN), NULL);\r
-  RetVal = AllocateZeroPool (PcdGet16 (PcdShellPrintBufferSize));\r
-  if (Temp == NULL || RetVal == NULL) {\r
-    SHELL_FREE_NON_NULL(Temp);\r
-    SHELL_FREE_NON_NULL(RetVal);\r
+  if (Temp == NULL) {\r
     return NULL;\r
   }\r
 \r
@@ -198,29 +196,30 @@ LoadedImageProtocolDumpInformation(
 \r
   if (EFI_ERROR (Status)) {\r
     SHELL_FREE_NON_NULL (Temp);\r
-    SHELL_FREE_NON_NULL (RetVal);\r
     return NULL;\r
   }\r
 \r
   DataType = ConvertMemoryType(LoadedImage->ImageDataType);\r
   CodeType = ConvertMemoryType(LoadedImage->ImageCodeType);\r
 \r
-  RetVal = CatSPrint(RetVal,\r
-                      Temp,\r
-                      LoadedImage->Revision,\r
-                      LoadedImage->ParentHandle,\r
-                      LoadedImage->SystemTable,\r
-                      LoadedImage->DeviceHandle,\r
-                      LoadedImage->FilePath,\r
-                      LoadedImage->LoadOptionsSize,\r
-                      LoadedImage->LoadOptions,\r
-                      LoadedImage->ImageBase,\r
-                      LoadedImage->ImageSize,\r
-                      CodeType,\r
-                      DataType,\r
-                      LoadedImage->Unload);\r
-\r
-  \r
+  RetVal = CatSPrint(\r
+             NULL,\r
+             Temp,\r
+             LoadedImage->Revision,\r
+             LoadedImage->ParentHandle,\r
+             LoadedImage->SystemTable,\r
+             LoadedImage->DeviceHandle,\r
+             LoadedImage->FilePath,\r
+             LoadedImage->LoadOptionsSize,\r
+             LoadedImage->LoadOptions,\r
+             LoadedImage->ImageBase,\r
+             LoadedImage->ImageSize,\r
+             CodeType,\r
+             DataType,\r
+             LoadedImage->Unload\r
+             );\r
+\r
+\r
   SHELL_FREE_NON_NULL(Temp);\r
   SHELL_FREE_NON_NULL(CodeType);\r
   SHELL_FREE_NON_NULL(DataType);\r
@@ -245,11 +244,15 @@ GraphicsOutputProtocolDumpInformation(
   IN CONST BOOLEAN    Verbose\r
   )\r
 {\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL      *GraphicsOutput;\r
-  EFI_STATUS                        Status;\r
-  CHAR16                            *RetVal;\r
-  CHAR16                            *Temp;\r
-  CHAR16                            *Fmt;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL          *GraphicsOutput;
+  EFI_STATUS                            Status;
+  CHAR16                                *RetVal;
+  CHAR16                                *Temp;
+  CHAR16                                *Fmt;
+  CHAR16                                *TempRetVal;
+  UINTN                                 GopInfoSize;
+  UINT32                                Mode;
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *GopInfo;
 \r
   if (!Verbose) {\r
     return (CatSPrint(NULL, L"GraphicsOutput"));\r
@@ -258,10 +261,7 @@ GraphicsOutputProtocolDumpInformation(
   HandleParsingHiiInit();\r
 \r
   Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_GOP_DUMP_MAIN), NULL);\r
-  RetVal = AllocateZeroPool (PcdGet16 (PcdShellPrintBufferSize));\r
-  if (Temp == NULL || RetVal == NULL) {\r
-    SHELL_FREE_NON_NULL(Temp);\r
-    SHELL_FREE_NON_NULL(RetVal);\r
+  if (Temp == NULL) {\r
     return NULL;\r
   }\r
 \r
@@ -276,29 +276,64 @@ GraphicsOutputProtocolDumpInformation(
 \r
   if (EFI_ERROR (Status)) {\r
     SHELL_FREE_NON_NULL (Temp);\r
-    SHELL_FREE_NON_NULL (RetVal);\r
     return NULL;\r
   }\r
 \r
   Fmt = ConvertPixelFormat(GraphicsOutput->Mode->Info->PixelFormat);\r
 \r
-  RetVal = CatSPrint(RetVal,\r
-                      Temp,\r
-                      GraphicsOutput->Mode->MaxMode,\r
-                      GraphicsOutput->Mode->Mode,\r
-                      GraphicsOutput->Mode->FrameBufferBase,\r
-                      (UINT64)GraphicsOutput->Mode->FrameBufferSize,\r
-                      (UINT64)GraphicsOutput->Mode->SizeOfInfo,\r
-                      GraphicsOutput->Mode->Info->Version,\r
-                      GraphicsOutput->Mode->Info->HorizontalResolution,\r
-                      GraphicsOutput->Mode->Info->VerticalResolution,\r
-                      Fmt,\r
-                      GraphicsOutput->Mode->Info->PixelsPerScanLine,\r
-                      GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.RedMask,\r
-                      GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.GreenMask,\r
-                      GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.BlueMask\r
-                      );\r
-  \r
+  RetVal = CatSPrint(\r
+             NULL,\r
+             Temp,\r
+             GraphicsOutput->Mode->MaxMode,\r
+             GraphicsOutput->Mode->Mode,\r
+             GraphicsOutput->Mode->FrameBufferBase,\r
+             (UINT64)GraphicsOutput->Mode->FrameBufferSize,\r
+             (UINT64)GraphicsOutput->Mode->SizeOfInfo,\r
+             GraphicsOutput->Mode->Info->Version,\r
+             GraphicsOutput->Mode->Info->HorizontalResolution,\r
+             GraphicsOutput->Mode->Info->VerticalResolution,\r
+             Fmt,\r
+             GraphicsOutput->Mode->Info->PixelsPerScanLine,\r
+             GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.RedMask,\r
+             GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.GreenMask,\r
+             GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.BlueMask\r
+             );\r
+\r
+  SHELL_FREE_NON_NULL (Temp);
+  
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_RES_LIST_MAIN), NULL);
+
+  TempRetVal = CatSPrint (RetVal, Temp);
+  SHELL_FREE_NON_NULL (RetVal);
+  RetVal = TempRetVal;
+  SHELL_FREE_NON_NULL (Temp);
+
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_RES_LIST_ENTRY), NULL);
+
+  for (Mode = 0; Mode < GraphicsOutput->Mode->MaxMode; Mode++) {
+    Status = GraphicsOutput->QueryMode (
+                               GraphicsOutput,
+                               Mode,
+                               &GopInfoSize,
+                               &GopInfo
+                               );
+    if (EFI_ERROR (Status)) {
+      continue;
+    }
+
+    TempRetVal = CatSPrint (
+                   RetVal,
+                   Temp,
+                   Mode,
+                   GopInfo->HorizontalResolution,
+                   GopInfo->VerticalResolution
+                   );
+
+    SHELL_FREE_NON_NULL (GopInfo);
+    SHELL_FREE_NON_NULL (RetVal);
+    RetVal = TempRetVal;
+  }
+
   SHELL_FREE_NON_NULL(Temp);\r
   SHELL_FREE_NON_NULL(Fmt);\r
 \r
@@ -306,6 +341,134 @@ GraphicsOutputProtocolDumpInformation(
 }\r
 \r
 /**\r
+  Function to dump information about EDID Discovered Protocol.
+
+  This will allocate the return buffer from boot services pool.
+
+  @param[in] TheHandle      The handle that has LoadedImage installed.
+  @param[in] Verbose        TRUE for additional information, FALSE otherwise.
+
+  @retval A poitner to a string containing the information.
+**/
+CHAR16*
+EFIAPI
+EdidDiscoveredProtocolDumpInformation (
+  IN CONST EFI_HANDLE TheHandle,
+  IN CONST BOOLEAN    Verbose
+  )
+{
+  EFI_EDID_DISCOVERED_PROTOCOL          *EdidDiscovered;
+  EFI_STATUS                            Status;
+  CHAR16                                *RetVal;
+  CHAR16                                *Temp;
+  CHAR16                                *TempRetVal;
+
+  if (!Verbose) {
+    return (CatSPrint(NULL, L"EDIDDiscovered"));
+  }
+
+  Status = gBS->OpenProtocol (
+                  TheHandle,
+                  &gEfiEdidDiscoveredProtocolGuid,
+                  (VOID**)&EdidDiscovered,
+                  NULL,
+                  NULL,
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
+                  );
+
+  if (EFI_ERROR (Status)) {
+    return NULL;
+  }
+
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_EDID_DISCOVERED_MAIN), NULL);
+  if (Temp == NULL) {
+    return NULL;
+  }
+
+  RetVal = CatSPrint (NULL, Temp, EdidDiscovered->SizeOfEdid);
+  SHELL_FREE_NON_NULL (Temp);
+
+  if(EdidDiscovered->SizeOfEdid != 0) {
+    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_EDID_DISCOVERED_DATA), NULL);
+    if (Temp == NULL) {
+      SHELL_FREE_NON_NULL (RetVal);
+      return NULL;
+    }
+    TempRetVal = CatSPrint (RetVal, Temp);
+    SHELL_FREE_NON_NULL (RetVal);
+    RetVal = TempRetVal;
+
+    TempRetVal = CatSDumpHex (RetVal, 7, 0, EdidDiscovered->SizeOfEdid, EdidDiscovered->Edid);
+    RetVal = TempRetVal;
+  }
+  return RetVal;
+}
+
+/**
+  Function to dump information about EDID Active Protocol.
+
+  This will allocate the return buffer from boot services pool.
+
+  @param[in] TheHandle      The handle that has LoadedImage installed.
+  @param[in] Verbose        TRUE for additional information, FALSE otherwise.
+
+  @retval A poitner to a string containing the information.
+**/
+CHAR16*
+EFIAPI
+EdidActiveProtocolDumpInformation (
+  IN CONST EFI_HANDLE TheHandle,
+  IN CONST BOOLEAN    Verbose
+  )
+{
+  EFI_EDID_ACTIVE_PROTOCOL  *EdidActive;
+  EFI_STATUS                Status;
+  CHAR16                    *RetVal;
+  CHAR16                    *Temp;
+  CHAR16                    *TempRetVal;
+
+  if (!Verbose) {
+    return (CatSPrint(NULL, L"EDIDActive"));
+  }
+
+  Status = gBS->OpenProtocol (
+                  TheHandle,
+                  &gEfiEdidActiveProtocolGuid,
+                  (VOID**)&EdidActive,
+                  NULL,
+                  NULL,
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
+                  );
+
+  if (EFI_ERROR (Status)) {
+    return NULL;
+  }
+
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_EDID_ACTIVE_MAIN), NULL);
+  if (Temp == NULL) {
+    return NULL;
+  }
+
+  RetVal = CatSPrint (NULL, Temp, EdidActive->SizeOfEdid);
+  SHELL_FREE_NON_NULL (Temp);
+
+  if(EdidActive->SizeOfEdid != 0) {
+    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_EDID_ACTIVE_DATA), NULL);
+    if (Temp == NULL) {
+      SHELL_FREE_NON_NULL (RetVal);
+      return NULL;
+    }
+    TempRetVal = CatSPrint (RetVal, Temp);
+    SHELL_FREE_NON_NULL (RetVal);
+    RetVal = TempRetVal;
+
+    TempRetVal = CatSDumpHex (RetVal, 7, 0, EdidActive->SizeOfEdid, EdidActive->Edid);
+    RetVal = TempRetVal;
+  }
+  return RetVal;
+}
+
+/**
   Function to dump information about PciRootBridgeIo.\r
 \r
   This will allocate the return buffer from boot services pool.\r
@@ -356,7 +519,7 @@ PciRootBridgeIoDumpInformation(
   FreePool(Temp);\r
   RetVal = Temp2;\r
   Temp2 = NULL;\r
\r
+\r
   Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SEG), NULL);\r
   if (Temp == NULL) {\r
     SHELL_FREE_NON_NULL(RetVal);\r
@@ -376,13 +539,13 @@ PciRootBridgeIoDumpInformation(
     if (Temp == NULL) {\r
       SHELL_FREE_NON_NULL(RetVal);\r
       return NULL;\r
-    }    \r
+    }\r
     Temp2 = CatSPrint(RetVal, Temp, Attributes);\r
     FreePool(Temp);\r
     FreePool(RetVal);\r
     RetVal = Temp2;\r
     Temp2 = NULL;\r
-    \r
+\r
     Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SUPPORTS), NULL);\r
     if (Temp == NULL) {\r
       SHELL_FREE_NON_NULL(RetVal);\r
@@ -429,7 +592,7 @@ PciRootBridgeIoDumpInformation(
         Temp2 = NULL;\r
       }\r
 \r
-      Temp2 = CatSPrint(RetVal, \r
+      Temp2 = CatSPrint(RetVal,\r
         L"%H%02x    %016lx  %016lx  %02x%N\r\n",\r
         Configuration->SpecificFlag,\r
         Configuration->AddrRangeMin,\r
@@ -618,23 +781,17 @@ AdapterInformationDumpInformation (
   CHAR16                            *GuidStr;\r
   CHAR16                            *TempStr;\r
   CHAR16                            *RetVal;\r
+  CHAR16                            *TempRetVal;\r
   VOID                              *InformationBlock;\r
   UINTN                             InformationBlockSize;\r
-   \r
+\r
   if (!Verbose) {\r
     return (CatSPrint(NULL, L"AdapterInfo"));\r
   }\r
 \r
   InfoTypesBuffer   = NULL;\r
   InformationBlock  = NULL;\r
-  \r
-  //\r
-  // Allocate print buffer to store data\r
-  //\r
-  RetVal = AllocateZeroPool (PcdGet16(PcdShellPrintBufferSize));\r
-  if (RetVal == NULL) {\r
-    return NULL;\r
-  }\r
+\r
 \r
   Status = gBS->OpenProtocol (\r
                   (EFI_HANDLE) (TheHandle),\r
@@ -646,7 +803,6 @@ AdapterInformationDumpInformation (
                   );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    SHELL_FREE_NON_NULL (RetVal);\r
     return NULL;\r
   }\r
 \r
@@ -655,22 +811,23 @@ AdapterInformationDumpInformation (
   //\r
   Status = EfiAdptrInfoProtocol->GetSupportedTypes (\r
                                    EfiAdptrInfoProtocol,\r
-                                   &InfoTypesBuffer, \r
+                                   &InfoTypesBuffer,\r
                                    &InfoTypesBufferCount\r
                                    );\r
+  RetVal = NULL;\r
   if (EFI_ERROR (Status)) {\r
     TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_GET_SUPP_TYPES_FAILED), NULL);\r
     if (TempStr != NULL) {\r
-      RetVal = CatSPrint (RetVal, TempStr, Status);\r
+      RetVal = CatSPrint (NULL, TempStr, Status);\r
     } else {\r
       goto ERROR_EXIT;\r
-    }  \r
+    }\r
   } else {\r
     TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_SUPP_TYPE_HEADER), NULL);\r
     if (TempStr == NULL) {\r
       goto ERROR_EXIT;\r
     }\r
-    RetVal = CatSPrint (RetVal, TempStr);\r
+    RetVal = CatSPrint (NULL, TempStr);\r
     SHELL_FREE_NON_NULL (TempStr);\r
 \r
     for (GuidIndex = 0; GuidIndex < InfoTypesBufferCount; GuidIndex++) {\r
@@ -678,7 +835,9 @@ AdapterInformationDumpInformation (
       if (TempStr == NULL) {\r
         goto ERROR_EXIT;\r
       }\r
-      RetVal = CatSPrint (RetVal, TempStr, (GuidIndex + 1), InfoTypesBuffer[GuidIndex]);\r
+      TempRetVal = CatSPrint (RetVal, TempStr, (GuidIndex + 1), &InfoTypesBuffer[GuidIndex]);\r
+      SHELL_FREE_NON_NULL (RetVal);\r
+      RetVal = TempRetVal;\r
       SHELL_FREE_NON_NULL (TempStr);\r
 \r
       TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_GUID_STRING), NULL);\r
@@ -687,32 +846,46 @@ AdapterInformationDumpInformation (
       }\r
 \r
       if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoMediaStateGuid)) {\r
-        RetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoMediaStateGuid");\r
+        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoMediaStateGuid");\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
       } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoNetworkBootGuid)) {\r
-        RetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoNetworkBootGuid");\r
+        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoNetworkBootGuid");\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
       } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoSanMacAddressGuid)) {\r
-        RetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoSanMacAddressGuid");\r
+        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoSanMacAddressGuid");\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+      } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoUndiIpv6SupportGuid)) {\r
+        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoUndiIpv6SupportGuid");\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
       } else {\r
 \r
         GuidStr = GetStringNameFromGuid (&InfoTypesBuffer[GuidIndex], NULL);\r
-       \r
+\r
         if (GuidStr != NULL) {\r
           if (StrCmp(GuidStr, L"UnknownDevice") == 0) {\r
-            RetVal = CatSPrint (RetVal, TempStr, L"UnknownInfoType");\r
-            \r
+            TempRetVal = CatSPrint (RetVal, TempStr, L"UnknownInfoType");\r
+            SHELL_FREE_NON_NULL (RetVal);\r
+            RetVal = TempRetVal;\r
+\r
             SHELL_FREE_NON_NULL (TempStr);\r
             SHELL_FREE_NON_NULL(GuidStr);\r
             //\r
             // So that we never have to pass this UnknownInfoType to the parsing function "GetInformation" service of AIP\r
             //\r
-            continue; \r
+            continue;\r
           } else {\r
-            RetVal = CatSPrint (RetVal, TempStr, GuidStr);\r
+            TempRetVal = CatSPrint (RetVal, TempStr, GuidStr);\r
+            SHELL_FREE_NON_NULL (RetVal);\r
+            RetVal = TempRetVal;\r
             SHELL_FREE_NON_NULL(GuidStr);\r
           }\r
         }\r
       }\r
-      \r
+\r
       SHELL_FREE_NON_NULL (TempStr);\r
 \r
       Status = EfiAdptrInfoProtocol->GetInformation (\r
@@ -727,57 +900,80 @@ AdapterInformationDumpInformation (
         if (TempStr == NULL) {\r
           goto ERROR_EXIT;\r
         }\r
-        RetVal = CatSPrint (RetVal, TempStr, Status);\r
+        TempRetVal = CatSPrint (RetVal, TempStr, Status);\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
       } else {\r
         if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoMediaStateGuid)) {\r
           TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_MEDIA_STATE), NULL);\r
           if (TempStr == NULL) {\r
             goto ERROR_EXIT;\r
           }\r
-          RetVal = CatSPrint (\r
-                     RetVal,\r
-                     TempStr,\r
-                     ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState,\r
-                     ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState\r
-                     );\r
+          TempRetVal = CatSPrint (\r
+                         RetVal,\r
+                         TempStr,\r
+                         ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState,\r
+                         ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState\r
+                         );\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
         } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoNetworkBootGuid)) {\r
           TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_NETWORK_BOOT_INFO), NULL);\r
           if (TempStr == NULL) {\r
             goto ERROR_EXIT;\r
           }\r
-          RetVal = CatSPrint (\r
-                     RetVal,\r
-                     TempStr,\r
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4BootCapablity,\r
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6BootCapablity, \r
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBootCapablity, \r
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->OffloadCapability, \r
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiMpioCapability, \r
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4Boot, \r
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6Boot,\r
-                     ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBoot\r
-                     );\r
-        } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoSanMacAddressGuid) == TRUE) { \r
+          TempRetVal = CatSPrint (\r
+                         RetVal,\r
+                         TempStr,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4BootCapablity,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6BootCapablity,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBootCapablity,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->OffloadCapability,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiMpioCapability,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4Boot,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6Boot,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBoot\r
+                         );\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
+        } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoSanMacAddressGuid) == TRUE) {\r
           TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_SAN_MAC_ADDRESS_INFO), NULL);\r
           if (TempStr == NULL) {\r
             goto ERROR_EXIT;\r
           }\r
-          RetVal = CatSPrint (\r
-                     RetVal,\r
-                     TempStr,\r
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[0], \r
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[1], \r
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[2],\r
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[3], \r
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[4], \r
-                     ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[5]\r
-                     );   \r
+          TempRetVal = CatSPrint (\r
+                         RetVal,\r
+                         TempStr,\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[0],\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[1],\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[2],\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[3],\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[4],\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[5]\r
+                         );\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
+        } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoUndiIpv6SupportGuid) == TRUE) {\r
+          TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_UNDI_IPV6_INFO), NULL);\r
+          if (TempStr == NULL) {\r
+            goto ERROR_EXIT;\r
+          }\r
+\r
+          TempRetVal = CatSPrint (\r
+                         RetVal,\r
+                         TempStr,\r
+                         ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT *)InformationBlock)->Ipv6Support\r
+                         );   \r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
         } else {\r
           TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_UNKNOWN_INFO_TYPE), NULL);\r
           if (TempStr == NULL) {\r
             goto ERROR_EXIT;\r
           }\r
-          RetVal = CatSPrint (RetVal, TempStr, &InfoTypesBuffer[GuidIndex]);\r
+          TempRetVal = CatSPrint (RetVal, TempStr, &InfoTypesBuffer[GuidIndex]);\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
         }\r
       }\r
       SHELL_FREE_NON_NULL (TempStr);\r
@@ -794,6 +990,407 @@ ERROR_EXIT:
   SHELL_FREE_NON_NULL (InformationBlock);\r
   return NULL;\r
 }\r
+\r
+/**\r
+  Function to dump information about EFI_FIRMWARE_MANAGEMENT_PROTOCOL Protocol.\r
+\r
+  @param[in] TheHandle      The handle that has the protocol installed.\r
+  @param[in] Verbose        TRUE for additional information, FALSE otherwise.\r
+\r
+  @retval A pointer to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+FirmwareManagementDumpInformation (\r
+  IN CONST EFI_HANDLE TheHandle,\r
+  IN CONST BOOLEAN    Verbose\r
+  )\r
+{\r
+  EFI_STATUS                          Status;\r
+  EFI_FIRMWARE_MANAGEMENT_PROTOCOL    *EfiFwMgmtProtocol;\r
+  EFI_FIRMWARE_IMAGE_DESCRIPTOR       *ImageInfo;\r
+  EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1    *ImageInfoV1;\r
+  EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2    *ImageInfoV2;\r
+  UINT64                              AttributeSetting;\r
+  UINTN                               ImageInfoSize;\r
+  UINTN                               DescriptorSize;\r
+  UINT32                              DescriptorVersion;\r
+  UINT32                              PackageVersion;\r
+  UINT8                               DescriptorCount;\r
+  UINT8                               Index;\r
+  UINT8                               Index1;\r
+  UINT8                               ImageCount;\r
+  CHAR16                              *PackageVersionName;\r
+  CHAR16                              *TempStr;\r
+  CHAR16                              *RetVal;\r
+  CHAR16                              *TempRetVal;\r
+  CHAR16                              *AttributeSettingStr;\r
+  BOOLEAN                             Found;\r
+  BOOLEAN                             AttributeSupported;\r
+\r
+  //\r
+  // Initialize local variables\r
+  //\r
+  ImageCount             = 0;\r
+  ImageInfoSize          = 1;\r
+  AttributeSetting       = 0;\r
+  Found                  = FALSE;\r
+  AttributeSupported     = FALSE;\r
+  ImageInfo              = NULL;\r
+  ImageInfoV1            = NULL;\r
+  ImageInfoV2            = NULL;\r
+  PackageVersionName     = NULL;\r
+  RetVal                 = NULL;\r
+  TempRetVal             = NULL;\r
+  TempStr                = NULL;\r
+  AttributeSettingStr    = NULL;\r
+\r
+  if (!Verbose) {\r
+    return (CatSPrint(NULL, L"FirmwareManagement"));\r
+  }\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  (EFI_HANDLE) (TheHandle),\r
+                  &gEfiFirmwareManagementProtocolGuid,\r
+                  (VOID **) &EfiFwMgmtProtocol,\r
+                  NULL,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  Status = EfiFwMgmtProtocol->GetImageInfo (\r
+                                EfiFwMgmtProtocol,\r
+                                &ImageInfoSize,\r
+                                ImageInfo,\r
+                                &DescriptorVersion,\r
+                                &DescriptorCount,\r
+                                &DescriptorSize,\r
+                                &PackageVersion,\r
+                                &PackageVersionName\r
+                                );\r
+\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    ImageInfo = AllocateZeroPool (ImageInfoSize);\r
+\r
+    if (ImageInfo == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+    } else {\r
+      Status = EfiFwMgmtProtocol->GetImageInfo (\r
+                                    EfiFwMgmtProtocol,\r
+                                    &ImageInfoSize,\r
+                                    ImageInfo,\r
+                                    &DescriptorVersion,\r
+                                    &DescriptorCount,\r
+                                    &DescriptorSize,\r
+                                    &PackageVersion,\r
+                                    &PackageVersionName\r
+                                    );\r
+    }\r
+  }\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    goto ERROR_EXIT;\r
+  }\r
+\r
+  //\r
+  // Decode Image Descriptor data only if its version is supported\r
+  //\r
+  if (DescriptorVersion <= EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION) {\r
+\r
+    if (ImageInfo == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+\r
+    ImageInfoV1 = (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1 *)ImageInfo;\r
+    ImageInfoV2 = (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2 *)ImageInfo;\r
+\r
+    //\r
+    // Set ImageInfoSize in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_INFO_SIZE), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+    RetVal = CatSPrint (NULL, TempStr, ImageInfoSize);\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    //\r
+    // Set DescriptorVersion in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_DESCRIPTOR_VERSION), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+    TempRetVal = CatSPrint (RetVal, TempStr, DescriptorVersion);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    //\r
+    // Set DescriptorCount in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_DESCRIPTOR_COUNT), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+    TempRetVal = CatSPrint (RetVal, TempStr, DescriptorCount);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+\r
+    //\r
+    // Set DescriptorSize in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_DESCRIPTOR_SIZE), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+    TempRetVal = CatSPrint (RetVal, TempStr, DescriptorSize);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    //\r
+    // Set PackageVersion in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_PACKAGE_VERSION), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+    TempRetVal = CatSPrint (RetVal, TempStr, PackageVersion);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    //\r
+    // Set PackageVersionName in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_PACKAGE_VERSION_NAME), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+    TempRetVal = CatSPrint (RetVal, TempStr, PackageVersionName);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    for (Index = 0; Index < DescriptorCount; Index++) {\r
+      //\r
+      // First check if Attribute is supported\r
+      // and generate a string for AttributeSetting field\r
+      //\r
+      SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+      AttributeSupported = FALSE;\r
+      AttributeSetting   = 0;\r
+      if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
+        if (ImageInfoV1[Index].AttributesSupported != 0x0) {\r
+          AttributeSupported = TRUE;\r
+          AttributeSetting   = ImageInfoV1[Index].AttributesSetting;\r
+        }\r
+      } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
+        if (ImageInfoV2[Index].AttributesSupported != 0x0) {\r
+          AttributeSupported = TRUE;\r
+          AttributeSetting   = ImageInfoV2[Index].AttributesSetting;\r
+        }\r
+      } else {\r
+        if (ImageInfo[Index].AttributesSupported != 0x0) {\r
+          AttributeSupported = TRUE;\r
+          AttributeSetting   = ImageInfo[Index].AttributesSetting;\r
+        }\r
+      }\r
+\r
+      if (!AttributeSupported) {\r
+        AttributeSettingStr = CatSPrint (NULL, L"None");\r
+      } else {\r
+        AttributeSettingStr = CatSPrint (NULL, L"(");\r
+\r
+        if ((AttributeSetting & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE) != 0x0) {\r
+          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_IMAGE_UPDATABLE");\r
+          SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+          AttributeSettingStr = TempRetVal;\r
+        }\r
+        if ((AttributeSetting & IMAGE_ATTRIBUTE_RESET_REQUIRED) != 0x0) {\r
+          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_RESET_REQUIRED");\r
+          SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+          AttributeSettingStr = TempRetVal;\r
+        }\r
+        if ((AttributeSetting & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED) != 0x0) {\r
+          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED");\r
+          SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+          AttributeSettingStr = TempRetVal;\r
+        }\r
+        if ((AttributeSetting & IMAGE_ATTRIBUTE_IN_USE) != 0x0) {\r
+          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_IN_USE");\r
+          SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+          AttributeSettingStr = TempRetVal;\r
+        }\r
+        if ((AttributeSetting & IMAGE_ATTRIBUTE_UEFI_IMAGE) != 0x0) {\r
+          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_UEFI_IMAGE");\r
+          SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+          AttributeSettingStr = TempRetVal;\r
+        }\r
+        TempRetVal = CatSPrint (AttributeSettingStr, L" )");\r
+        SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+        AttributeSettingStr = TempRetVal;\r
+      }\r
+\r
+      if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
+        if (ImageInfoV1[Index].ImageIndex != 0x0) {\r
+          ImageCount++;\r
+        }\r
+\r
+        TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO_V1), NULL);\r
+        if (TempStr == NULL) {\r
+          goto ERROR_EXIT;\r
+        }\r
+        TempRetVal = CatSPrint (\r
+                       RetVal,\r
+                       TempStr,\r
+                       Index,\r
+                       ImageInfoV1[Index].ImageIndex,\r
+                       ImageInfoV1[Index].ImageTypeId,\r
+                       ImageInfoV1[Index].ImageId,\r
+                       ImageInfoV1[Index].ImageIdName,\r
+                       ImageInfoV1[Index].Version,\r
+                       ImageInfoV1[Index].VersionName,\r
+                       ImageInfoV1[Index].Size,\r
+                       ImageInfoV1[Index].AttributesSupported,\r
+                       AttributeSettingStr,\r
+                       ImageInfoV1[Index].Compatibilities\r
+                       );\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+        SHELL_FREE_NON_NULL (TempStr);\r
+      } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
+        if (ImageInfoV2[Index].ImageIndex != 0x0) {\r
+          ImageCount++;\r
+        }\r
+\r
+        TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO_V2), NULL);\r
+        if (TempStr == NULL) {\r
+          goto ERROR_EXIT;\r
+        }\r
+        TempRetVal = CatSPrint (\r
+                       RetVal,\r
+                       TempStr,\r
+                       Index,\r
+                       ImageInfoV2[Index].ImageIndex,\r
+                       ImageInfoV2[Index].ImageTypeId,\r
+                       ImageInfoV2[Index].ImageId,\r
+                       ImageInfoV2[Index].ImageIdName,\r
+                       ImageInfoV2[Index].Version,\r
+                       ImageInfoV2[Index].VersionName,\r
+                       ImageInfoV2[Index].Size,\r
+                       ImageInfoV2[Index].AttributesSupported,\r
+                       AttributeSettingStr,\r
+                       ImageInfoV2[Index].Compatibilities,\r
+                       ImageInfoV2[Index].LowestSupportedImageVersion\r
+                       );\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+        SHELL_FREE_NON_NULL (TempStr);\r
+      } else {\r
+        if (ImageInfo[Index].ImageIndex != 0x0) {\r
+          ImageCount++;\r
+        }\r
+\r
+        TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGE_DESCRIPTOR_INFO), NULL);\r
+        if (TempStr == NULL) {\r
+          goto ERROR_EXIT;\r
+        }\r
+        TempRetVal = CatSPrint (\r
+                       RetVal,\r
+                       TempStr,\r
+                       Index,\r
+                       ImageInfo[Index].ImageIndex,\r
+                       ImageInfo[Index].ImageTypeId,\r
+                       ImageInfo[Index].ImageId,\r
+                       ImageInfo[Index].ImageIdName,\r
+                       ImageInfo[Index].Version,\r
+                       ImageInfo[Index].VersionName,\r
+                       ImageInfo[Index].Size,\r
+                       ImageInfo[Index].AttributesSupported,\r
+                       AttributeSettingStr,\r
+                       ImageInfo[Index].Compatibilities,\r
+                       ImageInfo[Index].LowestSupportedImageVersion,\r
+                       ImageInfo[Index].LastAttemptVersion,\r
+                       ImageInfo[Index].LastAttemptStatus,\r
+                       ImageInfo[Index].HardwareInstance\r
+                       );\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+        SHELL_FREE_NON_NULL (TempStr);\r
+      }\r
+    }\r
+  }\r
+\r
+  if (ImageCount > 0) {\r
+    for (Index=0; Index<DescriptorCount; Index++) {\r
+      for (Index1=Index+1; Index1<DescriptorCount; Index1++) {\r
+        if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
+          if (ImageInfoV1[Index].ImageId == ImageInfoV1[Index1].ImageId) {\r
+            Found = TRUE;\r
+            //\r
+            // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
+            //\r
+            goto ENDLOOP;\r
+          }\r
+        } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
+          if (ImageInfoV2[Index].ImageId == ImageInfoV2[Index1].ImageId) {\r
+            Found = TRUE;\r
+            //\r
+            // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
+            //\r
+            goto ENDLOOP;\r
+          }\r
+        } else {\r
+          if (ImageInfo[Index].ImageId == ImageInfo[Index1].ImageId) {\r
+            Found = TRUE;\r
+            //\r
+            // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
+            //\r
+            goto ENDLOOP;\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+ENDLOOP:\r
+  //\r
+  // Check if ImageId with duplicate value was found\r
+  //\r
+  if (Found) {\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_FMP_IMAGEID_NON_UNIQUE), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+    TempRetVal = CatSPrint (RetVal, TempStr);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+  }\r
+\r
+  SHELL_FREE_NON_NULL (ImageInfo);\r
+  SHELL_FREE_NON_NULL (PackageVersionName);\r
+  SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+\r
+  return RetVal;\r
+\r
+ERROR_EXIT:\r
+  SHELL_FREE_NON_NULL (RetVal);\r
+  SHELL_FREE_NON_NULL (ImageInfo);\r
+  SHELL_FREE_NON_NULL (PackageVersionName);\r
+  SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+\r
+  return NULL;\r
+}\r
+\r
 //\r
 // Put the information on the NT32 protocol GUIDs here so we are not dependant on the Nt32Pkg\r
 //\r
@@ -821,7 +1418,7 @@ STATIC CONST EFI_GUID WinNtSerialPortGuid    = LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID
 #define LOCAL_EFI_ISA_IO_PROTOCOL_GUID \\r
   { \\r
   0x7ee2bd44, 0x3da0, 0x11d4, { 0x9a, 0x38, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \\r
-  } \r
+  }\r
 #define LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID \\r
   { \\r
   0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 } \\r
@@ -864,8 +1461,8 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_ABS_POINTER),           &gEfiAbsolutePointerProtocolGuid,                 NULL},\r
   {STRING_TOKEN(STR_SERIAL_IO),             &gEfiSerialIoProtocolGuid,                        NULL},\r
   {STRING_TOKEN(STR_GRAPHICS_OUTPUT),       &gEfiGraphicsOutputProtocolGuid,                  GraphicsOutputProtocolDumpInformation},\r
-  {STRING_TOKEN(STR_EDID_DISCOVERED),       &gEfiEdidDiscoveredProtocolGuid,                  NULL},\r
-  {STRING_TOKEN(STR_EDID_ACTIVE),           &gEfiEdidActiveProtocolGuid,                      NULL},\r
+  {STRING_TOKEN(STR_EDID_DISCOVERED),       &gEfiEdidDiscoveredProtocolGuid,                  EdidDiscoveredProtocolDumpInformation},
+  {STRING_TOKEN(STR_EDID_ACTIVE),           &gEfiEdidActiveProtocolGuid,                      EdidActiveProtocolDumpInformation},
   {STRING_TOKEN(STR_EDID_OVERRIDE),         &gEfiEdidOverrideProtocolGuid,                    NULL},\r
   {STRING_TOKEN(STR_CON_IN),                &gEfiConsoleInDeviceGuid,                         NULL},\r
   {STRING_TOKEN(STR_CON_OUT),               &gEfiConsoleOutDeviceGuid,                        NULL},\r
@@ -989,7 +1586,7 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
 //\r
 // UEFI 2.3\r
 //\r
-  {STRING_TOKEN(STR_FW_MGMT),               &gEfiFirmwareManagementProtocolGuid,              NULL},\r
+  {STRING_TOKEN(STR_FW_MGMT),               &gEfiFirmwareManagementProtocolGuid,              FirmwareManagementDumpInformation},\r
   {STRING_TOKEN(STR_IP_SEC),                &gEfiIpSecProtocolGuid,                           NULL},\r
   {STRING_TOKEN(STR_IP_SEC2),               &gEfiIpSec2ProtocolGuid,                          NULL},\r
 \r
@@ -1013,6 +1610,124 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_IDE_CONT_INIT),         &gEfiIdeControllerInitProtocolGuid,               NULL},\r
   {STRING_TOKEN(STR_DISK_INFO),             &gEfiDiskInfoProtocolGuid,                        NULL},\r
 \r
+//\r
+// PI Spec 1.0\r
+//\r
+  {STRING_TOKEN(STR_BDS_ARCH),              &gEfiBdsArchProtocolGuid,                         NULL},\r
+  {STRING_TOKEN(STR_CPU_ARCH),              &gEfiCpuArchProtocolGuid,                         NULL},\r
+  {STRING_TOKEN(STR_MET_ARCH),              &gEfiMetronomeArchProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_MON_ARCH),              &gEfiMonotonicCounterArchProtocolGuid,            NULL},\r
+  {STRING_TOKEN(STR_RTC_ARCH),              &gEfiRealTimeClockArchProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_RESET_ARCH),            &gEfiResetArchProtocolGuid,                       NULL},\r
+  {STRING_TOKEN(STR_RT_ARCH),               &gEfiRuntimeArchProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_SEC_ARCH),              &gEfiSecurityArchProtocolGuid,                    NULL},\r
+  {STRING_TOKEN(STR_TIMER_ARCH),            &gEfiTimerArchProtocolGuid,                       NULL},\r
+  {STRING_TOKEN(STR_VAR_ARCH),              &gEfiVariableWriteArchProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_V_ARCH),                &gEfiVariableArchProtocolGuid,                    NULL},\r
+  {STRING_TOKEN(STR_SECP),                  &gEfiSecurityPolicyProtocolGuid,                  NULL},\r
+  {STRING_TOKEN(STR_WDT_ARCH),              &gEfiWatchdogTimerArchProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_SCR),                   &gEfiStatusCodeRuntimeProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_SMB_HC),                &gEfiSmbusHcProtocolGuid,                         NULL},\r
+  {STRING_TOKEN(STR_FV_2),                  &gEfiFirmwareVolume2ProtocolGuid,                 NULL},\r
+  {STRING_TOKEN(STR_FV_BLOCK),              &gEfiFirmwareVolumeBlockProtocolGuid,             NULL},\r
+  {STRING_TOKEN(STR_CAP_ARCH),              &gEfiCapsuleArchProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_MP_SERVICE),            &gEfiMpServiceProtocolGuid,                       NULL},\r
+  {STRING_TOKEN(STR_HBRAP),                 &gEfiPciHostBridgeResourceAllocationProtocolGuid, NULL},\r
+  {STRING_TOKEN(STR_PCIP),                  &gEfiPciPlatformProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_PCIO),                  &gEfiPciOverrideProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_PCIE),                  &gEfiPciEnumerationCompleteProtocolGuid,          NULL},\r
+  {STRING_TOKEN(STR_IPCID),                 &gEfiIncompatiblePciDeviceSupportProtocolGuid,    NULL},\r
+  {STRING_TOKEN(STR_PCIHPI),                &gEfiPciHotPlugInitProtocolGuid,                  NULL},\r
+  {STRING_TOKEN(STR_PCIHPR),                &gEfiPciHotPlugRequestProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_SMBIOS),                &gEfiSmbiosProtocolGuid,                          NULL},\r
+  {STRING_TOKEN(STR_S3_SAVE),               &gEfiS3SaveStateProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_S3_S_SMM),              &gEfiS3SmmSaveStateProtocolGuid,                  NULL},\r
+  {STRING_TOKEN(STR_RSC),                   &gEfiRscHandlerProtocolGuid,                      NULL},\r
+  {STRING_TOKEN(STR_S_RSC),                 &gEfiSmmRscHandlerProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_ACPI_SDT),              &gEfiAcpiSdtProtocolGuid,                         NULL},\r
+  {STRING_TOKEN(STR_SIO),                   &gEfiSioProtocolGuid,                             NULL},\r
+  {STRING_TOKEN(STR_S_CPU2),                &gEfiSmmCpuIo2ProtocolGuid,                       NULL},\r
+  {STRING_TOKEN(STR_S_BASE2),               &gEfiSmmBase2ProtocolGuid,                        NULL},\r
+  {STRING_TOKEN(STR_S_ACC_2),               &gEfiSmmAccess2ProtocolGuid,                      NULL},\r
+  {STRING_TOKEN(STR_S_CON_2),               &gEfiSmmControl2ProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_S_CONFIG),              &gEfiSmmConfigurationProtocolGuid,                NULL},\r
+  {STRING_TOKEN(STR_S_RTL),                 &gEfiSmmReadyToLockProtocolGuid,                  NULL},\r
+  {STRING_TOKEN(STR_DS_RTL),                &gEfiDxeSmmReadyToLockProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_S_COMM),                &gEfiSmmCommunicationProtocolGuid,                NULL},\r
+  {STRING_TOKEN(STR_S_STAT),                &gEfiSmmStatusCodeProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_S_CPU),                 &gEfiSmmCpuProtocolGuid,                          NULL},\r
+  {STRING_TOKEN(STR_S_PCIRBIO),             &gEfiPciRootBridgeIoProtocolGuid,                 NULL},\r
+  {STRING_TOKEN(STR_S_SWD),                 &gEfiSmmSwDispatch2ProtocolGuid,                  NULL},\r
+  {STRING_TOKEN(STR_S_SXD),                 &gEfiSmmSxDispatch2ProtocolGuid,                  NULL},\r
+  {STRING_TOKEN(STR_S_PTD2),                &gEfiSmmPeriodicTimerDispatch2ProtocolGuid,       NULL},\r
+  {STRING_TOKEN(STR_S_UD2),                 &gEfiSmmUsbDispatch2ProtocolGuid,                 NULL},\r
+  {STRING_TOKEN(STR_S_GD2),                 &gEfiSmmGpiDispatch2ProtocolGuid,                 NULL},\r
+  {STRING_TOKEN(STR_S_SBD2),                &gEfiSmmStandbyButtonDispatch2ProtocolGuid,       NULL},\r
+  {STRING_TOKEN(STR_S_PBD2),                &gEfiSmmPowerButtonDispatch2ProtocolGuid,         NULL},\r
+  {STRING_TOKEN(STR_S_ITD2),                &gEfiSmmIoTrapDispatch2ProtocolGuid,              NULL},\r
+  {STRING_TOKEN(STR_PCD),                   &gEfiPcdProtocolGuid,                             NULL},\r
+  {STRING_TOKEN(STR_FVB2),                  &gEfiFirmwareVolumeBlock2ProtocolGuid,            NULL},\r
+  {STRING_TOKEN(STR_CPUIO2),                &gEfiCpuIo2ProtocolGuid,                          NULL},\r
+  {STRING_TOKEN(STR_LEGACY_R2),             &gEfiLegacyRegion2ProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_SAL_MIP),               &gEfiSalMcaInitPmiProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_ES_BS),                 &gEfiExtendedSalBootServiceProtocolGuid,          NULL},\r
+  {STRING_TOKEN(STR_ES_BIO),                &gEfiExtendedSalBaseIoServicesProtocolGuid,       NULL},\r
+  {STRING_TOKEN(STR_ES_STALL),              &gEfiExtendedSalStallServicesProtocolGuid,        NULL},\r
+  {STRING_TOKEN(STR_ES_RTC),                &gEfiExtendedSalRtcServicesProtocolGuid,          NULL},\r
+  {STRING_TOKEN(STR_ES_VS),                 &gEfiExtendedSalVariableServicesProtocolGuid,     NULL},\r
+  {STRING_TOKEN(STR_ES_MTC),                &gEfiExtendedSalMtcServicesProtocolGuid,          NULL},\r
+  {STRING_TOKEN(STR_ES_RESET),              &gEfiExtendedSalResetServicesProtocolGuid,        NULL},\r
+  {STRING_TOKEN(STR_ES_SC),                 &gEfiExtendedSalStatusCodeServicesProtocolGuid,   NULL},\r
+  {STRING_TOKEN(STR_ES_FBS),                &gEfiExtendedSalFvBlockServicesProtocolGuid,      NULL},\r
+  {STRING_TOKEN(STR_ES_MP),                 &gEfiExtendedSalMpServicesProtocolGuid,           NULL},\r
+  {STRING_TOKEN(STR_ES_PAL),                &gEfiExtendedSalPalServicesProtocolGuid,          NULL},\r
+  {STRING_TOKEN(STR_ES_BASE),               &gEfiExtendedSalBaseServicesProtocolGuid,         NULL},\r
+  {STRING_TOKEN(STR_ES_MCA),                &gEfiExtendedSalMcaServicesProtocolGuid,          NULL},\r
+  {STRING_TOKEN(STR_ES_PCI),                &gEfiExtendedSalPciServicesProtocolGuid,          NULL},\r
+  {STRING_TOKEN(STR_ES_CACHE),              &gEfiExtendedSalCacheServicesProtocolGuid,        NULL},\r
+  {STRING_TOKEN(STR_ES_MCA_LOG),            &gEfiExtendedSalMcaLogServicesProtocolGuid,       NULL},\r
+  {STRING_TOKEN(STR_S2ARCH),                &gEfiSecurity2ArchProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_EODXE),                 &gEfiSmmEndOfDxeProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_ISAHC),                 &gEfiIsaHcProtocolGuid,                           NULL},\r
+  {STRING_TOKEN(STR_ISAHC_B),               &gEfiIsaHcServiceBindingProtocolGuid,             NULL},\r
+  {STRING_TOKEN(STR_SIO_C),                 &gEfiSioControlProtocolGuid,                      NULL},\r
+  {STRING_TOKEN(STR_GET_PCD),               &gEfiGetPcdInfoProtocolGuid,                      NULL},\r
+  {STRING_TOKEN(STR_I2C_M),                 &gEfiI2cMasterProtocolGuid,                       NULL},\r
+  {STRING_TOKEN(STR_I2CIO),                 &gEfiI2cIoProtocolGuid,                           NULL},\r
+  {STRING_TOKEN(STR_I2CEN),                 &gEfiI2cEnumerateProtocolGuid,                    NULL},\r
+  {STRING_TOKEN(STR_I2C_H),                 &gEfiI2cHostProtocolGuid,                         NULL},\r
+  {STRING_TOKEN(STR_I2C_BCM),               &gEfiI2cBusConfigurationManagementProtocolGuid,   NULL},\r
+  {STRING_TOKEN(STR_TREE),                  &gEfiTrEEProtocolGuid,                            NULL},\r
+  {STRING_TOKEN(STR_TCG2),                  &gEfiTcg2ProtocolGuid,                            NULL},\r
+  {STRING_TOKEN(STR_TIMESTAMP),             &gEfiTimestampProtocolGuid,                       NULL},\r
+  {STRING_TOKEN(STR_RNG),                   &gEfiRngProtocolGuid,                             NULL},\r
+  {STRING_TOKEN(STR_NVMEPT),                &gEfiNvmExpressPassThruProtocolGuid,              NULL},\r
+  {STRING_TOKEN(STR_H2_SB),                 &gEfiHash2ServiceBindingProtocolGuid,             NULL},\r
+  {STRING_TOKEN(STR_HASH2),                 &gEfiHash2ProtocolGuid,                           NULL},\r
+  {STRING_TOKEN(STR_BIO_C),                 &gEfiBlockIoCryptoProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_SCR),                   &gEfiSmartCardReaderProtocolGuid,                 NULL},\r
+  {STRING_TOKEN(STR_SCE),                   &gEfiSmartCardEdgeProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_USB_FIO),               &gEfiUsbFunctionIoProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_BC_HC),                 &gEfiBluetoothHcProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_BC_IO_SB),              &gEfiBluetoothIoServiceBindingProtocolGuid,       NULL},\r
+  {STRING_TOKEN(STR_BC_IO),                 &gEfiBluetoothIoProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_BC_C),                  &gEfiBluetoothConfigProtocolGuid,                 NULL},\r
+  {STRING_TOKEN(STR_REG_EXP),               &gEfiRegularExpressionProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_B_MGR_P),               &gEfiBootManagerPolicyProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_CKH),                   &gEfiConfigKeywordHandlerProtocolGuid,            NULL},\r
+  {STRING_TOKEN(STR_WIFI),                  &gEfiWiFiProtocolGuid,                            NULL},\r
+  {STRING_TOKEN(STR_EAP_M),                 &gEfiEapManagement2ProtocolGuid,                  NULL},\r
+  {STRING_TOKEN(STR_EAP_C),                 &gEfiEapConfigurationProtocolGuid,                NULL},\r
+  {STRING_TOKEN(STR_PKCS7),                 &gEfiPkcs7VerifyProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_NET_DNS4_SB),           &gEfiDns4ServiceBindingProtocolGuid,              NULL},\r
+  {STRING_TOKEN(STR_NET_DNS4),              &gEfiDns4ProtocolGuid,                            NULL},\r
+  {STRING_TOKEN(STR_NET_DNS6_SB),           &gEfiDns6ServiceBindingProtocolGuid,              NULL},\r
+  {STRING_TOKEN(STR_NET_DNS6),              &gEfiDns6ProtocolGuid,                            NULL},\r
+  {STRING_TOKEN(STR_NET_HTTP_SB),           &gEfiHttpServiceBindingProtocolGuid,              NULL},\r
+  {STRING_TOKEN(STR_NET_HTTP),              &gEfiHttpProtocolGuid,                            NULL},\r
+  {STRING_TOKEN(STR_NET_HTTP_U),            &gEfiHttpUtilitiesProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_REST),                  &gEfiRestProtocolGuid,                            NULL},\r
+\r
 //\r
 // UEFI Shell Spec 2.0\r
 //\r
@@ -1024,6 +1739,11 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
 //\r
   {STRING_TOKEN(STR_SHELL_DYNAMIC),         &gEfiShellDynamicCommandProtocolGuid,             NULL},\r
 \r
+//\r
+// Misc\r
+//\r
+  {STRING_TOKEN(STR_PCDINFOPROT),           &gGetPcdInfoProtocolGuid,                         NULL},\r
+\r
 //\r
 // terminator\r
 //\r
@@ -1290,9 +2010,9 @@ GetGuidFromStringName(
 \r
 /**\r
   Get best support language for this driver.\r
-  \r
-  First base on the user input language  to search, second base on the current \r
-  platform used language to search, third get the first language from the \r
+\r
+  First base on the user input language  to search, second base on the current\r
+  platform used language to search, third get the first language from the\r
   support language list. The caller need to free the buffer of the best language.\r
 \r
   @param[in] SupportedLanguages      The support languages for this driver.\r
@@ -1312,7 +2032,7 @@ GetBestLanguageForDriver (
   CHAR8                         *LanguageVariable;\r
   CHAR8                         *BestLanguage;\r
 \r
-  LanguageVariable = GetVariable (Iso639Language ? L"Lang" : L"PlatformLang", &gEfiGlobalVariableGuid);\r
+  GetVariable2 (Iso639Language ? L"Lang" : L"PlatformLang", &gEfiGlobalVariableGuid, (VOID**)&LanguageVariable, NULL);\r
 \r
   BestLanguage = GetBestLanguage(\r
                    SupportedLanguages,\r
@@ -1690,7 +2410,7 @@ ParseHandleDatabaseByRelationshipWithType (
 \r
       if (ControllerHandle == NULL) {\r
         //\r
-        // ControllerHandle == NULL and DriverBindingHandle != NULL.  \r
+        // ControllerHandle == NULL and DriverBindingHandle != NULL.\r
         // Return information on all the controller handles that the driver specified by DriverBindingHandle is managing\r
         //\r
         for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r