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