/** @file\r
Main file for Dmem shell Debug1 function.\r
\r
- Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- 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
+ Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
+ (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "UefiShellDebug1CommandsLib.h"\r
#include <Protocol/PciRootBridgeIo.h>\r
+#include <Guid/Acpi.h>\r
+#include <Guid/Mps.h>\r
+#include <Guid/SmBios.h>\r
+\r
+/**\r
+ Make a printable character.\r
+\r
+ If Char is printable then return it, otherwise return a question mark.\r
\r
+ @param[in] Char The character to make printable.\r
+\r
+ @return A printable character representing Char.\r
+**/\r
CHAR16\r
-MakePrintable(\r
- IN CONST CHAR16 Char\r
+MakePrintable (\r
+ IN CONST CHAR16 Char\r
)\r
{\r
- if ((Char < 0x20 && Char > 0)||(Char > 126)) {\r
+ if (((Char < 0x20) && (Char > 0)) || (Char > 126)) {\r
return (L'?');\r
}\r
+\r
return (Char);\r
}\r
\r
+/**\r
+ Display some Memory-Mapped-IO memory.\r
+\r
+ @param[in] Address The starting address to display.\r
+ @param[in] Size The length of memory to display.\r
+**/\r
SHELL_STATUS\r
-EFIAPI\r
-DisplayMmioMemory(\r
+DisplayMmioMemory (\r
IN CONST VOID *Address,\r
IN CONST UINTN Size\r
)\r
{\r
- EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRbIo;\r
- EFI_STATUS Status;\r
- VOID *Buffer;\r
- SHELL_STATUS ShellStatus;\r
+ EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRbIo;\r
+ EFI_STATUS Status;\r
+ VOID *Buffer;\r
+ SHELL_STATUS ShellStatus;\r
\r
ShellStatus = SHELL_SUCCESS;\r
\r
- Status = gBS->LocateProtocol(&gEfiPciRootBridgeIoProtocolGuid, NULL, (VOID**)&PciRbIo);\r
- if (EFI_ERROR(Status)) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle);\r
+ Status = gBS->LocateProtocol (&gEfiPciRootBridgeIoProtocolGuid, NULL, (VOID **)&PciRbIo);\r
+ if (EFI_ERROR (Status)) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle, L"dmem");\r
return (SHELL_NOT_FOUND);\r
}\r
- Buffer = AllocateZeroPool(Size);\r
- ASSERT(Buffer != NULL);\r
\r
- Status = PciRbIo->Mem.Read(PciRbIo, EfiPciWidthUint8, (UINT64)Address, Size, Buffer);\r
- if (EFI_ERROR(Status)) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_ER), gShellDebug1HiiHandle, Status);\r
+ Buffer = AllocateZeroPool (Size);\r
+ if (Buffer == NULL) {\r
+ return SHELL_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ Status = PciRbIo->Mem.Read (PciRbIo, EfiPciWidthUint8, (UINT64)(UINTN)Address, Size, Buffer);\r
+ if (EFI_ERROR (Status)) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_ER), gShellDebug1HiiHandle, L"dmem");\r
ShellStatus = SHELL_NOT_FOUND;\r
} else {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMEM_MMIO_HEADER_ROW), gShellDebug1HiiHandle, (UINT64)Address, Size);\r
- DumpHex(2,0,Size,Buffer);\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_MMIO_HEADER_ROW), gShellDebug1HiiHandle, (UINT64)(UINTN)Address, Size);\r
+ DumpHex (2, (UINTN)Address, Size, Buffer);\r
}\r
\r
- FreePool(Buffer);\r
+ FreePool (Buffer);\r
return (ShellStatus);\r
}\r
\r
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
- {L"-mmio", TypeFlag},\r
- {NULL, TypeMax}\r
- };\r
+STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
+ { L"-mmio", TypeFlag },\r
+ { NULL, TypeMax }\r
+};\r
\r
+/**\r
+ Function for 'dmem' 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
ShellCommandRunDmem (\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
- LIST_ENTRY *Package;\r
- CHAR16 *ProblemParam;\r
- SHELL_STATUS ShellStatus;\r
- VOID *Address;\r
- UINTN Size;\r
- CONST CHAR16 *Temp1;\r
-\r
- ShellStatus = SHELL_SUCCESS;\r
- Status = EFI_SUCCESS;\r
- Address = NULL;\r
- Size = 0;\r
+ EFI_STATUS Status;\r
+ LIST_ENTRY *Package;\r
+ CHAR16 *ProblemParam;\r
+ SHELL_STATUS ShellStatus;\r
+ VOID *Address;\r
+ UINT64 Size;\r
+ CONST CHAR16 *Temp1;\r
+ UINT64 AcpiTableAddress;\r
+ UINT64 Acpi20TableAddress;\r
+ UINT64 SalTableAddress;\r
+ UINT64 SmbiosTableAddress;\r
+ UINT64 MpsTableAddress;\r
+ UINTN TableWalker;\r
+\r
+ ShellStatus = SHELL_SUCCESS;\r
+ Status = EFI_SUCCESS;\r
+ Address = NULL;\r
+ Size = 0;\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 (ParamList, &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"dmem", ProblemParam);\r
+ FreePool (ProblemParam);\r
ShellStatus = SHELL_INVALID_PARAMETER;\r
} else {\r
- ASSERT(FALSE);\r
+ ASSERT (FALSE);\r
}\r
} else {\r
- Temp1 = ShellCommandLineGetRawValue(Package, 1);\r
- if (Temp1 == NULL) {\r
- Address = gST;\r
- Size = 512;\r
+ if (ShellCommandLineGetCount (Package) > 3) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"dmem");\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
} else {\r
- if (!ShellIsHexOrDecimalNumber(Temp1, TRUE, FALSE)) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Temp1);\r
- ShellStatus = SHELL_INVALID_PARAMETER;\r
- } else {\r
- Address = (VOID*)StrHexToUintn(Temp1);\r
- }\r
- Temp1 = ShellCommandLineGetRawValue(Package, 2);\r
+ Temp1 = ShellCommandLineGetRawValue (Package, 1);\r
if (Temp1 == NULL) {\r
- Size = 512;\r
+ Address = gST;\r
+ Size = sizeof (*gST);\r
} else {\r
- if (!ShellIsHexOrDecimalNumber(Temp1, FALSE, FALSE)) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Temp1);\r
+ if (!ShellIsHexOrDecimalNumber (Temp1, TRUE, FALSE) || EFI_ERROR (ShellConvertStringToUint64 (Temp1, (UINT64 *)&Address, TRUE, FALSE))) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dmem", Temp1);\r
ShellStatus = SHELL_INVALID_PARAMETER;\r
+ }\r
+\r
+ Temp1 = ShellCommandLineGetRawValue (Package, 2);\r
+ if (Temp1 == NULL) {\r
+ Size = 512;\r
} else {\r
- Size = ShellStrToUintn(Temp1);\r
+ if (!ShellIsHexOrDecimalNumber (Temp1, FALSE, FALSE) || EFI_ERROR (ShellConvertStringToUint64 (Temp1, &Size, TRUE, FALSE))) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dmem", Temp1);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ }\r
}\r
}\r
}\r
\r
if (ShellStatus == SHELL_SUCCESS) {\r
- if (!ShellCommandLineGetFlag(Package, L"-mmio")) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMEM_HEADER_ROW), gShellDebug1HiiHandle, (UINT64)Address, Size);\r
- DumpHex(2,0,Size,Address);\r
+ if (!ShellCommandLineGetFlag (Package, L"-mmio")) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_HEADER_ROW), gShellDebug1HiiHandle, (UINT64)(UINTN)Address, Size);\r
+ DumpHex (2, (UINTN)Address, (UINTN)Size, Address);\r
+ if (Address == (VOID *)gST) {\r
+ Acpi20TableAddress = 0;\r
+ AcpiTableAddress = 0;\r
+ SalTableAddress = 0;\r
+ SmbiosTableAddress = 0;\r
+ MpsTableAddress = 0;\r
+ for (TableWalker = 0; TableWalker < gST->NumberOfTableEntries; TableWalker++) {\r
+ if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiAcpi20TableGuid)) {\r
+ Acpi20TableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;\r
+ continue;\r
+ }\r
+\r
+ if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiAcpi10TableGuid)) {\r
+ AcpiTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;\r
+ continue;\r
+ }\r
+\r
+ if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSmbiosTableGuid)) {\r
+ SmbiosTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;\r
+ continue;\r
+ }\r
+\r
+ if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSmbios3TableGuid)) {\r
+ SmbiosTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;\r
+ continue;\r
+ }\r
+\r
+ if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiMpsTableGuid)) {\r
+ MpsTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable;\r
+ continue;\r
+ }\r
+ }\r
+\r
+ ShellPrintHiiEx (\r
+ -1,\r
+ -1,\r
+ NULL,\r
+ STRING_TOKEN (STR_DMEM_SYSTEM_TABLE),\r
+ gShellDebug1HiiHandle,\r
+ (UINT64)(UINTN)Address,\r
+ gST->Hdr.HeaderSize,\r
+ gST->Hdr.Revision,\r
+ (UINT64)(UINTN)gST->ConIn,\r
+ (UINT64)(UINTN)gST->ConOut,\r
+ (UINT64)(UINTN)gST->StdErr,\r
+ (UINT64)(UINTN)gST->RuntimeServices,\r
+ (UINT64)(UINTN)gST->BootServices,\r
+ SalTableAddress,\r
+ AcpiTableAddress,\r
+ Acpi20TableAddress,\r
+ MpsTableAddress,\r
+ SmbiosTableAddress\r
+ );\r
+ }\r
} else {\r
- ShellStatus = DisplayMmioMemory(Address, Size);\r
+ ShellStatus = DisplayMmioMemory (Address, (UINTN)Size);\r
}\r
}\r
\r
-\r
ShellCommandLineFreeVarList (Package);\r
}\r
\r