| /****************************************************************************** |
| * |
| * Module Name: apmain - Main module for the acpidump utility |
| * |
| *****************************************************************************/ |
| |
| /* |
| * Copyright (C) 2000 - 2016, Intel Corp. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions, and the following disclaimer, |
| * without modification. |
| * 2. Redistributions in binary form must reproduce at minimum a disclaimer |
| * substantially similar to the "NO WARRANTY" disclaimer below |
| * ("Disclaimer") and any redistribution must be conditioned upon |
| * including a substantially similar Disclaimer requirement for further |
| * binary redistribution. |
| * 3. Neither the names of the above-listed copyright holders nor the names |
| * of any contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * Alternatively, this software may be distributed under the terms of the |
| * GNU General Public License ("GPL") version 2 as published by the Free |
| * Software Foundation. |
| * |
| * NO WARRANTY |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
| * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
| * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGES. |
| */ |
| |
| #define _DECLARE_GLOBALS |
| #include "acpidump.h" |
| #include "acapps.h" |
| |
| |
| /* |
| * acpidump - A portable utility for obtaining system ACPI tables and dumping |
| * them in an ASCII hex format suitable for binary extraction via acpixtract. |
| * |
| * Obtaining the system ACPI tables is an OS-specific operation. |
| * |
| * This utility can be ported to any host operating system by providing a |
| * module containing system-specific versions of these interfaces: |
| * |
| * AcpiOsGetTableByAddress |
| * AcpiOsGetTableByIndex |
| * AcpiOsGetTableByName |
| * |
| * See the ACPICA Reference Guide for the exact definitions of these |
| * interfaces. Also, see these ACPICA source code modules for example |
| * implementations: |
| * |
| * source/os_specific/service_layers/oswintbl.c |
| * source/os_specific/service_layers/oslinuxtbl.c |
| */ |
| |
| |
| /* Local prototypes */ |
| |
| static void |
| ApDisplayUsage ( |
| void); |
| |
| static int |
| ApDoOptions ( |
| int argc, |
| char **argv); |
| |
| static int |
| ApInsertAction ( |
| char *Argument, |
| UINT32 ToBeDone); |
| |
| |
| /* Table for deferred actions from command line options */ |
| |
| AP_DUMP_ACTION ActionTable [AP_MAX_ACTIONS]; |
| UINT32 CurrentAction = 0; |
| |
| |
| #define AP_UTILITY_NAME "ACPI Binary Table Dump Utility" |
| #define AP_SUPPORTED_OPTIONS "?a:bc:f:hn:o:r:svxz" |
| |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: ApDisplayUsage |
| * |
| * DESCRIPTION: Usage message for the AcpiDump utility |
| * |
| ******************************************************************************/ |
| |
| static void |
| ApDisplayUsage ( |
| void) |
| { |
| |
| ACPI_USAGE_HEADER ("acpidump [options]"); |
| |
| ACPI_OPTION ("-b", "Dump tables to binary files"); |
| ACPI_OPTION ("-h -?", "This help message"); |
| ACPI_OPTION ("-o <File>", "Redirect output to file"); |
| ACPI_OPTION ("-r <Address>", "Dump tables from specified RSDP"); |
| ACPI_OPTION ("-s", "Print table summaries only"); |
| ACPI_OPTION ("-v", "Display version information"); |
| ACPI_OPTION ("-z", "Verbose mode"); |
| |
| ACPI_USAGE_TEXT ("\nTable Options:\n"); |
| |
| ACPI_OPTION ("-a <Address>", "Get table via a physical address"); |
| ACPI_OPTION ("-c <on|off>", "Turning on/off customized table dumping"); |
| ACPI_OPTION ("-f <BinaryFile>", "Get table via a binary file"); |
| ACPI_OPTION ("-n <Signature>", "Get table via a name/signature"); |
| ACPI_OPTION ("-x", "Do not use but dump XSDT"); |
| ACPI_OPTION ("-x -x", "Do not use or dump XSDT"); |
| |
| ACPI_USAGE_TEXT ( |
| "\n" |
| "Invocation without parameters dumps all available tables\n" |
| "Multiple mixed instances of -a, -f, and -n are supported\n\n"); |
| } |
| |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: ApInsertAction |
| * |
| * PARAMETERS: Argument - Pointer to the argument for this action |
| * ToBeDone - What to do to process this action |
| * |
| * RETURN: Status |
| * |
| * DESCRIPTION: Add an action item to the action table |
| * |
| ******************************************************************************/ |
| |
| static int |
| ApInsertAction ( |
| char *Argument, |
| UINT32 ToBeDone) |
| { |
| |
| /* Insert action and check for table overflow */ |
| |
| ActionTable [CurrentAction].Argument = Argument; |
| ActionTable [CurrentAction].ToBeDone = ToBeDone; |
| |
| CurrentAction++; |
| if (CurrentAction > AP_MAX_ACTIONS) |
| { |
| AcpiLogError ("Too many table options (max %u)\n", AP_MAX_ACTIONS); |
| return (-1); |
| } |
| |
| return (0); |
| } |
| |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: ApDoOptions |
| * |
| * PARAMETERS: argc/argv - Standard argc/argv |
| * |
| * RETURN: Status |
| * |
| * DESCRIPTION: Command line option processing. The main actions for getting |
| * and dumping tables are deferred via the action table. |
| * |
| *****************************************************************************/ |
| |
| static int |
| ApDoOptions ( |
| int argc, |
| char **argv) |
| { |
| int j; |
| ACPI_STATUS Status; |
| |
| |
| /* Command line options */ |
| |
| while ((j = AcpiGetopt (argc, argv, AP_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j) |
| { |
| /* |
| * Global options |
| */ |
| case 'b': /* Dump all input tables to binary files */ |
| |
| Gbl_BinaryMode = TRUE; |
| continue; |
| |
| case 'c': /* Dump customized tables */ |
| |
| if (!strcmp (AcpiGbl_Optarg, "on")) |
| { |
| Gbl_DumpCustomizedTables = TRUE; |
| } |
| else if (!strcmp (AcpiGbl_Optarg, "off")) |
| { |
| Gbl_DumpCustomizedTables = FALSE; |
| } |
| else |
| { |
| AcpiLogError ("%s: Cannot handle this switch, please use on|off\n", |
| AcpiGbl_Optarg); |
| return (-1); |
| } |
| continue; |
| |
| case 'h': |
| case '?': |
| |
| ApDisplayUsage (); |
| return (1); |
| |
| case 'o': /* Redirect output to a single file */ |
| |
| if (ApOpenOutputFile (AcpiGbl_Optarg)) |
| { |
| return (-1); |
| } |
| continue; |
| |
| case 'r': /* Dump tables from specified RSDP */ |
| |
| Status = AcpiUtStrtoul64 (AcpiGbl_Optarg, 0, &Gbl_RsdpBase); |
| if (ACPI_FAILURE (Status)) |
| { |
| AcpiLogError ("%s: Could not convert to a physical address\n", |
| AcpiGbl_Optarg); |
| return (-1); |
| } |
| continue; |
| |
| case 's': /* Print table summaries only */ |
| |
| Gbl_SummaryMode = TRUE; |
| continue; |
| |
| case 'x': /* Do not use XSDT */ |
| |
| if (!AcpiGbl_DoNotUseXsdt) |
| { |
| AcpiGbl_DoNotUseXsdt = TRUE; |
| } |
| else |
| { |
| Gbl_DoNotDumpXsdt = TRUE; |
| } |
| continue; |
| |
| case 'v': /* Revision/version */ |
| |
| AcpiOsPrintf (ACPI_COMMON_SIGNON (AP_UTILITY_NAME)); |
| return (1); |
| |
| case 'z': /* Verbose mode */ |
| |
| Gbl_VerboseMode = TRUE; |
| AcpiLogError (ACPI_COMMON_SIGNON (AP_UTILITY_NAME)); |
| continue; |
| |
| /* |
| * Table options |
| */ |
| case 'a': /* Get table by physical address */ |
| |
| if (ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_ADDRESS)) |
| { |
| return (-1); |
| } |
| break; |
| |
| case 'f': /* Get table from a file */ |
| |
| if (ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_FILE)) |
| { |
| return (-1); |
| } |
| break; |
| |
| case 'n': /* Get table by input name (signature) */ |
| |
| if (ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_NAME)) |
| { |
| return (-1); |
| } |
| break; |
| |
| default: |
| |
| ApDisplayUsage (); |
| return (-1); |
| } |
| |
| /* If there are no actions, this means "get/dump all tables" */ |
| |
| if (CurrentAction == 0) |
| { |
| if (ApInsertAction (NULL, AP_DUMP_ALL_TABLES)) |
| { |
| return (-1); |
| } |
| } |
| |
| return (0); |
| } |
| |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: main |
| * |
| * PARAMETERS: argc/argv - Standard argc/argv |
| * |
| * RETURN: Status |
| * |
| * DESCRIPTION: C main function for acpidump utility |
| * |
| ******************************************************************************/ |
| |
| #ifndef _GNU_EFI |
| int ACPI_SYSTEM_XFACE |
| main ( |
| int argc, |
| char *argv[]) |
| #else |
| int ACPI_SYSTEM_XFACE |
| acpi_main ( |
| int argc, |
| char *argv[]) |
| #endif |
| { |
| int Status = 0; |
| AP_DUMP_ACTION *Action; |
| UINT32 FileSize; |
| UINT32 i; |
| |
| |
| ACPI_DEBUG_INITIALIZE (); /* For debug version only */ |
| AcpiOsInitialize (); |
| Gbl_OutputFile = ACPI_FILE_OUT; |
| |
| /* Process command line options */ |
| |
| Status = ApDoOptions (argc, argv); |
| if (Status > 0) |
| { |
| return (0); |
| } |
| if (Status < 0) |
| { |
| return (Status); |
| } |
| |
| /* Get/dump ACPI table(s) as requested */ |
| |
| for (i = 0; i < CurrentAction; i++) |
| { |
| Action = &ActionTable[i]; |
| switch (Action->ToBeDone) |
| { |
| case AP_DUMP_ALL_TABLES: |
| |
| Status = ApDumpAllTables (); |
| break; |
| |
| case AP_DUMP_TABLE_BY_ADDRESS: |
| |
| Status = ApDumpTableByAddress (Action->Argument); |
| break; |
| |
| case AP_DUMP_TABLE_BY_NAME: |
| |
| Status = ApDumpTableByName (Action->Argument); |
| break; |
| |
| case AP_DUMP_TABLE_BY_FILE: |
| |
| Status = ApDumpTableFromFile (Action->Argument); |
| break; |
| |
| default: |
| |
| AcpiLogError ("Internal error, invalid action: 0x%X\n", |
| Action->ToBeDone); |
| return (-1); |
| } |
| |
| if (Status) |
| { |
| return (Status); |
| } |
| } |
| |
| if (Gbl_OutputFilename) |
| { |
| if (Gbl_VerboseMode) |
| { |
| /* Summary for the output file */ |
| |
| FileSize = CmGetFileSize (Gbl_OutputFile); |
| AcpiLogError ("Output file %s contains 0x%X (%u) bytes\n\n", |
| Gbl_OutputFilename, FileSize, FileSize); |
| } |
| |
| AcpiOsCloseFile (Gbl_OutputFile); |
| } |
| |
| return (Status); |
| } |