Home | History | Annotate | Download | only in UefiShellDebug1CommandsLib
      1 /** @file
      2   Main file for Mode shell Debug1 function.
      3 
      4   (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
      5   Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which acModeanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 //
     17 // Need full names for Standard-Format Output
     18 //
     19 STATIC CONST CHAR16 NameEfiReservedMemoryType[]      = L"Reserved";
     20 STATIC CONST CHAR16 NameEfiLoaderCode[]              = L"LoaderCode";
     21 STATIC CONST CHAR16 NameEfiLoaderData[]              = L"LoaderData";
     22 STATIC CONST CHAR16 NameEfiBootServicesCode[]        = L"BootServiceCode";
     23 STATIC CONST CHAR16 NameEfiBootServicesData[]        = L"BootServiceData";
     24 STATIC CONST CHAR16 NameEfiRuntimeServicesCode[]     = L"RuntimeCode";
     25 STATIC CONST CHAR16 NameEfiRuntimeServicesData[]     = L"RuntimeData";
     26 STATIC CONST CHAR16 NameEfiConventionalMemory[]      = L"Available";
     27 STATIC CONST CHAR16 NameEfiPersistentMemory[]        = L"Persistent";
     28 STATIC CONST CHAR16 NameEfiUnusableMemory[]          = L"UnusableMemory";
     29 STATIC CONST CHAR16 NameEfiACPIReclaimMemory[]       = L"ACPIReclaimMemory";
     30 STATIC CONST CHAR16 NameEfiACPIMemoryNVS[]           = L"ACPIMemoryNVS";
     31 STATIC CONST CHAR16 NameEfiMemoryMappedIO[]          = L"MemoryMappedIO";
     32 STATIC CONST CHAR16 NameEfiMemoryMappedIOPortSpace[] = L"MemoryMappedIOPortSpace";
     33 STATIC CONST CHAR16 NameEfiPalCode[]                 = L"PalCode";
     34 
     35 //
     36 // Need short names for some memory types
     37 //
     38 STATIC CONST CHAR16 NameEfiBootServicesCodeShort[]        = L"BS_Code";
     39 STATIC CONST CHAR16 NameEfiBootServicesDataShort[]        = L"BS_Data";
     40 STATIC CONST CHAR16 NameEfiRuntimeServicesCodeShort[]     = L"RT_Code";
     41 STATIC CONST CHAR16 NameEfiRuntimeServicesDataShort[]     = L"RT_Data";
     42 STATIC CONST CHAR16 NameEfiUnusableMemoryShort[]          = L"Unusable";
     43 STATIC CONST CHAR16 NameEfiACPIReclaimMemoryShort[]       = L"ACPI_Recl";
     44 STATIC CONST CHAR16 NameEfiACPIMemoryNVSShort[]           = L"ACPI_NVS";
     45 STATIC CONST CHAR16 NameEfiMemoryMappedIOShort[]          = L"MMIO";
     46 STATIC CONST CHAR16 NameEfiMemoryMappedIOPortSpaceShort[] = L"MMIO_Port";
     47 
     48 #include "UefiShellDebug1CommandsLib.h"
     49 
     50 /**
     51   Function for 'memmap' command.
     52 
     53   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
     54   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
     55 **/
     56 SHELL_STATUS
     57 EFIAPI
     58 ShellCommandRunMemMap (
     59   IN EFI_HANDLE        ImageHandle,
     60   IN EFI_SYSTEM_TABLE  *SystemTable
     61   )
     62 {
     63   EFI_STATUS          Status;
     64   LIST_ENTRY          *Package;
     65   CHAR16              *ProblemParam;
     66   SHELL_STATUS        ShellStatus;
     67   UINTN               Size;
     68   EFI_MEMORY_DESCRIPTOR *Buffer;
     69   UINTN               MapKey;
     70   UINTN               ItemSize;
     71   UINT32              Version;
     72   UINT8               *Walker;
     73   UINT64              ReservedPages;
     74   UINT64              LoadCodePages;
     75   UINT64              LoadDataPages;
     76   UINT64              BSCodePages;
     77   UINT64              BSDataPages;
     78   UINT64              RTDataPages;
     79   UINT64              RTCodePages;
     80   UINT64              AvailPages;
     81   UINT64              TotalPages;
     82   UINT64              ReservedPagesSize;
     83   UINT64              LoadCodePagesSize;
     84   UINT64              LoadDataPagesSize;
     85   UINT64              BSCodePagesSize;
     86   UINT64              BSDataPagesSize;
     87   UINT64              RTDataPagesSize;
     88   UINT64              RTCodePagesSize;
     89   UINT64              AvailPagesSize;
     90   UINT64              TotalPagesSize;
     91   UINT64              AcpiReclaimPages;
     92   UINT64              AcpiNvsPages;
     93   UINT64              MmioSpacePages;
     94   UINT64              AcpiReclaimPagesSize;
     95   UINT64              AcpiNvsPagesSize;
     96   UINT64              MmioSpacePagesSize;
     97   UINT64              MmioPortPages;
     98   UINT64              MmioPortPagesSize;
     99   UINT64              UnusableMemoryPages;
    100   UINT64              UnusableMemoryPagesSize;
    101   UINT64              PalCodePages;
    102   UINT64              PalCodePagesSize;
    103   BOOLEAN             Sfo;
    104 
    105   AcpiReclaimPages    = 0;
    106   AcpiNvsPages        = 0;
    107   MmioSpacePages      = 0;
    108   TotalPages          = 0;
    109   ReservedPages       = 0;
    110   LoadCodePages       = 0;
    111   LoadDataPages       = 0;
    112   BSCodePages         = 0;
    113   BSDataPages         = 0;
    114   RTDataPages         = 0;
    115   RTCodePages         = 0;
    116   AvailPages          = 0;
    117   MmioPortPages       = 0;
    118   UnusableMemoryPages = 0;
    119   PalCodePages        = 0;
    120   Size                = 0;
    121   Buffer              = NULL;
    122   ShellStatus         = SHELL_SUCCESS;
    123   Status              = EFI_SUCCESS;
    124 
    125   //
    126   // initialize the shell lib (we must be in non-auto-init...)
    127   //
    128   Status = ShellInitialize();
    129   ASSERT_EFI_ERROR(Status);
    130 
    131   Status = CommandInit();
    132   ASSERT_EFI_ERROR(Status);
    133 
    134   //
    135   // parse the command line
    136   //
    137   Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE);
    138   if (EFI_ERROR(Status)) {
    139     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
    140       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"memmap", ProblemParam);
    141       FreePool(ProblemParam);
    142       ShellStatus = SHELL_INVALID_PARAMETER;
    143     } else {
    144       ASSERT(FALSE);
    145     }
    146   } else {
    147     if (ShellCommandLineGetCount(Package) > 1) {
    148       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"memmap");
    149       ShellStatus = SHELL_INVALID_PARAMETER;
    150     } else {
    151       Status = gBS->GetMemoryMap(&Size, Buffer, &MapKey, &ItemSize, &Version);
    152       if (Status == EFI_BUFFER_TOO_SMALL){
    153         Size += SIZE_1KB;
    154         Buffer = AllocateZeroPool(Size);
    155         Status = gBS->GetMemoryMap(&Size, Buffer, &MapKey, &ItemSize, &Version);
    156       }
    157       if (EFI_ERROR(Status)) {
    158         ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_GET_FAILED), gShellDebug1HiiHandle, L"memmap");
    159         ShellStatus = SHELL_ACCESS_DENIED;
    160       } else {
    161         ASSERT(Version == EFI_MEMORY_DESCRIPTOR_VERSION);
    162 
    163         Sfo = ShellCommandLineGetFlag(Package, L"-sfo");
    164         if (!Sfo) {
    165           ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_HEAD), gShellDebug1HiiHandle);
    166         } else {
    167           ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellDebug1HiiHandle, L"memmap");
    168         }
    169 
    170         for (Walker = (UINT8*)Buffer; Walker < (((UINT8*)Buffer)+Size) && Walker != NULL; Walker += ItemSize){
    171           switch (((EFI_MEMORY_DESCRIPTOR*)Walker)->Type) {
    172             case  EfiReservedMemoryType:
    173               ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiReservedMemoryType, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    174               ReservedPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    175               break;
    176             case EfiLoaderCode:
    177               ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiLoaderCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    178               LoadCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    179               TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    180               break;
    181             case EfiLoaderData:
    182               ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiLoaderData, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    183               LoadDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    184               TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    185               break;
    186             case EfiBootServicesCode:
    187               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, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    188               BSCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    189               TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    190               break;
    191             case EfiBootServicesData:
    192               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, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    193               BSDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    194               TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    195               break;
    196             case EfiRuntimeServicesCode:
    197               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, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    198               RTCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    199               TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    200               break;
    201             case EfiRuntimeServicesData:
    202               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, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    203               RTDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    204               TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    205               break;
    206             case EfiConventionalMemory:
    207               ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiConventionalMemory, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    208               AvailPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    209               TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    210               break;
    211             case EfiPersistentMemory:
    212               ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiPersistentMemory, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    213               AvailPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    214               TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    215               break;
    216             case EfiUnusableMemory:
    217               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, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    218               UnusableMemoryPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    219               break;
    220             case EfiACPIReclaimMemory:
    221               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, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    222               TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    223               AcpiReclaimPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    224               break;
    225             case EfiACPIMemoryNVS:
    226               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, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    227               TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    228               AcpiNvsPages    += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    229               break;
    230             case EfiMemoryMappedIO:
    231               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, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    232               MmioSpacePages  += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    233               break;
    234             case EfiMemoryMappedIOPortSpace:
    235               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, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    236               MmioPortPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    237               break;
    238             case EfiPalCode:
    239               ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiPalCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
    240               TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    241               PalCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
    242               break;
    243             default:
    244               ASSERT(FALSE);
    245           }
    246         }
    247         //
    248         // print the summary
    249         //
    250         ReservedPagesSize       = MultU64x64(SIZE_4KB,ReservedPages);
    251         LoadCodePagesSize       = MultU64x64(SIZE_4KB,LoadCodePages);
    252         LoadDataPagesSize       = MultU64x64(SIZE_4KB,LoadDataPages);
    253         BSCodePagesSize         = MultU64x64(SIZE_4KB,BSCodePages);
    254         BSDataPagesSize         = MultU64x64(SIZE_4KB,BSDataPages);
    255         RTDataPagesSize         = MultU64x64(SIZE_4KB,RTDataPages);
    256         RTCodePagesSize         = MultU64x64(SIZE_4KB,RTCodePages);
    257         AvailPagesSize          = MultU64x64(SIZE_4KB,AvailPages);
    258         TotalPagesSize          = MultU64x64(SIZE_4KB,TotalPages);
    259         AcpiReclaimPagesSize    = MultU64x64(SIZE_4KB,AcpiReclaimPages);
    260         AcpiNvsPagesSize        = MultU64x64(SIZE_4KB,AcpiNvsPages);
    261         MmioSpacePagesSize      = MultU64x64(SIZE_4KB,MmioSpacePages);
    262         MmioPortPagesSize       = MultU64x64(SIZE_4KB,MmioPortPages);
    263         PalCodePagesSize        = MultU64x64(SIZE_4KB,PalCodePages);
    264         UnusableMemoryPagesSize = MultU64x64(SIZE_4KB,UnusableMemoryPages);
    265         if (!Sfo) {
    266           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_SUMM), gShellDebug1HiiHandle,
    267             ReservedPages, ReservedPagesSize,
    268             LoadCodePages, LoadCodePagesSize,
    269             LoadDataPages, LoadDataPagesSize,
    270             BSCodePages, BSCodePagesSize,
    271             BSDataPages, BSDataPagesSize,
    272             RTCodePages, RTCodePagesSize,
    273             RTDataPages, RTDataPagesSize,
    274             AcpiReclaimPages, AcpiReclaimPagesSize,
    275             AcpiNvsPages, AcpiNvsPagesSize,
    276             MmioSpacePages, MmioSpacePagesSize,
    277             MmioPortPages, MmioPortPagesSize,
    278             PalCodePages, PalCodePagesSize,
    279             AvailPages, AvailPagesSize,
    280             DivU64x32(MultU64x64(SIZE_4KB,TotalPages), SIZE_1MB), TotalPagesSize
    281            );
    282         } else {
    283           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO), gShellDebug1HiiHandle,
    284             TotalPagesSize,
    285             ReservedPagesSize,
    286             BSCodePagesSize,
    287             BSDataPagesSize,
    288             RTCodePagesSize,
    289             RTDataPagesSize,
    290             LoadCodePagesSize,
    291             LoadDataPagesSize,
    292             AvailPagesSize,
    293             MmioSpacePagesSize,
    294             MmioPortPagesSize,
    295             UnusableMemoryPagesSize,
    296             AcpiReclaimPagesSize,
    297             AcpiNvsPagesSize,
    298             PalCodePagesSize
    299            );
    300         }
    301       }
    302     }
    303     ShellCommandLineFreeVarList (Package);
    304   }
    305 
    306   if (Buffer != NULL) {
    307     FreePool(Buffer);
    308   }
    309 
    310   return (ShellStatus);
    311 }
    312 
    313