VirtualBox

source: vbox/trunk/src/VBox/Devices/EFI/FirmwareNew/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c

Last change on this file was 108794, checked in by vboxsync, 4 weeks ago

Devices/EFI/FirmwareNew: Merge edk2-stable202502 from the vendor branch and make it build for the important platforms, bugref:4643

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

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette