]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c
ShellPkg/AcpiView: Refactor configuration
[mirror_edk2.git] / ShellPkg / Library / UefiShellAcpiViewCommandLib / AcpiView.c
CommitLineData
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
30EFI_HII_HANDLE gShellAcpiViewHiiHandle = NULL;\r
31\r
ee4dc24f
RN
32STATIC UINT32 mTableCount;\r
33STATIC UINT32 mBinTableCount;\r
ee4dc24f 34\r
a6eaba4d
DB
35/**\r
36 An array of acpiview command line parameters.\r
37**/\r
ee4dc24f 38STATIC 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
57STATIC\r
58BOOLEAN\r
59DumpAcpiTableToFile (\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
127BOOLEAN\r
128ProcessTableReportOptions (\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
231STATIC\r
232EFI_STATUS\r
233EFIAPI\r
234AcpiView (\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
378SHELL_STATUS\r
379EFIAPI\r
380ShellCommandRunAcpiView (\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
558Done:\r
559 if (Package != NULL) {\r
560 ShellCommandLineFreeVarList (Package);\r
561 }\r
562 return ShellStatus;\r
563}\r