]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellAcpiViewCommandLib / UefiShellAcpiViewCommandLib.c
CommitLineData
a6eaba4d 1/** @file\r
ee4dc24f
RN
2 Main file for 'acpiview' Shell command function.\r
3\r
558b37b4 4 Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.\r
80e67bcb 5 Copyright (c) 2016 - 2021, Arm Limited. All rights reserved.<BR>\r
56ba3746 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
ee4dc24f
RN
7**/\r
8\r
9#include <Guid/ShellLibHiiGuid.h>\r
10#include <IndustryStandard/Acpi.h>\r
1d3d5e32 11#include <IndustryStandard/ArmErrorSourceTable.h>\r
422fe85c
TP
12\r
13#include <Library/BaseMemoryLib.h>\r
ee4dc24f 14#include <Library/HiiLib.h>\r
422fe85c
TP
15#include <Library/MemoryAllocationLib.h>\r
16#include <Library/PrintLib.h>\r
ee4dc24f 17#include <Library/ShellCommandLib.h>\r
422fe85c 18#include <Library/ShellLib.h>\r
ee4dc24f 19#include <Library/UefiBootServicesTableLib.h>\r
422fe85c 20#include <Library/UefiLib.h>\r
db77d8f7 21#include <Library/AcpiViewCommandLib.h>\r
ee4dc24f 22#include <Uefi.h>\r
422fe85c 23\r
ee4dc24f
RN
24#include "AcpiParser.h"\r
25#include "AcpiTableParser.h"\r
26#include "AcpiView.h"\r
422fe85c 27#include "AcpiViewConfig.h"\r
ee4dc24f 28\r
47d20b54
MK
29CONST CHAR16 gShellAcpiViewFileName[] = L"ShellCommand";\r
30EFI_HII_HANDLE gShellAcpiViewHiiHandle = NULL;\r
ee4dc24f 31\r
422fe85c
TP
32/**\r
33 An array of acpiview command line parameters.\r
34**/\r
47d20b54
MK
35STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
36 { L"-q", TypeFlag },\r
37 { L"-d", TypeFlag },\r
38 { L"-h", TypeFlag },\r
39 { L"-l", TypeFlag },\r
40 { L"-s", TypeValue },\r
41 { L"-r", TypeValue },\r
42 { NULL, TypeMax }\r
422fe85c
TP
43};\r
44\r
ee4dc24f
RN
45/**\r
46 A list of available table parsers.\r
47*/\r
48STATIC\r
49CONST\r
47d20b54
MK
50ACPI_TABLE_PARSER ParserList[] = {\r
51 { EFI_ACPI_6_3_ARM_ERROR_SOURCE_TABLE_SIGNATURE, ParseAcpiAest },\r
1fd8d089 52 { EFI_ACPI_6_4_ARM_PERFORMANCE_MONITORING_UNIT_TABLE_SIGNATURE, ParseAcpiApmt },\r
47d20b54
MK
53 { EFI_ACPI_6_2_BOOT_GRAPHICS_RESOURCE_TABLE_SIGNATURE, ParseAcpiBgrt },\r
54 { EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE, ParseAcpiDbg2 },\r
55 { EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,\r
56 ParseAcpiDsdt },\r
558b37b4 57 { EFI_ACPI_6_4_ERROR_RECORD_SERIALIZATION_TABLE_SIGNATURE, ParseAcpiErst },\r
47d20b54
MK
58 { EFI_ACPI_6_3_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE, ParseAcpiFacs },\r
59 { EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiFadt },\r
60 { EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiGtdt },\r
61 { EFI_ACPI_6_4_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_SIGNATURE, ParseAcpiHmat },\r
62 { EFI_ACPI_6_2_IO_REMAPPING_TABLE_SIGNATURE, ParseAcpiIort },\r
63 { EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiMadt },\r
64 { EFI_ACPI_6_2_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE,\r
65 ParseAcpiMcfg },\r
66 { EFI_ACPI_6_4_PLATFORM_COMMUNICATIONS_CHANNEL_TABLE_SIGNATURE,\r
67 ParseAcpiPcct },\r
a50b65ce 68 { EFI_ACPI_6_4_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE,\r
47d20b54
MK
69 ParseAcpiPptt },\r
70 { RSDP_TABLE_INFO, ParseAcpiRsdp },\r
71 { EFI_ACPI_6_2_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE, ParseAcpiSlit },\r
72 { EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, ParseAcpiSpcr },\r
73 { EFI_ACPI_6_2_SYSTEM_RESOURCE_AFFINITY_TABLE_SIGNATURE, ParseAcpiSrat },\r
74 { EFI_ACPI_6_2_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiSsdt },\r
75 { EFI_ACPI_6_2_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiXsdt }\r
ee4dc24f
RN
76};\r
77\r
a6eaba4d
DB
78/**\r
79 This function registers all the available table parsers.\r
ee4dc24f
RN
80\r
81 @retval EFI_SUCCESS The parser is registered.\r
82 @retval EFI_ALREADY_STARTED The parser for the ACPI Table\r
83 was already registered.\r
84 @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
85 @retval EFI_OUT_OF_RESOURCES No space to register the\r
86 parser.\r
a6eaba4d 87**/\r
ee4dc24f
RN
88EFI_STATUS\r
89RegisterAllParsers (\r
90 )\r
91{\r
47d20b54
MK
92 EFI_STATUS Status;\r
93 UINTN Count;\r
f75c7478 94\r
7343bc80 95 Status = EFI_SUCCESS;\r
47d20b54 96 Count = sizeof (ParserList) / sizeof (ParserList[0]);\r
f75c7478 97\r
ee4dc24f
RN
98 while (Count-- != 0) {\r
99 Status = RegisterParser (\r
100 ParserList[Count].Signature,\r
101 ParserList[Count].Parser\r
102 );\r
103 if (EFI_ERROR (Status)) {\r
104 return Status;\r
105 }\r
106 }\r
47d20b54 107\r
ee4dc24f
RN
108 return Status;\r
109}\r
110\r
d45cf5ff
TP
111/**\r
112 Dump a buffer to a file. Print error message if a file cannot be created.\r
113\r
114 @param[in] FileName The filename that shall be created to contain the buffer.\r
115 @param[in] Buffer Pointer to buffer that shall be dumped.\r
116 @param[in] BufferSize The size of buffer to be dumped in bytes.\r
117\r
118 @return The number of bytes that were written\r
119**/\r
120UINTN\r
121EFIAPI\r
122ShellDumpBufferToFile (\r
47d20b54
MK
123 IN CONST CHAR16 *FileNameBuffer,\r
124 IN CONST VOID *Buffer,\r
d45cf5ff
TP
125 IN CONST UINTN BufferSize\r
126 )\r
127{\r
47d20b54
MK
128 EFI_STATUS Status;\r
129 SHELL_FILE_HANDLE DumpFileHandle;\r
130 UINTN TransferBytes;\r
d45cf5ff
TP
131\r
132 Status = ShellOpenFileByName (\r
133 FileNameBuffer,\r
134 &DumpFileHandle,\r
135 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,\r
136 0\r
137 );\r
138\r
139 if (EFI_ERROR (Status)) {\r
140 ShellPrintHiiEx (\r
141 -1,\r
142 -1,\r
143 NULL,\r
144 STRING_TOKEN (STR_GEN_READONLY_MEDIA),\r
145 gShellAcpiViewHiiHandle,\r
146 L"acpiview"\r
147 );\r
148 return 0;\r
149 }\r
150\r
151 TransferBytes = BufferSize;\r
47d20b54
MK
152 Status = ShellWriteFile (\r
153 DumpFileHandle,\r
154 &TransferBytes,\r
155 (VOID *)Buffer\r
156 );\r
d45cf5ff
TP
157\r
158 if (EFI_ERROR (Status)) {\r
159 Print (L"ERROR: Failed to write binary file.\n");\r
160 TransferBytes = 0;\r
161 } else {\r
162 Print (L"DONE.\n");\r
163 }\r
164\r
165 ShellCloseFile (&DumpFileHandle);\r
166 return TransferBytes;\r
167}\r
168\r
ee4dc24f
RN
169/**\r
170 Return the file name of the help text file if not using HII.\r
171\r
172 @return The string pointer to the file name.\r
a6eaba4d 173**/\r
47d20b54 174CONST CHAR16 *\r
ee4dc24f
RN
175EFIAPI\r
176ShellCommandGetManFileNameAcpiView (\r
177 VOID\r
178 )\r
179{\r
180 return gShellAcpiViewFileName;\r
181}\r
182\r
422fe85c
TP
183/**\r
184 Function for 'acpiview' command.\r
185\r
186 @param[in] ImageHandle Handle to the Image (NULL if internal).\r
187 @param[in] SystemTable Pointer to the System Table (NULL if internal).\r
188\r
189 @retval SHELL_INVALID_PARAMETER The command line invocation could not be parsed\r
190 @retval SHELL_NOT_FOUND The command failed\r
191 @retval SHELL_SUCCESS The command was successful\r
192**/\r
193SHELL_STATUS\r
194EFIAPI\r
195ShellCommandRunAcpiView (\r
196 IN EFI_HANDLE ImageHandle,\r
47d20b54 197 IN EFI_SYSTEM_TABLE *SystemTable\r
422fe85c
TP
198 )\r
199{\r
200 EFI_STATUS Status;\r
201 SHELL_STATUS ShellStatus;\r
47d20b54
MK
202 LIST_ENTRY *Package;\r
203 CHAR16 *ProblemParam;\r
422fe85c 204 SHELL_FILE_HANDLE TmpDumpFileHandle;\r
47d20b54
MK
205 CONST CHAR16 *MandatoryTableSpecStr;\r
206 CONST CHAR16 *SelectedTableName;\r
422fe85c
TP
207\r
208 // Set configuration defaults\r
209 AcpiConfigSetDefaults ();\r
210\r
47d20b54
MK
211 ShellStatus = SHELL_SUCCESS;\r
212 Package = NULL;\r
422fe85c
TP
213 TmpDumpFileHandle = NULL;\r
214\r
215 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
216 if (EFI_ERROR (Status)) {\r
47d20b54 217 if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
422fe85c
TP
218 ShellPrintHiiEx (\r
219 -1,\r
220 -1,\r
221 NULL,\r
222 STRING_TOKEN (STR_GEN_PROBLEM),\r
223 gShellAcpiViewHiiHandle,\r
224 L"acpiview",\r
225 ProblemParam\r
226 );\r
227 FreePool (ProblemParam);\r
228 } else {\r
229 Print (L"acpiview: Error processing input parameter(s)\n");\r
230 }\r
47d20b54 231\r
422fe85c
TP
232 ShellStatus = SHELL_INVALID_PARAMETER;\r
233 } else {\r
234 if (ShellCommandLineGetCount (Package) > 1) {\r
235 ShellPrintHiiEx (\r
236 -1,\r
237 -1,\r
238 NULL,\r
239 STRING_TOKEN (STR_GEN_TOO_MANY),\r
240 gShellAcpiViewHiiHandle,\r
241 L"acpiview"\r
242 );\r
243 ShellStatus = SHELL_INVALID_PARAMETER;\r
244 } else if (ShellCommandLineGetFlag (Package, L"-?")) {\r
245 ShellPrintHiiEx (\r
246 -1,\r
247 -1,\r
248 NULL,\r
249 STRING_TOKEN (STR_GET_HELP_ACPIVIEW),\r
250 gShellAcpiViewHiiHandle,\r
251 L"acpiview"\r
252 );\r
253 } else if (ShellCommandLineGetFlag (Package, L"-s") &&\r
47d20b54
MK
254 (ShellCommandLineGetValue (Package, L"-s") == NULL))\r
255 {\r
422fe85c
TP
256 ShellPrintHiiEx (\r
257 -1,\r
258 -1,\r
259 NULL,\r
260 STRING_TOKEN (STR_GEN_NO_VALUE),\r
261 gShellAcpiViewHiiHandle,\r
262 L"acpiview",\r
263 L"-s"\r
264 );\r
265 ShellStatus = SHELL_INVALID_PARAMETER;\r
266 } else if (ShellCommandLineGetFlag (Package, L"-r") &&\r
47d20b54
MK
267 (ShellCommandLineGetValue (Package, L"-r") == NULL))\r
268 {\r
422fe85c
TP
269 ShellPrintHiiEx (\r
270 -1,\r
271 -1,\r
272 NULL,\r
273 STRING_TOKEN (STR_GEN_NO_VALUE),\r
274 gShellAcpiViewHiiHandle,\r
275 L"acpiview",\r
276 L"-r"\r
277 );\r
278 ShellStatus = SHELL_INVALID_PARAMETER;\r
279 } else if ((ShellCommandLineGetFlag (Package, L"-s") &&\r
47d20b54
MK
280 ShellCommandLineGetFlag (Package, L"-l")))\r
281 {\r
422fe85c
TP
282 ShellPrintHiiEx (\r
283 -1,\r
284 -1,\r
285 NULL,\r
286 STRING_TOKEN (STR_GEN_TOO_MANY),\r
287 gShellAcpiViewHiiHandle,\r
288 L"acpiview"\r
289 );\r
290 ShellStatus = SHELL_INVALID_PARAMETER;\r
291 } else if (ShellCommandLineGetFlag (Package, L"-d") &&\r
47d20b54
MK
292 !ShellCommandLineGetFlag (Package, L"-s"))\r
293 {\r
294 ShellPrintHiiEx (\r
295 -1,\r
296 -1,\r
297 NULL,\r
298 STRING_TOKEN (STR_GEN_MISSING_OPTION),\r
299 gShellAcpiViewHiiHandle,\r
300 L"acpiview",\r
301 L"-s",\r
302 L"-d"\r
303 );\r
304 ShellStatus = SHELL_INVALID_PARAMETER;\r
422fe85c
TP
305 } else {\r
306 // Turn on colour highlighting if requested\r
307 SetColourHighlighting (ShellCommandLineGetFlag (Package, L"-h"));\r
308\r
309 // Surpress consistency checking if requested\r
310 SetConsistencyChecking (!ShellCommandLineGetFlag (Package, L"-q"));\r
311\r
312 // Evaluate the parameters for mandatory ACPI table presence checks\r
313 SetMandatoryTableValidate (ShellCommandLineGetFlag (Package, L"-r"));\r
314 MandatoryTableSpecStr = ShellCommandLineGetValue (Package, L"-r");\r
315\r
316 if (MandatoryTableSpecStr != NULL) {\r
317 SetMandatoryTableSpec (ShellHexStrToUintn (MandatoryTableSpecStr));\r
318 }\r
319\r
320 if (ShellCommandLineGetFlag (Package, L"-l")) {\r
321 SetReportOption (ReportTableList);\r
322 } else {\r
323 SelectedTableName = ShellCommandLineGetValue (Package, L"-s");\r
324 if (SelectedTableName != NULL) {\r
325 SelectAcpiTable (SelectedTableName);\r
326 SetReportOption (ReportSelected);\r
327\r
47d20b54 328 if (ShellCommandLineGetFlag (Package, L"-d")) {\r
422fe85c 329 // Create a temporary file to check if the media is writable.\r
47d20b54 330 CHAR16 FileNameBuffer[MAX_FILE_NAME_LEN];\r
422fe85c
TP
331 SetReportOption (ReportDumpBinFile);\r
332\r
333 UnicodeSPrint (\r
334 FileNameBuffer,\r
335 sizeof (FileNameBuffer),\r
336 L".\\%s0000.tmp",\r
337 SelectedTableName\r
338 );\r
339\r
340 Status = ShellOpenFileByName (\r
341 FileNameBuffer,\r
342 &TmpDumpFileHandle,\r
343 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE |\r
344 EFI_FILE_MODE_CREATE,\r
345 0\r
346 );\r
347\r
348 if (EFI_ERROR (Status)) {\r
47d20b54 349 ShellStatus = SHELL_INVALID_PARAMETER;\r
422fe85c
TP
350 TmpDumpFileHandle = NULL;\r
351 ShellPrintHiiEx (\r
352 -1,\r
353 -1,\r
354 NULL,\r
355 STRING_TOKEN (STR_GEN_READONLY_MEDIA),\r
356 gShellAcpiViewHiiHandle,\r
357 L"acpiview"\r
358 );\r
359 goto Done;\r
360 }\r
47d20b54 361\r
422fe85c
TP
362 // Delete Temporary file.\r
363 ShellDeleteFile (&TmpDumpFileHandle);\r
364 } // -d\r
365 } // -s\r
366 }\r
367\r
368 // Parse ACPI Table information\r
369 Status = AcpiView (SystemTable);\r
370 if (EFI_ERROR (Status)) {\r
371 ShellStatus = SHELL_NOT_FOUND;\r
372 }\r
373 }\r
374 }\r
375\r
376Done:\r
377 if (Package != NULL) {\r
378 ShellCommandLineFreeVarList (Package);\r
379 }\r
47d20b54 380\r
422fe85c
TP
381 return ShellStatus;\r
382}\r
383\r
ee4dc24f
RN
384/**\r
385 Constructor for the Shell AcpiView Command library.\r
386\r
387 Install the handlers for acpiview UEFI Shell command.\r
388\r
389 @param ImageHandle The image handle of the process.\r
390 @param SystemTable The EFI System Table pointer.\r
391\r
392 @retval EFI_SUCCESS The Shell command handlers were installed\r
393 successfully.\r
394 @retval EFI_DEVICE_ERROR Hii package failed to install.\r
a6eaba4d 395**/\r
ee4dc24f
RN
396EFI_STATUS\r
397EFIAPI\r
398UefiShellAcpiViewCommandLibConstructor (\r
399 IN EFI_HANDLE ImageHandle,\r
400 IN EFI_SYSTEM_TABLE *SystemTable\r
401 )\r
402{\r
47d20b54
MK
403 EFI_STATUS Status;\r
404\r
ee4dc24f
RN
405 gShellAcpiViewHiiHandle = NULL;\r
406\r
407 // Check Shell Profile Debug1 bit of the profiles mask\r
81038d50 408 if ((PcdGet8 (PcdShellProfileMask) & BIT1) == 0) {\r
ee4dc24f
RN
409 return EFI_SUCCESS;\r
410 }\r
411\r
412 Status = RegisterAllParsers ();\r
413 if (EFI_ERROR (Status)) {\r
414 Print (L"acpiview: Error failed to register parser.\n");\r
415 return Status;\r
416 }\r
417\r
418 gShellAcpiViewHiiHandle = HiiAddPackages (\r
419 &gShellAcpiViewHiiGuid,\r
420 gImageHandle,\r
421 UefiShellAcpiViewCommandLibStrings,\r
422 NULL\r
423 );\r
424 if (gShellAcpiViewHiiHandle == NULL) {\r
425 return EFI_DEVICE_ERROR;\r
426 }\r
47d20b54 427\r
ee4dc24f
RN
428 // Install our Shell command handler\r
429 ShellCommandRegisterCommandName (\r
430 L"acpiview",\r
431 ShellCommandRunAcpiView,\r
432 ShellCommandGetManFileNameAcpiView,\r
433 0,\r
434 L"acpiview",\r
435 TRUE,\r
436 gShellAcpiViewHiiHandle,\r
437 STRING_TOKEN (STR_GET_HELP_ACPIVIEW)\r
438 );\r
439\r
440 return EFI_SUCCESS;\r
441}\r
442\r
443/**\r
444 Destructor for the library. free any resources.\r
445\r
446 @param ImageHandle The image handle of the process.\r
447 @param SystemTable The EFI System Table pointer.\r
a6eaba4d 448**/\r
ee4dc24f
RN
449EFI_STATUS\r
450EFIAPI\r
451UefiShellAcpiViewCommandLibDestructor (\r
452 IN EFI_HANDLE ImageHandle,\r
453 IN EFI_SYSTEM_TABLE *SystemTable\r
454 )\r
455{\r
456 if (gShellAcpiViewHiiHandle != NULL) {\r
457 HiiRemovePackages (gShellAcpiViewHiiHandle);\r
458 }\r
47d20b54 459\r
ee4dc24f
RN
460 return EFI_SUCCESS;\r
461}\r