]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / MemMap.c
index 653c7f2d9eb7a7fc23d777737ddc6cac1af8b3cb..a089953b286f336a849c9207c3f13bfb2dc30b47 100644 (file)
 /** @file\r
   Main file for Mode shell Debug1 function.\r
 \r
-  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
-  This program and the acModeanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which acModeanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
+  (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
-STATIC CONST CHAR16 strNameEfiReservedMemoryType[]      = L"Reserved";\r
-STATIC CONST CHAR16 strNameEfiLoaderCode[]              = L"LoadCode";\r
-STATIC CONST CHAR16 strNameEfiLoaderData[]              = L"LoadData";\r
-STATIC CONST CHAR16 strNameEfiBootServicesCode[]        = L"BSCode";\r
-STATIC CONST CHAR16 strNameEfiBootServicesData[]        = L"BSData";\r
-STATIC CONST CHAR16 strNameEfiRuntimeServicesCode[]     = L"RTCode";\r
-STATIC CONST CHAR16 strNameEfiRuntimeServicesData[]     = L"RTData";\r
-STATIC CONST CHAR16 strNameEfiConventionalMemory[]      = L"Conv";\r
-STATIC CONST CHAR16 strNameEfiUnusableMemory[]          = L"Unusable";\r
-STATIC CONST CHAR16 strNameEfiACPIReclaimMemory[]       = L"ACPIRec";\r
-STATIC CONST CHAR16 strNameEfiACPIMemoryNVS[]           = L"ACPI_NVS";\r
-STATIC CONST CHAR16 strNameEfiMemoryMappedIO[]          = L"MMIO";\r
-STATIC CONST CHAR16 strNameEfiMemoryMappedIOPortSpace[] = L"MMIOPort";\r
-STATIC CONST CHAR16 strNameEfiPalCode[]                 = L"PalCode";\r
+//\r
+// Need full names for Standard-Format Output\r
+//\r
+STATIC CONST CHAR16  NameEfiReservedMemoryType[]      = L"Reserved";\r
+STATIC CONST CHAR16  NameEfiLoaderCode[]              = L"LoaderCode";\r
+STATIC CONST CHAR16  NameEfiLoaderData[]              = L"LoaderData";\r
+STATIC CONST CHAR16  NameEfiBootServicesCode[]        = L"BootServiceCode";\r
+STATIC CONST CHAR16  NameEfiBootServicesData[]        = L"BootServiceData";\r
+STATIC CONST CHAR16  NameEfiRuntimeServicesCode[]     = L"RuntimeCode";\r
+STATIC CONST CHAR16  NameEfiRuntimeServicesData[]     = L"RuntimeData";\r
+STATIC CONST CHAR16  NameEfiConventionalMemory[]      = L"Available";\r
+STATIC CONST CHAR16  NameEfiPersistentMemory[]        = L"Persistent";\r
+STATIC CONST CHAR16  NameEfiUnusableMemory[]          = L"UnusableMemory";\r
+STATIC CONST CHAR16  NameEfiACPIReclaimMemory[]       = L"ACPIReclaimMemory";\r
+STATIC CONST CHAR16  NameEfiACPIMemoryNVS[]           = L"ACPIMemoryNVS";\r
+STATIC CONST CHAR16  NameEfiMemoryMappedIO[]          = L"MemoryMappedIO";\r
+STATIC CONST CHAR16  NameEfiMemoryMappedIOPortSpace[] = L"MemoryMappedIOPortSpace";\r
+STATIC CONST CHAR16  NameEfiPalCode[]                 = L"PalCode";\r
+STATIC CONST CHAR16  NameEfiUnacceptedMemoryType[]    = L"Unaccepted";\r
+\r
+//\r
+// Need short names for some memory types\r
+//\r
+STATIC CONST CHAR16  NameEfiBootServicesCodeShort[]        = L"BS_Code";\r
+STATIC CONST CHAR16  NameEfiBootServicesDataShort[]        = L"BS_Data";\r
+STATIC CONST CHAR16  NameEfiRuntimeServicesCodeShort[]     = L"RT_Code";\r
+STATIC CONST CHAR16  NameEfiRuntimeServicesDataShort[]     = L"RT_Data";\r
+STATIC CONST CHAR16  NameEfiUnusableMemoryShort[]          = L"Unusable";\r
+STATIC CONST CHAR16  NameEfiACPIReclaimMemoryShort[]       = L"ACPI_Recl";\r
+STATIC CONST CHAR16  NameEfiACPIMemoryNVSShort[]           = L"ACPI_NVS";\r
+STATIC CONST CHAR16  NameEfiMemoryMappedIOShort[]          = L"MMIO";\r
+STATIC CONST CHAR16  NameEfiMemoryMappedIOPortSpaceShort[] = L"MMIO_Port";\r
 \r
 #include "UefiShellDebug1CommandsLib.h"\r
 \r
+typedef struct {\r
+  UINT32        Type;\r
+  UINT64        NumberOfPages;\r
+  LIST_ENTRY    Link;\r
+} MEMORY_LENGTH_ENTRY;\r
+\r
+/**\r
+  Add the length of the specified type to List.\r
+\r
+  @param List          A list to hold all pairs of <Type, NumberOfPages>.\r
+  @param Type          Memory type.\r
+  @param NumberOfPages Number of pages.\r
+**/\r
+VOID\r
+AddMemoryLength (\r
+  LIST_ENTRY  *List,\r
+  UINT32      Type,\r
+  UINT64      NumberOfPages\r
+  )\r
+{\r
+  MEMORY_LENGTH_ENTRY  *Entry;\r
+  MEMORY_LENGTH_ENTRY  *NewEntry;\r
+  LIST_ENTRY           *Link;\r
+\r
+  Entry = NULL;\r
+  for (Link = GetFirstNode (List); !IsNull (List, Link); Link = GetNextNode (List, Link)) {\r
+    Entry = BASE_CR (Link, MEMORY_LENGTH_ENTRY, Link);\r
+    if (Entry->Type >= Type) {\r
+      break;\r
+    }\r
+  }\r
+\r
+  if ((Entry != NULL) && (Entry->Type == Type)) {\r
+    //\r
+    // The Entry is the one we look for.\r
+    //\r
+    NewEntry = Entry;\r
+  } else {\r
+    //\r
+    // The search operation breaks due to:\r
+    // 1. Type of every entry < Type --> Insert to tail\r
+    // 2. Type of an entry > Type --> Insert to previous of this entry\r
+    //\r
+    NewEntry = AllocatePool (sizeof (*NewEntry));\r
+    if (NewEntry == NULL) {\r
+      return;\r
+    }\r
+\r
+    NewEntry->Type          = Type;\r
+    NewEntry->NumberOfPages = 0;\r
+    InsertTailList (Link, &NewEntry->Link);\r
+  }\r
+\r
+  NewEntry->NumberOfPages += NumberOfPages;\r
+}\r
+\r
+/**\r
+  Function for 'memmap' command.\r
+\r
+  @param[in] ImageHandle  Handle to the Image (NULL if Internal).\r
+  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).\r
+**/\r
 SHELL_STATUS\r
 EFIAPI\r
 ShellCommandRunMemMap (\r
@@ -36,36 +112,58 @@ ShellCommandRunMemMap (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  EFI_STATUS          Status;\r
-  LIST_ENTRY          *Package;\r
-  CHAR16              *ProblemParam;\r
-  SHELL_STATUS        ShellStatus;\r
-  UINTN               Size;\r
-  EFI_MEMORY_DESCRIPTOR *Buffer;\r
-  UINTN               MapKey;\r
-  UINTN               ItemSize;\r
-  UINT32              Version;\r
-  UINT8               *Walker;\r
-  UINT64              ReservedPages;\r
-  UINT64              LoadCodePages;\r
-  UINT64              LoadDataPages;\r
-  UINT64              BSCodePages;\r
-  UINT64              BSDataPages;\r
-  UINT64              RTDataPages;\r
-  UINT64              RTCodePages;\r
-  UINT64              AvailPages;\r
-  UINT64              TotalPages;\r
-  UINT64              ReservedPagesSize;\r
-  UINT64              LoadCodePagesSize;\r
-  UINT64              LoadDataPagesSize;\r
-  UINT64              BSCodePagesSize;\r
-  UINT64              BSDataPagesSize;\r
-  UINT64              RTDataPagesSize;\r
-  UINT64              RTCodePagesSize;\r
-  UINT64              AvailPagesSize;\r
-  UINT64              TotalPagesSize;\r
-  BOOLEAN             Sfo;\r
+  EFI_STATUS             Status;\r
+  LIST_ENTRY             *Package;\r
+  CHAR16                 *ProblemParam;\r
+  SHELL_STATUS           ShellStatus;\r
+  UINTN                  Size;\r
+  EFI_MEMORY_DESCRIPTOR  *Descriptors;\r
+  UINTN                  MapKey;\r
+  UINTN                  ItemSize;\r
+  UINT32                 Version;\r
+  EFI_MEMORY_DESCRIPTOR  *Walker;\r
+  UINT64                 ReservedPages;\r
+  UINT64                 LoadCodePages;\r
+  UINT64                 LoadDataPages;\r
+  UINT64                 BSCodePages;\r
+  UINT64                 BSDataPages;\r
+  UINT64                 RTDataPages;\r
+  UINT64                 RTCodePages;\r
+  UINT64                 AvailPages;\r
+  UINT64                 TotalPages;\r
+  UINT64                 ReservedPagesSize;\r
+  UINT64                 LoadCodePagesSize;\r
+  UINT64                 LoadDataPagesSize;\r
+  UINT64                 BSCodePagesSize;\r
+  UINT64                 BSDataPagesSize;\r
+  UINT64                 RTDataPagesSize;\r
+  UINT64                 RTCodePagesSize;\r
+  UINT64                 AvailPagesSize;\r
+  UINT64                 TotalPagesSize;\r
+  UINT64                 AcpiReclaimPages;\r
+  UINT64                 AcpiNvsPages;\r
+  UINT64                 MmioSpacePages;\r
+  UINT64                 AcpiReclaimPagesSize;\r
+  UINT64                 AcpiNvsPagesSize;\r
+  UINT64                 MmioSpacePagesSize;\r
+  UINT64                 MmioPortPages;\r
+  UINT64                 MmioPortPagesSize;\r
+  UINT64                 UnusableMemoryPages;\r
+  UINT64                 UnusableMemoryPagesSize;\r
+  UINT64                 PalCodePages;\r
+  UINT64                 PalCodePagesSize;\r
+  UINT64                 UnacceptedPages;\r
+  UINT64                 UnacceptedPagesSize;\r
+  UINT64                 PersistentPages;\r
+  UINT64                 PersistentPagesSize;\r
+  BOOLEAN                Sfo;\r
+  LIST_ENTRY             MemoryList;\r
+  MEMORY_LENGTH_ENTRY    *Entry;\r
+  LIST_ENTRY             *Link;\r
 \r
+  AcpiReclaimPages    = 0;\r
+  AcpiNvsPages        = 0;\r
+  MmioSpacePages      = 0;\r
   TotalPages          = 0;\r
   ReservedPages       = 0;\r
   LoadCodePages       = 0;\r
@@ -75,166 +173,287 @@ ShellCommandRunMemMap (
   RTDataPages         = 0;\r
   RTCodePages         = 0;\r
   AvailPages          = 0;\r
+  MmioPortPages       = 0;\r
+  UnusableMemoryPages = 0;\r
+  PalCodePages        = 0;\r
+  PersistentPages     = 0;\r
   Size                = 0;\r
-  Buffer              = NULL;\r
+  UnacceptedPages     = 0;\r
+  Descriptors         = NULL;\r
   ShellStatus         = SHELL_SUCCESS;\r
   Status              = EFI_SUCCESS;\r
+  InitializeListHead (&MemoryList);\r
 \r
   //\r
   // initialize the shell lib (we must be in non-auto-init...)\r
   //\r
-  Status = ShellInitialize();\r
-  ASSERT_EFI_ERROR(Status);\r
+  Status = ShellInitialize ();\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
-  Status = CommandInit();\r
-  ASSERT_EFI_ERROR(Status);\r
+  Status = CommandInit ();\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
   // parse the command line\r
   //\r
   Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE);\r
-  if (EFI_ERROR(Status)) {\r
-    if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);\r
-      FreePool(ProblemParam);\r
+  if (EFI_ERROR (Status)) {\r
+    if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"memmap", ProblemParam);\r
+      FreePool (ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
-      ASSERT(FALSE);\r
+      ASSERT (FALSE);\r
     }\r
   } else {\r
-    if (ShellCommandLineGetCount(Package) > 1) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);\r
+    if (ShellCommandLineGetCount (Package) > 1) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"memmap");\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
-      Status = gBS->GetMemoryMap(&Size, Buffer, &MapKey, &ItemSize, &Version);\r
-      if (Status == EFI_BUFFER_TOO_SMALL){\r
-        Size += SIZE_1KB;\r
-        Buffer = AllocatePool(Size);\r
-        Status = gBS->GetMemoryMap(&Size, Buffer, &MapKey, &ItemSize, &Version);\r
+      Status = gBS->GetMemoryMap (&Size, Descriptors, &MapKey, &ItemSize, &Version);\r
+      if (Status == EFI_BUFFER_TOO_SMALL) {\r
+        Size       += SIZE_1KB;\r
+        Descriptors = AllocateZeroPool (Size);\r
+        Status      = gBS->GetMemoryMap (&Size, Descriptors, &MapKey, &ItemSize, &Version);\r
       }\r
-      if (EFI_ERROR(Status)) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_GET_FAILED), gShellDebug1HiiHandle, Status);\r
+\r
+      if (EFI_ERROR (Status)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_GET_FAILED), gShellDebug1HiiHandle, L"memmap");\r
         ShellStatus = SHELL_ACCESS_DENIED;\r
       } else {\r
-        ASSERT(Version == EFI_MEMORY_DESCRIPTOR_VERSION);\r
-        Sfo = ShellCommandLineGetFlag(Package, L"-sfo");\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_HEAD), gShellDebug1HiiHandle);\r
-        for (Walker = (UINT8*)Buffer; Walker < (((UINT8*)Buffer)+Size) && Walker != NULL; Walker += ItemSize){\r
-          switch (((EFI_MEMORY_DESCRIPTOR*)Walker)->Type) {\r
-            // replaced ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages) with 0000\r
-            case  EfiReservedMemoryType:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiReservedMemoryType, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              ReservedPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+        ASSERT (Version == EFI_MEMORY_DESCRIPTOR_VERSION);\r
+\r
+        Sfo = ShellCommandLineGetFlag (Package, L"-sfo");\r
+        if (!Sfo) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_HEAD), gShellDebug1HiiHandle);\r
+        } else {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellDebug1HiiHandle, L"memmap");\r
+        }\r
+\r
+        for ( Walker = Descriptors\r
+              ; (Walker < (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Descriptors + Size)) && (Walker != NULL)\r
+              ; Walker = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Walker + ItemSize)\r
+              )\r
+        {\r
+          switch (Walker->Type) {\r
+            case EfiReservedMemoryType:\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiReservedMemoryType, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              ReservedPages += Walker->NumberOfPages;\r
               break;\r
             case EfiLoaderCode:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiLoaderCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              LoadCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiLoaderCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              LoadCodePages += Walker->NumberOfPages;\r
+              TotalPages    += Walker->NumberOfPages;\r
               break;\r
             case EfiLoaderData:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiLoaderData, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              LoadDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiLoaderData, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              LoadDataPages += Walker->NumberOfPages;\r
+              TotalPages    += Walker->NumberOfPages;\r
               break;\r
             case EfiBootServicesCode:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiBootServicesCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              BSCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiBootServicesCodeShort : NameEfiBootServicesCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              BSCodePages += Walker->NumberOfPages;\r
+              TotalPages  += Walker->NumberOfPages;\r
               break;\r
             case EfiBootServicesData:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiBootServicesData, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              BSDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiBootServicesDataShort : NameEfiBootServicesData, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              BSDataPages += Walker->NumberOfPages;\r
+              TotalPages  += Walker->NumberOfPages;\r
               break;\r
             case EfiRuntimeServicesCode:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiRuntimeServicesCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              RTCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiRuntimeServicesCodeShort : NameEfiRuntimeServicesCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              RTCodePages += Walker->NumberOfPages;\r
+              TotalPages  += Walker->NumberOfPages;\r
               break;\r
             case EfiRuntimeServicesData:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiRuntimeServicesData, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              RTDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiRuntimeServicesDataShort : NameEfiRuntimeServicesData, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              RTDataPages += Walker->NumberOfPages;\r
+              TotalPages  += Walker->NumberOfPages;\r
               break;\r
             case EfiConventionalMemory:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiConventionalMemory, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              AvailPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiConventionalMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              AvailPages += Walker->NumberOfPages;\r
+              TotalPages += Walker->NumberOfPages;\r
+              break;\r
+            case EfiPersistentMemory:\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiPersistentMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              PersistentPages += Walker->NumberOfPages;\r
+              TotalPages      += Walker->NumberOfPages;\r
               break;\r
             case EfiUnusableMemory:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiUnusableMemory, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiUnusableMemoryShort : NameEfiUnusableMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              UnusableMemoryPages += Walker->NumberOfPages;\r
               break;\r
             case EfiACPIReclaimMemory:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiACPIReclaimMemory, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiACPIReclaimMemoryShort : NameEfiACPIReclaimMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              TotalPages       += Walker->NumberOfPages;\r
+              AcpiReclaimPages += Walker->NumberOfPages;\r
               break;\r
             case EfiACPIMemoryNVS:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiACPIMemoryNVS, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiACPIMemoryNVSShort : NameEfiACPIMemoryNVS, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              TotalPages   += Walker->NumberOfPages;\r
+              AcpiNvsPages += Walker->NumberOfPages;\r
               break;\r
             case EfiMemoryMappedIO:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiMemoryMappedIO, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiMemoryMappedIOShort : NameEfiMemoryMappedIO, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              MmioSpacePages += Walker->NumberOfPages;\r
               break;\r
             case EfiMemoryMappedIOPortSpace:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiMemoryMappedIOPortSpace, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiMemoryMappedIOPortSpaceShort : NameEfiMemoryMappedIOPortSpace, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              MmioPortPages += Walker->NumberOfPages;\r
               break;\r
             case EfiPalCode:\r
-              ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiPalCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);\r
-              TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiPalCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              TotalPages   += Walker->NumberOfPages;\r
+              PalCodePages += Walker->NumberOfPages;\r
+              break;\r
+            case EfiUnacceptedMemoryType:\r
+              ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiUnacceptedMemoryType, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
+              TotalPages      += Walker->NumberOfPages;\r
+              UnacceptedPages += Walker->NumberOfPages;\r
               break;\r
             default:\r
-              ASSERT(FALSE);\r
+              //\r
+              // Shell Spec defines the SFO format.\r
+              // Do not print the OEM/OS memory usage in the SFO format, to avoid conflict with Shell Spec.\r
+              //\r
+              if (!Sfo) {\r
+                ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_ITEM_OTHER), gShellDebug1HiiHandle, Walker->Type, Walker->PhysicalStart, Walker->PhysicalStart + MultU64x64 (SIZE_4KB, Walker->NumberOfPages) - 1, Walker->NumberOfPages, Walker->Attribute);\r
+              }\r
+\r
+              TotalPages += Walker->NumberOfPages;\r
+              AddMemoryLength (&MemoryList, Walker->Type, Walker->NumberOfPages);\r
+              break;\r
           }\r
         }\r
+\r
         //\r
         // print the summary\r
         //\r
-        ReservedPagesSize              = MultU64x64(SIZE_4KB,ReservedPages);\r
-        LoadCodePagesSize              = MultU64x64(SIZE_4KB,LoadCodePages);\r
-        LoadDataPagesSize              = MultU64x64(SIZE_4KB,LoadDataPages);\r
-        BSCodePagesSize                  = MultU64x64(SIZE_4KB,BSCodePages);\r
-        BSDataPagesSize                  = MultU64x64(SIZE_4KB,BSDataPages);\r
-        RTDataPagesSize                  = MultU64x64(SIZE_4KB,RTDataPages);\r
-        RTCodePagesSize                  = MultU64x64(SIZE_4KB,RTCodePages);\r
-        AvailPagesSize           = MultU64x64(SIZE_4KB,AvailPages);\r
-        TotalPagesSize           = MultU64x64(SIZE_4KB,TotalPages);\r
+        ReservedPagesSize       = MultU64x64 (SIZE_4KB, ReservedPages);\r
+        LoadCodePagesSize       = MultU64x64 (SIZE_4KB, LoadCodePages);\r
+        LoadDataPagesSize       = MultU64x64 (SIZE_4KB, LoadDataPages);\r
+        BSCodePagesSize         = MultU64x64 (SIZE_4KB, BSCodePages);\r
+        BSDataPagesSize         = MultU64x64 (SIZE_4KB, BSDataPages);\r
+        RTDataPagesSize         = MultU64x64 (SIZE_4KB, RTDataPages);\r
+        RTCodePagesSize         = MultU64x64 (SIZE_4KB, RTCodePages);\r
+        AvailPagesSize          = MultU64x64 (SIZE_4KB, AvailPages);\r
+        TotalPagesSize          = MultU64x64 (SIZE_4KB, TotalPages);\r
+        AcpiReclaimPagesSize    = MultU64x64 (SIZE_4KB, AcpiReclaimPages);\r
+        AcpiNvsPagesSize        = MultU64x64 (SIZE_4KB, AcpiNvsPages);\r
+        MmioSpacePagesSize      = MultU64x64 (SIZE_4KB, MmioSpacePages);\r
+        MmioPortPagesSize       = MultU64x64 (SIZE_4KB, MmioPortPages);\r
+        PalCodePagesSize        = MultU64x64 (SIZE_4KB, PalCodePages);\r
+        UnacceptedPagesSize     = MultU64x64 (SIZE_4KB, UnacceptedPages);\r
+        PersistentPagesSize     = MultU64x64 (SIZE_4KB, PersistentPages);\r
+        UnusableMemoryPagesSize = MultU64x64 (SIZE_4KB, UnusableMemoryPages);\r
         if (!Sfo) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_SUMM), gShellDebug1HiiHandle,\r
-            ReservedPages, ReservedPagesSize,\r
-            LoadCodePages, LoadCodePagesSize,\r
-            LoadDataPages, LoadDataPagesSize,\r
-            BSCodePages, BSCodePagesSize,\r
-            BSDataPages, BSDataPagesSize,\r
-            RTDataPages, RTDataPagesSize,\r
-            AvailPages, AvailPagesSize,\r
-            DivU64x32(MultU64x64(SIZE_4KB,TotalPages), SIZE_1MB), TotalPagesSize\r
-           );\r
+          ShellPrintHiiEx (\r
+            -1,\r
+            -1,\r
+            NULL,\r
+            STRING_TOKEN (STR_MEMMAP_LIST_SUMM),\r
+            gShellDebug1HiiHandle,\r
+            ReservedPages,\r
+            ReservedPagesSize,\r
+            LoadCodePages,\r
+            LoadCodePagesSize,\r
+            LoadDataPages,\r
+            LoadDataPagesSize,\r
+            BSCodePages,\r
+            BSCodePagesSize,\r
+            BSDataPages,\r
+            BSDataPagesSize,\r
+            RTCodePages,\r
+            RTCodePagesSize,\r
+            RTDataPages,\r
+            RTDataPagesSize,\r
+            AcpiReclaimPages,\r
+            AcpiReclaimPagesSize,\r
+            AcpiNvsPages,\r
+            AcpiNvsPagesSize,\r
+            MmioSpacePages,\r
+            MmioSpacePagesSize,\r
+            MmioPortPages,\r
+            MmioPortPagesSize,\r
+            PalCodePages,\r
+            PalCodePagesSize,\r
+            UnacceptedPages,\r
+            UnacceptedPagesSize,\r
+            AvailPages,\r
+            AvailPagesSize,\r
+            PersistentPages,\r
+            PersistentPagesSize\r
+            );\r
+\r
+          //\r
+          // Print out the total memory usage for OEM/OS types in the order of type.\r
+          //\r
+          for (Link = GetFirstNode (&MemoryList); !IsNull (&MemoryList, Link); Link = GetNextNode (&MemoryList, Link)) {\r
+            Entry = BASE_CR (Link, MEMORY_LENGTH_ENTRY, Link);\r
+            ShellPrintHiiEx (\r
+              -1,\r
+              -1,\r
+              NULL,\r
+              STRING_TOKEN (STR_MEMMAP_LIST_SUMM_OTHER),\r
+              gShellDebug1HiiHandle,\r
+              Entry->Type,\r
+              Entry->NumberOfPages,\r
+              MultU64x64 (SIZE_4KB, Entry->NumberOfPages)\r
+              );\r
+          }\r
+\r
+          ShellPrintHiiEx (\r
+            -1,\r
+            -1,\r
+            NULL,\r
+            STRING_TOKEN (STR_MEMMAP_LIST_SUMM2),\r
+            gShellDebug1HiiHandle,\r
+            DivU64x32 (MultU64x64 (SIZE_4KB, TotalPages), SIZE_1MB),\r
+            TotalPagesSize\r
+            );\r
         } else {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO), gShellDebug1HiiHandle,\r
+          ShellPrintHiiEx (\r
+            -1,\r
+            -1,\r
+            NULL,\r
+            STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO),\r
+            gShellDebug1HiiHandle,\r
             TotalPagesSize,\r
-            MultU64x64(SIZE_4KB,ReservedPages),\r
+            ReservedPagesSize,\r
             BSCodePagesSize,\r
             BSDataPagesSize,\r
             RTCodePagesSize,\r
             RTDataPagesSize,\r
             LoadCodePagesSize,\r
             LoadDataPagesSize,\r
-            AvailPages, AvailPagesSize\r
-           );\r
+            AvailPagesSize,\r
+            MmioSpacePagesSize,\r
+            MmioPortPagesSize,\r
+            UnusableMemoryPagesSize,\r
+            AcpiReclaimPagesSize,\r
+            AcpiNvsPagesSize,\r
+            PalCodePagesSize,\r
+            UnacceptedPagesSize,\r
+            PersistentPagesSize\r
+            );\r
         }\r
       }\r
     }\r
+\r
     ShellCommandLineFreeVarList (Package);\r
   }\r
 \r
-  if (Buffer != NULL) {\r
-    FreePool(Buffer);\r
+  if (Descriptors != NULL) {\r
+    FreePool (Descriptors);\r
+  }\r
+\r
+  //\r
+  // Free the memory list.\r
+  //\r
+  for (Link = GetFirstNode (&MemoryList); !IsNull (&MemoryList, Link); ) {\r
+    Link = RemoveEntryList (Link);\r
   }\r
 \r
   return (ShellStatus);\r
 }\r
-\r