1 /******************************************************************************
   2  *
   3  * Module Name: axmain - main module for acpixtract utility
   4  *
   5  *****************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2014, Intel Corp.
   9  * All rights reserved.
  10  *
  11  * Redistribution and use in source and binary forms, with or without
  12  * modification, are permitted provided that the following conditions
  13  * are met:
  14  * 1. Redistributions of source code must retain the above copyright
  15  *    notice, this list of conditions, and the following disclaimer,
  16  *    without modification.
  17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  18  *    substantially similar to the "NO WARRANTY" disclaimer below
  19  *    ("Disclaimer") and any redistribution must be conditioned upon
  20  *    including a substantially similar Disclaimer requirement for further
  21  *    binary redistribution.
  22  * 3. Neither the names of the above-listed copyright holders nor the names
  23  *    of any contributors may be used to endorse or promote products derived
  24  *    from this software without specific prior written permission.
  25  *
  26  * Alternatively, this software may be distributed under the terms of the
  27  * GNU General Public License ("GPL") version 2 as published by the Free
  28  * Software Foundation.
  29  *
  30  * NO WARRANTY
  31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  41  * POSSIBILITY OF SUCH DAMAGES.
  42  */
  43 
  44 #include "acpi.h"
  45 #include "accommon.h"
  46 #include "acapps.h"
  47 #include <stdio.h>
  48 
  49 
  50 static void
  51 DisplayUsage (
  52     void);
  53 
  54 int
  55 AxExtractTables (
  56     char                    *InputPathname,
  57     char                    *Signature,
  58     unsigned int            MinimumInstances);
  59 
  60 int
  61 AxListTables (
  62     char                    *InputPathname);
  63 
  64 
  65 /* Options */
  66 
  67 #define AX_EXTRACT_ALL          0
  68 #define AX_LIST_ALL             1
  69 #define AX_EXTRACT_SIGNATURE    2
  70 #define AX_EXTRACT_AML_TABLES   3
  71 
  72 static int          AxAction = AX_EXTRACT_AML_TABLES; /* DSDT & SSDTs */
  73 
  74 #define AX_OPTIONAL_TABLES      0
  75 #define AX_REQUIRED_TABLE       1
  76 
  77 #define AX_UTILITY_NAME             "ACPI Binary Table Extraction Utility"
  78 #define AX_SUPPORTED_OPTIONS        "ahls:v"
  79 
  80 
  81 /******************************************************************************
  82  *
  83  * FUNCTION:    DisplayUsage
  84  *
  85  * DESCRIPTION: Usage message
  86  *
  87  ******************************************************************************/
  88 
  89 static void
  90 DisplayUsage (
  91     void)
  92 {
  93 
  94     ACPI_USAGE_HEADER ("acpixtract [option] <InputFile>");
  95 
  96     ACPI_OPTION ("-a",                  "Extract all tables, not just DSDT/SSDT");
  97     ACPI_OPTION ("-l",                  "List table summaries, do not extract");
  98     ACPI_OPTION ("-s <signature>",      "Extract all tables with <signature>");
  99     ACPI_OPTION ("-v",                  "Display version information");
 100 
 101     printf ("\nExtract binary ACPI tables from text acpidump output\n");
 102     printf ("Default invocation extracts the DSDT and all SSDTs\n");
 103 }
 104 
 105 
 106 /******************************************************************************
 107  *
 108  * FUNCTION:    main
 109  *
 110  * DESCRIPTION: C main function
 111  *
 112  ******************************************************************************/
 113 
 114 int
 115 main (
 116     int                     argc,
 117     char                    *argv[])
 118 {
 119     char                    *Filename;
 120     int                     Status;
 121     int                     j;
 122 
 123 
 124     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
 125     printf (ACPI_COMMON_SIGNON (AX_UTILITY_NAME));
 126 
 127     if (argc < 2)
 128     {
 129         DisplayUsage ();
 130         return (0);
 131     }
 132 
 133     /* Command line options */
 134 
 135     while ((j = AcpiGetopt (argc, argv, AX_SUPPORTED_OPTIONS)) != EOF) switch (j)
 136     {
 137     case 'a':
 138 
 139         AxAction = AX_EXTRACT_ALL;          /* Extract all tables found */
 140         break;
 141 
 142     case 'l':
 143 
 144         AxAction = AX_LIST_ALL;             /* List tables only, do not extract */
 145         break;
 146 
 147     case 's':
 148 
 149         AxAction = AX_EXTRACT_SIGNATURE;    /* Extract only tables with this sig */
 150         break;
 151 
 152     case 'v': /* -v: (Version): signon already emitted, just exit */
 153 
 154         return (0);
 155 
 156     case 'h':
 157     default:
 158 
 159         DisplayUsage ();
 160         return (0);
 161     }
 162 
 163     /* Input filename is always required */
 164 
 165     Filename = argv[AcpiGbl_Optind];
 166     if (!Filename)
 167     {
 168         printf ("Missing required input filename\n");
 169         return (-1);
 170     }
 171 
 172     /* Perform requested action */
 173 
 174     switch (AxAction)
 175     {
 176     case AX_EXTRACT_ALL:
 177 
 178         Status = AxExtractTables (Filename, NULL, AX_OPTIONAL_TABLES);
 179         break;
 180 
 181     case AX_LIST_ALL:
 182 
 183         Status = AxListTables (Filename);
 184         break;
 185 
 186     case AX_EXTRACT_SIGNATURE:
 187 
 188         Status = AxExtractTables (Filename, AcpiGbl_Optarg, AX_REQUIRED_TABLE);
 189         break;
 190 
 191     default:
 192         /*
 193          * Default output is the DSDT and all SSDTs. One DSDT is required,
 194          * any SSDTs are optional.
 195          */
 196         Status = AxExtractTables (Filename, "DSDT", AX_REQUIRED_TABLE);
 197         if (Status)
 198         {
 199             return (Status);
 200         }
 201 
 202         Status = AxExtractTables (Filename, "SSDT", AX_OPTIONAL_TABLES);
 203         break;
 204     }
 205 
 206     return (Status);
 207 }