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