]>
Commit | Line | Data |
---|---|---|
a6eaba4d | 1 | /** @file\r |
ee4dc24f | 2 | \r |
8af507c1 | 3 | Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.\r |
56ba3746 | 4 | SPDX-License-Identifier: BSD-2-Clause-Patent\r |
faef5a36 KK |
5 | \r |
6 | @par Glossary:\r | |
7 | - Sbbr or SBBR - Server Base Boot Requirements\r | |
8 | \r | |
9 | @par Reference(s):\r | |
10 | - Arm Server Base Boot Requirements 1.2, September 2019\r | |
ee4dc24f RN |
11 | **/\r |
12 | \r | |
13 | #include <Library/PrintLib.h>\r | |
14 | #include <Library/UefiLib.h>\r | |
15 | #include <Library/ShellLib.h>\r | |
16 | #include <Library/UefiBootServicesTableLib.h>\r | |
17 | #include <Library/BaseMemoryLib.h>\r | |
18 | #include <Library/DebugLib.h>\r | |
19 | #include <Library/MemoryAllocationLib.h>\r | |
20 | #include "AcpiParser.h"\r | |
21 | #include "AcpiTableParser.h"\r | |
22 | #include "AcpiView.h"\r | |
e18ac66d | 23 | #include "AcpiViewConfig.h"\r |
ee4dc24f RN |
24 | #include "UefiShellAcpiViewCommandLib.h"\r |
25 | \r | |
faef5a36 KK |
26 | #if defined(MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)\r |
27 | #include "Arm/SbbrValidator.h"\r | |
28 | #endif\r | |
29 | \r | |
ee4dc24f RN |
30 | EFI_HII_HANDLE gShellAcpiViewHiiHandle = NULL;\r |
31 | \r | |
ee4dc24f RN |
32 | STATIC UINT32 mTableCount;\r |
33 | STATIC UINT32 mBinTableCount;\r | |
ee4dc24f | 34 | \r |
a6eaba4d DB |
35 | /**\r |
36 | An array of acpiview command line parameters.\r | |
37 | **/\r | |
ee4dc24f | 38 | STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r |
f73843d5 | 39 | {L"-q", TypeFlag},\r |
ee4dc24f | 40 | {L"-d", TypeFlag},\r |
4286eb22 | 41 | {L"-h", TypeFlag},\r |
ee4dc24f RN |
42 | {L"-l", TypeFlag},\r |
43 | {L"-s", TypeValue},\r | |
8af507c1 | 44 | {L"-r", TypeValue},\r |
ee4dc24f RN |
45 | {NULL, TypeMax}\r |
46 | };\r | |
47 | \r | |
a6eaba4d DB |
48 | /**\r |
49 | This function dumps the ACPI table to a file.\r | |
50 | \r | |
ee4dc24f RN |
51 | @param [in] Ptr Pointer to the ACPI table data.\r |
52 | @param [in] Length The length of the ACPI table.\r | |
53 | \r | |
54 | @retval TRUE Success.\r | |
55 | @retval FALSE Failure.\r | |
a6eaba4d | 56 | **/\r |
ee4dc24f RN |
57 | STATIC\r |
58 | BOOLEAN\r | |
59 | DumpAcpiTableToFile (\r | |
60 | IN CONST UINT8* Ptr,\r | |
61 | IN CONST UINTN Length\r | |
62 | )\r | |
63 | {\r | |
e18ac66d TP |
64 | EFI_STATUS Status;\r |
65 | CHAR16 FileNameBuffer[MAX_FILE_NAME_LEN];\r | |
66 | SHELL_FILE_HANDLE DumpFileHandle;\r | |
67 | UINTN TransferBytes;\r | |
68 | SELECTED_ACPI_TABLE *SelectedTable;\r | |
f75c7478 DB |
69 | \r |
70 | DumpFileHandle = NULL;\r | |
71 | TransferBytes = Length;\r | |
e18ac66d | 72 | GetSelectedAcpiTable (&SelectedTable);\r |
ee4dc24f RN |
73 | \r |
74 | UnicodeSPrint (\r | |
75 | FileNameBuffer,\r | |
76 | sizeof (FileNameBuffer),\r | |
77 | L".\\%s%04d.bin",\r | |
e18ac66d | 78 | SelectedTable->Name,\r |
ee4dc24f RN |
79 | mBinTableCount++\r |
80 | );\r | |
81 | \r | |
82 | Status = ShellOpenFileByName (\r | |
83 | FileNameBuffer,\r | |
84 | &DumpFileHandle,\r | |
85 | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,\r | |
86 | 0\r | |
87 | );\r | |
88 | if (EFI_ERROR (Status)) {\r | |
89 | ShellPrintHiiEx (\r | |
90 | -1,\r | |
91 | -1,\r | |
92 | NULL,\r | |
93 | STRING_TOKEN (STR_GEN_READONLY_MEDIA),\r | |
94 | gShellAcpiViewHiiHandle,\r | |
95 | L"acpiview"\r | |
96 | );\r | |
97 | return FALSE;\r | |
98 | }\r | |
99 | \r | |
100 | Print (L"Dumping ACPI table to : %s ... ", FileNameBuffer);\r | |
101 | \r | |
102 | Status = ShellWriteFile (\r | |
103 | DumpFileHandle,\r | |
104 | &TransferBytes,\r | |
105 | (VOID*)Ptr\r | |
106 | );\r | |
107 | if (EFI_ERROR (Status)) {\r | |
108 | Print (L"ERROR: Failed to dump table to binary file.\n");\r | |
109 | TransferBytes = 0;\r | |
110 | } else {\r | |
111 | Print (L"DONE.\n");\r | |
112 | }\r | |
113 | \r | |
114 | ShellCloseFile (&DumpFileHandle);\r | |
115 | return (Length == TransferBytes);\r | |
116 | }\r | |
117 | \r | |
a6eaba4d DB |
118 | /**\r |
119 | This function processes the table reporting options for the ACPI table.\r | |
ee4dc24f RN |
120 | \r |
121 | @param [in] Signature The ACPI table Signature.\r | |
122 | @param [in] TablePtr Pointer to the ACPI table data.\r | |
123 | @param [in] Length The length fo the ACPI table.\r | |
124 | \r | |
125 | @retval Returns TRUE if the ACPI table should be traced.\r | |
a6eaba4d | 126 | **/\r |
ee4dc24f RN |
127 | BOOLEAN\r |
128 | ProcessTableReportOptions (\r | |
129 | IN CONST UINT32 Signature,\r | |
130 | IN CONST UINT8* TablePtr,\r | |
131 | IN CONST UINT32 Length\r | |
132 | )\r | |
133 | {\r | |
e18ac66d TP |
134 | UINTN OriginalAttribute;\r |
135 | UINT8 *SignaturePtr;\r | |
136 | BOOLEAN Log;\r | |
137 | BOOLEAN HighLight;\r | |
138 | SELECTED_ACPI_TABLE *SelectedTable;\r | |
f75c7478 | 139 | \r |
0154e02d SZ |
140 | //\r |
141 | // set local variables to suppress incorrect compiler/analyzer warnings\r | |
142 | //\r | |
143 | OriginalAttribute = 0;\r | |
f75c7478 DB |
144 | SignaturePtr = (UINT8*)(UINTN)&Signature;\r |
145 | Log = FALSE;\r | |
146 | HighLight = GetColourHighlighting ();\r | |
e18ac66d | 147 | GetSelectedAcpiTable (&SelectedTable);\r |
f75c7478 | 148 | \r |
ee4dc24f | 149 | switch (GetReportOption ()) {\r |
f75c7478 | 150 | case ReportAll:\r |
ee4dc24f RN |
151 | Log = TRUE;\r |
152 | break;\r | |
f75c7478 | 153 | case ReportSelected:\r |
e18ac66d | 154 | if (Signature == SelectedTable->Type) {\r |
ee4dc24f | 155 | Log = TRUE;\r |
e18ac66d | 156 | SelectedTable->Found = TRUE;\r |
ee4dc24f RN |
157 | }\r |
158 | break;\r | |
f75c7478 | 159 | case ReportTableList:\r |
ee4dc24f RN |
160 | if (mTableCount == 0) {\r |
161 | if (HighLight) {\r | |
162 | OriginalAttribute = gST->ConOut->Mode->Attribute;\r | |
163 | gST->ConOut->SetAttribute (\r | |
164 | gST->ConOut,\r | |
165 | EFI_TEXT_ATTR(EFI_CYAN,\r | |
166 | ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4))\r | |
167 | );\r | |
168 | }\r | |
169 | Print (L"\nInstalled Table(s):\n");\r | |
170 | if (HighLight) {\r | |
171 | gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);\r | |
172 | }\r | |
173 | }\r | |
174 | Print (\r | |
175 | L"\t%4d. %c%c%c%c\n",\r | |
176 | ++mTableCount,\r | |
177 | SignaturePtr[0],\r | |
178 | SignaturePtr[1],\r | |
179 | SignaturePtr[2],\r | |
180 | SignaturePtr[3]\r | |
181 | );\r | |
182 | break;\r | |
f75c7478 | 183 | case ReportDumpBinFile:\r |
e18ac66d TP |
184 | if (Signature == SelectedTable->Type) {\r |
185 | SelectedTable->Found = TRUE;\r | |
ee4dc24f RN |
186 | DumpAcpiTableToFile (TablePtr, Length);\r |
187 | }\r | |
188 | break;\r | |
f75c7478 | 189 | case ReportMax:\r |
ee4dc24f RN |
190 | // We should never be here.\r |
191 | // This case is only present to prevent compiler warning.\r | |
192 | break;\r | |
193 | } // switch\r | |
194 | \r | |
195 | if (Log) {\r | |
196 | if (HighLight) {\r | |
197 | OriginalAttribute = gST->ConOut->Mode->Attribute;\r | |
198 | gST->ConOut->SetAttribute (\r | |
199 | gST->ConOut,\r | |
200 | EFI_TEXT_ATTR(EFI_LIGHTBLUE,\r | |
201 | ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4))\r | |
202 | );\r | |
203 | }\r | |
204 | Print (\r | |
205 | L"\n\n --------------- %c%c%c%c Table --------------- \n\n",\r | |
206 | SignaturePtr[0],\r | |
207 | SignaturePtr[1],\r | |
208 | SignaturePtr[2],\r | |
209 | SignaturePtr[3]\r | |
210 | );\r | |
211 | if (HighLight) {\r | |
212 | gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);\r | |
213 | }\r | |
214 | }\r | |
215 | \r | |
216 | return Log;\r | |
217 | }\r | |
218 | \r | |
ee4dc24f | 219 | \r |
ee4dc24f | 220 | \r |
a6eaba4d DB |
221 | /**\r |
222 | This function iterates the configuration table entries in the\r | |
223 | system table, retrieves the RSDP pointer and starts parsing the ACPI tables.\r | |
ee4dc24f RN |
224 | \r |
225 | @param [in] SystemTable Pointer to the EFI system table.\r | |
226 | \r | |
227 | @retval Returns EFI_NOT_FOUND if the RSDP pointer is not found.\r | |
228 | Returns EFI_UNSUPPORTED if the RSDP version is less than 2.\r | |
229 | Returns EFI_SUCCESS if successful.\r | |
a6eaba4d | 230 | **/\r |
ee4dc24f RN |
231 | STATIC\r |
232 | EFI_STATUS\r | |
233 | EFIAPI\r | |
234 | AcpiView (\r | |
235 | IN EFI_SYSTEM_TABLE* SystemTable\r | |
236 | )\r | |
237 | {\r | |
238 | EFI_STATUS Status;\r | |
239 | UINTN Index;\r | |
240 | EFI_CONFIGURATION_TABLE* EfiConfigurationTable;\r | |
241 | BOOLEAN FoundAcpiTable;\r | |
242 | UINTN OriginalAttribute;\r | |
243 | UINTN PrintAttribute;\r | |
244 | EREPORT_OPTION ReportOption;\r | |
245 | UINT8* RsdpPtr;\r | |
246 | UINT32 RsdpLength;\r | |
247 | UINT8 RsdpRevision;\r | |
248 | PARSE_ACPI_TABLE_PROC RsdpParserProc;\r | |
249 | BOOLEAN Trace;\r | |
e18ac66d | 250 | SELECTED_ACPI_TABLE *SelectedTable;\r |
ee4dc24f | 251 | \r |
0154e02d SZ |
252 | //\r |
253 | // set local variables to suppress incorrect compiler/analyzer warnings\r | |
254 | //\r | |
255 | EfiConfigurationTable = NULL;\r | |
256 | OriginalAttribute = 0;\r | |
257 | \r | |
cae974be TP |
258 | // Reset The error/warning counters\r |
259 | ResetErrorCount ();\r | |
260 | ResetWarningCount ();\r | |
261 | \r | |
e18ac66d TP |
262 | // Retrieve the user selection of ACPI table to process\r |
263 | GetSelectedAcpiTable (&SelectedTable);\r | |
264 | \r | |
ee4dc24f RN |
265 | // Search the table for an entry that matches the ACPI Table Guid\r |
266 | FoundAcpiTable = FALSE;\r | |
267 | for (Index = 0; Index < SystemTable->NumberOfTableEntries; Index++) {\r | |
268 | if (CompareGuid (&gEfiAcpiTableGuid,\r | |
269 | &(SystemTable->ConfigurationTable[Index].VendorGuid))) {\r | |
270 | EfiConfigurationTable = &SystemTable->ConfigurationTable[Index];\r | |
271 | FoundAcpiTable = TRUE;\r | |
272 | break;\r | |
273 | }\r | |
274 | }\r | |
275 | \r | |
276 | if (FoundAcpiTable) {\r | |
277 | RsdpPtr = (UINT8*)EfiConfigurationTable->VendorTable;\r | |
278 | \r | |
279 | // The RSDP revision is 1 byte starting at offset 15\r | |
280 | RsdpRevision = *(RsdpPtr + RSDP_REVISION_OFFSET);\r | |
281 | \r | |
282 | if (RsdpRevision < 2) {\r | |
283 | Print (\r | |
284 | L"ERROR: RSDP version less than 2 is not supported.\n"\r | |
285 | );\r | |
286 | return EFI_UNSUPPORTED;\r | |
287 | }\r | |
288 | \r | |
faef5a36 KK |
289 | #if defined(MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)\r |
290 | if (GetMandatoryTableValidate ()) {\r | |
291 | ArmSbbrResetTableCounts ();\r | |
292 | }\r | |
293 | #endif\r | |
294 | \r | |
ee4dc24f RN |
295 | // The RSDP length is 4 bytes starting at offset 20\r |
296 | RsdpLength = *(UINT32*)(RsdpPtr + RSDP_LENGTH_OFFSET);\r | |
297 | \r | |
298 | Trace = ProcessTableReportOptions (RSDP_TABLE_INFO, RsdpPtr, RsdpLength);\r | |
299 | \r | |
300 | Status = GetParser (RSDP_TABLE_INFO, &RsdpParserProc);\r | |
301 | if (EFI_ERROR (Status)) {\r | |
302 | Print (\r | |
303 | L"ERROR: No registered parser found for RSDP.\n"\r | |
304 | );\r | |
305 | return Status;\r | |
306 | }\r | |
307 | \r | |
308 | RsdpParserProc (\r | |
309 | Trace,\r | |
310 | RsdpPtr,\r | |
311 | RsdpLength,\r | |
312 | RsdpRevision\r | |
313 | );\r | |
314 | \r | |
315 | } else {\r | |
316 | IncrementErrorCount ();\r | |
317 | Print (\r | |
318 | L"ERROR: Failed to find ACPI Table Guid in System Configuration Table.\n"\r | |
319 | );\r | |
320 | return EFI_NOT_FOUND;\r | |
321 | }\r | |
322 | \r | |
faef5a36 KK |
323 | #if defined(MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)\r |
324 | if (GetMandatoryTableValidate ()) {\r | |
325 | ArmSbbrReqsValidate ((ARM_SBBR_VERSION)GetMandatoryTableSpec ());\r | |
326 | }\r | |
327 | #endif\r | |
328 | \r | |
ee4dc24f | 329 | ReportOption = GetReportOption ();\r |
f75c7478 DB |
330 | if (ReportTableList != ReportOption) {\r |
331 | if (((ReportSelected == ReportOption) ||\r | |
332 | (ReportDumpBinFile == ReportOption)) &&\r | |
e18ac66d | 333 | (!SelectedTable->Found)) {\r |
ee4dc24f | 334 | Print (L"\nRequested ACPI Table not found.\n");\r |
f73843d5 KK |
335 | } else if (GetConsistencyChecking () &&\r |
336 | (ReportDumpBinFile != ReportOption)) {\r | |
ee4dc24f RN |
337 | OriginalAttribute = gST->ConOut->Mode->Attribute;\r |
338 | \r | |
339 | Print (L"\nTable Statistics:\n");\r | |
340 | \r | |
341 | if (GetColourHighlighting ()) {\r | |
342 | PrintAttribute = (GetErrorCount () > 0) ?\r | |
343 | EFI_TEXT_ATTR (\r | |
344 | EFI_RED,\r | |
345 | ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)\r | |
346 | ) :\r | |
347 | OriginalAttribute;\r | |
348 | gST->ConOut->SetAttribute (gST->ConOut, PrintAttribute);\r | |
349 | }\r | |
350 | Print (L"\t%d Error(s)\n", GetErrorCount ());\r | |
351 | \r | |
352 | if (GetColourHighlighting ()) {\r | |
353 | PrintAttribute = (GetWarningCount () > 0) ?\r | |
354 | EFI_TEXT_ATTR (\r | |
355 | EFI_RED,\r | |
356 | ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)\r | |
357 | ) :\r | |
358 | OriginalAttribute;\r | |
359 | \r | |
360 | gST->ConOut->SetAttribute (gST->ConOut, PrintAttribute);\r | |
361 | }\r | |
362 | Print (L"\t%d Warning(s)\n", GetWarningCount ());\r | |
363 | \r | |
364 | if (GetColourHighlighting ()) {\r | |
365 | gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);\r | |
366 | }\r | |
367 | }\r | |
368 | }\r | |
369 | return EFI_SUCCESS;\r | |
370 | }\r | |
371 | \r | |
372 | /**\r | |
373 | Function for 'acpiview' command.\r | |
374 | \r | |
375 | @param[in] ImageHandle Handle to the Image (NULL if Internal).\r | |
376 | @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r | |
a6eaba4d | 377 | **/\r |
ee4dc24f RN |
378 | SHELL_STATUS\r |
379 | EFIAPI\r | |
380 | ShellCommandRunAcpiView (\r | |
381 | IN EFI_HANDLE ImageHandle,\r | |
382 | IN EFI_SYSTEM_TABLE* SystemTable\r | |
383 | )\r | |
384 | {\r | |
385 | EFI_STATUS Status;\r | |
f75c7478 DB |
386 | SHELL_STATUS ShellStatus;\r |
387 | LIST_ENTRY* Package;\r | |
ee4dc24f | 388 | CHAR16* ProblemParam;\r |
f75c7478 | 389 | SHELL_FILE_HANDLE TmpDumpFileHandle;\r |
8af507c1 | 390 | CONST CHAR16* MandatoryTableSpecStr;\r |
e18ac66d | 391 | CONST CHAR16 *SelectedTableName;\r |
ee4dc24f RN |
392 | \r |
393 | // Set Defaults\r | |
ee4dc24f RN |
394 | mTableCount = 0;\r |
395 | mBinTableCount = 0;\r | |
e18ac66d | 396 | AcpiConfigSetDefaults ();\r |
ee4dc24f | 397 | \r |
f75c7478 DB |
398 | ShellStatus = SHELL_SUCCESS;\r |
399 | Package = NULL;\r | |
400 | TmpDumpFileHandle = NULL;\r | |
401 | \r | |
ee4dc24f RN |
402 | Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r |
403 | if (EFI_ERROR (Status)) {\r | |
404 | if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r | |
405 | ShellPrintHiiEx (\r | |
406 | -1,\r | |
407 | -1,\r | |
408 | NULL,\r | |
409 | STRING_TOKEN (STR_GEN_PROBLEM),\r | |
410 | gShellAcpiViewHiiHandle,\r | |
411 | L"acpiview",\r | |
412 | ProblemParam\r | |
413 | );\r | |
414 | FreePool (ProblemParam);\r | |
415 | } else {\r | |
416 | Print (L"acpiview: Error processing input parameter(s)\n");\r | |
417 | }\r | |
418 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
419 | } else {\r | |
420 | if (ShellCommandLineGetCount (Package) > 1) {\r | |
421 | ShellPrintHiiEx (\r | |
422 | -1,\r | |
423 | -1,\r | |
424 | NULL,\r | |
425 | STRING_TOKEN (STR_GEN_TOO_MANY),\r | |
426 | gShellAcpiViewHiiHandle,\r | |
427 | L"acpiview"\r | |
428 | );\r | |
429 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
430 | } else if (ShellCommandLineGetFlag (Package, L"-?")) {\r | |
431 | ShellPrintHiiEx (\r | |
432 | -1,\r | |
433 | -1,\r | |
434 | NULL,\r | |
435 | STRING_TOKEN (STR_GET_HELP_ACPIVIEW),\r | |
436 | gShellAcpiViewHiiHandle,\r | |
437 | L"acpiview"\r | |
438 | );\r | |
439 | } else if (ShellCommandLineGetFlag (Package, L"-s") &&\r | |
440 | ShellCommandLineGetValue (Package, L"-s") == NULL) {\r | |
441 | ShellPrintHiiEx (\r | |
442 | -1,\r | |
443 | -1,\r | |
444 | NULL,\r | |
445 | STRING_TOKEN (STR_GEN_NO_VALUE),\r | |
446 | gShellAcpiViewHiiHandle,\r | |
447 | L"acpiview",\r | |
448 | L"-s"\r | |
449 | );\r | |
450 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
8af507c1 KK |
451 | } else if (ShellCommandLineGetFlag (Package, L"-r") &&\r |
452 | ShellCommandLineGetValue (Package, L"-r") == NULL) {\r | |
453 | ShellPrintHiiEx (\r | |
454 | -1,\r | |
455 | -1,\r | |
456 | NULL,\r | |
457 | STRING_TOKEN (STR_GEN_NO_VALUE),\r | |
458 | gShellAcpiViewHiiHandle,\r | |
459 | L"acpiview",\r | |
460 | L"-r"\r | |
461 | );\r | |
462 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
ee4dc24f RN |
463 | } else if ((ShellCommandLineGetFlag (Package, L"-s") &&\r |
464 | ShellCommandLineGetFlag (Package, L"-l"))) {\r | |
465 | ShellPrintHiiEx (\r | |
466 | -1,\r | |
467 | -1,\r | |
468 | NULL,\r | |
469 | STRING_TOKEN (STR_GEN_TOO_MANY),\r | |
470 | gShellAcpiViewHiiHandle,\r | |
471 | L"acpiview"\r | |
472 | );\r | |
473 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
ee4dc24f RN |
474 | } else if (ShellCommandLineGetFlag (Package, L"-d") &&\r |
475 | !ShellCommandLineGetFlag (Package, L"-s")) {\r | |
476 | ShellPrintHiiEx (\r | |
477 | -1,\r | |
478 | -1,\r | |
479 | NULL,\r | |
480 | STRING_TOKEN (STR_GEN_MISSING_OPTION),\r | |
481 | gShellAcpiViewHiiHandle,\r | |
482 | L"acpiview",\r | |
483 | L"-s",\r | |
484 | L"-d"\r | |
485 | );\r | |
486 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
487 | } else {\r | |
4286eb22 KK |
488 | // Turn on colour highlighting if requested\r |
489 | SetColourHighlighting (ShellCommandLineGetFlag (Package, L"-h"));\r | |
ee4dc24f | 490 | \r |
f73843d5 KK |
491 | // Surpress consistency checking if requested\r |
492 | SetConsistencyChecking (!ShellCommandLineGetFlag (Package, L"-q"));\r | |
493 | \r | |
8af507c1 KK |
494 | // Evaluate the parameters for mandatory ACPI table presence checks\r |
495 | SetMandatoryTableValidate (ShellCommandLineGetFlag (Package, L"-r"));\r | |
496 | MandatoryTableSpecStr = ShellCommandLineGetValue (Package, L"-r");\r | |
497 | \r | |
498 | if (MandatoryTableSpecStr != NULL) {\r | |
499 | SetMandatoryTableSpec (ShellHexStrToUintn (MandatoryTableSpecStr));\r | |
500 | }\r | |
501 | \r | |
ee4dc24f | 502 | if (ShellCommandLineGetFlag (Package, L"-l")) {\r |
e18ac66d | 503 | SetReportOption (ReportTableList);\r |
ee4dc24f | 504 | } else {\r |
e18ac66d TP |
505 | SelectedTableName = ShellCommandLineGetValue (Package, L"-s");\r |
506 | if (SelectedTableName != NULL) {\r | |
507 | SelectAcpiTable (SelectedTableName);\r | |
508 | SetReportOption (ReportSelected);\r | |
ee4dc24f RN |
509 | \r |
510 | if (ShellCommandLineGetFlag (Package, L"-d")) {\r | |
511 | // Create a temporary file to check if the media is writable.\r | |
512 | CHAR16 FileNameBuffer[MAX_FILE_NAME_LEN];\r | |
e18ac66d | 513 | SetReportOption (ReportDumpBinFile);\r |
ee4dc24f RN |
514 | \r |
515 | UnicodeSPrint (\r | |
516 | FileNameBuffer,\r | |
517 | sizeof (FileNameBuffer),\r | |
518 | L".\\%s%04d.tmp",\r | |
e18ac66d | 519 | SelectedTableName,\r |
ee4dc24f RN |
520 | mBinTableCount\r |
521 | );\r | |
522 | \r | |
523 | Status = ShellOpenFileByName (\r | |
524 | FileNameBuffer,\r | |
525 | &TmpDumpFileHandle,\r | |
526 | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE |\r | |
527 | EFI_FILE_MODE_CREATE,\r | |
528 | 0\r | |
529 | );\r | |
530 | \r | |
531 | if (EFI_ERROR (Status)) {\r | |
532 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
533 | TmpDumpFileHandle = NULL;\r | |
534 | ShellPrintHiiEx (\r | |
535 | -1,\r | |
536 | -1,\r | |
537 | NULL,\r | |
538 | STRING_TOKEN (STR_GEN_READONLY_MEDIA),\r | |
539 | gShellAcpiViewHiiHandle,\r | |
540 | L"acpiview"\r | |
541 | );\r | |
542 | goto Done;\r | |
543 | }\r | |
544 | // Delete Temporary file.\r | |
545 | ShellDeleteFile (&TmpDumpFileHandle);\r | |
546 | } // -d\r | |
547 | } // -s\r | |
548 | }\r | |
549 | \r | |
550 | // Parse ACPI Table information\r | |
551 | Status = AcpiView (SystemTable);\r | |
552 | if (EFI_ERROR (Status)) {\r | |
553 | ShellStatus = SHELL_NOT_FOUND;\r | |
554 | }\r | |
555 | }\r | |
556 | }\r | |
557 | \r | |
558 | Done:\r | |
559 | if (Package != NULL) {\r | |
560 | ShellCommandLineFreeVarList (Package);\r | |
561 | }\r | |
562 | return ShellStatus;\r | |
563 | }\r |