xref: /dflybsd-src/sys/contrib/dev/acpica/source/tools/acpixtract/axmain.c (revision 5f39c7e70ca0960d1868c75a449064df712dbb10)
10d02842fSSascha Wildner /******************************************************************************
20d02842fSSascha Wildner  *
30d02842fSSascha Wildner  * Module Name: axmain - main module for acpixtract utility
40d02842fSSascha Wildner  *
50d02842fSSascha Wildner  *****************************************************************************/
60d02842fSSascha Wildner 
70d02842fSSascha Wildner /*
820294b7eSSascha Wildner  * Copyright (C) 2000 - 2014, Intel Corp.
90d02842fSSascha Wildner  * All rights reserved.
100d02842fSSascha Wildner  *
110d02842fSSascha Wildner  * Redistribution and use in source and binary forms, with or without
120d02842fSSascha Wildner  * modification, are permitted provided that the following conditions
130d02842fSSascha Wildner  * are met:
140d02842fSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
150d02842fSSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
160d02842fSSascha Wildner  *    without modification.
170d02842fSSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
180d02842fSSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
190d02842fSSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
200d02842fSSascha Wildner  *    including a substantially similar Disclaimer requirement for further
210d02842fSSascha Wildner  *    binary redistribution.
220d02842fSSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
230d02842fSSascha Wildner  *    of any contributors may be used to endorse or promote products derived
240d02842fSSascha Wildner  *    from this software without specific prior written permission.
250d02842fSSascha Wildner  *
260d02842fSSascha Wildner  * Alternatively, this software may be distributed under the terms of the
270d02842fSSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
280d02842fSSascha Wildner  * Software Foundation.
290d02842fSSascha Wildner  *
300d02842fSSascha Wildner  * NO WARRANTY
310d02842fSSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
320d02842fSSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
330d02842fSSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
340d02842fSSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
350d02842fSSascha Wildner  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
360d02842fSSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
370d02842fSSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
380d02842fSSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
390d02842fSSascha Wildner  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
400d02842fSSascha Wildner  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
410d02842fSSascha Wildner  * POSSIBILITY OF SUCH DAMAGES.
420d02842fSSascha Wildner  */
430d02842fSSascha Wildner 
440d02842fSSascha Wildner #include "acpi.h"
450d02842fSSascha Wildner #include "accommon.h"
460d02842fSSascha Wildner #include "acapps.h"
470d02842fSSascha Wildner #include <stdio.h>
480d02842fSSascha Wildner 
490d02842fSSascha Wildner 
500d02842fSSascha Wildner static void
510d02842fSSascha Wildner DisplayUsage (
520d02842fSSascha Wildner     void);
530d02842fSSascha Wildner 
540d02842fSSascha Wildner int
550d02842fSSascha Wildner AxExtractTables (
560d02842fSSascha Wildner     char                    *InputPathname,
570d02842fSSascha Wildner     char                    *Signature,
580d02842fSSascha Wildner     unsigned int            MinimumInstances);
590d02842fSSascha Wildner 
600d02842fSSascha Wildner int
610d02842fSSascha Wildner AxListTables (
620d02842fSSascha Wildner     char                    *InputPathname);
630d02842fSSascha Wildner 
640d02842fSSascha Wildner 
650d02842fSSascha Wildner /* Options */
660d02842fSSascha Wildner 
670d02842fSSascha Wildner #define AX_EXTRACT_ALL          0
680d02842fSSascha Wildner #define AX_LIST_ALL             1
690d02842fSSascha Wildner #define AX_EXTRACT_SIGNATURE    2
700d02842fSSascha Wildner #define AX_EXTRACT_AML_TABLES   3
710d02842fSSascha Wildner 
720d02842fSSascha Wildner static int          AxAction = AX_EXTRACT_AML_TABLES; /* DSDT & SSDTs */
730d02842fSSascha Wildner 
740d02842fSSascha Wildner #define AX_OPTIONAL_TABLES      0
750d02842fSSascha Wildner #define AX_REQUIRED_TABLE       1
760d02842fSSascha Wildner 
770d02842fSSascha Wildner #define AX_UTILITY_NAME             "ACPI Binary Table Extraction Utility"
780d02842fSSascha Wildner #define AX_SUPPORTED_OPTIONS        "ahls:v"
790d02842fSSascha Wildner 
800d02842fSSascha Wildner 
810d02842fSSascha Wildner /******************************************************************************
820d02842fSSascha Wildner  *
830d02842fSSascha Wildner  * FUNCTION:    DisplayUsage
840d02842fSSascha Wildner  *
850d02842fSSascha Wildner  * DESCRIPTION: Usage message
860d02842fSSascha Wildner  *
870d02842fSSascha Wildner  ******************************************************************************/
880d02842fSSascha Wildner 
890d02842fSSascha Wildner static void
900d02842fSSascha Wildner DisplayUsage (
910d02842fSSascha Wildner     void)
920d02842fSSascha Wildner {
930d02842fSSascha Wildner 
940d02842fSSascha Wildner     ACPI_USAGE_HEADER ("acpixtract [option] <InputFile>");
950d02842fSSascha Wildner 
960d02842fSSascha Wildner     ACPI_OPTION ("-a",                  "Extract all tables, not just DSDT/SSDT");
970d02842fSSascha Wildner     ACPI_OPTION ("-l",                  "List table summaries, do not extract");
980d02842fSSascha Wildner     ACPI_OPTION ("-s <signature>",      "Extract all tables with <signature>");
990d02842fSSascha Wildner     ACPI_OPTION ("-v",                  "Display version information");
1000d02842fSSascha Wildner 
101*5f39c7e7SSascha Wildner     ACPI_USAGE_TEXT ("\nExtract binary ACPI tables from text acpidump output\n");
102*5f39c7e7SSascha Wildner     ACPI_USAGE_TEXT ("Default invocation extracts the DSDT and all SSDTs\n");
1030d02842fSSascha Wildner }
1040d02842fSSascha Wildner 
1050d02842fSSascha Wildner 
1060d02842fSSascha Wildner /******************************************************************************
1070d02842fSSascha Wildner  *
1080d02842fSSascha Wildner  * FUNCTION:    main
1090d02842fSSascha Wildner  *
1100d02842fSSascha Wildner  * DESCRIPTION: C main function
1110d02842fSSascha Wildner  *
1120d02842fSSascha Wildner  ******************************************************************************/
1130d02842fSSascha Wildner 
1140d02842fSSascha Wildner int
1150d02842fSSascha Wildner main (
1160d02842fSSascha Wildner     int                     argc,
1170d02842fSSascha Wildner     char                    *argv[])
1180d02842fSSascha Wildner {
1190d02842fSSascha Wildner     char                    *Filename;
1200d02842fSSascha Wildner     int                     Status;
1210d02842fSSascha Wildner     int                     j;
1220d02842fSSascha Wildner 
1230d02842fSSascha Wildner 
1240d02842fSSascha Wildner     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
125*5f39c7e7SSascha Wildner     AcpiOsInitialize ();
1260d02842fSSascha Wildner     printf (ACPI_COMMON_SIGNON (AX_UTILITY_NAME));
1270d02842fSSascha Wildner 
1280d02842fSSascha Wildner     if (argc < 2)
1290d02842fSSascha Wildner     {
1300d02842fSSascha Wildner         DisplayUsage ();
1310d02842fSSascha Wildner         return (0);
1320d02842fSSascha Wildner     }
1330d02842fSSascha Wildner 
1340d02842fSSascha Wildner     /* Command line options */
1350d02842fSSascha Wildner 
136*5f39c7e7SSascha Wildner     while ((j = AcpiGetopt (argc, argv, AX_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
1370d02842fSSascha Wildner     {
1380d02842fSSascha Wildner     case 'a':
1390d02842fSSascha Wildner 
1400d02842fSSascha Wildner         AxAction = AX_EXTRACT_ALL;          /* Extract all tables found */
1410d02842fSSascha Wildner         break;
1420d02842fSSascha Wildner 
1430d02842fSSascha Wildner     case 'l':
1440d02842fSSascha Wildner 
1450d02842fSSascha Wildner         AxAction = AX_LIST_ALL;             /* List tables only, do not extract */
1460d02842fSSascha Wildner         break;
1470d02842fSSascha Wildner 
1480d02842fSSascha Wildner     case 's':
1490d02842fSSascha Wildner 
1500d02842fSSascha Wildner         AxAction = AX_EXTRACT_SIGNATURE;    /* Extract only tables with this sig */
1510d02842fSSascha Wildner         break;
1520d02842fSSascha Wildner 
1530d02842fSSascha Wildner     case 'v': /* -v: (Version): signon already emitted, just exit */
1540d02842fSSascha Wildner 
1550d02842fSSascha Wildner         return (0);
1560d02842fSSascha Wildner 
1570d02842fSSascha Wildner     case 'h':
1580d02842fSSascha Wildner     default:
1590d02842fSSascha Wildner 
1600d02842fSSascha Wildner         DisplayUsage ();
1610d02842fSSascha Wildner         return (0);
1620d02842fSSascha Wildner     }
1630d02842fSSascha Wildner 
1640d02842fSSascha Wildner     /* Input filename is always required */
1650d02842fSSascha Wildner 
1660d02842fSSascha Wildner     Filename = argv[AcpiGbl_Optind];
1670d02842fSSascha Wildner     if (!Filename)
1680d02842fSSascha Wildner     {
1690d02842fSSascha Wildner         printf ("Missing required input filename\n");
1700d02842fSSascha Wildner         return (-1);
1710d02842fSSascha Wildner     }
1720d02842fSSascha Wildner 
1730d02842fSSascha Wildner     /* Perform requested action */
1740d02842fSSascha Wildner 
1750d02842fSSascha Wildner     switch (AxAction)
1760d02842fSSascha Wildner     {
1770d02842fSSascha Wildner     case AX_EXTRACT_ALL:
1780d02842fSSascha Wildner 
1790d02842fSSascha Wildner         Status = AxExtractTables (Filename, NULL, AX_OPTIONAL_TABLES);
1800d02842fSSascha Wildner         break;
1810d02842fSSascha Wildner 
1820d02842fSSascha Wildner     case AX_LIST_ALL:
1830d02842fSSascha Wildner 
1840d02842fSSascha Wildner         Status = AxListTables (Filename);
1850d02842fSSascha Wildner         break;
1860d02842fSSascha Wildner 
1870d02842fSSascha Wildner     case AX_EXTRACT_SIGNATURE:
1880d02842fSSascha Wildner 
1890d02842fSSascha Wildner         Status = AxExtractTables (Filename, AcpiGbl_Optarg, AX_REQUIRED_TABLE);
1900d02842fSSascha Wildner         break;
1910d02842fSSascha Wildner 
1920d02842fSSascha Wildner     default:
1930d02842fSSascha Wildner         /*
1940d02842fSSascha Wildner          * Default output is the DSDT and all SSDTs. One DSDT is required,
1950d02842fSSascha Wildner          * any SSDTs are optional.
1960d02842fSSascha Wildner          */
1970d02842fSSascha Wildner         Status = AxExtractTables (Filename, "DSDT", AX_REQUIRED_TABLE);
1980d02842fSSascha Wildner         if (Status)
1990d02842fSSascha Wildner         {
2000d02842fSSascha Wildner             return (Status);
2010d02842fSSascha Wildner         }
2020d02842fSSascha Wildner 
2030d02842fSSascha Wildner         Status = AxExtractTables (Filename, "SSDT", AX_OPTIONAL_TABLES);
2040d02842fSSascha Wildner         break;
2050d02842fSSascha Wildner     }
2060d02842fSSascha Wildner 
2070d02842fSSascha Wildner     return (Status);
2080d02842fSSascha Wildner }
209