Merge branch 'vendor/TNFTP'
[dragonfly.git] / sys / contrib / dev / acpica / source / tools / acpinames / anmain.c
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 }