xref: /dflybsd-src/sys/contrib/dev/acpica/source/common/dmtables.c (revision 383048aca08c2de51d27aa8638a36982a0d74550)
1 820c5b08SSascha Wildner /******************************************************************************
2 820c5b08SSascha Wildner  *
3 820c5b08SSascha Wildner  * Module Name: dmtables - disassembler ACPI table support
4 820c5b08SSascha Wildner  *
5 820c5b08SSascha Wildner  *****************************************************************************/
6 820c5b08SSascha Wildner 
7 b4315fc7SSascha Wildner /******************************************************************************
8 b4315fc7SSascha Wildner  *
9 b4315fc7SSascha Wildner  * 1. Copyright Notice
10 b4315fc7SSascha Wildner  *
11 *383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
12 820c5b08SSascha Wildner  * All rights reserved.
13 820c5b08SSascha Wildner  *
14 b4315fc7SSascha Wildner  * 2. License
15 b4315fc7SSascha Wildner  *
16 b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17 b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18 b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19 b4315fc7SSascha Wildner  * property rights.
20 b4315fc7SSascha Wildner  *
21 b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22 b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23 b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24 b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25 b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26 b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27 b4315fc7SSascha Wildner  *
28 b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29 b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30 b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31 b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32 b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33 b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34 b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35 b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36 b4315fc7SSascha Wildner  *
37 b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38 b4315fc7SSascha Wildner  * conditions are met:
39 b4315fc7SSascha Wildner  *
40 b4315fc7SSascha Wildner  * 3. Conditions
41 b4315fc7SSascha Wildner  *
42 b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43 b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44 b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45 b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46 b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47 b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48 b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49 b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50 b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51 b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52 b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53 b4315fc7SSascha Wildner  *
54 b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55 b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56 b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57 b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58 b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59 b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60 b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61 b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62 b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63 b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64 b4315fc7SSascha Wildner  * make.
65 b4315fc7SSascha Wildner  *
66 b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67 b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68 b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69 b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70 b4315fc7SSascha Wildner  * distribution.
71 b4315fc7SSascha Wildner  *
72 b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73 b4315fc7SSascha Wildner  * Intel Code.
74 b4315fc7SSascha Wildner  *
75 b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76 b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77 b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78 b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79 b4315fc7SSascha Wildner  *
80 b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81 b4315fc7SSascha Wildner  *
82 b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83 b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84 b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85 b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86 b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87 b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88 b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
89 b4315fc7SSascha Wildner  *
90 b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91 b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92 b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93 b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94 b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95 b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96 b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97 b4315fc7SSascha Wildner  * LIMITED REMEDY.
98 b4315fc7SSascha Wildner  *
99 b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100 b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
101 b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
102 b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
103 b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
104 b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
105 b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
106 b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
107 b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108 b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
109 b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
110 b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
111 b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
112 b4315fc7SSascha Wildner  * such license, approval or letter.
113 b4315fc7SSascha Wildner  *
114 b4315fc7SSascha Wildner  *****************************************************************************
115 b4315fc7SSascha Wildner  *
116 b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
117 b4315fc7SSascha Wildner  * following license:
118 b4315fc7SSascha Wildner  *
119 820c5b08SSascha Wildner  * Redistribution and use in source and binary forms, with or without
120 820c5b08SSascha Wildner  * modification, are permitted provided that the following conditions
121 820c5b08SSascha Wildner  * are met:
122 820c5b08SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
123 820c5b08SSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
124 820c5b08SSascha Wildner  *    without modification.
125 820c5b08SSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126 820c5b08SSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
127 820c5b08SSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
128 820c5b08SSascha Wildner  *    including a substantially similar Disclaimer requirement for further
129 820c5b08SSascha Wildner  *    binary redistribution.
130 820c5b08SSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
131 820c5b08SSascha Wildner  *    of any contributors may be used to endorse or promote products derived
132 820c5b08SSascha Wildner  *    from this software without specific prior written permission.
133 820c5b08SSascha Wildner  *
134 b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135 b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136 b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137 b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138 b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139 b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140 b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141 b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142 b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143 b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144 b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145 b4315fc7SSascha Wildner  *
146 b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
147 820c5b08SSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
148 820c5b08SSascha Wildner  * Software Foundation.
149 820c5b08SSascha Wildner  *
150 b4315fc7SSascha Wildner  *****************************************************************************/
151 820c5b08SSascha Wildner 
152 820c5b08SSascha Wildner #include "aslcompiler.h"
153 820c5b08SSascha Wildner #include "acdispat.h"
154 820c5b08SSascha Wildner #include "acnamesp.h"
155 820c5b08SSascha Wildner #include "actables.h"
156 820c5b08SSascha Wildner #include "acparser.h"
157 277350a0SSascha Wildner #include "acapps.h"
158 d638c6eeSSascha Wildner #include "acmacros.h"
159 d638c6eeSSascha Wildner #include "acconvert.h"
160 820c5b08SSascha Wildner 
161 820c5b08SSascha Wildner 
162 820c5b08SSascha Wildner #define _COMPONENT          ACPI_TOOLS
163 820c5b08SSascha Wildner         ACPI_MODULE_NAME    ("dmtables")
164 820c5b08SSascha Wildner 
165 820c5b08SSascha Wildner 
166 820c5b08SSascha Wildner /* Local prototypes */
167 820c5b08SSascha Wildner 
168 820c5b08SSascha Wildner static void
169 820c5b08SSascha Wildner AdCreateTableHeader (
170 820c5b08SSascha Wildner     char                    *Filename,
171 820c5b08SSascha Wildner     ACPI_TABLE_HEADER       *Table);
172 820c5b08SSascha Wildner 
173 820c5b08SSascha Wildner static ACPI_STATUS
174 820c5b08SSascha Wildner AdStoreTable (
175 820c5b08SSascha Wildner     ACPI_TABLE_HEADER       *Table,
176 820c5b08SSascha Wildner     UINT32                  *TableIndex);
177 820c5b08SSascha Wildner 
178 820c5b08SSascha Wildner 
179 820c5b08SSascha Wildner extern ACPI_TABLE_DESC      LocalTables[1];
180 820c5b08SSascha Wildner extern ACPI_PARSE_OBJECT    *AcpiGbl_ParseOpRoot;
181 820c5b08SSascha Wildner 
182 820c5b08SSascha Wildner 
183 820c5b08SSascha Wildner /******************************************************************************
184 820c5b08SSascha Wildner  *
185 820c5b08SSascha Wildner  * FUNCTION:    AdDisassemblerHeader
186 820c5b08SSascha Wildner  *
187 820c5b08SSascha Wildner  * PARAMETERS:  Filename            - Input file for the table
188 820c5b08SSascha Wildner  *              TableType           - Either AML or DataTable
189 820c5b08SSascha Wildner  *
190 820c5b08SSascha Wildner  * RETURN:      None
191 820c5b08SSascha Wildner  *
192 820c5b08SSascha Wildner  * DESCRIPTION: Create the disassembler header, including ACPICA signon with
193 820c5b08SSascha Wildner  *              current time and date.
194 820c5b08SSascha Wildner  *
195 820c5b08SSascha Wildner  *****************************************************************************/
196 820c5b08SSascha Wildner 
197 820c5b08SSascha Wildner void
AdDisassemblerHeader(char * Filename,UINT8 TableType)198 820c5b08SSascha Wildner AdDisassemblerHeader (
199 820c5b08SSascha Wildner     char                    *Filename,
200 820c5b08SSascha Wildner     UINT8                   TableType)
201 820c5b08SSascha Wildner {
202 820c5b08SSascha Wildner     time_t                  Timer;
203 820c5b08SSascha Wildner 
204 820c5b08SSascha Wildner 
205 820c5b08SSascha Wildner     time (&Timer);
206 820c5b08SSascha Wildner 
207 820c5b08SSascha Wildner     /* Header and input table info */
208 820c5b08SSascha Wildner 
209 820c5b08SSascha Wildner     AcpiOsPrintf ("/*\n");
210 820c5b08SSascha Wildner     AcpiOsPrintf (ACPI_COMMON_HEADER (AML_DISASSEMBLER_NAME, " * "));
211 820c5b08SSascha Wildner 
212 820c5b08SSascha Wildner     if (TableType == ACPI_IS_AML_TABLE)
213 820c5b08SSascha Wildner     {
214 820c5b08SSascha Wildner         if (AcpiGbl_CstyleDisassembly)
215 820c5b08SSascha Wildner         {
216 820c5b08SSascha Wildner             AcpiOsPrintf (
217 820c5b08SSascha Wildner                 " * Disassembling to symbolic ASL+ operators\n"
218 820c5b08SSascha Wildner                 " *\n");
219 820c5b08SSascha Wildner         }
220 820c5b08SSascha Wildner         else
221 820c5b08SSascha Wildner         {
222 820c5b08SSascha Wildner             AcpiOsPrintf (
223 820c5b08SSascha Wildner                 " * Disassembling to non-symbolic legacy ASL operators\n"
224 820c5b08SSascha Wildner                 " *\n");
225 820c5b08SSascha Wildner         }
226 820c5b08SSascha Wildner     }
227 820c5b08SSascha Wildner 
228 820c5b08SSascha Wildner     AcpiOsPrintf (" * Disassembly of %s, %s", Filename, ctime (&Timer));
229 820c5b08SSascha Wildner     AcpiOsPrintf (" *\n");
230 820c5b08SSascha Wildner }
231 820c5b08SSascha Wildner 
232 820c5b08SSascha Wildner 
233 820c5b08SSascha Wildner /******************************************************************************
234 820c5b08SSascha Wildner  *
235 820c5b08SSascha Wildner  * FUNCTION:    AdCreateTableHeader
236 820c5b08SSascha Wildner  *
237 820c5b08SSascha Wildner  * PARAMETERS:  Filename            - Input file for the table
238 820c5b08SSascha Wildner  *              Table               - Pointer to the raw table
239 820c5b08SSascha Wildner  *
240 820c5b08SSascha Wildner  * RETURN:      None
241 820c5b08SSascha Wildner  *
242 820c5b08SSascha Wildner  * DESCRIPTION: Create the ASL table header, including ACPICA signon with
243 820c5b08SSascha Wildner  *              current time and date.
244 820c5b08SSascha Wildner  *
245 820c5b08SSascha Wildner  *****************************************************************************/
246 820c5b08SSascha Wildner 
247 820c5b08SSascha Wildner static void
AdCreateTableHeader(char * Filename,ACPI_TABLE_HEADER * Table)248 820c5b08SSascha Wildner AdCreateTableHeader (
249 820c5b08SSascha Wildner     char                    *Filename,
250 820c5b08SSascha Wildner     ACPI_TABLE_HEADER       *Table)
251 820c5b08SSascha Wildner {
252 820c5b08SSascha Wildner     UINT8                   Checksum;
253 820c5b08SSascha Wildner 
254 820c5b08SSascha Wildner 
255 7c9678bcSSascha Wildner     /* Reset globals for External statements */
256 7c9678bcSSascha Wildner 
257 7c9678bcSSascha Wildner     AcpiGbl_NumExternalMethods = 0;
258 7c9678bcSSascha Wildner     AcpiGbl_ResolvedExternalMethods = 0;
259 7c9678bcSSascha Wildner 
260 820c5b08SSascha Wildner     /*
261 820c5b08SSascha Wildner      * Print file header and dump original table header
262 820c5b08SSascha Wildner      */
263 820c5b08SSascha Wildner     AdDisassemblerHeader (Filename, ACPI_IS_AML_TABLE);
264 820c5b08SSascha Wildner 
265 820c5b08SSascha Wildner     AcpiOsPrintf (" * Original Table Header:\n");
266 820c5b08SSascha Wildner     AcpiOsPrintf (" *     Signature        \"%4.4s\"\n",    Table->Signature);
267 820c5b08SSascha Wildner     AcpiOsPrintf (" *     Length           0x%8.8X (%u)\n", Table->Length, Table->Length);
268 820c5b08SSascha Wildner 
269 820c5b08SSascha Wildner     /* Print and validate the revision */
270 820c5b08SSascha Wildner 
271 820c5b08SSascha Wildner     AcpiOsPrintf (" *     Revision         0x%2.2X",      Table->Revision);
272 820c5b08SSascha Wildner 
273 820c5b08SSascha Wildner     switch (Table->Revision)
274 820c5b08SSascha Wildner     {
275 820c5b08SSascha Wildner     case 0:
276 820c5b08SSascha Wildner 
277 820c5b08SSascha Wildner         AcpiOsPrintf (" **** Invalid Revision");
278 820c5b08SSascha Wildner         break;
279 820c5b08SSascha Wildner 
280 820c5b08SSascha Wildner     case 1:
281 820c5b08SSascha Wildner 
282 820c5b08SSascha Wildner         /* Revision of DSDT controls the ACPI integer width */
283 820c5b08SSascha Wildner 
284 c1776041SSascha Wildner         if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_DSDT))
285 820c5b08SSascha Wildner         {
286 820c5b08SSascha Wildner             AcpiOsPrintf (" **** 32-bit table (V1), no 64-bit math support");
287 820c5b08SSascha Wildner         }
288 820c5b08SSascha Wildner         break;
289 820c5b08SSascha Wildner 
290 820c5b08SSascha Wildner     default:
291 820c5b08SSascha Wildner 
292 820c5b08SSascha Wildner         break;
293 820c5b08SSascha Wildner     }
294 820c5b08SSascha Wildner 
295 820c5b08SSascha Wildner     /* Print and validate the table checksum */
296 820c5b08SSascha Wildner 
297 2ffe9f16SSascha Wildner     AcpiOsPrintf ("\n *     Checksum         0x%2.2X",        Table->Checksum);
298 820c5b08SSascha Wildner 
299 820c5b08SSascha Wildner     Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length);
300 820c5b08SSascha Wildner     if (Checksum)
301 820c5b08SSascha Wildner     {
302 820c5b08SSascha Wildner         AcpiOsPrintf (" **** Incorrect checksum, should be 0x%2.2X",
303 820c5b08SSascha Wildner             (UINT8) (Table->Checksum - Checksum));
304 820c5b08SSascha Wildner     }
305 820c5b08SSascha Wildner 
306 820c5b08SSascha Wildner     AcpiOsPrintf ("\n");
307 820c5b08SSascha Wildner     AcpiOsPrintf (" *     OEM ID           \"%.6s\"\n",     Table->OemId);
308 820c5b08SSascha Wildner     AcpiOsPrintf (" *     OEM Table ID     \"%.8s\"\n",     Table->OemTableId);
309 820c5b08SSascha Wildner     AcpiOsPrintf (" *     OEM Revision     0x%8.8X (%u)\n", Table->OemRevision, Table->OemRevision);
310 820c5b08SSascha Wildner     AcpiOsPrintf (" *     Compiler ID      \"%.4s\"\n",     Table->AslCompilerId);
311 820c5b08SSascha Wildner     AcpiOsPrintf (" *     Compiler Version 0x%8.8X (%u)\n", Table->AslCompilerRevision, Table->AslCompilerRevision);
312 820c5b08SSascha Wildner     AcpiOsPrintf (" */\n");
313 820c5b08SSascha Wildner 
314 2ffe9f16SSascha Wildner     /*
315 d638c6eeSSascha Wildner      * Print comments that come before this definition block.
316 d638c6eeSSascha Wildner      */
317 7bcb6cafSSascha Wildner     if (AcpiGbl_CaptureComments)
318 d638c6eeSSascha Wildner     {
319 d638c6eeSSascha Wildner         ASL_CV_PRINT_ONE_COMMENT(AcpiGbl_ParseOpRoot,AML_COMMENT_STANDARD, NULL, 0);
320 d638c6eeSSascha Wildner     }
321 d638c6eeSSascha Wildner 
322 d638c6eeSSascha Wildner     /*
323 2ffe9f16SSascha Wildner      * Open the ASL definition block.
324 2ffe9f16SSascha Wildner      *
325 2ffe9f16SSascha Wildner      * Note: the AMLFilename string is left zero-length in order to just let
326 2ffe9f16SSascha Wildner      * the compiler create it when the disassembled file is compiled. This
327 2ffe9f16SSascha Wildner      * makes it easier to rename the disassembled ASL file if needed.
328 2ffe9f16SSascha Wildner      */
329 820c5b08SSascha Wildner     AcpiOsPrintf (
330 e5412f1eSSascha Wildner         "DefinitionBlock (\"\", \"%4.4s\", %u, \"%.6s\", \"%.8s\", 0x%8.8X)\n",
331 2ffe9f16SSascha Wildner         Table->Signature, Table->Revision,
332 820c5b08SSascha Wildner         Table->OemId, Table->OemTableId, Table->OemRevision);
333 820c5b08SSascha Wildner }
334 820c5b08SSascha Wildner 
335 820c5b08SSascha Wildner 
336 820c5b08SSascha Wildner /******************************************************************************
337 820c5b08SSascha Wildner  *
338 820c5b08SSascha Wildner  * FUNCTION:    AdDisplayTables
339 820c5b08SSascha Wildner  *
340 820c5b08SSascha Wildner  * PARAMETERS:  Filename            - Input file for the table
341 820c5b08SSascha Wildner  *              Table               - Pointer to the raw table
342 820c5b08SSascha Wildner  *
343 820c5b08SSascha Wildner  * RETURN:      Status
344 820c5b08SSascha Wildner  *
345 820c5b08SSascha Wildner  * DESCRIPTION: Display (disassemble) loaded tables and dump raw tables
346 820c5b08SSascha Wildner  *
347 820c5b08SSascha Wildner  *****************************************************************************/
348 820c5b08SSascha Wildner 
349 820c5b08SSascha Wildner ACPI_STATUS
AdDisplayTables(char * Filename,ACPI_TABLE_HEADER * Table)350 820c5b08SSascha Wildner AdDisplayTables (
351 820c5b08SSascha Wildner     char                    *Filename,
352 820c5b08SSascha Wildner     ACPI_TABLE_HEADER       *Table)
353 820c5b08SSascha Wildner {
354 820c5b08SSascha Wildner 
355 820c5b08SSascha Wildner 
356 820c5b08SSascha Wildner     if (!AcpiGbl_ParseOpRoot)
357 820c5b08SSascha Wildner     {
358 820c5b08SSascha Wildner         return (AE_NOT_EXIST);
359 820c5b08SSascha Wildner     }
360 820c5b08SSascha Wildner 
361 820c5b08SSascha Wildner     if (!AcpiGbl_DmOpt_Listing)
362 820c5b08SSascha Wildner     {
363 820c5b08SSascha Wildner         AdCreateTableHeader (Filename, Table);
364 820c5b08SSascha Wildner     }
365 820c5b08SSascha Wildner 
366 820c5b08SSascha Wildner     AcpiDmDisassemble (NULL, AcpiGbl_ParseOpRoot, ACPI_UINT32_MAX);
367 820c5b08SSascha Wildner     MpEmitMappingInfo ();
368 820c5b08SSascha Wildner 
369 820c5b08SSascha Wildner     if (AcpiGbl_DmOpt_Listing)
370 820c5b08SSascha Wildner     {
371 820c5b08SSascha Wildner         AcpiOsPrintf ("\n\nTable Header:\n");
372 820c5b08SSascha Wildner         AcpiUtDebugDumpBuffer ((UINT8 *) Table, sizeof (ACPI_TABLE_HEADER),
373 820c5b08SSascha Wildner             DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
374 820c5b08SSascha Wildner 
375 820c5b08SSascha Wildner         AcpiOsPrintf ("Table Body (Length 0x%X)\n", Table->Length);
376 820c5b08SSascha Wildner         AcpiUtDebugDumpBuffer (((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER)),
377 820c5b08SSascha Wildner             Table->Length, DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
378 820c5b08SSascha Wildner     }
379 820c5b08SSascha Wildner 
380 820c5b08SSascha Wildner     return (AE_OK);
381 820c5b08SSascha Wildner }
382 820c5b08SSascha Wildner 
383 820c5b08SSascha Wildner 
384 820c5b08SSascha Wildner /*******************************************************************************
385 820c5b08SSascha Wildner  *
386 820c5b08SSascha Wildner  * FUNCTION:    AdStoreTable
387 820c5b08SSascha Wildner  *
388 820c5b08SSascha Wildner  * PARAMETERS:  Table               - Table header
389 820c5b08SSascha Wildner  *              TableIndex          - Where the table index is returned
390 820c5b08SSascha Wildner  *
391 820c5b08SSascha Wildner  * RETURN:      Status and table index.
392 820c5b08SSascha Wildner  *
393 820c5b08SSascha Wildner  * DESCRIPTION: Add an ACPI table to the global table list
394 820c5b08SSascha Wildner  *
395 820c5b08SSascha Wildner  ******************************************************************************/
396 820c5b08SSascha Wildner 
397 820c5b08SSascha Wildner static ACPI_STATUS
AdStoreTable(ACPI_TABLE_HEADER * Table,UINT32 * TableIndex)398 820c5b08SSascha Wildner AdStoreTable (
399 820c5b08SSascha Wildner     ACPI_TABLE_HEADER       *Table,
400 820c5b08SSascha Wildner     UINT32                  *TableIndex)
401 820c5b08SSascha Wildner {
402 820c5b08SSascha Wildner     ACPI_STATUS             Status;
403 820c5b08SSascha Wildner     ACPI_TABLE_DESC         *TableDesc;
404 820c5b08SSascha Wildner 
405 820c5b08SSascha Wildner 
406 820c5b08SSascha Wildner     Status = AcpiTbGetNextTableDescriptor (TableIndex, &TableDesc);
407 820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
408 820c5b08SSascha Wildner     {
409 820c5b08SSascha Wildner         return (Status);
410 820c5b08SSascha Wildner     }
411 820c5b08SSascha Wildner 
412 820c5b08SSascha Wildner     /* Initialize added table */
413 820c5b08SSascha Wildner 
414 820c5b08SSascha Wildner     AcpiTbInitTableDescriptor (TableDesc, ACPI_PTR_TO_PHYSADDR (Table),
415 820c5b08SSascha Wildner         ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, Table);
416 820c5b08SSascha Wildner     Status = AcpiTbValidateTable (TableDesc);
417 820c5b08SSascha Wildner     return (Status);
418 820c5b08SSascha Wildner }
419 820c5b08SSascha Wildner 
420 820c5b08SSascha Wildner 
421 820c5b08SSascha Wildner /******************************************************************************
422 820c5b08SSascha Wildner  *
423 820c5b08SSascha Wildner  * FUNCTION:    AdGetLocalTables
424 820c5b08SSascha Wildner  *
425 820c5b08SSascha Wildner  * PARAMETERS:  None
426 820c5b08SSascha Wildner  *
427 820c5b08SSascha Wildner  * RETURN:      Status
428 820c5b08SSascha Wildner  *
429 820c5b08SSascha Wildner  * DESCRIPTION: Get the ACPI tables from either memory or a file
430 820c5b08SSascha Wildner  *
431 820c5b08SSascha Wildner  *****************************************************************************/
432 820c5b08SSascha Wildner 
433 820c5b08SSascha Wildner ACPI_STATUS
AdGetLocalTables(void)434 820c5b08SSascha Wildner AdGetLocalTables (
435 820c5b08SSascha Wildner     void)
436 820c5b08SSascha Wildner {
437 820c5b08SSascha Wildner     ACPI_STATUS             Status;
438 820c5b08SSascha Wildner     ACPI_TABLE_HEADER       TableHeader;
439 820c5b08SSascha Wildner     ACPI_TABLE_HEADER       *NewTable;
440 820c5b08SSascha Wildner     UINT32                  TableIndex;
441 820c5b08SSascha Wildner 
442 820c5b08SSascha Wildner 
443 820c5b08SSascha Wildner     /* Get the DSDT via table override */
444 820c5b08SSascha Wildner 
445 820c5b08SSascha Wildner     ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_DSDT);
446 e5412f1eSSascha Wildner     Status = AcpiOsTableOverride (&TableHeader, &NewTable);
447 e5412f1eSSascha Wildner     if (ACPI_FAILURE (Status) || !NewTable)
448 820c5b08SSascha Wildner     {
449 820c5b08SSascha Wildner         fprintf (stderr, "Could not obtain DSDT\n");
450 820c5b08SSascha Wildner         return (AE_NO_ACPI_TABLES);
451 820c5b08SSascha Wildner     }
452 820c5b08SSascha Wildner 
453 820c5b08SSascha Wildner     AdWriteTable (NewTable, NewTable->Length,
454 820c5b08SSascha Wildner         ACPI_SIG_DSDT, NewTable->OemTableId);
455 820c5b08SSascha Wildner 
456 820c5b08SSascha Wildner     /* Store DSDT in the Table Manager */
457 820c5b08SSascha Wildner 
458 820c5b08SSascha Wildner     Status = AdStoreTable (NewTable, &TableIndex);
459 820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
460 820c5b08SSascha Wildner     {
461 820c5b08SSascha Wildner         fprintf (stderr, "Could not store DSDT\n");
462 820c5b08SSascha Wildner         return (AE_NO_ACPI_TABLES);
463 820c5b08SSascha Wildner     }
464 820c5b08SSascha Wildner 
465 820c5b08SSascha Wildner     return (AE_OK);
466 820c5b08SSascha Wildner }
467 820c5b08SSascha Wildner 
468 820c5b08SSascha Wildner 
469 820c5b08SSascha Wildner /******************************************************************************
470 820c5b08SSascha Wildner  *
471 820c5b08SSascha Wildner  * FUNCTION:    AdParseTable
472 820c5b08SSascha Wildner  *
473 820c5b08SSascha Wildner  * PARAMETERS:  Table               - Pointer to the raw table
474 820c5b08SSascha Wildner  *              OwnerId             - Returned OwnerId of the table
475 820c5b08SSascha Wildner  *              LoadTable           - If add table to the global table list
476 820c5b08SSascha Wildner  *              External            - If this is an external table
477 820c5b08SSascha Wildner  *
478 820c5b08SSascha Wildner  * RETURN:      Status
479 820c5b08SSascha Wildner  *
480 820c5b08SSascha Wildner  * DESCRIPTION: Parse an ACPI AML table
481 820c5b08SSascha Wildner  *
482 820c5b08SSascha Wildner  *****************************************************************************/
483 820c5b08SSascha Wildner 
484 820c5b08SSascha Wildner ACPI_STATUS
AdParseTable(ACPI_TABLE_HEADER * Table,ACPI_OWNER_ID * OwnerId,BOOLEAN LoadTable,BOOLEAN External)485 820c5b08SSascha Wildner AdParseTable (
486 820c5b08SSascha Wildner     ACPI_TABLE_HEADER       *Table,
487 820c5b08SSascha Wildner     ACPI_OWNER_ID           *OwnerId,
488 820c5b08SSascha Wildner     BOOLEAN                 LoadTable,
489 820c5b08SSascha Wildner     BOOLEAN                 External)
490 820c5b08SSascha Wildner {
491 820c5b08SSascha Wildner     ACPI_STATUS             Status = AE_OK;
492 820c5b08SSascha Wildner     ACPI_WALK_STATE         *WalkState;
493 820c5b08SSascha Wildner     UINT8                   *AmlStart;
494 820c5b08SSascha Wildner     UINT32                  AmlLength;
495 820c5b08SSascha Wildner     UINT32                  TableIndex;
496 820c5b08SSascha Wildner 
497 820c5b08SSascha Wildner 
498 820c5b08SSascha Wildner     if (!Table)
499 820c5b08SSascha Wildner     {
500 820c5b08SSascha Wildner         return (AE_NOT_EXIST);
501 820c5b08SSascha Wildner     }
502 820c5b08SSascha Wildner 
503 820c5b08SSascha Wildner     /* Pass 1:  Parse everything except control method bodies */
504 820c5b08SSascha Wildner 
505 820c5b08SSascha Wildner     fprintf (stderr, "Pass 1 parse of [%4.4s]\n", (char *) Table->Signature);
506 820c5b08SSascha Wildner 
507 820c5b08SSascha Wildner     AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
508 820c5b08SSascha Wildner     AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
509 820c5b08SSascha Wildner 
510 e5412f1eSSascha Wildner     AcpiUtSetIntegerWidth (Table->Revision);
511 e5412f1eSSascha Wildner 
512 820c5b08SSascha Wildner     /* Create the root object */
513 820c5b08SSascha Wildner 
514 820c5b08SSascha Wildner     AcpiGbl_ParseOpRoot = AcpiPsCreateScopeOp (AmlStart);
515 820c5b08SSascha Wildner     if (!AcpiGbl_ParseOpRoot)
516 820c5b08SSascha Wildner     {
517 820c5b08SSascha Wildner         return (AE_NO_MEMORY);
518 820c5b08SSascha Wildner     }
519 820c5b08SSascha Wildner 
520 d638c6eeSSascha Wildner #ifdef ACPI_ASL_COMPILER
521 7bcb6cafSSascha Wildner     if (AcpiGbl_CaptureComments)
522 d638c6eeSSascha Wildner     {
523 d638c6eeSSascha Wildner         AcpiGbl_ParseOpRoot->Common.CvFilename = AcpiGbl_FileTreeRoot->Filename;
524 d638c6eeSSascha Wildner     }
525 d638c6eeSSascha Wildner     else
526 d638c6eeSSascha Wildner     {
527 d638c6eeSSascha Wildner         AcpiGbl_ParseOpRoot->Common.CvFilename = NULL;
528 d638c6eeSSascha Wildner     }
529 d638c6eeSSascha Wildner #endif
530 d638c6eeSSascha Wildner 
531 820c5b08SSascha Wildner     /* Create and initialize a new walk state */
532 820c5b08SSascha Wildner 
533 820c5b08SSascha Wildner     WalkState = AcpiDsCreateWalkState (0, AcpiGbl_ParseOpRoot, NULL, NULL);
534 820c5b08SSascha Wildner     if (!WalkState)
535 820c5b08SSascha Wildner     {
536 820c5b08SSascha Wildner         return (AE_NO_MEMORY);
537 820c5b08SSascha Wildner     }
538 820c5b08SSascha Wildner 
539 820c5b08SSascha Wildner     Status = AcpiDsInitAmlWalk (WalkState, AcpiGbl_ParseOpRoot,
540 820c5b08SSascha Wildner         NULL, AmlStart, AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
541 820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
542 820c5b08SSascha Wildner     {
543 820c5b08SSascha Wildner         return (Status);
544 820c5b08SSascha Wildner     }
545 820c5b08SSascha Wildner 
546 820c5b08SSascha Wildner     WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
547 820c5b08SSascha Wildner 
548 820c5b08SSascha Wildner     Status = AcpiPsParseAml (WalkState);
549 820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
550 820c5b08SSascha Wildner     {
551 820c5b08SSascha Wildner         return (Status);
552 820c5b08SSascha Wildner     }
553 820c5b08SSascha Wildner 
554 820c5b08SSascha Wildner     /* If LoadTable is FALSE, we are parsing the last loaded table */
555 820c5b08SSascha Wildner 
556 820c5b08SSascha Wildner     TableIndex = AcpiGbl_RootTableList.CurrentTableCount - 1;
557 820c5b08SSascha Wildner 
558 820c5b08SSascha Wildner     /* Pass 2 */
559 820c5b08SSascha Wildner 
560 820c5b08SSascha Wildner     if (LoadTable)
561 820c5b08SSascha Wildner     {
562 820c5b08SSascha Wildner         Status = AdStoreTable (Table, &TableIndex);
563 820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
564 820c5b08SSascha Wildner         {
565 820c5b08SSascha Wildner             return (Status);
566 820c5b08SSascha Wildner         }
567 820c5b08SSascha Wildner         Status = AcpiTbAllocateOwnerId (TableIndex);
568 820c5b08SSascha Wildner         if (ACPI_FAILURE (Status))
569 820c5b08SSascha Wildner         {
570 820c5b08SSascha Wildner             return (Status);
571 820c5b08SSascha Wildner         }
572 820c5b08SSascha Wildner         if (OwnerId)
573 820c5b08SSascha Wildner         {
574 820c5b08SSascha Wildner             Status = AcpiTbGetOwnerId (TableIndex, OwnerId);
575 820c5b08SSascha Wildner             if (ACPI_FAILURE (Status))
576 820c5b08SSascha Wildner             {
577 820c5b08SSascha Wildner                 return (Status);
578 820c5b08SSascha Wildner             }
579 820c5b08SSascha Wildner         }
580 820c5b08SSascha Wildner     }
581 820c5b08SSascha Wildner 
582 820c5b08SSascha Wildner     fprintf (stderr, "Pass 2 parse of [%4.4s]\n", (char *) Table->Signature);
583 820c5b08SSascha Wildner 
584 820c5b08SSascha Wildner     Status = AcpiNsOneCompleteParse (ACPI_IMODE_LOAD_PASS2, TableIndex, NULL);
585 820c5b08SSascha Wildner     if (ACPI_FAILURE (Status))
586 820c5b08SSascha Wildner     {
587 820c5b08SSascha Wildner         return (Status);
588 820c5b08SSascha Wildner     }
589 820c5b08SSascha Wildner 
590 820c5b08SSascha Wildner     /* No need to parse control methods of external table */
591 820c5b08SSascha Wildner 
592 820c5b08SSascha Wildner     if (External)
593 820c5b08SSascha Wildner     {
594 820c5b08SSascha Wildner         return (AE_OK);
595 820c5b08SSascha Wildner     }
596 820c5b08SSascha Wildner 
597 820c5b08SSascha Wildner     /*
598 820c5b08SSascha Wildner      * Pass 3: Parse control methods and link their parse trees
599 820c5b08SSascha Wildner      * into the main parse tree
600 820c5b08SSascha Wildner      */
601 820c5b08SSascha Wildner     fprintf (stderr,
602 820c5b08SSascha Wildner         "Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)\n");
603 820c5b08SSascha Wildner 
604 e5412f1eSSascha Wildner     (void) AcpiDmParseDeferredOps (AcpiGbl_ParseOpRoot);
605 820c5b08SSascha Wildner     fprintf (stderr, "\n");
606 820c5b08SSascha Wildner 
607 820c5b08SSascha Wildner     /* Process Resource Templates */
608 820c5b08SSascha Wildner 
609 820c5b08SSascha Wildner     AcpiDmFindResources (AcpiGbl_ParseOpRoot);
610 820c5b08SSascha Wildner 
611 820c5b08SSascha Wildner     fprintf (stderr, "Parsing completed\n");
612 820c5b08SSascha Wildner     return (AE_OK);
613 820c5b08SSascha Wildner }
614