2 Main file for Dmem shell Debug1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2010 - 2011, 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 accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
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.
16 #include "UefiShellDebug1CommandsLib.h"
17 #include <Protocol/PciRootBridgeIo.h>
18 #include <Guid/Acpi.h>
20 #include <Guid/SmBios.h>
21 #include <Guid/SalSystemTable.h>
24 Make a printable character.
26 If Char is printable then return it, otherwise return a question mark.
28 @param[in] Char The character to make printable.
30 @return A printable character representing Char.
38 if ((Char
< 0x20 && Char
> 0)||(Char
> 126)) {
45 Display some Memory-Mapped-IO memory.
47 @param[in] Address The starting address to display.
48 @param[in] Size The length of memory to display.
53 IN CONST VOID
*Address
,
57 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*PciRbIo
;
60 SHELL_STATUS ShellStatus
;
62 ShellStatus
= SHELL_SUCCESS
;
64 Status
= gBS
->LocateProtocol(&gEfiPciRootBridgeIoProtocolGuid
, NULL
, (VOID
**)&PciRbIo
);
65 if (EFI_ERROR(Status
)) {
66 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PCIRBIO_NF
), gShellDebug1HiiHandle
, L
"dmem");
67 return (SHELL_NOT_FOUND
);
69 Buffer
= AllocateZeroPool(Size
);
70 ASSERT(Buffer
!= NULL
);
72 Status
= PciRbIo
->Mem
.Read(PciRbIo
, EfiPciWidthUint8
, (UINT64
)(UINTN
)Address
, Size
, Buffer
);
73 if (EFI_ERROR(Status
)) {
74 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PCIRBIO_ER
), gShellDebug1HiiHandle
, L
"dmem");
75 ShellStatus
= SHELL_NOT_FOUND
;
77 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DMEM_MMIO_HEADER_ROW
), gShellDebug1HiiHandle
, (UINT64
)(UINTN
)Address
, Size
);
78 DumpHex(2, (UINTN
)Address
, Size
, Buffer
);
85 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
91 Function for 'dmem' command.
93 @param[in] ImageHandle Handle to the Image (NULL if Internal).
94 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
99 IN EFI_HANDLE ImageHandle
,
100 IN EFI_SYSTEM_TABLE
*SystemTable
105 CHAR16
*ProblemParam
;
106 SHELL_STATUS ShellStatus
;
110 UINT64 AcpiTableAddress
;
111 UINT64 Acpi20TableAddress
;
112 UINT64 SalTableAddress
;
113 UINT64 SmbiosTableAddress
;
114 UINT64 MpsTableAddress
;
117 ShellStatus
= SHELL_SUCCESS
;
118 Status
= EFI_SUCCESS
;
123 // initialize the shell lib (we must be in non-auto-init...)
125 Status
= ShellInitialize();
126 ASSERT_EFI_ERROR(Status
);
128 Status
= CommandInit();
129 ASSERT_EFI_ERROR(Status
);
132 // parse the command line
134 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
135 if (EFI_ERROR(Status
)) {
136 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
137 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, L
"dmem", ProblemParam
);
138 FreePool(ProblemParam
);
139 ShellStatus
= SHELL_INVALID_PARAMETER
;
144 if (ShellCommandLineGetCount(Package
) > 3) {
145 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
, L
"dmem");
146 ShellStatus
= SHELL_INVALID_PARAMETER
;
148 Temp1
= ShellCommandLineGetRawValue(Package
, 1);
153 if (!ShellIsHexOrDecimalNumber(Temp1
, TRUE
, FALSE
) || EFI_ERROR(ShellConvertStringToUint64(Temp1
, (UINT64
*)&Address
, TRUE
, FALSE
))) {
154 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"dmem", Temp1
);
155 ShellStatus
= SHELL_INVALID_PARAMETER
;
157 Temp1
= ShellCommandLineGetRawValue(Package
, 2);
161 if (!ShellIsHexOrDecimalNumber(Temp1
, FALSE
, FALSE
) || EFI_ERROR(ShellConvertStringToUint64(Temp1
, &Size
, TRUE
, FALSE
))) {
162 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDebug1HiiHandle
, L
"dmem", Temp1
);
163 ShellStatus
= SHELL_INVALID_PARAMETER
;
169 if (ShellStatus
== SHELL_SUCCESS
) {
170 if (!ShellCommandLineGetFlag(Package
, L
"-mmio")) {
171 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DMEM_HEADER_ROW
), gShellDebug1HiiHandle
, (UINT64
)(UINTN
)Address
, Size
);
172 DumpHex(2, (UINTN
)Address
, (UINTN
)Size
, Address
);
173 if (Address
== (VOID
*)gST
) {
174 Acpi20TableAddress
= 0;
175 AcpiTableAddress
= 0;
177 SmbiosTableAddress
= 0;
179 for (TableWalker
= 0 ; TableWalker
< gST
->NumberOfTableEntries
; TableWalker
++) {
180 if (CompareGuid(&gST
->ConfigurationTable
[TableWalker
].VendorGuid
, &gEfiAcpi20TableGuid
)) {
181 Acpi20TableAddress
= (UINT64
)(UINTN
)gST
->ConfigurationTable
[TableWalker
].VendorTable
;
184 if (CompareGuid(&gST
->ConfigurationTable
[TableWalker
].VendorGuid
, &gEfiAcpi10TableGuid
)) {
185 AcpiTableAddress
= (UINT64
)(UINTN
)gST
->ConfigurationTable
[TableWalker
].VendorTable
;
188 if (CompareGuid(&gST
->ConfigurationTable
[TableWalker
].VendorGuid
, &gEfiSalSystemTableGuid
)) {
189 SalTableAddress
= (UINT64
)(UINTN
)gST
->ConfigurationTable
[TableWalker
].VendorTable
;
192 if (CompareGuid(&gST
->ConfigurationTable
[TableWalker
].VendorGuid
, &gEfiSmbiosTableGuid
)) {
193 SmbiosTableAddress
= (UINT64
)(UINTN
)gST
->ConfigurationTable
[TableWalker
].VendorTable
;
196 if (CompareGuid(&gST
->ConfigurationTable
[TableWalker
].VendorGuid
, &gEfiMpsTableGuid
)) {
197 MpsTableAddress
= (UINT64
)(UINTN
)gST
->ConfigurationTable
[TableWalker
].VendorTable
;
202 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DMEM_SYSTEM_TABLE
), gShellDebug1HiiHandle
,
203 (UINT64
)(UINTN
)Address
,
206 (UINT64
)(UINTN
)gST
->ConIn
,
207 (UINT64
)(UINTN
)gST
->ConOut
,
208 (UINT64
)(UINTN
)gST
->StdErr
,
209 (UINT64
)(UINTN
)gST
->RuntimeServices
,
210 (UINT64
)(UINTN
)gST
->BootServices
,
219 ShellStatus
= DisplayMmioMemory(Address
, (UINTN
)Size
);
224 ShellCommandLineFreeVarList (Package
);
227 return (ShellStatus
);