X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ShellPkg%2FLibrary%2FUefiShellAcpiViewCommandLib%2FUefiShellAcpiViewCommandLib.c;h=bbac125bb9aca45768c5d13c52225b549bd38537;hb=558b37b49b2196e82f2e8f9da7939f755343e94a;hp=c3942ad24e5b9c885dc78fbe97434a87147e306e;hpb=422fe85cc3109684c81990911c79dc18d1828d96;p=mirror_edk2.git diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c index c3942ad24e..bbac125bb9 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c @@ -1,12 +1,14 @@ /** @file Main file for 'acpiview' Shell command function. - Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.
+ Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. + Copyright (c) 2016 - 2021, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include +#include #include #include @@ -16,27 +18,28 @@ #include #include #include +#include #include #include "AcpiParser.h" #include "AcpiTableParser.h" #include "AcpiView.h" #include "AcpiViewConfig.h" -#include "UefiShellAcpiViewCommandLib.h" -CONST CHAR16 gShellAcpiViewFileName[] = L"ShellCommand"; +CONST CHAR16 gShellAcpiViewFileName[] = L"ShellCommand"; +EFI_HII_HANDLE gShellAcpiViewHiiHandle = NULL; /** An array of acpiview command line parameters. **/ -STATIC CONST SHELL_PARAM_ITEM ParamList[] = { - {L"-q", TypeFlag}, - {L"-d", TypeFlag}, - {L"-h", TypeFlag}, - {L"-l", TypeFlag}, - {L"-s", TypeValue}, - {L"-r", TypeValue}, - {NULL, TypeMax} +STATIC CONST SHELL_PARAM_ITEM ParamList[] = { + { L"-q", TypeFlag }, + { L"-d", TypeFlag }, + { L"-h", TypeFlag }, + { L"-l", TypeFlag }, + { L"-s", TypeValue }, + { L"-r", TypeValue }, + { NULL, TypeMax } }; /** @@ -44,26 +47,32 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = { */ STATIC CONST -ACPI_TABLE_PARSER ParserList[] = { - {EFI_ACPI_6_2_BOOT_GRAPHICS_RESOURCE_TABLE_SIGNATURE, ParseAcpiBgrt}, - {EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE, ParseAcpiDbg2}, - {EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, - ParseAcpiDsdt}, - {EFI_ACPI_6_3_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE, ParseAcpiFacs}, - {EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiFadt}, - {EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiGtdt}, - {EFI_ACPI_6_2_IO_REMAPPING_TABLE_SIGNATURE, ParseAcpiIort}, - {EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiMadt}, - {EFI_ACPI_6_2_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE, - ParseAcpiMcfg}, - {EFI_ACPI_6_2_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE, - ParseAcpiPptt}, - {RSDP_TABLE_INFO, ParseAcpiRsdp}, - {EFI_ACPI_6_2_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE, ParseAcpiSlit}, - {EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, ParseAcpiSpcr}, - {EFI_ACPI_6_2_SYSTEM_RESOURCE_AFFINITY_TABLE_SIGNATURE, ParseAcpiSrat}, - {EFI_ACPI_6_2_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiSsdt}, - {EFI_ACPI_6_2_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiXsdt} +ACPI_TABLE_PARSER ParserList[] = { + { EFI_ACPI_6_3_ARM_ERROR_SOURCE_TABLE_SIGNATURE, ParseAcpiAest }, + { EFI_ACPI_6_4_ARM_PERFORMANCE_MONITORING_UNIT_TABLE_SIGNATURE, ParseAcpiApmt }, + { EFI_ACPI_6_2_BOOT_GRAPHICS_RESOURCE_TABLE_SIGNATURE, ParseAcpiBgrt }, + { EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE, ParseAcpiDbg2 }, + { EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, + ParseAcpiDsdt }, + { EFI_ACPI_6_4_ERROR_RECORD_SERIALIZATION_TABLE_SIGNATURE, ParseAcpiErst }, + { EFI_ACPI_6_3_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE, ParseAcpiFacs }, + { EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiFadt }, + { EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiGtdt }, + { EFI_ACPI_6_4_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_SIGNATURE, ParseAcpiHmat }, + { EFI_ACPI_6_2_IO_REMAPPING_TABLE_SIGNATURE, ParseAcpiIort }, + { EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiMadt }, + { EFI_ACPI_6_2_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE, + ParseAcpiMcfg }, + { EFI_ACPI_6_4_PLATFORM_COMMUNICATIONS_CHANNEL_TABLE_SIGNATURE, + ParseAcpiPcct }, + { EFI_ACPI_6_4_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE, + ParseAcpiPptt }, + { RSDP_TABLE_INFO, ParseAcpiRsdp }, + { EFI_ACPI_6_2_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE, ParseAcpiSlit }, + { EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, ParseAcpiSpcr }, + { EFI_ACPI_6_2_SYSTEM_RESOURCE_AFFINITY_TABLE_SIGNATURE, ParseAcpiSrat }, + { EFI_ACPI_6_2_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiSsdt }, + { EFI_ACPI_6_2_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiXsdt } }; /** @@ -80,11 +89,11 @@ EFI_STATUS RegisterAllParsers ( ) { - EFI_STATUS Status; - UINTN Count; + EFI_STATUS Status; + UINTN Count; Status = EFI_SUCCESS; - Count = sizeof (ParserList) / sizeof (ParserList[0]); + Count = sizeof (ParserList) / sizeof (ParserList[0]); while (Count-- != 0) { Status = RegisterParser ( @@ -95,15 +104,74 @@ RegisterAllParsers ( return Status; } } + return Status; } +/** + Dump a buffer to a file. Print error message if a file cannot be created. + + @param[in] FileName The filename that shall be created to contain the buffer. + @param[in] Buffer Pointer to buffer that shall be dumped. + @param[in] BufferSize The size of buffer to be dumped in bytes. + + @return The number of bytes that were written +**/ +UINTN +EFIAPI +ShellDumpBufferToFile ( + IN CONST CHAR16 *FileNameBuffer, + IN CONST VOID *Buffer, + IN CONST UINTN BufferSize + ) +{ + EFI_STATUS Status; + SHELL_FILE_HANDLE DumpFileHandle; + UINTN TransferBytes; + + Status = ShellOpenFileByName ( + FileNameBuffer, + &DumpFileHandle, + EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, + 0 + ); + + if (EFI_ERROR (Status)) { + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_GEN_READONLY_MEDIA), + gShellAcpiViewHiiHandle, + L"acpiview" + ); + return 0; + } + + TransferBytes = BufferSize; + Status = ShellWriteFile ( + DumpFileHandle, + &TransferBytes, + (VOID *)Buffer + ); + + if (EFI_ERROR (Status)) { + Print (L"ERROR: Failed to write binary file.\n"); + TransferBytes = 0; + } else { + Print (L"DONE.\n"); + } + + ShellCloseFile (&DumpFileHandle); + return TransferBytes; +} + /** Return the file name of the help text file if not using HII. @return The string pointer to the file name. **/ -CONST CHAR16* +CONST CHAR16 * EFIAPI ShellCommandGetManFileNameAcpiView ( VOID @@ -126,27 +194,27 @@ SHELL_STATUS EFIAPI ShellCommandRunAcpiView ( IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE* SystemTable + IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; SHELL_STATUS ShellStatus; - LIST_ENTRY* Package; - CHAR16* ProblemParam; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; SHELL_FILE_HANDLE TmpDumpFileHandle; - CONST CHAR16* MandatoryTableSpecStr; - CONST CHAR16* SelectedTableName; + CONST CHAR16 *MandatoryTableSpecStr; + CONST CHAR16 *SelectedTableName; // Set configuration defaults AcpiConfigSetDefaults (); - ShellStatus = SHELL_SUCCESS; - Package = NULL; + ShellStatus = SHELL_SUCCESS; + Package = NULL; TmpDumpFileHandle = NULL; Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { - if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { ShellPrintHiiEx ( -1, -1, @@ -160,6 +228,7 @@ ShellCommandRunAcpiView ( } else { Print (L"acpiview: Error processing input parameter(s)\n"); } + ShellStatus = SHELL_INVALID_PARAMETER; } else { if (ShellCommandLineGetCount (Package) > 1) { @@ -182,7 +251,8 @@ ShellCommandRunAcpiView ( L"acpiview" ); } else if (ShellCommandLineGetFlag (Package, L"-s") && - ShellCommandLineGetValue (Package, L"-s") == NULL) { + (ShellCommandLineGetValue (Package, L"-s") == NULL)) + { ShellPrintHiiEx ( -1, -1, @@ -194,7 +264,8 @@ ShellCommandRunAcpiView ( ); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-r") && - ShellCommandLineGetValue (Package, L"-r") == NULL) { + (ShellCommandLineGetValue (Package, L"-r") == NULL)) + { ShellPrintHiiEx ( -1, -1, @@ -206,7 +277,8 @@ ShellCommandRunAcpiView ( ); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((ShellCommandLineGetFlag (Package, L"-s") && - ShellCommandLineGetFlag (Package, L"-l"))) { + ShellCommandLineGetFlag (Package, L"-l"))) + { ShellPrintHiiEx ( -1, -1, @@ -217,18 +289,19 @@ ShellCommandRunAcpiView ( ); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-d") && - !ShellCommandLineGetFlag (Package, L"-s")) { - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_GEN_MISSING_OPTION), - gShellAcpiViewHiiHandle, - L"acpiview", - L"-s", - L"-d" - ); - ShellStatus = SHELL_INVALID_PARAMETER; + !ShellCommandLineGetFlag (Package, L"-s")) + { + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_GEN_MISSING_OPTION), + gShellAcpiViewHiiHandle, + L"acpiview", + L"-s", + L"-d" + ); + ShellStatus = SHELL_INVALID_PARAMETER; } else { // Turn on colour highlighting if requested SetColourHighlighting (ShellCommandLineGetFlag (Package, L"-h")); @@ -252,9 +325,9 @@ ShellCommandRunAcpiView ( SelectAcpiTable (SelectedTableName); SetReportOption (ReportSelected); - if (ShellCommandLineGetFlag (Package, L"-d")) { + if (ShellCommandLineGetFlag (Package, L"-d")) { // Create a temporary file to check if the media is writable. - CHAR16 FileNameBuffer[MAX_FILE_NAME_LEN]; + CHAR16 FileNameBuffer[MAX_FILE_NAME_LEN]; SetReportOption (ReportDumpBinFile); UnicodeSPrint ( @@ -273,7 +346,7 @@ ShellCommandRunAcpiView ( ); if (EFI_ERROR (Status)) { - ShellStatus = SHELL_INVALID_PARAMETER; + ShellStatus = SHELL_INVALID_PARAMETER; TmpDumpFileHandle = NULL; ShellPrintHiiEx ( -1, @@ -285,6 +358,7 @@ ShellCommandRunAcpiView ( ); goto Done; } + // Delete Temporary file. ShellDeleteFile (&TmpDumpFileHandle); } // -d @@ -303,6 +377,7 @@ Done: if (Package != NULL) { ShellCommandLineFreeVarList (Package); } + return ShellStatus; } @@ -325,7 +400,8 @@ UefiShellAcpiViewCommandLibConstructor ( IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; + EFI_STATUS Status; + gShellAcpiViewHiiHandle = NULL; // Check Shell Profile Debug1 bit of the profiles mask @@ -348,6 +424,7 @@ UefiShellAcpiViewCommandLibConstructor ( if (gShellAcpiViewHiiHandle == NULL) { return EFI_DEVICE_ERROR; } + // Install our Shell command handler ShellCommandRegisterCommandName ( L"acpiview", @@ -379,5 +456,6 @@ UefiShellAcpiViewCommandLibDestructor ( if (gShellAcpiViewHiiHandle != NULL) { HiiRemovePackages (gShellAcpiViewHiiHandle); } + return EFI_SUCCESS; }