1 /******************************************************************************
   2  *
   3  * Module Name: anmain - Main routine for the AcpiNames 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 "acpinames.h"
  45 
  46 #define _COMPONENT          ACPI_TOOLS
  47         ACPI_MODULE_NAME    ("anmain")
  48 
  49 
  50 extern ACPI_TABLE_DESC  Tables[];
  51 
  52 static AE_TABLE_DESC    *AeTableListHead = NULL;
  53 
  54 
  55 #define AN_UTILITY_NAME             "ACPI Namespace Dump Utility"
  56 #define AN_SUPPORTED_OPTIONS        "?hv"
  57 
  58 
  59 /******************************************************************************
  60  *
  61  * FUNCTION:    usage
  62  *
  63  * PARAMETERS:  None
  64  *
  65  * RETURN:      None
  66  *
  67  * DESCRIPTION: Print a usage message
  68  *
  69  *****************************************************************************/
  70 
  71 static void
  72 usage (
  73     void)
  74 {
  75 
  76     ACPI_USAGE_HEADER ("AcpiNames [options] AMLfile");
  77     ACPI_OPTION ("-?",                  "Display this message");
  78     ACPI_OPTION ("-v",                  "Display version information");
  79 }
  80 
  81 
  82 /******************************************************************************
  83  *
  84  * FUNCTION:    NsDumpEntireNamespace
  85  *
  86  * PARAMETERS:  AmlFilename         - Filename for DSDT or SSDT AML table
  87  *
  88  * RETURN:      Status (pass/fail)
  89  *
  90  * DESCRIPTION: Build an ACPI namespace for the input AML table, and dump the
  91  *              formatted namespace contents.
  92  *
  93  *****************************************************************************/
  94 
  95 static int
  96 NsDumpEntireNamespace (
  97     char                    *AmlFilename)
  98 {
  99     ACPI_STATUS             Status;
 100     ACPI_TABLE_HEADER       *Table = NULL;
 101     UINT32                  TableCount = 0;
 102     AE_TABLE_DESC           *TableDesc;
 103     ACPI_HANDLE             Handle;
 104 
 105 
 106     /* Open the binary AML file and read the entire table */
 107 
 108     Status = AcpiDbReadTableFromFile (AmlFilename, &Table);
 109     if (ACPI_FAILURE (Status))
 110     {
 111         printf ("**** Could not get input table %s, %s\n", AmlFilename,
 112             AcpiFormatException (Status));
 113         return (-1);
 114     }
 115 
 116     /* Table must be a DSDT. SSDTs are not currently supported */
 117 
 118     if (!ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT))
 119     {
 120         printf ("**** Input table signature is [%4.4s], must be [DSDT]\n",
 121             Table->Signature);
 122         return (-1);
 123     }
 124 
 125     /*
 126      * Allocate and link a table descriptor (allows for future expansion to
 127      * multiple input files)
 128      */
 129     TableDesc = AcpiOsAllocate (sizeof (AE_TABLE_DESC));
 130     TableDesc->Table = Table;
 131     TableDesc->Next = AeTableListHead;
 132     AeTableListHead = TableDesc;
 133 
 134     TableCount++;
 135 
 136     /*
 137      * Build a local XSDT with all tables. Normally, here is where the
 138      * RSDP search is performed to find the ACPI tables
 139      */
 140     Status = AeBuildLocalTables (TableCount, AeTableListHead);
 141     if (ACPI_FAILURE (Status))
 142     {
 143         return (-1);
 144     }
 145 
 146     /* Initialize table manager, get XSDT */
 147 
 148     Status = AcpiInitializeTables (Tables, ACPI_MAX_INIT_TABLES, TRUE);
 149     if (ACPI_FAILURE (Status))
 150     {
 151         printf ("**** Could not initialize ACPI table manager, %s\n",
 152             AcpiFormatException (Status));
 153         return (-1);
 154     }
 155 
 156     /* Reallocate root table to dynamic memory */
 157 
 158     Status = AcpiReallocateRootTable ();
 159     if (ACPI_FAILURE (Status))
 160     {
 161         printf ("**** Could not reallocate root table, %s\n",
 162             AcpiFormatException (Status));
 163         return (-1);
 164     }
 165 
 166     /* Load the ACPI namespace */
 167 
 168     Status = AcpiLoadTables ();
 169     if (ACPI_FAILURE (Status))
 170     {
 171         printf ("**** Could not load ACPI tables, %s\n",
 172             AcpiFormatException (Status));
 173         return (-1);
 174     }
 175 
 176     /*
 177      * Enable ACPICA. These calls don't do much for this
 178      * utility, since we only dump the namespace. There is no
 179      * hardware or event manager code underneath.
 180      */
 181     Status = AcpiEnableSubsystem (
 182                 ACPI_NO_ACPI_ENABLE |
 183                 ACPI_NO_ADDRESS_SPACE_INIT |
 184                 ACPI_NO_EVENT_INIT |
 185                 ACPI_NO_HANDLER_INIT);
 186     if (ACPI_FAILURE (Status))
 187     {
 188         printf ("**** Could not EnableSubsystem, %s\n",
 189             AcpiFormatException (Status));
 190         return (-1);
 191     }
 192 
 193     Status = AcpiInitializeObjects (
 194                 ACPI_NO_ADDRESS_SPACE_INIT |
 195                 ACPI_NO_DEVICE_INIT |
 196                 ACPI_NO_EVENT_INIT);
 197     if (ACPI_FAILURE (Status))
 198     {
 199         printf ("**** Could not InitializeObjects, %s\n",
 200             AcpiFormatException (Status));
 201         return (-1);
 202     }
 203 
 204     /*
 205      * Perform a namespace walk to dump the contents
 206      */
 207     AcpiOsPrintf ("\nACPI Namespace:\n");
 208 
 209     AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, ACPI_UINT32_MAX,
 210         ACPI_OWNER_ID_MAX, AcpiGbl_RootNode);
 211 
 212 
 213     /* Example: get a handle to the _GPE scope */
 214 
 215     Status = AcpiGetHandle (NULL, "\\_GPE", &Handle);
 216     AE_CHECK_OK (AcpiGetHandle, Status);
 217 
 218     return (0);
 219 }
 220 
 221 
 222 /******************************************************************************
 223  *
 224  * FUNCTION:    main
 225  *
 226  * PARAMETERS:  argc, argv
 227  *
 228  * RETURN:      Status (pass/fail)
 229  *
 230  * DESCRIPTION: Main routine for NsDump utility
 231  *
 232  *****************************************************************************/
 233 
 234 int ACPI_SYSTEM_XFACE
 235 main (
 236     int                     argc,
 237     char                    **argv)
 238 {
 239     ACPI_STATUS             Status;
 240     int                     j;
 241 
 242 
 243     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
 244     printf (ACPI_COMMON_SIGNON (AN_UTILITY_NAME));
 245 
 246     if (argc < 2)
 247     {
 248         usage ();
 249         return (0);
 250     }
 251 
 252     /* Init globals and ACPICA */
 253 
 254     AcpiDbgLevel = ACPI_NORMAL_DEFAULT | ACPI_LV_TABLES;
 255     AcpiDbgLayer = 0xFFFFFFFF;
 256 
 257     Status = AcpiInitializeSubsystem ();
 258     AE_CHECK_OK (AcpiInitializeSubsystem, Status);
 259 
 260     /* Get the command line options */
 261 
 262     while ((j = AcpiGetopt (argc, argv, AN_SUPPORTED_OPTIONS)) != EOF) switch(j)
 263     {
 264     case 'v': /* -v: (Version): signon already emitted, just exit */
 265 
 266         return (0);
 267 
 268     case '?':
 269     case 'h':
 270     default:
 271 
 272         usage();
 273         return (0);
 274     }
 275 
 276     /*
 277      * The next argument is the filename for the DSDT or SSDT.
 278      * Open the file, build namespace and dump it.
 279      */
 280     return (NsDumpEntireNamespace (argv[AcpiGbl_Optind]));
 281 }