xref: /illumos-gate/usr/src/cmd/acpi/common/adisasm.c (revision bc36eafd)
1*bc36eafdSMike Gerdts /******************************************************************************
2*bc36eafdSMike Gerdts  *
3*bc36eafdSMike Gerdts  * Module Name: adisasm - Application-level disassembler routines
4*bc36eafdSMike Gerdts  *
5*bc36eafdSMike Gerdts  *****************************************************************************/
6*bc36eafdSMike Gerdts 
7*bc36eafdSMike Gerdts /*
8*bc36eafdSMike Gerdts  * Copyright (C) 2000 - 2016, Intel Corp.
9*bc36eafdSMike Gerdts  * All rights reserved.
10*bc36eafdSMike Gerdts  *
11*bc36eafdSMike Gerdts  * Redistribution and use in source and binary forms, with or without
12*bc36eafdSMike Gerdts  * modification, are permitted provided that the following conditions
13*bc36eafdSMike Gerdts  * are met:
14*bc36eafdSMike Gerdts  * 1. Redistributions of source code must retain the above copyright
15*bc36eafdSMike Gerdts  *    notice, this list of conditions, and the following disclaimer,
16*bc36eafdSMike Gerdts  *    without modification.
17*bc36eafdSMike Gerdts  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*bc36eafdSMike Gerdts  *    substantially similar to the "NO WARRANTY" disclaimer below
19*bc36eafdSMike Gerdts  *    ("Disclaimer") and any redistribution must be conditioned upon
20*bc36eafdSMike Gerdts  *    including a substantially similar Disclaimer requirement for further
21*bc36eafdSMike Gerdts  *    binary redistribution.
22*bc36eafdSMike Gerdts  * 3. Neither the names of the above-listed copyright holders nor the names
23*bc36eafdSMike Gerdts  *    of any contributors may be used to endorse or promote products derived
24*bc36eafdSMike Gerdts  *    from this software without specific prior written permission.
25*bc36eafdSMike Gerdts  *
26*bc36eafdSMike Gerdts  * Alternatively, this software may be distributed under the terms of the
27*bc36eafdSMike Gerdts  * GNU General Public License ("GPL") version 2 as published by the Free
28*bc36eafdSMike Gerdts  * Software Foundation.
29*bc36eafdSMike Gerdts  *
30*bc36eafdSMike Gerdts  * NO WARRANTY
31*bc36eafdSMike Gerdts  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*bc36eafdSMike Gerdts  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*bc36eafdSMike Gerdts  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*bc36eafdSMike Gerdts  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*bc36eafdSMike Gerdts  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*bc36eafdSMike Gerdts  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*bc36eafdSMike Gerdts  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*bc36eafdSMike Gerdts  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*bc36eafdSMike Gerdts  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*bc36eafdSMike Gerdts  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*bc36eafdSMike Gerdts  * POSSIBILITY OF SUCH DAMAGES.
42*bc36eafdSMike Gerdts  */
43*bc36eafdSMike Gerdts 
44*bc36eafdSMike Gerdts #include "aslcompiler.h"
45*bc36eafdSMike Gerdts #include "amlcode.h"
46*bc36eafdSMike Gerdts #include "acdisasm.h"
47*bc36eafdSMike Gerdts #include "acdispat.h"
48*bc36eafdSMike Gerdts #include "acnamesp.h"
49*bc36eafdSMike Gerdts #include "acparser.h"
50*bc36eafdSMike Gerdts #include "acapps.h"
51*bc36eafdSMike Gerdts 
52*bc36eafdSMike Gerdts #include <stdio.h>
53*bc36eafdSMike Gerdts 
54*bc36eafdSMike Gerdts 
55*bc36eafdSMike Gerdts #define _COMPONENT          ACPI_TOOLS
56*bc36eafdSMike Gerdts         ACPI_MODULE_NAME    ("adisasm")
57*bc36eafdSMike Gerdts 
58*bc36eafdSMike Gerdts /* Local prototypes */
59*bc36eafdSMike Gerdts 
60*bc36eafdSMike Gerdts static ACPI_STATUS
61*bc36eafdSMike Gerdts AdDoExternalFileList (
62*bc36eafdSMike Gerdts     char                    *Filename);
63*bc36eafdSMike Gerdts 
64*bc36eafdSMike Gerdts static ACPI_STATUS
65*bc36eafdSMike Gerdts AdDisassembleOneTable (
66*bc36eafdSMike Gerdts     ACPI_TABLE_HEADER       *Table,
67*bc36eafdSMike Gerdts     FILE                    *File,
68*bc36eafdSMike Gerdts     char                    *Filename,
69*bc36eafdSMike Gerdts     char                    *DisasmFilename);
70*bc36eafdSMike Gerdts 
71*bc36eafdSMike Gerdts static ACPI_STATUS
72*bc36eafdSMike Gerdts AdReparseOneTable (
73*bc36eafdSMike Gerdts     ACPI_TABLE_HEADER       *Table,
74*bc36eafdSMike Gerdts     FILE                    *File,
75*bc36eafdSMike Gerdts     ACPI_OWNER_ID           OwnerId);
76*bc36eafdSMike Gerdts 
77*bc36eafdSMike Gerdts 
78*bc36eafdSMike Gerdts ACPI_TABLE_DESC             LocalTables[1];
79*bc36eafdSMike Gerdts ACPI_PARSE_OBJECT           *AcpiGbl_ParseOpRoot;
80*bc36eafdSMike Gerdts 
81*bc36eafdSMike Gerdts 
82*bc36eafdSMike Gerdts /* Stubs for everything except ASL compiler */
83*bc36eafdSMike Gerdts 
84*bc36eafdSMike Gerdts #ifndef ACPI_ASL_COMPILER
85*bc36eafdSMike Gerdts BOOLEAN
86*bc36eafdSMike Gerdts AcpiDsIsResultUsed (
87*bc36eafdSMike Gerdts     ACPI_PARSE_OBJECT       *Op,
88*bc36eafdSMike Gerdts     ACPI_WALK_STATE         *WalkState)
89*bc36eafdSMike Gerdts {
90*bc36eafdSMike Gerdts     return (TRUE);
91*bc36eafdSMike Gerdts }
92*bc36eafdSMike Gerdts 
93*bc36eafdSMike Gerdts ACPI_STATUS
94*bc36eafdSMike Gerdts AcpiDsMethodError (
95*bc36eafdSMike Gerdts     ACPI_STATUS             Status,
96*bc36eafdSMike Gerdts     ACPI_WALK_STATE         *WalkState)
97*bc36eafdSMike Gerdts {
98*bc36eafdSMike Gerdts     return (Status);
99*bc36eafdSMike Gerdts }
100*bc36eafdSMike Gerdts #endif
101*bc36eafdSMike Gerdts 
102*bc36eafdSMike Gerdts 
103*bc36eafdSMike Gerdts /*******************************************************************************
104*bc36eafdSMike Gerdts  *
105*bc36eafdSMike Gerdts  * FUNCTION:    AdInitialize
106*bc36eafdSMike Gerdts  *
107*bc36eafdSMike Gerdts  * PARAMETERS:  None
108*bc36eafdSMike Gerdts  *
109*bc36eafdSMike Gerdts  * RETURN:      Status
110*bc36eafdSMike Gerdts  *
111*bc36eafdSMike Gerdts  * DESCRIPTION: ACPICA and local initialization
112*bc36eafdSMike Gerdts  *
113*bc36eafdSMike Gerdts  ******************************************************************************/
114*bc36eafdSMike Gerdts 
115*bc36eafdSMike Gerdts ACPI_STATUS
116*bc36eafdSMike Gerdts AdInitialize (
117*bc36eafdSMike Gerdts     void)
118*bc36eafdSMike Gerdts {
119*bc36eafdSMike Gerdts     ACPI_STATUS             Status;
120*bc36eafdSMike Gerdts 
121*bc36eafdSMike Gerdts 
122*bc36eafdSMike Gerdts     /* ACPICA subsystem initialization */
123*bc36eafdSMike Gerdts 
124*bc36eafdSMike Gerdts     Status = AcpiOsInitialize ();
125*bc36eafdSMike Gerdts     if (ACPI_FAILURE (Status))
126*bc36eafdSMike Gerdts     {
127*bc36eafdSMike Gerdts         return (Status);
128*bc36eafdSMike Gerdts     }
129*bc36eafdSMike Gerdts 
130*bc36eafdSMike Gerdts     Status = AcpiUtInitGlobals ();
131*bc36eafdSMike Gerdts     if (ACPI_FAILURE (Status))
132*bc36eafdSMike Gerdts     {
133*bc36eafdSMike Gerdts         return (Status);
134*bc36eafdSMike Gerdts     }
135*bc36eafdSMike Gerdts 
136*bc36eafdSMike Gerdts     Status = AcpiUtMutexInitialize ();
137*bc36eafdSMike Gerdts     if (ACPI_FAILURE (Status))
138*bc36eafdSMike Gerdts     {
139*bc36eafdSMike Gerdts         return (Status);
140*bc36eafdSMike Gerdts     }
141*bc36eafdSMike Gerdts 
142*bc36eafdSMike Gerdts     Status = AcpiNsRootInitialize ();
143*bc36eafdSMike Gerdts     if (ACPI_FAILURE (Status))
144*bc36eafdSMike Gerdts     {
145*bc36eafdSMike Gerdts         return (Status);
146*bc36eafdSMike Gerdts     }
147*bc36eafdSMike Gerdts 
148*bc36eafdSMike Gerdts     /* Setup the Table Manager (cheat - there is no RSDT) */
149*bc36eafdSMike Gerdts 
150*bc36eafdSMike Gerdts     AcpiGbl_RootTableList.MaxTableCount = 1;
151*bc36eafdSMike Gerdts     AcpiGbl_RootTableList.CurrentTableCount = 0;
152*bc36eafdSMike Gerdts     AcpiGbl_RootTableList.Tables = LocalTables;
153*bc36eafdSMike Gerdts 
154*bc36eafdSMike Gerdts     return (Status);
155*bc36eafdSMike Gerdts }
156*bc36eafdSMike Gerdts 
157*bc36eafdSMike Gerdts 
158*bc36eafdSMike Gerdts /******************************************************************************
159*bc36eafdSMike Gerdts  *
160*bc36eafdSMike Gerdts  * FUNCTION:    AdAmlDisassemble
161*bc36eafdSMike Gerdts  *
162*bc36eafdSMike Gerdts  * PARAMETERS:  Filename            - AML input filename
163*bc36eafdSMike Gerdts  *              OutToFile           - TRUE if output should go to a file
164*bc36eafdSMike Gerdts  *              Prefix              - Path prefix for output
165*bc36eafdSMike Gerdts  *              OutFilename         - where the filename is returned
166*bc36eafdSMike Gerdts  *
167*bc36eafdSMike Gerdts  * RETURN:      Status
168*bc36eafdSMike Gerdts  *
169*bc36eafdSMike Gerdts  * DESCRIPTION: Disassembler entry point. Disassemble an entire ACPI table.
170*bc36eafdSMike Gerdts  *
171*bc36eafdSMike Gerdts  *****************************************************************************/
172*bc36eafdSMike Gerdts 
173*bc36eafdSMike Gerdts ACPI_STATUS
174*bc36eafdSMike Gerdts AdAmlDisassemble (
175*bc36eafdSMike Gerdts     BOOLEAN                 OutToFile,
176*bc36eafdSMike Gerdts     char                    *Filename,
177*bc36eafdSMike Gerdts     char                    *Prefix,
178*bc36eafdSMike Gerdts     char                    **OutFilename)
179*bc36eafdSMike Gerdts {
180*bc36eafdSMike Gerdts     ACPI_STATUS             Status;
181*bc36eafdSMike Gerdts     char                    *DisasmFilename = NULL;
182*bc36eafdSMike Gerdts     FILE                    *File = NULL;
183*bc36eafdSMike Gerdts     ACPI_TABLE_HEADER       *Table = NULL;
184*bc36eafdSMike Gerdts     ACPI_NEW_TABLE_DESC     *ListHead = NULL;
185*bc36eafdSMike Gerdts 
186*bc36eafdSMike Gerdts 
187*bc36eafdSMike Gerdts     /*
188*bc36eafdSMike Gerdts      * Input: AML code from either a file or via GetTables (memory or
189*bc36eafdSMike Gerdts      * registry)
190*bc36eafdSMike Gerdts      */
191*bc36eafdSMike Gerdts     if (Filename)
192*bc36eafdSMike Gerdts     {
193*bc36eafdSMike Gerdts         /* Get the list of all AML tables in the file */
194*bc36eafdSMike Gerdts 
195*bc36eafdSMike Gerdts         Status = AcGetAllTablesFromFile (Filename,
196*bc36eafdSMike Gerdts             ACPI_GET_ALL_TABLES, &ListHead);
197*bc36eafdSMike Gerdts         if (ACPI_FAILURE (Status))
198*bc36eafdSMike Gerdts         {
199*bc36eafdSMike Gerdts             AcpiOsPrintf ("Could not get ACPI tables from %s, %s\n",
200*bc36eafdSMike Gerdts                 Filename, AcpiFormatException (Status));
201*bc36eafdSMike Gerdts             return (Status);
202*bc36eafdSMike Gerdts         }
203*bc36eafdSMike Gerdts 
204*bc36eafdSMike Gerdts         /* Process any user-specified files for external objects */
205*bc36eafdSMike Gerdts 
206*bc36eafdSMike Gerdts         Status = AdDoExternalFileList (Filename);
207*bc36eafdSMike Gerdts         if (ACPI_FAILURE (Status))
208*bc36eafdSMike Gerdts         {
209*bc36eafdSMike Gerdts             return (Status);
210*bc36eafdSMike Gerdts         }
211*bc36eafdSMike Gerdts     }
212*bc36eafdSMike Gerdts     else
213*bc36eafdSMike Gerdts     {
214*bc36eafdSMike Gerdts         Status = AdGetLocalTables ();
215*bc36eafdSMike Gerdts         if (ACPI_FAILURE (Status))
216*bc36eafdSMike Gerdts         {
217*bc36eafdSMike Gerdts             AcpiOsPrintf ("Could not get ACPI tables, %s\n",
218*bc36eafdSMike Gerdts                 AcpiFormatException (Status));
219*bc36eafdSMike Gerdts             return (Status);
220*bc36eafdSMike Gerdts         }
221*bc36eafdSMike Gerdts 
222*bc36eafdSMike Gerdts         if (!AcpiGbl_DmOpt_Disasm)
223*bc36eafdSMike Gerdts         {
224*bc36eafdSMike Gerdts             return (AE_OK);
225*bc36eafdSMike Gerdts         }
226*bc36eafdSMike Gerdts 
227*bc36eafdSMike Gerdts         /* Obtained the local tables, just disassemble the DSDT */
228*bc36eafdSMike Gerdts 
229*bc36eafdSMike Gerdts         Status = AcpiGetTable (ACPI_SIG_DSDT, 0, &Table);
230*bc36eafdSMike Gerdts         if (ACPI_FAILURE (Status))
231*bc36eafdSMike Gerdts         {
232*bc36eafdSMike Gerdts             AcpiOsPrintf ("Could not get DSDT, %s\n",
233*bc36eafdSMike Gerdts                 AcpiFormatException (Status));
234*bc36eafdSMike Gerdts             return (Status);
235*bc36eafdSMike Gerdts         }
236*bc36eafdSMike Gerdts 
237*bc36eafdSMike Gerdts         AcpiOsPrintf ("\nDisassembly of DSDT\n");
238*bc36eafdSMike Gerdts         Prefix = AdGenerateFilename ("dsdt", Table->OemTableId);
239*bc36eafdSMike Gerdts     }
240*bc36eafdSMike Gerdts 
241*bc36eafdSMike Gerdts     /*
242*bc36eafdSMike Gerdts      * Output: ASL code. Redirect to a file if requested
243*bc36eafdSMike Gerdts      */
244*bc36eafdSMike Gerdts     if (OutToFile)
245*bc36eafdSMike Gerdts     {
246*bc36eafdSMike Gerdts         /* Create/Open a disassembly output file */
247*bc36eafdSMike Gerdts 
248*bc36eafdSMike Gerdts         DisasmFilename = FlGenerateFilename (Prefix, FILE_SUFFIX_DISASSEMBLY);
249*bc36eafdSMike Gerdts         if (!DisasmFilename)
250*bc36eafdSMike Gerdts         {
251*bc36eafdSMike Gerdts             fprintf (stderr, "Could not generate output filename\n");
252*bc36eafdSMike Gerdts             Status = AE_ERROR;
253*bc36eafdSMike Gerdts             goto Cleanup;
254*bc36eafdSMike Gerdts         }
255*bc36eafdSMike Gerdts 
256*bc36eafdSMike Gerdts         File = fopen (DisasmFilename, "w+");
257*bc36eafdSMike Gerdts         if (!File)
258*bc36eafdSMike Gerdts         {
259*bc36eafdSMike Gerdts             fprintf (stderr, "Could not open output file %s\n",
260*bc36eafdSMike Gerdts                 DisasmFilename);
261*bc36eafdSMike Gerdts             Status = AE_ERROR;
262*bc36eafdSMike Gerdts             goto Cleanup;
263*bc36eafdSMike Gerdts         }
264*bc36eafdSMike Gerdts 
265*bc36eafdSMike Gerdts         AcpiOsRedirectOutput (File);
266*bc36eafdSMike Gerdts     }
267*bc36eafdSMike Gerdts 
268*bc36eafdSMike Gerdts     *OutFilename = DisasmFilename;
269*bc36eafdSMike Gerdts 
270*bc36eafdSMike Gerdts     /* Disassemble all AML tables within the file */
271*bc36eafdSMike Gerdts 
272*bc36eafdSMike Gerdts     while (ListHead)
273*bc36eafdSMike Gerdts     {
274*bc36eafdSMike Gerdts         Status = AdDisassembleOneTable (ListHead->Table,
275*bc36eafdSMike Gerdts             File, Filename, DisasmFilename);
276*bc36eafdSMike Gerdts         if (ACPI_FAILURE (Status))
277*bc36eafdSMike Gerdts         {
278*bc36eafdSMike Gerdts             break;
279*bc36eafdSMike Gerdts         }
280*bc36eafdSMike Gerdts 
281*bc36eafdSMike Gerdts         ListHead = ListHead->Next;
282*bc36eafdSMike Gerdts     }
283*bc36eafdSMike Gerdts 
284*bc36eafdSMike Gerdts Cleanup:
285*bc36eafdSMike Gerdts 
286*bc36eafdSMike Gerdts     if (Table &&
287*bc36eafdSMike Gerdts         !AcpiGbl_ForceAmlDisassembly &&
288*bc36eafdSMike Gerdts         !AcpiUtIsAmlTable (Table))
289*bc36eafdSMike Gerdts     {
290*bc36eafdSMike Gerdts         ACPI_FREE (Table);
291*bc36eafdSMike Gerdts     }
292*bc36eafdSMike Gerdts 
293*bc36eafdSMike Gerdts     if (File)
294*bc36eafdSMike Gerdts     {
295*bc36eafdSMike Gerdts         fclose (File);
296*bc36eafdSMike Gerdts         AcpiOsRedirectOutput (stdout);
297*bc36eafdSMike Gerdts     }
298*bc36eafdSMike Gerdts 
299*bc36eafdSMike Gerdts     AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
300*bc36eafdSMike Gerdts     AcpiGbl_ParseOpRoot = NULL;
301*bc36eafdSMike Gerdts     return (Status);
302*bc36eafdSMike Gerdts }
303*bc36eafdSMike Gerdts 
304*bc36eafdSMike Gerdts 
305*bc36eafdSMike Gerdts /******************************************************************************
306*bc36eafdSMike Gerdts  *
307*bc36eafdSMike Gerdts  * FUNCTION:    AdDisassembleOneTable
308*bc36eafdSMike Gerdts  *
309*bc36eafdSMike Gerdts  * PARAMETERS:  Table               - Raw AML table
310*bc36eafdSMike Gerdts  *              File                - Pointer for the input file
311*bc36eafdSMike Gerdts  *              Filename            - AML input filename
312*bc36eafdSMike Gerdts  *              DisasmFilename      - Output filename
313*bc36eafdSMike Gerdts  *
314*bc36eafdSMike Gerdts  * RETURN:      Status
315*bc36eafdSMike Gerdts  *
316*bc36eafdSMike Gerdts  * DESCRIPTION: Disassemble a single ACPI table. AML or data table.
317*bc36eafdSMike Gerdts  *
318*bc36eafdSMike Gerdts  *****************************************************************************/
319*bc36eafdSMike Gerdts 
320*bc36eafdSMike Gerdts static ACPI_STATUS
321*bc36eafdSMike Gerdts AdDisassembleOneTable (
322*bc36eafdSMike Gerdts     ACPI_TABLE_HEADER       *Table,
323*bc36eafdSMike Gerdts     FILE                    *File,
324*bc36eafdSMike Gerdts     char                    *Filename,
325*bc36eafdSMike Gerdts     char                    *DisasmFilename)
326*bc36eafdSMike Gerdts {
327*bc36eafdSMike Gerdts     ACPI_STATUS             Status;
328*bc36eafdSMike Gerdts     ACPI_OWNER_ID           OwnerId;
329*bc36eafdSMike Gerdts 
330*bc36eafdSMike Gerdts 
331*bc36eafdSMike Gerdts     /* ForceAmlDisassembly means to assume the table contains valid AML */
332*bc36eafdSMike Gerdts 
333*bc36eafdSMike Gerdts     if (!AcpiGbl_ForceAmlDisassembly && !AcpiUtIsAmlTable (Table))
334*bc36eafdSMike Gerdts     {
335*bc36eafdSMike Gerdts         AdDisassemblerHeader (Filename, ACPI_IS_DATA_TABLE);
336*bc36eafdSMike Gerdts 
337*bc36eafdSMike Gerdts         /* This is a "Data Table" (non-AML table) */
338*bc36eafdSMike Gerdts 
339*bc36eafdSMike Gerdts         AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n",
340*bc36eafdSMike Gerdts             Table->Signature);
341*bc36eafdSMike Gerdts         AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength]  "
342*bc36eafdSMike Gerdts             "FieldName : FieldValue\n */\n\n");
343*bc36eafdSMike Gerdts 
344*bc36eafdSMike Gerdts         AcpiDmDumpDataTable (Table);
345*bc36eafdSMike Gerdts         fprintf (stderr, "Acpi Data Table [%4.4s] decoded\n",
346*bc36eafdSMike Gerdts             Table->Signature);
347*bc36eafdSMike Gerdts 
348*bc36eafdSMike Gerdts         if (File)
349*bc36eafdSMike Gerdts         {
350*bc36eafdSMike Gerdts             fprintf (stderr, "Formatted output:  %s - %u bytes\n",
351*bc36eafdSMike Gerdts                 DisasmFilename, CmGetFileSize (File));
352*bc36eafdSMike Gerdts         }
353*bc36eafdSMike Gerdts 
354*bc36eafdSMike Gerdts         return (AE_OK);
355*bc36eafdSMike Gerdts     }
356*bc36eafdSMike Gerdts 
357*bc36eafdSMike Gerdts     /*
358*bc36eafdSMike Gerdts      * This is an AML table (DSDT or SSDT).
359*bc36eafdSMike Gerdts      * Always parse the tables, only option is what to display
360*bc36eafdSMike Gerdts      */
361*bc36eafdSMike Gerdts     Status = AdParseTable (Table, &OwnerId, TRUE, FALSE);
362*bc36eafdSMike Gerdts     if (ACPI_FAILURE (Status))
363*bc36eafdSMike Gerdts     {
364*bc36eafdSMike Gerdts         AcpiOsPrintf ("Could not parse ACPI tables, %s\n",
365*bc36eafdSMike Gerdts             AcpiFormatException (Status));
366*bc36eafdSMike Gerdts         return (Status);
367*bc36eafdSMike Gerdts     }
368*bc36eafdSMike Gerdts 
369*bc36eafdSMike Gerdts     /* Debug output, namespace and parse tree */
370*bc36eafdSMike Gerdts 
371*bc36eafdSMike Gerdts     if (AslCompilerdebug && File)
372*bc36eafdSMike Gerdts     {
373*bc36eafdSMike Gerdts         AcpiOsPrintf ("/**** Before second load\n");
374*bc36eafdSMike Gerdts 
375*bc36eafdSMike Gerdts         NsSetupNamespaceListing (File);
376*bc36eafdSMike Gerdts         NsDisplayNamespace ();
377*bc36eafdSMike Gerdts 
378*bc36eafdSMike Gerdts         AcpiOsPrintf ("*****/\n");
379*bc36eafdSMike Gerdts     }
380*bc36eafdSMike Gerdts 
381*bc36eafdSMike Gerdts     /* Load namespace from names created within control methods */
382*bc36eafdSMike Gerdts 
383*bc36eafdSMike Gerdts     AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot,
384*bc36eafdSMike Gerdts         AcpiGbl_RootNode, OwnerId);
385*bc36eafdSMike Gerdts 
386*bc36eafdSMike Gerdts     /*
387*bc36eafdSMike Gerdts      * Cross reference the namespace here, in order to
388*bc36eafdSMike Gerdts      * generate External() statements
389*bc36eafdSMike Gerdts      */
390*bc36eafdSMike Gerdts     AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot,
391*bc36eafdSMike Gerdts         AcpiGbl_RootNode, OwnerId);
392*bc36eafdSMike Gerdts 
393*bc36eafdSMike Gerdts     if (AslCompilerdebug)
394*bc36eafdSMike Gerdts     {
395*bc36eafdSMike Gerdts         AcpiDmDumpTree (AcpiGbl_ParseOpRoot);
396*bc36eafdSMike Gerdts     }
397*bc36eafdSMike Gerdts 
398*bc36eafdSMike Gerdts     /* Find possible calls to external control methods */
399*bc36eafdSMike Gerdts 
400*bc36eafdSMike Gerdts     AcpiDmFindOrphanMethods (AcpiGbl_ParseOpRoot);
401*bc36eafdSMike Gerdts 
402*bc36eafdSMike Gerdts     /*
403*bc36eafdSMike Gerdts      * If we found any external control methods, we must reparse
404*bc36eafdSMike Gerdts      * the entire tree with the new information (namely, the
405*bc36eafdSMike Gerdts      * number of arguments per method)
406*bc36eafdSMike Gerdts      */
407*bc36eafdSMike Gerdts     if (AcpiDmGetExternalMethodCount ())
408*bc36eafdSMike Gerdts     {
409*bc36eafdSMike Gerdts         Status = AdReparseOneTable (Table, File, OwnerId);
410*bc36eafdSMike Gerdts         if (ACPI_FAILURE (Status))
411*bc36eafdSMike Gerdts         {
412*bc36eafdSMike Gerdts             return (Status);
413*bc36eafdSMike Gerdts         }
414*bc36eafdSMike Gerdts     }
415*bc36eafdSMike Gerdts 
416*bc36eafdSMike Gerdts     /*
417*bc36eafdSMike Gerdts      * Now that the namespace is finalized, we can perform namespace
418*bc36eafdSMike Gerdts      * transforms.
419*bc36eafdSMike Gerdts      *
420*bc36eafdSMike Gerdts      * 1) Convert fixed-offset references to resource descriptors
421*bc36eafdSMike Gerdts      *    to symbolic references (Note: modifies namespace)
422*bc36eafdSMike Gerdts      */
423*bc36eafdSMike Gerdts     AcpiDmConvertResourceIndexes (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode);
424*bc36eafdSMike Gerdts 
425*bc36eafdSMike Gerdts     /* Optional displays */
426*bc36eafdSMike Gerdts 
427*bc36eafdSMike Gerdts     if (AcpiGbl_DmOpt_Disasm)
428*bc36eafdSMike Gerdts     {
429*bc36eafdSMike Gerdts         /* This is the real disassembly */
430*bc36eafdSMike Gerdts 
431*bc36eafdSMike Gerdts         AdDisplayTables (Filename, Table);
432*bc36eafdSMike Gerdts 
433*bc36eafdSMike Gerdts         /* Dump hex table if requested (-vt) */
434*bc36eafdSMike Gerdts 
435*bc36eafdSMike Gerdts         AcpiDmDumpDataTable (Table);
436*bc36eafdSMike Gerdts 
437*bc36eafdSMike Gerdts         fprintf (stderr, "Disassembly completed\n");
438*bc36eafdSMike Gerdts         if (File)
439*bc36eafdSMike Gerdts         {
440*bc36eafdSMike Gerdts             fprintf (stderr, "ASL Output:    %s - %u bytes\n",
441*bc36eafdSMike Gerdts                 DisasmFilename, CmGetFileSize (File));
442*bc36eafdSMike Gerdts         }
443*bc36eafdSMike Gerdts 
444*bc36eafdSMike Gerdts         if (Gbl_MapfileFlag)
445*bc36eafdSMike Gerdts         {
446*bc36eafdSMike Gerdts             fprintf (stderr, "%14s %s - %u bytes\n",
447*bc36eafdSMike Gerdts                 Gbl_Files[ASL_FILE_MAP_OUTPUT].ShortDescription,
448*bc36eafdSMike Gerdts                 Gbl_Files[ASL_FILE_MAP_OUTPUT].Filename,
449*bc36eafdSMike Gerdts                 FlGetFileSize (ASL_FILE_MAP_OUTPUT));
450*bc36eafdSMike Gerdts         }
451*bc36eafdSMike Gerdts     }
452*bc36eafdSMike Gerdts 
453*bc36eafdSMike Gerdts     return (AE_OK);
454*bc36eafdSMike Gerdts }
455*bc36eafdSMike Gerdts 
456*bc36eafdSMike Gerdts 
457*bc36eafdSMike Gerdts /******************************************************************************
458*bc36eafdSMike Gerdts  *
459*bc36eafdSMike Gerdts  * FUNCTION:    AdReparseOneTable
460*bc36eafdSMike Gerdts  *
461*bc36eafdSMike Gerdts  * PARAMETERS:  Table               - Raw AML table
462*bc36eafdSMike Gerdts  *              File                - Pointer for the input file
463*bc36eafdSMike Gerdts  *              OwnerId             - ID for this table
464*bc36eafdSMike Gerdts  *
465*bc36eafdSMike Gerdts  * RETURN:      Status
466*bc36eafdSMike Gerdts  *
467*bc36eafdSMike Gerdts  * DESCRIPTION: Reparse a table that has already been loaded. Used to
468*bc36eafdSMike Gerdts  *              integrate information about external control methods.
469*bc36eafdSMike Gerdts  *              These methods may have been previously parsed incorrectly.
470*bc36eafdSMike Gerdts  *
471*bc36eafdSMike Gerdts  *****************************************************************************/
472*bc36eafdSMike Gerdts 
473*bc36eafdSMike Gerdts static ACPI_STATUS
474*bc36eafdSMike Gerdts AdReparseOneTable (
475*bc36eafdSMike Gerdts     ACPI_TABLE_HEADER       *Table,
476*bc36eafdSMike Gerdts     FILE                    *File,
477*bc36eafdSMike Gerdts     ACPI_OWNER_ID           OwnerId)
478*bc36eafdSMike Gerdts {
479*bc36eafdSMike Gerdts     ACPI_STATUS             Status;
480*bc36eafdSMike Gerdts 
481*bc36eafdSMike Gerdts 
482*bc36eafdSMike Gerdts     fprintf (stderr,
483*bc36eafdSMike Gerdts         "\nFound %u external control methods, "
484*bc36eafdSMike Gerdts         "reparsing with new information\n",
485*bc36eafdSMike Gerdts         AcpiDmGetExternalMethodCount ());
486*bc36eafdSMike Gerdts 
487*bc36eafdSMike Gerdts     /* Reparse, rebuild namespace */
488*bc36eafdSMike Gerdts 
489*bc36eafdSMike Gerdts     AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
490*bc36eafdSMike Gerdts     AcpiGbl_ParseOpRoot = NULL;
491*bc36eafdSMike Gerdts     AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode);
492*bc36eafdSMike Gerdts 
493*bc36eafdSMike Gerdts     AcpiGbl_RootNode                    = NULL;
494*bc36eafdSMike Gerdts     AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
495*bc36eafdSMike Gerdts     AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
496*bc36eafdSMike Gerdts     AcpiGbl_RootNodeStruct.Type         = ACPI_TYPE_DEVICE;
497*bc36eafdSMike Gerdts     AcpiGbl_RootNodeStruct.Parent       = NULL;
498*bc36eafdSMike Gerdts     AcpiGbl_RootNodeStruct.Child        = NULL;
499*bc36eafdSMike Gerdts     AcpiGbl_RootNodeStruct.Peer         = NULL;
500*bc36eafdSMike Gerdts     AcpiGbl_RootNodeStruct.Object       = NULL;
501*bc36eafdSMike Gerdts     AcpiGbl_RootNodeStruct.Flags        = 0;
502*bc36eafdSMike Gerdts 
503*bc36eafdSMike Gerdts     Status = AcpiNsRootInitialize ();
504*bc36eafdSMike Gerdts     if (ACPI_FAILURE (Status))
505*bc36eafdSMike Gerdts     {
506*bc36eafdSMike Gerdts         return (Status);
507*bc36eafdSMike Gerdts     }
508*bc36eafdSMike Gerdts 
509*bc36eafdSMike Gerdts     /* New namespace, add the external definitions first */
510*bc36eafdSMike Gerdts 
511*bc36eafdSMike Gerdts     AcpiDmAddExternalsToNamespace ();
512*bc36eafdSMike Gerdts 
513*bc36eafdSMike Gerdts     /* Parse the table again. No need to reload it, however */
514*bc36eafdSMike Gerdts 
515*bc36eafdSMike Gerdts     Status = AdParseTable (Table, NULL, FALSE, FALSE);
516*bc36eafdSMike Gerdts     if (ACPI_FAILURE (Status))
517*bc36eafdSMike Gerdts     {
518*bc36eafdSMike Gerdts         AcpiOsPrintf ("Could not parse ACPI tables, %s\n",
519*bc36eafdSMike Gerdts             AcpiFormatException (Status));
520*bc36eafdSMike Gerdts         return (Status);
521*bc36eafdSMike Gerdts     }
522*bc36eafdSMike Gerdts 
523*bc36eafdSMike Gerdts     /* Cross reference the namespace again */
524*bc36eafdSMike Gerdts 
525*bc36eafdSMike Gerdts     AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot,
526*bc36eafdSMike Gerdts         AcpiGbl_RootNode, OwnerId);
527*bc36eafdSMike Gerdts 
528*bc36eafdSMike Gerdts     AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot,
529*bc36eafdSMike Gerdts         AcpiGbl_RootNode, OwnerId);
530*bc36eafdSMike Gerdts 
531*bc36eafdSMike Gerdts     /* Debug output - namespace and parse tree */
532*bc36eafdSMike Gerdts 
533*bc36eafdSMike Gerdts     if (AslCompilerdebug)
534*bc36eafdSMike Gerdts     {
535*bc36eafdSMike Gerdts         AcpiOsPrintf ("/**** After second load and resource conversion\n");
536*bc36eafdSMike Gerdts         if (File)
537*bc36eafdSMike Gerdts         {
538*bc36eafdSMike Gerdts             NsSetupNamespaceListing (File);
539*bc36eafdSMike Gerdts             NsDisplayNamespace ();
540*bc36eafdSMike Gerdts         }
541*bc36eafdSMike Gerdts 
542*bc36eafdSMike Gerdts         AcpiOsPrintf ("*****/\n");
543*bc36eafdSMike Gerdts         AcpiDmDumpTree (AcpiGbl_ParseOpRoot);
544*bc36eafdSMike Gerdts     }
545*bc36eafdSMike Gerdts 
546*bc36eafdSMike Gerdts     return (AE_OK);
547*bc36eafdSMike Gerdts }
548*bc36eafdSMike Gerdts 
549*bc36eafdSMike Gerdts 
550*bc36eafdSMike Gerdts /******************************************************************************
551*bc36eafdSMike Gerdts  *
552*bc36eafdSMike Gerdts  * FUNCTION:    AdDoExternalFileList
553*bc36eafdSMike Gerdts  *
554*bc36eafdSMike Gerdts  * PARAMETERS:  Filename            - Input file for the table
555*bc36eafdSMike Gerdts  *
556*bc36eafdSMike Gerdts  * RETURN:      Status
557*bc36eafdSMike Gerdts  *
558*bc36eafdSMike Gerdts  * DESCRIPTION: Process all tables found in the -e external files list
559*bc36eafdSMike Gerdts  *
560*bc36eafdSMike Gerdts  *****************************************************************************/
561*bc36eafdSMike Gerdts 
562*bc36eafdSMike Gerdts static ACPI_STATUS
563*bc36eafdSMike Gerdts AdDoExternalFileList (
564*bc36eafdSMike Gerdts     char                    *Filename)
565*bc36eafdSMike Gerdts {
566*bc36eafdSMike Gerdts     ACPI_EXTERNAL_FILE      *ExternalFileList;
567*bc36eafdSMike Gerdts     char                    *ExternalFilename;
568*bc36eafdSMike Gerdts     ACPI_NEW_TABLE_DESC     *ExternalListHead = NULL;
569*bc36eafdSMike Gerdts     ACPI_STATUS             Status;
570*bc36eafdSMike Gerdts     ACPI_STATUS             GlobalStatus = AE_OK;
571*bc36eafdSMike Gerdts     ACPI_OWNER_ID           OwnerId;
572*bc36eafdSMike Gerdts 
573*bc36eafdSMike Gerdts 
574*bc36eafdSMike Gerdts     /*
575*bc36eafdSMike Gerdts      * External filenames are specified on the command line like this:
576*bc36eafdSMike Gerdts      * Example: iasl -e file1,file2,file3 -d xxx.aml
577*bc36eafdSMike Gerdts      */
578*bc36eafdSMike Gerdts     ExternalFileList = AcpiGbl_ExternalFileList;
579*bc36eafdSMike Gerdts 
580*bc36eafdSMike Gerdts     /* Process each external file */
581*bc36eafdSMike Gerdts 
582*bc36eafdSMike Gerdts     while (ExternalFileList)
583*bc36eafdSMike Gerdts     {
584*bc36eafdSMike Gerdts         ExternalFilename = ExternalFileList->Path;
585*bc36eafdSMike Gerdts         if (!strcmp (ExternalFilename, Filename))
586*bc36eafdSMike Gerdts         {
587*bc36eafdSMike Gerdts             /* Next external file */
588*bc36eafdSMike Gerdts 
589*bc36eafdSMike Gerdts             ExternalFileList = ExternalFileList->Next;
590*bc36eafdSMike Gerdts             continue;
591*bc36eafdSMike Gerdts         }
592*bc36eafdSMike Gerdts 
593*bc36eafdSMike Gerdts         AcpiOsPrintf ("External object resolution file %16s\n",
594*bc36eafdSMike Gerdts             ExternalFilename);
595*bc36eafdSMike Gerdts 
596*bc36eafdSMike Gerdts         Status = AcGetAllTablesFromFile (
597*bc36eafdSMike Gerdts             ExternalFilename, ACPI_GET_ONLY_AML_TABLES, &ExternalListHead);
598*bc36eafdSMike Gerdts         if (ACPI_FAILURE (Status))
599*bc36eafdSMike Gerdts         {
600*bc36eafdSMike Gerdts             if (Status == AE_TYPE)
601*bc36eafdSMike Gerdts             {
602*bc36eafdSMike Gerdts                 ExternalFileList = ExternalFileList->Next;
603*bc36eafdSMike Gerdts                 GlobalStatus = AE_TYPE;
604*bc36eafdSMike Gerdts                 Status = AE_OK;
605*bc36eafdSMike Gerdts                 continue;
606*bc36eafdSMike Gerdts             }
607*bc36eafdSMike Gerdts 
608*bc36eafdSMike Gerdts             return (Status);
609*bc36eafdSMike Gerdts         }
610*bc36eafdSMike Gerdts 
611*bc36eafdSMike Gerdts         /* Load external tables for symbol resolution */
612*bc36eafdSMike Gerdts 
613*bc36eafdSMike Gerdts         while (ExternalListHead)
614*bc36eafdSMike Gerdts         {
615*bc36eafdSMike Gerdts             Status = AdParseTable (
616*bc36eafdSMike Gerdts                 ExternalListHead->Table, &OwnerId, TRUE, TRUE);
617*bc36eafdSMike Gerdts             if (ACPI_FAILURE (Status))
618*bc36eafdSMike Gerdts             {
619*bc36eafdSMike Gerdts                 AcpiOsPrintf ("Could not parse external ACPI tables, %s\n",
620*bc36eafdSMike Gerdts                     AcpiFormatException (Status));
621*bc36eafdSMike Gerdts                 return (Status);
622*bc36eafdSMike Gerdts             }
623*bc36eafdSMike Gerdts 
624*bc36eafdSMike Gerdts             /*
625*bc36eafdSMike Gerdts              * Load namespace from names created within control methods
626*bc36eafdSMike Gerdts              * Set owner id of nodes in external table
627*bc36eafdSMike Gerdts              */
628*bc36eafdSMike Gerdts             AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot,
629*bc36eafdSMike Gerdts                 AcpiGbl_RootNode, OwnerId);
630*bc36eafdSMike Gerdts             AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
631*bc36eafdSMike Gerdts 
632*bc36eafdSMike Gerdts             ExternalListHead = ExternalListHead->Next;
633*bc36eafdSMike Gerdts         }
634*bc36eafdSMike Gerdts 
635*bc36eafdSMike Gerdts         /* Next external file */
636*bc36eafdSMike Gerdts 
637*bc36eafdSMike Gerdts         ExternalFileList = ExternalFileList->Next;
638*bc36eafdSMike Gerdts     }
639*bc36eafdSMike Gerdts 
640*bc36eafdSMike Gerdts     if (ACPI_FAILURE (GlobalStatus))
641*bc36eafdSMike Gerdts     {
642*bc36eafdSMike Gerdts         return (GlobalStatus);
643*bc36eafdSMike Gerdts     }
644*bc36eafdSMike Gerdts 
645*bc36eafdSMike Gerdts     /* Clear external list generated by Scope in external tables */
646*bc36eafdSMike Gerdts 
647*bc36eafdSMike Gerdts     if (AcpiGbl_ExternalFileList)
648*bc36eafdSMike Gerdts     {
649*bc36eafdSMike Gerdts         AcpiDmClearExternalList ();
650*bc36eafdSMike Gerdts     }
651*bc36eafdSMike Gerdts 
652*bc36eafdSMike Gerdts     /* Load any externals defined in the optional external ref file */
653*bc36eafdSMike Gerdts 
654*bc36eafdSMike Gerdts     AcpiDmGetExternalsFromFile ();
655*bc36eafdSMike Gerdts     return (AE_OK);
656*bc36eafdSMike Gerdts }
657