Home | History | Annotate | Download | only in UefiShellDebug1CommandsLib
      1 /** @file
      2   Main file for Dmem shell Debug1 function.
      3 
      4   Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
      5   (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
      6   (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
      7   This program and the accompanying materials
      8   are licensed and made available under the terms and conditions of the BSD License
      9   which accompanies this distribution.  The full text of the license may be found at
     10   http://opensource.org/licenses/bsd-license.php
     11 
     12   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 
     15 **/
     16 
     17 #include "UefiShellDebug1CommandsLib.h"
     18 #include <Protocol/PciRootBridgeIo.h>
     19 #include <Guid/Acpi.h>
     20 #include <Guid/Mps.h>
     21 #include <Guid/SmBios.h>
     22 #include <Guid/SalSystemTable.h>
     23 
     24 /**
     25   Make a printable character.
     26 
     27   If Char is printable then return it, otherwise return a question mark.
     28 
     29   @param[in] Char     The character to make printable.
     30 
     31   @return A printable character representing Char.
     32 **/
     33 CHAR16
     34 MakePrintable(
     35   IN CONST CHAR16 Char
     36   )
     37 {
     38   if ((Char < 0x20 && Char > 0)||(Char > 126)) {
     39     return (L'?');
     40   }
     41   return (Char);
     42 }
     43 
     44 /**
     45   Display some Memory-Mapped-IO memory.
     46 
     47   @param[in] Address    The starting address to display.
     48   @param[in] Size       The length of memory to display.
     49 **/
     50 SHELL_STATUS
     51 DisplayMmioMemory(
     52   IN CONST VOID   *Address,
     53   IN CONST UINTN  Size
     54   )
     55 {
     56   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRbIo;
     57   EFI_STATUS                      Status;
     58   VOID                            *Buffer;
     59   SHELL_STATUS                    ShellStatus;
     60 
     61   ShellStatus = SHELL_SUCCESS;
     62 
     63   Status = gBS->LocateProtocol(&gEfiPciRootBridgeIoProtocolGuid, NULL, (VOID**)&PciRbIo);
     64   if (EFI_ERROR(Status)) {
     65     ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle, L"dmem");
     66     return (SHELL_NOT_FOUND);
     67   }
     68   Buffer = AllocateZeroPool(Size);
     69   if (Buffer == NULL) {
     70     return SHELL_OUT_OF_RESOURCES;
     71   }
     72 
     73   Status = PciRbIo->Mem.Read(PciRbIo, EfiPciWidthUint8, (UINT64)(UINTN)Address, Size, Buffer);
     74   if (EFI_ERROR(Status)) {
     75     ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_ER), gShellDebug1HiiHandle, L"dmem");
     76     ShellStatus = SHELL_NOT_FOUND;
     77   } else {
     78     ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMEM_MMIO_HEADER_ROW), gShellDebug1HiiHandle, (UINT64)(UINTN)Address, Size);
     79     DumpHex(2, (UINTN)Address, Size, Buffer);
     80   }
     81 
     82   FreePool(Buffer);
     83   return (ShellStatus);
     84 }
     85 
     86 STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
     87   {L"-mmio", TypeFlag},
     88   {NULL, TypeMax}
     89   };
     90 
     91 /**
     92   Function for 'dmem' command.
     93 
     94   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
     95   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
     96 **/
     97 SHELL_STATUS
     98 EFIAPI
     99 ShellCommandRunDmem (
    100   IN EFI_HANDLE        ImageHandle,
    101   IN EFI_SYSTEM_TABLE  *SystemTable
    102   )
    103 {
    104   EFI_STATUS          Status;
    105   LIST_ENTRY          *Package;
    106   CHAR16              *ProblemParam;
    107   SHELL_STATUS        ShellStatus;
    108   VOID                *Address;
    109   UINT64              Size;
    110   CONST CHAR16        *Temp1;
    111   UINT64              AcpiTableAddress;
    112   UINT64              Acpi20TableAddress;
    113   UINT64              SalTableAddress;
    114   UINT64              SmbiosTableAddress;
    115   UINT64              MpsTableAddress;
    116   UINTN               TableWalker;
    117 
    118   ShellStatus         = SHELL_SUCCESS;
    119   Status              = EFI_SUCCESS;
    120   Address             = NULL;
    121   Size                = 0;
    122 
    123   //
    124   // initialize the shell lib (we must be in non-auto-init...)
    125   //
    126   Status = ShellInitialize();
    127   ASSERT_EFI_ERROR(Status);
    128 
    129   Status = CommandInit();
    130   ASSERT_EFI_ERROR(Status);
    131 
    132   //
    133   // parse the command line
    134   //
    135   Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
    136   if (EFI_ERROR(Status)) {
    137     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
    138       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"dmem", ProblemParam);
    139       FreePool(ProblemParam);
    140       ShellStatus = SHELL_INVALID_PARAMETER;
    141     } else {
    142       ASSERT(FALSE);
    143     }
    144   } else {
    145     if (ShellCommandLineGetCount(Package) > 3) {
    146       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"dmem");
    147       ShellStatus = SHELL_INVALID_PARAMETER;
    148     } else {
    149       Temp1 = ShellCommandLineGetRawValue(Package, 1);
    150       if (Temp1 == NULL) {
    151         Address = gST;
    152         Size = 512;
    153       } else {
    154         if (!ShellIsHexOrDecimalNumber(Temp1, TRUE, FALSE) || EFI_ERROR(ShellConvertStringToUint64(Temp1, (UINT64*)&Address, TRUE, FALSE))) {
    155           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dmem", Temp1);
    156           ShellStatus = SHELL_INVALID_PARAMETER;
    157         }
    158         Temp1 = ShellCommandLineGetRawValue(Package, 2);
    159         if (Temp1 == NULL) {
    160           Size = 512;
    161         } else {
    162           if (!ShellIsHexOrDecimalNumber(Temp1, FALSE, FALSE) || EFI_ERROR(ShellConvertStringToUint64(Temp1, &Size, TRUE, FALSE))) {
    163             ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dmem", Temp1);
    164             ShellStatus = SHELL_INVALID_PARAMETER;
    165           }
    166         }
    167       }
    168     }
    169 
    170     if (ShellStatus == SHELL_SUCCESS) {
    171       if (!ShellCommandLineGetFlag(Package, L"-mmio")) {
    172         ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMEM_HEADER_ROW), gShellDebug1HiiHandle, (UINT64)(UINTN)Address, Size);
    173         DumpHex(2, (UINTN)Address, (UINTN)Size, Address);
    174         if (Address == (VOID*)gST) {
    175           Acpi20TableAddress  = 0;
    176           AcpiTableAddress    = 0;
    177           SalTableAddress     = 0;
    178           SmbiosTableAddress  = 0;
    179           MpsTableAddress     = 0;
    180           for (TableWalker = 0 ; TableWalker < gST->NumberOfTableEntries ; TableWalker++) {
    181             if (CompareGuid(&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiAcpi20TableGuid)) {
    182               Acpi20TableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;
    183               continue;
    184             }
    185             if (CompareGuid(&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiAcpi10TableGuid)) {
    186               AcpiTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;
    187               continue;
    188             }
    189             if (CompareGuid(&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSalSystemTableGuid)) {
    190               SalTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;
    191               continue;
    192             }
    193             if (CompareGuid(&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSmbiosTableGuid)) {
    194               SmbiosTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;
    195               continue;
    196             }
    197             if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSmbios3TableGuid)) {
    198               SmbiosTableAddress = (UINT64) (UINTN) gST->ConfigurationTable[TableWalker].VendorTable;
    199               continue;
    200             }
    201             if (CompareGuid(&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiMpsTableGuid)) {
    202               MpsTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;
    203               continue;
    204             }
    205           }
    206 
    207           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMEM_SYSTEM_TABLE), gShellDebug1HiiHandle,
    208             (UINT64)(UINTN)Address,
    209             gST->Hdr.HeaderSize,
    210             gST->Hdr.Revision,
    211             (UINT64)(UINTN)gST->ConIn,
    212             (UINT64)(UINTN)gST->ConOut,
    213             (UINT64)(UINTN)gST->StdErr,
    214             (UINT64)(UINTN)gST->RuntimeServices,
    215             (UINT64)(UINTN)gST->BootServices,
    216             SalTableAddress,
    217             AcpiTableAddress,
    218             Acpi20TableAddress,
    219             MpsTableAddress,
    220             SmbiosTableAddress
    221             );
    222         }
    223       } else {
    224         ShellStatus = DisplayMmioMemory(Address, (UINTN)Size);
    225       }
    226     }
    227 
    228 
    229     ShellCommandLineFreeVarList (Package);
    230   }
    231 
    232   return (ShellStatus);
    233 }
    234