xref: /freebsd/sys/contrib/dev/acpica/common/adisasm.c (revision f556842ef620f894156109183a6a500355cd950a)
159db4265SNate Lawson /******************************************************************************
259db4265SNate Lawson  *
359db4265SNate Lawson  * Module Name: adisasm - Application-level disassembler routines
459db4265SNate Lawson  *
559db4265SNate Lawson  *****************************************************************************/
659db4265SNate Lawson 
759db4265SNate Lawson /******************************************************************************
859db4265SNate Lawson  *
959db4265SNate Lawson  * 1. Copyright Notice
1059db4265SNate Lawson  *
11a9f12690SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
1259db4265SNate Lawson  * All rights reserved.
1359db4265SNate Lawson  *
1459db4265SNate Lawson  * 2. License
1559db4265SNate Lawson  *
1659db4265SNate Lawson  * 2.1. This is your license from Intel Corp. under its intellectual property
1759db4265SNate Lawson  * rights.  You may have additional license terms from the party that provided
1859db4265SNate Lawson  * you this software, covering your right to use that party's intellectual
1959db4265SNate Lawson  * property rights.
2059db4265SNate Lawson  *
2159db4265SNate Lawson  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
2259db4265SNate Lawson  * copy of the source code appearing in this file ("Covered Code") an
2359db4265SNate Lawson  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
2459db4265SNate Lawson  * base code distributed originally by Intel ("Original Intel Code") to copy,
2559db4265SNate Lawson  * make derivatives, distribute, use and display any portion of the Covered
2659db4265SNate Lawson  * Code in any form, with the right to sublicense such rights; and
2759db4265SNate Lawson  *
2859db4265SNate Lawson  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
2959db4265SNate Lawson  * license (with the right to sublicense), under only those claims of Intel
3059db4265SNate Lawson  * patents that are infringed by the Original Intel Code, to make, use, sell,
3159db4265SNate Lawson  * offer to sell, and import the Covered Code and derivative works thereof
3259db4265SNate Lawson  * solely to the minimum extent necessary to exercise the above copyright
3359db4265SNate Lawson  * license, and in no event shall the patent license extend to any additions
3459db4265SNate Lawson  * to or modifications of the Original Intel Code.  No other license or right
3559db4265SNate Lawson  * is granted directly or by implication, estoppel or otherwise;
3659db4265SNate Lawson  *
3759db4265SNate Lawson  * The above copyright and patent license is granted only if the following
3859db4265SNate Lawson  * conditions are met:
3959db4265SNate Lawson  *
4059db4265SNate Lawson  * 3. Conditions
4159db4265SNate Lawson  *
4259db4265SNate Lawson  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
4359db4265SNate Lawson  * Redistribution of source code of any substantial portion of the Covered
4459db4265SNate Lawson  * Code or modification with rights to further distribute source must include
4559db4265SNate Lawson  * the above Copyright Notice, the above License, this list of Conditions,
4659db4265SNate Lawson  * and the following Disclaimer and Export Compliance provision.  In addition,
4759db4265SNate Lawson  * Licensee must cause all Covered Code to which Licensee contributes to
4859db4265SNate Lawson  * contain a file documenting the changes Licensee made to create that Covered
4959db4265SNate Lawson  * Code and the date of any change.  Licensee must include in that file the
5059db4265SNate Lawson  * documentation of any changes made by any predecessor Licensee.  Licensee
5159db4265SNate Lawson  * must include a prominent statement that the modification is derived,
5259db4265SNate Lawson  * directly or indirectly, from Original Intel Code.
5359db4265SNate Lawson  *
5459db4265SNate Lawson  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
5559db4265SNate Lawson  * Redistribution of source code of any substantial portion of the Covered
5659db4265SNate Lawson  * Code or modification without rights to further distribute source must
5759db4265SNate Lawson  * include the following Disclaimer and Export Compliance provision in the
5859db4265SNate Lawson  * documentation and/or other materials provided with distribution.  In
5959db4265SNate Lawson  * addition, Licensee may not authorize further sublicense of source of any
6059db4265SNate Lawson  * portion of the Covered Code, and must include terms to the effect that the
6159db4265SNate Lawson  * license from Licensee to its licensee is limited to the intellectual
6259db4265SNate Lawson  * property embodied in the software Licensee provides to its licensee, and
6359db4265SNate Lawson  * not to intellectual property embodied in modifications its licensee may
6459db4265SNate Lawson  * make.
6559db4265SNate Lawson  *
6659db4265SNate Lawson  * 3.3. Redistribution of Executable. Redistribution in executable form of any
6759db4265SNate Lawson  * substantial portion of the Covered Code or modification must reproduce the
6859db4265SNate Lawson  * above Copyright Notice, and the following Disclaimer and Export Compliance
6959db4265SNate Lawson  * provision in the documentation and/or other materials provided with the
7059db4265SNate Lawson  * distribution.
7159db4265SNate Lawson  *
7259db4265SNate Lawson  * 3.4. Intel retains all right, title, and interest in and to the Original
7359db4265SNate Lawson  * Intel Code.
7459db4265SNate Lawson  *
7559db4265SNate Lawson  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
7659db4265SNate Lawson  * Intel shall be used in advertising or otherwise to promote the sale, use or
7759db4265SNate Lawson  * other dealings in products derived from or relating to the Covered Code
7859db4265SNate Lawson  * without prior written authorization from Intel.
7959db4265SNate Lawson  *
8059db4265SNate Lawson  * 4. Disclaimer and Export Compliance
8159db4265SNate Lawson  *
8259db4265SNate Lawson  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
8359db4265SNate Lawson  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
8459db4265SNate Lawson  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
8559db4265SNate Lawson  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
8659db4265SNate Lawson  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
8759db4265SNate Lawson  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
8859db4265SNate Lawson  * PARTICULAR PURPOSE.
8959db4265SNate Lawson  *
9059db4265SNate Lawson  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
9159db4265SNate Lawson  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
9259db4265SNate Lawson  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
9359db4265SNate Lawson  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
9459db4265SNate Lawson  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
9559db4265SNate Lawson  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
9659db4265SNate Lawson  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
9759db4265SNate Lawson  * LIMITED REMEDY.
9859db4265SNate Lawson  *
9959db4265SNate Lawson  * 4.3. Licensee shall not export, either directly or indirectly, any of this
10059db4265SNate Lawson  * software or system incorporating such software without first obtaining any
10159db4265SNate Lawson  * required license or other approval from the U. S. Department of Commerce or
10259db4265SNate Lawson  * any other agency or department of the United States Government.  In the
10359db4265SNate Lawson  * event Licensee exports any such software from the United States or
10459db4265SNate Lawson  * re-exports any such software from a foreign destination, Licensee shall
10559db4265SNate Lawson  * ensure that the distribution and export/re-export of the software is in
10659db4265SNate Lawson  * compliance with all laws, regulations, orders, or other restrictions of the
10759db4265SNate Lawson  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
10859db4265SNate Lawson  * any of its subsidiaries will export/re-export any technical data, process,
10959db4265SNate Lawson  * software, or service, directly or indirectly, to any country for which the
11059db4265SNate Lawson  * United States government or any agency thereof requires an export license,
11159db4265SNate Lawson  * other governmental approval, or letter of assurance, without first obtaining
11259db4265SNate Lawson  * such license, approval or letter.
11359db4265SNate Lawson  *
11459db4265SNate Lawson  *****************************************************************************/
11559db4265SNate Lawson 
11659db4265SNate Lawson 
117ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
118ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
119ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h>
120ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
121ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h>
122ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
123ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h>
124ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
125ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/actables.h>
126ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
12759db4265SNate Lawson 
12859db4265SNate Lawson #include <stdio.h>
12959db4265SNate Lawson #include <time.h>
13059db4265SNate Lawson 
13159db4265SNate Lawson 
13259db4265SNate Lawson #define _COMPONENT          ACPI_TOOLS
13359db4265SNate Lawson         ACPI_MODULE_NAME    ("adisasm")
13459db4265SNate Lawson 
135f556842eSJung-uk Kim 
1361a39cfb0SJung-uk Kim extern int                  AslCompilerdebug;
137f556842eSJung-uk Kim extern char                 *Gbl_ExternalFilename;
138f556842eSJung-uk Kim 
13959db4265SNate Lawson 
1401a39cfb0SJung-uk Kim ACPI_STATUS
1411a39cfb0SJung-uk Kim LsDisplayNamespace (
1421a39cfb0SJung-uk Kim     void);
14359db4265SNate Lawson 
1441a39cfb0SJung-uk Kim void
145f556842eSJung-uk Kim LsSetupNsList (
146f556842eSJung-uk Kim     void                    *Handle);
1471a39cfb0SJung-uk Kim 
1481a39cfb0SJung-uk Kim 
1491a39cfb0SJung-uk Kim /* Local prototypes */
1501a39cfb0SJung-uk Kim 
1511a39cfb0SJung-uk Kim void
1521a39cfb0SJung-uk Kim AdCreateTableHeader (
1531a39cfb0SJung-uk Kim     char                    *Filename,
1541a39cfb0SJung-uk Kim     ACPI_TABLE_HEADER       *Table);
1551a39cfb0SJung-uk Kim 
1561a39cfb0SJung-uk Kim void
1571a39cfb0SJung-uk Kim AdDisassemblerHeader (
1581a39cfb0SJung-uk Kim     char                    *Filename);
1591a39cfb0SJung-uk Kim 
160a9f12690SJung-uk Kim ACPI_STATUS
161a9f12690SJung-uk Kim AdDeferredParse (
162a9f12690SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
163a9f12690SJung-uk Kim     UINT8                   *Aml,
164a9f12690SJung-uk Kim     UINT32                  AmlLength);
165a9f12690SJung-uk Kim 
166a9f12690SJung-uk Kim ACPI_STATUS
167a9f12690SJung-uk Kim AdParseDeferredOps (
168a9f12690SJung-uk Kim     ACPI_PARSE_OBJECT       *Root);
169a9f12690SJung-uk Kim 
1701a39cfb0SJung-uk Kim 
1711a39cfb0SJung-uk Kim /* Stubs for ASL compiler */
17259db4265SNate Lawson 
173fba7fc7eSJung-uk Kim #ifndef ACPI_ASL_COMPILER
17459db4265SNate Lawson BOOLEAN
17559db4265SNate Lawson AcpiDsIsResultUsed (
17659db4265SNate Lawson     ACPI_PARSE_OBJECT       *Op,
17759db4265SNate Lawson     ACPI_WALK_STATE         *WalkState)
17859db4265SNate Lawson {
17959db4265SNate Lawson     return TRUE;
18059db4265SNate Lawson }
1811a39cfb0SJung-uk Kim 
1821a39cfb0SJung-uk Kim ACPI_STATUS
1831a39cfb0SJung-uk Kim AcpiDsMethodError (
1841a39cfb0SJung-uk Kim     ACPI_STATUS             Status,
1851a39cfb0SJung-uk Kim     ACPI_WALK_STATE         *WalkState)
1861a39cfb0SJung-uk Kim {
1871a39cfb0SJung-uk Kim     return (Status);
1881a39cfb0SJung-uk Kim }
18959db4265SNate Lawson #endif
19059db4265SNate Lawson 
19159db4265SNate Lawson ACPI_STATUS
1921a39cfb0SJung-uk Kim AcpiNsLoadTable (
193a9f12690SJung-uk Kim     UINT32                  TableIndex,
1941a39cfb0SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node)
1951a39cfb0SJung-uk Kim {
1961a39cfb0SJung-uk Kim     return (AE_NOT_IMPLEMENTED);
1971a39cfb0SJung-uk Kim }
1981a39cfb0SJung-uk Kim 
1991a39cfb0SJung-uk Kim ACPI_STATUS
20059db4265SNate Lawson AcpiDsRestartControlMethod (
20159db4265SNate Lawson     ACPI_WALK_STATE         *WalkState,
20259db4265SNate Lawson     ACPI_OPERAND_OBJECT     *ReturnDesc)
20359db4265SNate Lawson {
20459db4265SNate Lawson     return (AE_OK);
20559db4265SNate Lawson }
20659db4265SNate Lawson 
207fba7fc7eSJung-uk Kim void
20859db4265SNate Lawson AcpiDsTerminateControlMethod (
2091a39cfb0SJung-uk Kim     ACPI_OPERAND_OBJECT     *MethodDesc,
21059db4265SNate Lawson     ACPI_WALK_STATE         *WalkState)
21159db4265SNate Lawson {
212fba7fc7eSJung-uk Kim     return;
21359db4265SNate Lawson }
21459db4265SNate Lawson 
21559db4265SNate Lawson ACPI_STATUS
21659db4265SNate Lawson AcpiDsCallControlMethod (
21759db4265SNate Lawson     ACPI_THREAD_STATE       *Thread,
21859db4265SNate Lawson     ACPI_WALK_STATE         *WalkState,
21959db4265SNate Lawson     ACPI_PARSE_OBJECT       *Op)
22059db4265SNate Lawson {
22159db4265SNate Lawson     return (AE_OK);
22259db4265SNate Lawson }
22359db4265SNate Lawson 
22459db4265SNate Lawson ACPI_STATUS
22559db4265SNate Lawson AcpiDsMethodDataInitArgs (
22659db4265SNate Lawson     ACPI_OPERAND_OBJECT     **Params,
22759db4265SNate Lawson     UINT32                  MaxParamCount,
22859db4265SNate Lawson     ACPI_WALK_STATE         *WalkState)
22959db4265SNate Lawson {
23059db4265SNate Lawson     return (AE_OK);
23159db4265SNate Lawson }
23259db4265SNate Lawson 
23359db4265SNate Lawson 
234f556842eSJung-uk Kim static ACPI_TABLE_DESC      LocalTables[1];
235f556842eSJung-uk Kim static ACPI_PARSE_OBJECT    *AcpiGbl_ParseOpRoot;
23659db4265SNate Lawson 
23759db4265SNate Lawson 
23859db4265SNate Lawson /*******************************************************************************
23959db4265SNate Lawson  *
24059db4265SNate Lawson  * FUNCTION:    AdInitialize
24159db4265SNate Lawson  *
242f556842eSJung-uk Kim  * PARAMETERS:  None
24359db4265SNate Lawson  *
24459db4265SNate Lawson  * RETURN:      Status
24559db4265SNate Lawson  *
246f556842eSJung-uk Kim  * DESCRIPTION: ACPICA and local initialization
24759db4265SNate Lawson  *
24859db4265SNate Lawson  ******************************************************************************/
24959db4265SNate Lawson 
25059db4265SNate Lawson ACPI_STATUS
25159db4265SNate Lawson AdInitialize (
25259db4265SNate Lawson     void)
25359db4265SNate Lawson {
25459db4265SNate Lawson     ACPI_STATUS             Status;
25559db4265SNate Lawson 
25659db4265SNate Lawson 
25759db4265SNate Lawson     /* ACPI CA subsystem initialization */
25859db4265SNate Lawson 
2591a39cfb0SJung-uk Kim     Status = AcpiOsInitialize ();
260a9f12690SJung-uk Kim     if (ACPI_FAILURE (Status))
261a9f12690SJung-uk Kim     {
262a9f12690SJung-uk Kim         return (Status);
263a9f12690SJung-uk Kim     }
264a9f12690SJung-uk Kim 
265a9f12690SJung-uk Kim     Status = AcpiUtInitGlobals ();
266a9f12690SJung-uk Kim     if (ACPI_FAILURE (Status))
267a9f12690SJung-uk Kim     {
268a9f12690SJung-uk Kim         return (Status);
269a9f12690SJung-uk Kim     }
2701a39cfb0SJung-uk Kim 
27159db4265SNate Lawson     Status = AcpiUtMutexInitialize ();
27259db4265SNate Lawson     if (ACPI_FAILURE (Status))
27359db4265SNate Lawson     {
274a9f12690SJung-uk Kim         return (Status);
27559db4265SNate Lawson     }
27659db4265SNate Lawson 
27759db4265SNate Lawson     Status = AcpiNsRootInitialize ();
2781a39cfb0SJung-uk Kim     if (ACPI_FAILURE (Status))
2791a39cfb0SJung-uk Kim     {
280a9f12690SJung-uk Kim         return (Status);
2811a39cfb0SJung-uk Kim     }
2821a39cfb0SJung-uk Kim 
2831a39cfb0SJung-uk Kim     /* Setup the Table Manager (cheat - there is no RSDT) */
2841a39cfb0SJung-uk Kim 
2851a39cfb0SJung-uk Kim     AcpiGbl_RootTableList.Size = 1;
2861a39cfb0SJung-uk Kim     AcpiGbl_RootTableList.Count = 0;
2871a39cfb0SJung-uk Kim     AcpiGbl_RootTableList.Tables = LocalTables;
2881a39cfb0SJung-uk Kim 
289a9f12690SJung-uk Kim     return (Status);
29059db4265SNate Lawson }
29159db4265SNate Lawson 
29259db4265SNate Lawson 
29359db4265SNate Lawson /******************************************************************************
29459db4265SNate Lawson  *
29559db4265SNate Lawson  * FUNCTION:    AdAmlDisassemble
29659db4265SNate Lawson  *
297fba7fc7eSJung-uk Kim  * PARAMETERS:  Filename            - AML input filename
298fba7fc7eSJung-uk Kim  *              OutToFile           - TRUE if output should go to a file
299fba7fc7eSJung-uk Kim  *              Prefix              - Path prefix for output
300fba7fc7eSJung-uk Kim  *              OutFilename         - where the filename is returned
301fba7fc7eSJung-uk Kim  *              GetAllTables        - TRUE if all tables are desired
30259db4265SNate Lawson  *
30359db4265SNate Lawson  * RETURN:      Status
30459db4265SNate Lawson  *
30559db4265SNate Lawson  * DESCRIPTION: Disassemble an entire ACPI table
30659db4265SNate Lawson  *
30759db4265SNate Lawson  *****************************************************************************/
30859db4265SNate Lawson 
30959db4265SNate Lawson ACPI_STATUS
31059db4265SNate Lawson AdAmlDisassemble (
31159db4265SNate Lawson     BOOLEAN                 OutToFile,
31259db4265SNate Lawson     char                    *Filename,
31359db4265SNate Lawson     char                    *Prefix,
31459db4265SNate Lawson     char                    **OutFilename,
31559db4265SNate Lawson     BOOLEAN                 GetAllTables)
31659db4265SNate Lawson {
31759db4265SNate Lawson     ACPI_STATUS             Status;
31859db4265SNate Lawson     char                    *DisasmFilename = NULL;
319a9f12690SJung-uk Kim     char                    *ExternalFilename;
32059db4265SNate Lawson     FILE                    *File = NULL;
321a9f12690SJung-uk Kim     ACPI_TABLE_HEADER       *Table = NULL;
3221a39cfb0SJung-uk Kim     ACPI_TABLE_HEADER       *ExternalTable;
323a9f12690SJung-uk Kim     ACPI_OWNER_ID           OwnerId;
32459db4265SNate Lawson 
32559db4265SNate Lawson 
32659db4265SNate Lawson     /*
327f556842eSJung-uk Kim      * Input: AML code from either a file or via GetTables (memory or
328f556842eSJung-uk Kim      * registry)
32959db4265SNate Lawson      */
33059db4265SNate Lawson     if (Filename)
33159db4265SNate Lawson     {
33259db4265SNate Lawson         Status = AcpiDbGetTableFromFile (Filename, &Table);
33359db4265SNate Lawson         if (ACPI_FAILURE (Status))
33459db4265SNate Lawson         {
33559db4265SNate Lawson             return Status;
33659db4265SNate Lawson         }
3371a39cfb0SJung-uk Kim 
338a9f12690SJung-uk Kim         /*
339a9f12690SJung-uk Kim          * External filenames separated by commas
340a9f12690SJung-uk Kim          * Example: iasl -e file1,file2,file3 -d xxx.aml
341a9f12690SJung-uk Kim          */
3421a39cfb0SJung-uk Kim         if (Gbl_ExternalFilename)
3431a39cfb0SJung-uk Kim         {
344a9f12690SJung-uk Kim             ExternalFilename = strtok (Gbl_ExternalFilename, ",");
345a9f12690SJung-uk Kim 
346a9f12690SJung-uk Kim             while (ExternalFilename)
347a9f12690SJung-uk Kim             {
348a9f12690SJung-uk Kim                 Status = AcpiDbGetTableFromFile (ExternalFilename, &ExternalTable);
3491a39cfb0SJung-uk Kim                 if (ACPI_FAILURE (Status))
3501a39cfb0SJung-uk Kim                 {
3511a39cfb0SJung-uk Kim                     return Status;
3521a39cfb0SJung-uk Kim                 }
353a9f12690SJung-uk Kim 
354a9f12690SJung-uk Kim                 /* Load external table for symbol resolution */
355a9f12690SJung-uk Kim 
356a9f12690SJung-uk Kim                 if (ExternalTable)
357a9f12690SJung-uk Kim                 {
358a9f12690SJung-uk Kim                     Status = AdParseTable (ExternalTable, &OwnerId, TRUE, TRUE);
359a9f12690SJung-uk Kim                     if (ACPI_FAILURE (Status))
360a9f12690SJung-uk Kim                     {
361a9f12690SJung-uk Kim                         AcpiOsPrintf ("Could not parse external ACPI tables, %s\n",
362a9f12690SJung-uk Kim                             AcpiFormatException (Status));
363a9f12690SJung-uk Kim                         return Status;
364a9f12690SJung-uk Kim                     }
365a9f12690SJung-uk Kim 
366a9f12690SJung-uk Kim                     /*
367a9f12690SJung-uk Kim                      * Load namespace from names created within control methods
368a9f12690SJung-uk Kim                      * Set owner id of nodes in external table
369a9f12690SJung-uk Kim                      */
370a9f12690SJung-uk Kim                     AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot,
371a9f12690SJung-uk Kim                         AcpiGbl_RootNode, OwnerId);
372a9f12690SJung-uk Kim                     AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
373a9f12690SJung-uk Kim                 }
374a9f12690SJung-uk Kim 
375a9f12690SJung-uk Kim                 /* Next external file name */
376a9f12690SJung-uk Kim 
377a9f12690SJung-uk Kim                 ExternalFilename = strtok (NULL, ",");
378a9f12690SJung-uk Kim             }
379a9f12690SJung-uk Kim 
380a9f12690SJung-uk Kim             /* Clear external list generated by Scope in external tables */
381a9f12690SJung-uk Kim 
382f556842eSJung-uk Kim             AcpiDmClearExternalList ();
3831a39cfb0SJung-uk Kim         }
38459db4265SNate Lawson     }
38559db4265SNate Lawson     else
38659db4265SNate Lawson     {
38759db4265SNate Lawson         Status = AdGetLocalTables (Filename, GetAllTables);
38859db4265SNate Lawson         if (ACPI_FAILURE (Status))
38959db4265SNate Lawson         {
39059db4265SNate Lawson             AcpiOsPrintf ("Could not get ACPI tables, %s\n",
39159db4265SNate Lawson                 AcpiFormatException (Status));
39259db4265SNate Lawson             return Status;
39359db4265SNate Lawson         }
39459db4265SNate Lawson 
39559db4265SNate Lawson         if (!AcpiGbl_DbOpt_disasm)
39659db4265SNate Lawson         {
39759db4265SNate Lawson             return AE_OK;
39859db4265SNate Lawson         }
39959db4265SNate Lawson 
4001a39cfb0SJung-uk Kim         /* Obtained the local tables, just disassemble the DSDT */
40159db4265SNate Lawson 
4021a39cfb0SJung-uk Kim         Status = AcpiGetTable (ACPI_SIG_DSDT, 0, &Table);
4031a39cfb0SJung-uk Kim         if (ACPI_FAILURE (Status))
4041a39cfb0SJung-uk Kim         {
4051a39cfb0SJung-uk Kim             AcpiOsPrintf ("Could not get DSDT, %s\n",
4061a39cfb0SJung-uk Kim                 AcpiFormatException (Status));
4071a39cfb0SJung-uk Kim             return Status;
4081a39cfb0SJung-uk Kim         }
4091a39cfb0SJung-uk Kim 
41059db4265SNate Lawson         AcpiOsPrintf ("\nDisassembly of DSDT\n");
4111a39cfb0SJung-uk Kim         Prefix = AdGenerateFilename ("dsdt", Table->OemTableId);
41259db4265SNate Lawson     }
41359db4265SNate Lawson 
41459db4265SNate Lawson     /*
415f556842eSJung-uk Kim      * Output:  ASL code. Redirect to a file if requested
41659db4265SNate Lawson      */
41759db4265SNate Lawson     if (OutToFile)
41859db4265SNate Lawson     {
41959db4265SNate Lawson         /* Create/Open a disassembly output file */
42059db4265SNate Lawson 
42159db4265SNate Lawson         DisasmFilename = FlGenerateFilename (Prefix, FILE_SUFFIX_DISASSEMBLY);
42259db4265SNate Lawson         if (!OutFilename)
42359db4265SNate Lawson         {
42459db4265SNate Lawson             fprintf (stderr, "Could not generate output filename\n");
425e50beb51SNate Lawson             Status = AE_ERROR;
426e50beb51SNate Lawson             goto Cleanup;
42759db4265SNate Lawson         }
42859db4265SNate Lawson 
42959db4265SNate Lawson         File = fopen (DisasmFilename, "w+");
43059db4265SNate Lawson         if (!File)
43159db4265SNate Lawson         {
4321a39cfb0SJung-uk Kim             fprintf (stderr, "Could not open output file %s\n", DisasmFilename);
433e50beb51SNate Lawson             Status = AE_ERROR;
434e50beb51SNate Lawson             goto Cleanup;
43559db4265SNate Lawson         }
43659db4265SNate Lawson 
43759db4265SNate Lawson         AcpiOsRedirectOutput (File);
43859db4265SNate Lawson     }
43959db4265SNate Lawson 
44059db4265SNate Lawson     *OutFilename = DisasmFilename;
44159db4265SNate Lawson 
4421a39cfb0SJung-uk Kim     if (!AcpiUtIsAmlTable (Table))
4431a39cfb0SJung-uk Kim     {
4441a39cfb0SJung-uk Kim         AdDisassemblerHeader (Filename);
4451a39cfb0SJung-uk Kim         AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n",
4461a39cfb0SJung-uk Kim             Table->Signature);
4471a39cfb0SJung-uk Kim         AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength]  FieldName : FieldValue\n */\n\n");
4481a39cfb0SJung-uk Kim 
4491a39cfb0SJung-uk Kim         AcpiDmDumpDataTable (Table);
4501a39cfb0SJung-uk Kim         fprintf (stderr, "Acpi Data Table [%4.4s] decoded, written to \"%s\"\n",
4511a39cfb0SJung-uk Kim             Table->Signature, DisasmFilename);
4521a39cfb0SJung-uk Kim     }
4531a39cfb0SJung-uk Kim     else
4541a39cfb0SJung-uk Kim     {
45559db4265SNate Lawson         /* Always parse the tables, only option is what to display */
45659db4265SNate Lawson 
457a9f12690SJung-uk Kim         Status = AdParseTable (Table, &OwnerId, TRUE, FALSE);
45859db4265SNate Lawson         if (ACPI_FAILURE (Status))
45959db4265SNate Lawson         {
46059db4265SNate Lawson             AcpiOsPrintf ("Could not parse ACPI tables, %s\n",
46159db4265SNate Lawson                 AcpiFormatException (Status));
46259db4265SNate Lawson             goto Cleanup;
46359db4265SNate Lawson         }
46459db4265SNate Lawson 
4651a39cfb0SJung-uk Kim         if (AslCompilerdebug)
4661a39cfb0SJung-uk Kim         {
4671a39cfb0SJung-uk Kim             AcpiOsPrintf ("/**** Before second load\n");
4681a39cfb0SJung-uk Kim 
4691a39cfb0SJung-uk Kim             LsSetupNsList (File);
4701a39cfb0SJung-uk Kim             LsDisplayNamespace ();
4711a39cfb0SJung-uk Kim             AcpiOsPrintf ("*****/\n");
4721a39cfb0SJung-uk Kim         }
4731a39cfb0SJung-uk Kim 
474e0ef747bSNate Lawson         /*
4751a39cfb0SJung-uk Kim          * Load namespace from names created within control methods
476e0ef747bSNate Lawson          */
477a9f12690SJung-uk Kim         AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode, OwnerId);
4781a39cfb0SJung-uk Kim 
4791a39cfb0SJung-uk Kim         /*
4801a39cfb0SJung-uk Kim          * Cross reference the namespace here, in order to generate External() statements
4811a39cfb0SJung-uk Kim          */
482a9f12690SJung-uk Kim         AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode, OwnerId);
4831a39cfb0SJung-uk Kim 
4841a39cfb0SJung-uk Kim         if (AslCompilerdebug)
4851a39cfb0SJung-uk Kim         {
4861a39cfb0SJung-uk Kim             AcpiDmDumpTree (AcpiGbl_ParseOpRoot);
4871a39cfb0SJung-uk Kim         }
4881a39cfb0SJung-uk Kim 
4891a39cfb0SJung-uk Kim         /* Find possible calls to external control methods */
4901a39cfb0SJung-uk Kim 
4911a39cfb0SJung-uk Kim         AcpiDmFindOrphanMethods (AcpiGbl_ParseOpRoot);
4921a39cfb0SJung-uk Kim 
4931a39cfb0SJung-uk Kim         /* Convert fixed-offset references to resource descriptors to symbolic references */
4941a39cfb0SJung-uk Kim 
4951a39cfb0SJung-uk Kim         AcpiDmConvertResourceIndexes (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode);
4961a39cfb0SJung-uk Kim 
4971a39cfb0SJung-uk Kim         /*
4981a39cfb0SJung-uk Kim          * If we found any external control methods, we must reparse the entire
4991a39cfb0SJung-uk Kim          * tree with the new information (namely, the number of arguments per
5001a39cfb0SJung-uk Kim          * method)
5011a39cfb0SJung-uk Kim          */
502f556842eSJung-uk Kim         if (AcpiDmGetExternalMethodCount ())
5031a39cfb0SJung-uk Kim         {
5041a39cfb0SJung-uk Kim             fprintf (stderr,
5051a39cfb0SJung-uk Kim                 "\nFound %d external control methods, reparsing with new information\n",
506f556842eSJung-uk Kim                 AcpiDmGetExternalMethodCount ());
5071a39cfb0SJung-uk Kim 
5081a39cfb0SJung-uk Kim             /*
5091a39cfb0SJung-uk Kim              * Reparse, rebuild namespace. no need to xref namespace
5101a39cfb0SJung-uk Kim              */
5111a39cfb0SJung-uk Kim             AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
5121a39cfb0SJung-uk Kim             AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode);
5131a39cfb0SJung-uk Kim 
5141a39cfb0SJung-uk Kim             AcpiGbl_RootNode                    = NULL;
5151a39cfb0SJung-uk Kim             AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
5161a39cfb0SJung-uk Kim             AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
5171a39cfb0SJung-uk Kim             AcpiGbl_RootNodeStruct.Type         = ACPI_TYPE_DEVICE;
5181a39cfb0SJung-uk Kim             AcpiGbl_RootNodeStruct.Child        = NULL;
5191a39cfb0SJung-uk Kim             AcpiGbl_RootNodeStruct.Peer         = NULL;
5201a39cfb0SJung-uk Kim             AcpiGbl_RootNodeStruct.Object       = NULL;
5211a39cfb0SJung-uk Kim             AcpiGbl_RootNodeStruct.Flags        = ANOBJ_END_OF_PEER_LIST;
5221a39cfb0SJung-uk Kim 
5231a39cfb0SJung-uk Kim             Status = AcpiNsRootInitialize ();
524f556842eSJung-uk Kim             AcpiDmAddExternalsToNamespace ();
5251a39cfb0SJung-uk Kim 
526a9f12690SJung-uk Kim             /* Parse table. No need to reload it, however (FALSE) */
527a9f12690SJung-uk Kim 
528a9f12690SJung-uk Kim             Status = AdParseTable (Table, NULL, FALSE, FALSE);
5291a39cfb0SJung-uk Kim             if (ACPI_FAILURE (Status))
5301a39cfb0SJung-uk Kim             {
5311a39cfb0SJung-uk Kim                 AcpiOsPrintf ("Could not parse ACPI tables, %s\n",
5321a39cfb0SJung-uk Kim                     AcpiFormatException (Status));
5331a39cfb0SJung-uk Kim                 goto Cleanup;
5341a39cfb0SJung-uk Kim             }
5351a39cfb0SJung-uk Kim 
5361a39cfb0SJung-uk Kim             if (AslCompilerdebug)
5371a39cfb0SJung-uk Kim             {
538a9f12690SJung-uk Kim                 AcpiOsPrintf ("/**** After second load and resource conversion\n");
539a9f12690SJung-uk Kim                 LsSetupNsList (File);
540a9f12690SJung-uk Kim                 LsDisplayNamespace ();
541a9f12690SJung-uk Kim                 AcpiOsPrintf ("*****/\n");
542a9f12690SJung-uk Kim 
5431a39cfb0SJung-uk Kim                 AcpiDmDumpTree (AcpiGbl_ParseOpRoot);
5441a39cfb0SJung-uk Kim             }
5451a39cfb0SJung-uk Kim         }
546e0ef747bSNate Lawson 
54759db4265SNate Lawson         /* Optional displays */
54859db4265SNate Lawson 
54959db4265SNate Lawson         if (AcpiGbl_DbOpt_disasm)
55059db4265SNate Lawson         {
55159db4265SNate Lawson             AdDisplayTables (Filename, Table);
5521a39cfb0SJung-uk Kim             fprintf (stderr,
5531a39cfb0SJung-uk Kim                 "Disassembly completed, written to \"%s\"\n",
5541a39cfb0SJung-uk Kim                 DisasmFilename);
5551a39cfb0SJung-uk Kim         }
55659db4265SNate Lawson     }
55759db4265SNate Lawson 
55859db4265SNate Lawson Cleanup:
559a9f12690SJung-uk Kim 
560a9f12690SJung-uk Kim     if (Table && !AcpiUtIsAmlTable (Table))
561a9f12690SJung-uk Kim     {
562a9f12690SJung-uk Kim         ACPI_FREE (Table);
563a9f12690SJung-uk Kim     }
564a9f12690SJung-uk Kim 
565a9f12690SJung-uk Kim     if (DisasmFilename)
566a9f12690SJung-uk Kim     {
567a9f12690SJung-uk Kim         ACPI_FREE (DisasmFilename);
568a9f12690SJung-uk Kim     }
569a9f12690SJung-uk Kim 
5701a39cfb0SJung-uk Kim     if (OutToFile && File)
57159db4265SNate Lawson     {
5721a39cfb0SJung-uk Kim 
5731a39cfb0SJung-uk Kim #ifdef ASL_DISASM_DEBUG
5741a39cfb0SJung-uk Kim         LsSetupNsList (File);
5751a39cfb0SJung-uk Kim         LsDisplayNamespace ();
5761a39cfb0SJung-uk Kim #endif
57759db4265SNate Lawson         fclose (File);
57859db4265SNate Lawson         AcpiOsRedirectOutput (stdout);
57959db4265SNate Lawson     }
58059db4265SNate Lawson 
5811a39cfb0SJung-uk Kim     AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
582a9f12690SJung-uk Kim     AcpiGbl_ParseOpRoot = NULL;
583a9f12690SJung-uk Kim     return (Status);
58459db4265SNate Lawson }
58559db4265SNate Lawson 
58659db4265SNate Lawson 
58759db4265SNate Lawson /******************************************************************************
58859db4265SNate Lawson  *
5891a39cfb0SJung-uk Kim  * FUNCTION:    AdDisassemblerHeader
5901a39cfb0SJung-uk Kim  *
5911a39cfb0SJung-uk Kim  * PARAMETERS:  Filename            - Input file for the table
5921a39cfb0SJung-uk Kim  *
5931a39cfb0SJung-uk Kim  * RETURN:      None
5941a39cfb0SJung-uk Kim  *
5951a39cfb0SJung-uk Kim  * DESCRIPTION: Create the disassembler header, including ACPI CA signon with
5961a39cfb0SJung-uk Kim  *              current time and date.
5971a39cfb0SJung-uk Kim  *
5981a39cfb0SJung-uk Kim  *****************************************************************************/
5991a39cfb0SJung-uk Kim 
6001a39cfb0SJung-uk Kim void
6011a39cfb0SJung-uk Kim AdDisassemblerHeader (
6021a39cfb0SJung-uk Kim     char                    *Filename)
6031a39cfb0SJung-uk Kim {
6041a39cfb0SJung-uk Kim     time_t                  Timer;
6051a39cfb0SJung-uk Kim 
6061a39cfb0SJung-uk Kim     time (&Timer);
6071a39cfb0SJung-uk Kim 
6081a39cfb0SJung-uk Kim     /* Header and input table info */
6091a39cfb0SJung-uk Kim 
6101a39cfb0SJung-uk Kim     AcpiOsPrintf ("/*\n * Intel ACPI Component Architecture\n");
6111a39cfb0SJung-uk Kim     AcpiOsPrintf (" * AML Disassembler version %8.8X\n", ACPI_CA_VERSION);
6121a39cfb0SJung-uk Kim 
6131a39cfb0SJung-uk Kim     AcpiOsPrintf (" *\n * Disassembly of %s, %s", Filename, ctime (&Timer));
6141a39cfb0SJung-uk Kim     AcpiOsPrintf (" *\n");
6151a39cfb0SJung-uk Kim }
6161a39cfb0SJung-uk Kim 
6171a39cfb0SJung-uk Kim 
6181a39cfb0SJung-uk Kim /******************************************************************************
6191a39cfb0SJung-uk Kim  *
62059db4265SNate Lawson  * FUNCTION:    AdCreateTableHeader
62159db4265SNate Lawson  *
62259db4265SNate Lawson  * PARAMETERS:  Filename            - Input file for the table
62359db4265SNate Lawson  *              Table               - Pointer to the raw table
62459db4265SNate Lawson  *
62559db4265SNate Lawson  * RETURN:      None
62659db4265SNate Lawson  *
62759db4265SNate Lawson  * DESCRIPTION: Create the ASL table header, including ACPI CA signon with
62859db4265SNate Lawson  *              current time and date.
62959db4265SNate Lawson  *
63059db4265SNate Lawson  *****************************************************************************/
63159db4265SNate Lawson 
63259db4265SNate Lawson void
63359db4265SNate Lawson AdCreateTableHeader (
63459db4265SNate Lawson     char                    *Filename,
63559db4265SNate Lawson     ACPI_TABLE_HEADER       *Table)
63659db4265SNate Lawson {
6371a39cfb0SJung-uk Kim     char                    *NewFilename;
638a9f12690SJung-uk Kim     UINT8                   Checksum;
63959db4265SNate Lawson 
64059db4265SNate Lawson 
641a9f12690SJung-uk Kim     /*
642a9f12690SJung-uk Kim      * Print file header and dump original table header
643a9f12690SJung-uk Kim      */
6441a39cfb0SJung-uk Kim     AdDisassemblerHeader (Filename);
64559db4265SNate Lawson 
6461a39cfb0SJung-uk Kim     AcpiOsPrintf (" *\n * Original Table Header:\n");
6471a39cfb0SJung-uk Kim     AcpiOsPrintf (" *     Signature        \"%4.4s\"\n",    Table->Signature);
6481a39cfb0SJung-uk Kim     AcpiOsPrintf (" *     Length           0x%8.8X (%u)\n", Table->Length, Table->Length);
649a9f12690SJung-uk Kim 
650a9f12690SJung-uk Kim     /* Print and validate the revision */
651a9f12690SJung-uk Kim 
652a9f12690SJung-uk Kim     AcpiOsPrintf (" *     Revision         0x%2.2X",      Table->Revision);
653a9f12690SJung-uk Kim 
654a9f12690SJung-uk Kim     switch (Table->Revision)
655a9f12690SJung-uk Kim     {
656a9f12690SJung-uk Kim     case 0:
657a9f12690SJung-uk Kim         AcpiOsPrintf (" **** Invalid Revision");
658a9f12690SJung-uk Kim         break;
659a9f12690SJung-uk Kim 
660a9f12690SJung-uk Kim     case 1:
661a9f12690SJung-uk Kim         /* Revision of DSDT controls the ACPI integer width */
662a9f12690SJung-uk Kim 
663a9f12690SJung-uk Kim         if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT))
664a9f12690SJung-uk Kim         {
665a9f12690SJung-uk Kim             AcpiOsPrintf (" **** ACPI 1.0, no 64-bit math support");
666a9f12690SJung-uk Kim         }
667a9f12690SJung-uk Kim         break;
668a9f12690SJung-uk Kim 
669a9f12690SJung-uk Kim     default:
670a9f12690SJung-uk Kim         break;
671a9f12690SJung-uk Kim     }
672a9f12690SJung-uk Kim     AcpiOsPrintf ("\n");
673a9f12690SJung-uk Kim 
674a9f12690SJung-uk Kim     /* Print and validate the table checksum */
675a9f12690SJung-uk Kim 
676a9f12690SJung-uk Kim     AcpiOsPrintf (" *     Checksum         0x%2.2X",        Table->Checksum);
677a9f12690SJung-uk Kim 
678a9f12690SJung-uk Kim     Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length);
679a9f12690SJung-uk Kim     if (Checksum)
680a9f12690SJung-uk Kim     {
681a9f12690SJung-uk Kim         AcpiOsPrintf (" **** Incorrect checksum, should be 0x%2.2X",
682a9f12690SJung-uk Kim             (UINT8) (Table->Checksum - Checksum));
683a9f12690SJung-uk Kim     }
684a9f12690SJung-uk Kim     AcpiOsPrintf ("\n");
685a9f12690SJung-uk Kim 
6861a39cfb0SJung-uk Kim     AcpiOsPrintf (" *     OEM ID           \"%.6s\"\n",     Table->OemId);
6871a39cfb0SJung-uk Kim     AcpiOsPrintf (" *     OEM Table ID     \"%.8s\"\n",     Table->OemTableId);
6881a39cfb0SJung-uk Kim     AcpiOsPrintf (" *     OEM Revision     0x%8.8X (%u)\n", Table->OemRevision, Table->OemRevision);
689a9f12690SJung-uk Kim     AcpiOsPrintf (" *     Compiler ID      \"%.4s\"\n",     Table->AslCompilerId);
690a9f12690SJung-uk Kim     AcpiOsPrintf (" *     Compiler Version 0x%8.8X (%u)\n", Table->AslCompilerRevision, Table->AslCompilerRevision);
6911a39cfb0SJung-uk Kim     AcpiOsPrintf (" */\n");
6921a39cfb0SJung-uk Kim 
6931a39cfb0SJung-uk Kim     /* Create AML output filename based on input filename */
6941a39cfb0SJung-uk Kim 
6951a39cfb0SJung-uk Kim     if (Filename)
6961a39cfb0SJung-uk Kim     {
6971a39cfb0SJung-uk Kim         NewFilename = FlGenerateFilename (Filename, "aml");
6981a39cfb0SJung-uk Kim     }
6991a39cfb0SJung-uk Kim     else
7001a39cfb0SJung-uk Kim     {
7011a39cfb0SJung-uk Kim         NewFilename = ACPI_ALLOCATE_ZEROED (9);
7021a39cfb0SJung-uk Kim         strncat (NewFilename, Table->Signature, 4);
7031a39cfb0SJung-uk Kim         strcat (NewFilename, ".aml");
7041a39cfb0SJung-uk Kim     }
7051a39cfb0SJung-uk Kim 
7061a39cfb0SJung-uk Kim     /* Open the ASL definition block */
70759db4265SNate Lawson 
70859db4265SNate Lawson     AcpiOsPrintf (
7091a39cfb0SJung-uk Kim         "DefinitionBlock (\"%s\", \"%4.4s\", %hd, \"%.6s\", \"%.8s\", 0x%8.8X)\n",
7101a39cfb0SJung-uk Kim         NewFilename, Table->Signature, Table->Revision,
71159db4265SNate Lawson         Table->OemId, Table->OemTableId, Table->OemRevision);
712a9f12690SJung-uk Kim 
713a9f12690SJung-uk Kim     ACPI_FREE (NewFilename);
71459db4265SNate Lawson }
71559db4265SNate Lawson 
71659db4265SNate Lawson 
71759db4265SNate Lawson /******************************************************************************
71859db4265SNate Lawson  *
71959db4265SNate Lawson  * FUNCTION:    AdDisplayTables
72059db4265SNate Lawson  *
72159db4265SNate Lawson  * PARAMETERS:  Filename            - Input file for the table
722fba7fc7eSJung-uk Kim  *              Table               - Pointer to the raw table
72359db4265SNate Lawson  *
72459db4265SNate Lawson  * RETURN:      Status
72559db4265SNate Lawson  *
72659db4265SNate Lawson  * DESCRIPTION: Display (disassemble) loaded tables and dump raw tables
72759db4265SNate Lawson  *
72859db4265SNate Lawson  *****************************************************************************/
72959db4265SNate Lawson 
73059db4265SNate Lawson ACPI_STATUS
73159db4265SNate Lawson AdDisplayTables (
73259db4265SNate Lawson     char                    *Filename,
73359db4265SNate Lawson     ACPI_TABLE_HEADER       *Table)
73459db4265SNate Lawson {
73559db4265SNate Lawson 
73659db4265SNate Lawson 
7371a39cfb0SJung-uk Kim     if (!AcpiGbl_ParseOpRoot)
73859db4265SNate Lawson     {
73959db4265SNate Lawson         return AE_NOT_EXIST;
74059db4265SNate Lawson     }
74159db4265SNate Lawson 
74259db4265SNate Lawson     if (!AcpiGbl_DbOpt_verbose)
74359db4265SNate Lawson     {
74459db4265SNate Lawson         AdCreateTableHeader (Filename, Table);
74559db4265SNate Lawson     }
74659db4265SNate Lawson 
7471a39cfb0SJung-uk Kim     AcpiDmDisassemble (NULL, AcpiGbl_ParseOpRoot, ACPI_UINT32_MAX);
74859db4265SNate Lawson 
74959db4265SNate Lawson     if (AcpiGbl_DbOpt_verbose)
75059db4265SNate Lawson     {
75159db4265SNate Lawson         AcpiOsPrintf ("\n\nTable Header:\n");
75259db4265SNate Lawson         AcpiUtDumpBuffer ((UINT8 *) Table, sizeof (ACPI_TABLE_HEADER),
75359db4265SNate Lawson             DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
75459db4265SNate Lawson 
75559db4265SNate Lawson         AcpiOsPrintf ("Table Body (Length 0x%X)\n", Table->Length);
75659db4265SNate Lawson         AcpiUtDumpBuffer (((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER)), Table->Length,
75759db4265SNate Lawson             DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
75859db4265SNate Lawson     }
75959db4265SNate Lawson 
76059db4265SNate Lawson     return AE_OK;
76159db4265SNate Lawson }
76259db4265SNate Lawson 
76359db4265SNate Lawson 
76459db4265SNate Lawson /******************************************************************************
76559db4265SNate Lawson  *
76659db4265SNate Lawson  * FUNCTION:    AdDeferredParse
76759db4265SNate Lawson  *
76859db4265SNate Lawson  * PARAMETERS:  Op                  - Root Op of the deferred opcode
76959db4265SNate Lawson  *              Aml                 - Pointer to the raw AML
77059db4265SNate Lawson  *              AmlLength           - Length of the AML
77159db4265SNate Lawson  *
77259db4265SNate Lawson  * RETURN:      Status
77359db4265SNate Lawson  *
77459db4265SNate Lawson  * DESCRIPTION: Parse one deferred opcode
77559db4265SNate Lawson  *              (Methods, operation regions, etc.)
77659db4265SNate Lawson  *
77759db4265SNate Lawson  *****************************************************************************/
77859db4265SNate Lawson 
77959db4265SNate Lawson ACPI_STATUS
78059db4265SNate Lawson AdDeferredParse (
78159db4265SNate Lawson     ACPI_PARSE_OBJECT       *Op,
78259db4265SNate Lawson     UINT8                   *Aml,
78359db4265SNate Lawson     UINT32                  AmlLength)
78459db4265SNate Lawson {
78559db4265SNate Lawson     ACPI_WALK_STATE         *WalkState;
78659db4265SNate Lawson     ACPI_STATUS             Status;
78759db4265SNate Lawson     ACPI_PARSE_OBJECT       *SearchOp;
78859db4265SNate Lawson     ACPI_PARSE_OBJECT       *StartOp;
78959db4265SNate Lawson     UINT32                  BaseAmlOffset;
79059db4265SNate Lawson     ACPI_PARSE_OBJECT       *ExtraOp;
79159db4265SNate Lawson 
79259db4265SNate Lawson 
7931a39cfb0SJung-uk Kim     ACPI_FUNCTION_TRACE (AdDeferredParse);
79459db4265SNate Lawson 
79559db4265SNate Lawson 
79659db4265SNate Lawson     fprintf (stderr, ".");
79759db4265SNate Lawson 
79859db4265SNate Lawson     if (!Aml || !AmlLength)
79959db4265SNate Lawson     {
80059db4265SNate Lawson         return_ACPI_STATUS (AE_OK);
80159db4265SNate Lawson     }
80259db4265SNate Lawson 
80359db4265SNate Lawson     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Parsing %s [%4.4s]\n",
80459db4265SNate Lawson         Op->Common.AmlOpName, (char *) &Op->Named.Name));
80559db4265SNate Lawson 
80659db4265SNate Lawson     WalkState = AcpiDsCreateWalkState (0, Op, NULL, NULL);
80759db4265SNate Lawson     if (!WalkState)
80859db4265SNate Lawson     {
80959db4265SNate Lawson         return_ACPI_STATUS (AE_NO_MEMORY);
81059db4265SNate Lawson     }
81159db4265SNate Lawson 
81259db4265SNate Lawson     Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, Aml,
8131a39cfb0SJung-uk Kim                     AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
81459db4265SNate Lawson     if (ACPI_FAILURE (Status))
81559db4265SNate Lawson     {
81659db4265SNate Lawson         return_ACPI_STATUS (Status);
81759db4265SNate Lawson     }
81859db4265SNate Lawson 
81959db4265SNate Lawson     /* Parse the method */
82059db4265SNate Lawson 
82159db4265SNate Lawson     WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
822fba7fc7eSJung-uk Kim     WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
82359db4265SNate Lawson     Status = AcpiPsParseAml (WalkState);
82459db4265SNate Lawson 
82559db4265SNate Lawson     /*
82659db4265SNate Lawson      * We need to update all of the Aml offsets, since the parser thought
82759db4265SNate Lawson      * that the method began at offset zero.  In reality, it began somewhere
82859db4265SNate Lawson      * within the ACPI table, at the BaseAmlOffset.  Walk the entire tree that
82959db4265SNate Lawson      * was just created and update the AmlOffset in each Op
83059db4265SNate Lawson      */
83159db4265SNate Lawson     BaseAmlOffset = (Op->Common.Value.Arg)->Common.AmlOffset + 1;
83259db4265SNate Lawson     StartOp = (Op->Common.Value.Arg)->Common.Next;
83359db4265SNate Lawson     SearchOp = StartOp;
83459db4265SNate Lawson 
83559db4265SNate Lawson     /* Walk the parse tree */
83659db4265SNate Lawson 
83759db4265SNate Lawson     while (SearchOp)
83859db4265SNate Lawson     {
83959db4265SNate Lawson         SearchOp->Common.AmlOffset += BaseAmlOffset;
84059db4265SNate Lawson         SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp);
84159db4265SNate Lawson     }
84259db4265SNate Lawson 
84359db4265SNate Lawson     /*
84459db4265SNate Lawson      * Link the newly parsed subtree into the main parse tree
84559db4265SNate Lawson      */
84659db4265SNate Lawson     switch (Op->Common.AmlOpcode)
84759db4265SNate Lawson     {
84859db4265SNate Lawson     case AML_BUFFER_OP:
84959db4265SNate Lawson     case AML_PACKAGE_OP:
85059db4265SNate Lawson     case AML_VAR_PACKAGE_OP:
85159db4265SNate Lawson 
85259db4265SNate Lawson         switch (Op->Common.AmlOpcode)
85359db4265SNate Lawson         {
85459db4265SNate Lawson         case AML_PACKAGE_OP:
85559db4265SNate Lawson             ExtraOp = Op->Common.Value.Arg;
85659db4265SNate Lawson             ExtraOp = ExtraOp->Common.Next;
85759db4265SNate Lawson             Op->Common.Value.Arg = ExtraOp->Common.Value.Arg;
85859db4265SNate Lawson             break;
85959db4265SNate Lawson 
860fba7fc7eSJung-uk Kim         case AML_VAR_PACKAGE_OP:
86159db4265SNate Lawson         case AML_BUFFER_OP:
86259db4265SNate Lawson         default:
86359db4265SNate Lawson             ExtraOp = Op->Common.Value.Arg;
86459db4265SNate Lawson             Op->Common.Value.Arg = ExtraOp->Common.Value.Arg;
86559db4265SNate Lawson             break;
86659db4265SNate Lawson         }
86759db4265SNate Lawson 
86859db4265SNate Lawson         /* Must point all parents to the main tree */
86959db4265SNate Lawson 
87059db4265SNate Lawson         StartOp = Op;
87159db4265SNate Lawson         SearchOp = StartOp;
87259db4265SNate Lawson         while (SearchOp)
87359db4265SNate Lawson         {
87459db4265SNate Lawson             if (SearchOp->Common.Parent == ExtraOp)
87559db4265SNate Lawson             {
87659db4265SNate Lawson                 SearchOp->Common.Parent = Op;
87759db4265SNate Lawson             }
87859db4265SNate Lawson             SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp);
87959db4265SNate Lawson         }
88059db4265SNate Lawson         break;
88159db4265SNate Lawson 
88259db4265SNate Lawson     default:
88359db4265SNate Lawson         break;
88459db4265SNate Lawson     }
88559db4265SNate Lawson 
88659db4265SNate Lawson     return_ACPI_STATUS (AE_OK);
88759db4265SNate Lawson }
88859db4265SNate Lawson 
88959db4265SNate Lawson 
89059db4265SNate Lawson /******************************************************************************
89159db4265SNate Lawson  *
89259db4265SNate Lawson  * FUNCTION:    AdParseDeferredOps
89359db4265SNate Lawson  *
89459db4265SNate Lawson  * PARAMETERS:  Root                - Root of the parse tree
89559db4265SNate Lawson  *
89659db4265SNate Lawson  * RETURN:      Status
89759db4265SNate Lawson  *
89859db4265SNate Lawson  * DESCRIPTION: Parse the deferred opcodes (Methods, regions, etc.)
89959db4265SNate Lawson  *
90059db4265SNate Lawson  *****************************************************************************/
90159db4265SNate Lawson 
90259db4265SNate Lawson ACPI_STATUS
90359db4265SNate Lawson AdParseDeferredOps (
90459db4265SNate Lawson     ACPI_PARSE_OBJECT       *Root)
90559db4265SNate Lawson {
90659db4265SNate Lawson     ACPI_PARSE_OBJECT       *Op = Root;
90759db4265SNate Lawson     ACPI_STATUS             Status = AE_OK;
90859db4265SNate Lawson     const ACPI_OPCODE_INFO  *OpInfo;
90959db4265SNate Lawson 
91059db4265SNate Lawson 
9111a39cfb0SJung-uk Kim     ACPI_FUNCTION_NAME (AdParseDeferredOps);
91259db4265SNate Lawson     fprintf (stderr, "Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)\n");
91359db4265SNate Lawson 
91459db4265SNate Lawson     while (Op)
91559db4265SNate Lawson     {
91659db4265SNate Lawson         OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
91759db4265SNate Lawson         if (!(OpInfo->Flags & AML_DEFER))
91859db4265SNate Lawson         {
91959db4265SNate Lawson             Op = AcpiPsGetDepthNext (Root, Op);
92059db4265SNate Lawson             continue;
92159db4265SNate Lawson         }
92259db4265SNate Lawson 
92359db4265SNate Lawson         switch (Op->Common.AmlOpcode)
92459db4265SNate Lawson         {
92559db4265SNate Lawson         case AML_METHOD_OP:
92659db4265SNate Lawson         case AML_BUFFER_OP:
92759db4265SNate Lawson         case AML_PACKAGE_OP:
92859db4265SNate Lawson         case AML_VAR_PACKAGE_OP:
92959db4265SNate Lawson 
93059db4265SNate Lawson             Status = AdDeferredParse (Op, Op->Named.Data, Op->Named.Length);
93159db4265SNate Lawson             if (ACPI_FAILURE (Status))
93259db4265SNate Lawson             {
93359db4265SNate Lawson                 return_ACPI_STATUS (Status);
93459db4265SNate Lawson             }
93559db4265SNate Lawson             break;
93659db4265SNate Lawson 
93759db4265SNate Lawson         case AML_REGION_OP:
93859db4265SNate Lawson         case AML_CREATE_QWORD_FIELD_OP:
93959db4265SNate Lawson         case AML_CREATE_DWORD_FIELD_OP:
94059db4265SNate Lawson         case AML_CREATE_WORD_FIELD_OP:
94159db4265SNate Lawson         case AML_CREATE_BYTE_FIELD_OP:
94259db4265SNate Lawson         case AML_CREATE_BIT_FIELD_OP:
94359db4265SNate Lawson         case AML_CREATE_FIELD_OP:
944a9f12690SJung-uk Kim         case AML_BANK_FIELD_OP:
94559db4265SNate Lawson 
94659db4265SNate Lawson             /* Nothing to do in these cases */
94759db4265SNate Lawson 
94859db4265SNate Lawson             break;
94959db4265SNate Lawson 
95059db4265SNate Lawson         default:
9511a39cfb0SJung-uk Kim             ACPI_ERROR ((AE_INFO, "Unhandled deferred opcode [%s]",
95259db4265SNate Lawson                 Op->Common.AmlOpName));
95359db4265SNate Lawson             break;
95459db4265SNate Lawson         }
95559db4265SNate Lawson 
95659db4265SNate Lawson         Op = AcpiPsGetDepthNext (Root, Op);
95759db4265SNate Lawson     }
95859db4265SNate Lawson 
95959db4265SNate Lawson     fprintf (stderr, "\n");
96059db4265SNate Lawson     return Status;
96159db4265SNate Lawson }
96259db4265SNate Lawson 
96359db4265SNate Lawson 
96459db4265SNate Lawson /******************************************************************************
96559db4265SNate Lawson  *
96659db4265SNate Lawson  * FUNCTION:    AdGetLocalTables
96759db4265SNate Lawson  *
968fba7fc7eSJung-uk Kim  * PARAMETERS:  Filename            - Not used
969fba7fc7eSJung-uk Kim  *              GetAllTables        - TRUE if all tables are desired
97059db4265SNate Lawson  *
971fba7fc7eSJung-uk Kim  * RETURN:      Status
97259db4265SNate Lawson  *
97359db4265SNate Lawson  * DESCRIPTION: Get the ACPI tables from either memory or a file
97459db4265SNate Lawson  *
97559db4265SNate Lawson  *****************************************************************************/
97659db4265SNate Lawson 
97759db4265SNate Lawson ACPI_STATUS
97859db4265SNate Lawson AdGetLocalTables (
97959db4265SNate Lawson     char                    *Filename,
98059db4265SNate Lawson     BOOLEAN                 GetAllTables)
98159db4265SNate Lawson {
98259db4265SNate Lawson     ACPI_STATUS             Status;
98359db4265SNate Lawson     ACPI_TABLE_HEADER       TableHeader;
98459db4265SNate Lawson     ACPI_TABLE_HEADER       *NewTable;
98559db4265SNate Lawson     UINT32                  NumTables;
98659db4265SNate Lawson     UINT32                  PointerSize;
987a9f12690SJung-uk Kim     UINT32                  TableIndex;
98859db4265SNate Lawson 
98959db4265SNate Lawson 
99059db4265SNate Lawson     if (GetAllTables)
99159db4265SNate Lawson     {
9921a39cfb0SJung-uk Kim         ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_RSDT);
99359db4265SNate Lawson         AcpiOsTableOverride (&TableHeader, &NewTable);
994e50beb51SNate Lawson         if (!NewTable)
995e50beb51SNate Lawson         {
996e50beb51SNate Lawson             fprintf (stderr, "Could not obtain RSDT\n");
997e50beb51SNate Lawson             return AE_NO_ACPI_TABLES;
998e50beb51SNate Lawson         }
999a9f12690SJung-uk Kim         else
1000a9f12690SJung-uk Kim         {
1001a9f12690SJung-uk Kim             AdWriteTable (NewTable, NewTable->Length,
1002a9f12690SJung-uk Kim                 ACPI_SIG_RSDT, NewTable->OemTableId);
1003a9f12690SJung-uk Kim         }
100459db4265SNate Lawson 
10051a39cfb0SJung-uk Kim         if (ACPI_COMPARE_NAME (NewTable->Signature, ACPI_SIG_RSDT))
100659db4265SNate Lawson         {
100759db4265SNate Lawson             PointerSize = sizeof (UINT32);
100859db4265SNate Lawson         }
100959db4265SNate Lawson         else
101059db4265SNate Lawson         {
101159db4265SNate Lawson             PointerSize = sizeof (UINT64);
101259db4265SNate Lawson         }
101359db4265SNate Lawson 
101459db4265SNate Lawson         /*
101559db4265SNate Lawson          * Determine the number of tables pointed to by the RSDT/XSDT.
101659db4265SNate Lawson          * This is defined by the ACPI Specification to be the number of
101759db4265SNate Lawson          * pointers contained within the RSDT/XSDT.  The size of the pointers
101859db4265SNate Lawson          * is architecture-dependent.
101959db4265SNate Lawson          */
102059db4265SNate Lawson         NumTables = (NewTable->Length - sizeof (ACPI_TABLE_HEADER)) / PointerSize;
102159db4265SNate Lawson         AcpiOsPrintf ("There are %d tables defined in the %4.4s\n\n",
102259db4265SNate Lawson             NumTables, NewTable->Signature);
102359db4265SNate Lawson 
102459db4265SNate Lawson         /* Get the FADT */
102559db4265SNate Lawson 
10261a39cfb0SJung-uk Kim         ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_FADT);
102759db4265SNate Lawson         AcpiOsTableOverride (&TableHeader, &NewTable);
102859db4265SNate Lawson         if (NewTable)
102959db4265SNate Lawson         {
103059db4265SNate Lawson             AdWriteTable (NewTable, NewTable->Length,
10311a39cfb0SJung-uk Kim                 ACPI_SIG_FADT, NewTable->OemTableId);
103259db4265SNate Lawson         }
103359db4265SNate Lawson         AcpiOsPrintf ("\n");
103459db4265SNate Lawson 
10351a39cfb0SJung-uk Kim         /* Don't bother with FACS, it is usually all zeros */
103659db4265SNate Lawson     }
103759db4265SNate Lawson 
103859db4265SNate Lawson     /* Always get the DSDT */
103959db4265SNate Lawson 
10401a39cfb0SJung-uk Kim     ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_DSDT);
104159db4265SNate Lawson     AcpiOsTableOverride (&TableHeader, &NewTable);
104259db4265SNate Lawson     if (NewTable)
104359db4265SNate Lawson     {
10441a39cfb0SJung-uk Kim         AdWriteTable (NewTable, NewTable->Length,
10451a39cfb0SJung-uk Kim             ACPI_SIG_DSDT, NewTable->OemTableId);
10461a39cfb0SJung-uk Kim 
10471a39cfb0SJung-uk Kim         /* Store DSDT in the Table Manager */
10481a39cfb0SJung-uk Kim 
10491a39cfb0SJung-uk Kim         Status = AcpiTbStoreTable (0, NewTable, NewTable->Length,
10501a39cfb0SJung-uk Kim                     0, &TableIndex);
1051f556842eSJung-uk Kim         if (ACPI_FAILURE (Status))
1052f556842eSJung-uk Kim         {
1053f556842eSJung-uk Kim             fprintf (stderr, "Could not store DSDT\n");
1054f556842eSJung-uk Kim             return AE_NO_ACPI_TABLES;
1055f556842eSJung-uk Kim         }
105659db4265SNate Lawson     }
105759db4265SNate Lawson     else
105859db4265SNate Lawson     {
105959db4265SNate Lawson         fprintf (stderr, "Could not obtain DSDT\n");
1060e50beb51SNate Lawson         return AE_NO_ACPI_TABLES;
106159db4265SNate Lawson     }
106259db4265SNate Lawson 
10631a39cfb0SJung-uk Kim #if 0
10641a39cfb0SJung-uk Kim     /* TBD: Future implementation */
10651a39cfb0SJung-uk Kim 
106659db4265SNate Lawson     AcpiOsPrintf ("\n");
106759db4265SNate Lawson 
106859db4265SNate Lawson     /* Get all SSDTs */
106959db4265SNate Lawson 
10701a39cfb0SJung-uk Kim     ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_SSDT);
10711a39cfb0SJung-uk Kim     do
107259db4265SNate Lawson     {
10731a39cfb0SJung-uk Kim         NewTable = NULL;
107459db4265SNate Lawson         Status = AcpiOsTableOverride (&TableHeader, &NewTable);
10751a39cfb0SJung-uk Kim 
10761a39cfb0SJung-uk Kim     } while (NewTable);
10771a39cfb0SJung-uk Kim #endif
107859db4265SNate Lawson 
107959db4265SNate Lawson     return AE_OK;
108059db4265SNate Lawson }
108159db4265SNate Lawson 
10821a39cfb0SJung-uk Kim 
108359db4265SNate Lawson /******************************************************************************
108459db4265SNate Lawson  *
108559db4265SNate Lawson  * FUNCTION:    AdParseTable
108659db4265SNate Lawson  *
1087fba7fc7eSJung-uk Kim  * PARAMETERS:  Table               - Pointer to the raw table
1088a9f12690SJung-uk Kim  *              OwnerId             - Returned OwnerId of the table
1089a9f12690SJung-uk Kim  *              LoadTable           - If add table to the global table list
1090a9f12690SJung-uk Kim  *              External            - If this is an external table
109159db4265SNate Lawson  *
109259db4265SNate Lawson  * RETURN:      Status
109359db4265SNate Lawson  *
109459db4265SNate Lawson  * DESCRIPTION: Parse the DSDT.
109559db4265SNate Lawson  *
109659db4265SNate Lawson  *****************************************************************************/
109759db4265SNate Lawson 
109859db4265SNate Lawson ACPI_STATUS
109959db4265SNate Lawson AdParseTable (
1100a9f12690SJung-uk Kim     ACPI_TABLE_HEADER       *Table,
1101a9f12690SJung-uk Kim     ACPI_OWNER_ID           *OwnerId,
1102a9f12690SJung-uk Kim     BOOLEAN                 LoadTable,
1103a9f12690SJung-uk Kim     BOOLEAN                 External)
110459db4265SNate Lawson {
110559db4265SNate Lawson     ACPI_STATUS             Status = AE_OK;
110659db4265SNate Lawson     ACPI_WALK_STATE         *WalkState;
110759db4265SNate Lawson     UINT8                   *AmlStart;
110859db4265SNate Lawson     UINT32                  AmlLength;
1109a9f12690SJung-uk Kim     UINT32                  TableIndex;
111059db4265SNate Lawson 
111159db4265SNate Lawson 
111259db4265SNate Lawson     if (!Table)
111359db4265SNate Lawson     {
111459db4265SNate Lawson         return AE_NOT_EXIST;
111559db4265SNate Lawson     }
111659db4265SNate Lawson 
111759db4265SNate Lawson     /* Pass 1:  Parse everything except control method bodies */
111859db4265SNate Lawson 
111959db4265SNate Lawson     fprintf (stderr, "Pass 1 parse of [%4.4s]\n", (char *) Table->Signature);
112059db4265SNate Lawson 
112159db4265SNate Lawson     AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
112259db4265SNate Lawson     AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
112359db4265SNate Lawson 
112459db4265SNate Lawson     /* Create the root object */
112559db4265SNate Lawson 
11261a39cfb0SJung-uk Kim     AcpiGbl_ParseOpRoot = AcpiPsCreateScopeOp ();
11271a39cfb0SJung-uk Kim     if (!AcpiGbl_ParseOpRoot)
112859db4265SNate Lawson     {
112959db4265SNate Lawson         return AE_NO_MEMORY;
113059db4265SNate Lawson     }
113159db4265SNate Lawson 
113259db4265SNate Lawson     /* Create and initialize a new walk state */
113359db4265SNate Lawson 
113459db4265SNate Lawson     WalkState = AcpiDsCreateWalkState (0,
11351a39cfb0SJung-uk Kim                         AcpiGbl_ParseOpRoot, NULL, NULL);
113659db4265SNate Lawson     if (!WalkState)
113759db4265SNate Lawson     {
113859db4265SNate Lawson         return (AE_NO_MEMORY);
113959db4265SNate Lawson     }
114059db4265SNate Lawson 
11411a39cfb0SJung-uk Kim     Status = AcpiDsInitAmlWalk (WalkState, AcpiGbl_ParseOpRoot,
11421a39cfb0SJung-uk Kim                 NULL, AmlStart, AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
114359db4265SNate Lawson     if (ACPI_FAILURE (Status))
114459db4265SNate Lawson     {
114559db4265SNate Lawson         return (Status);
114659db4265SNate Lawson     }
114759db4265SNate Lawson 
114859db4265SNate Lawson     WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
1149fba7fc7eSJung-uk Kim     WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
115059db4265SNate Lawson 
115159db4265SNate Lawson     Status = AcpiPsParseAml (WalkState);
115259db4265SNate Lawson     if (ACPI_FAILURE (Status))
115359db4265SNate Lawson     {
115459db4265SNate Lawson         return Status;
115559db4265SNate Lawson     }
115659db4265SNate Lawson 
1157a9f12690SJung-uk Kim     /* If LoadTable is FALSE, we are parsing the last loaded table */
1158a9f12690SJung-uk Kim 
1159a9f12690SJung-uk Kim     TableIndex = AcpiGbl_RootTableList.Count - 1;
1160a9f12690SJung-uk Kim 
116159db4265SNate Lawson     /* Pass 2 */
116259db4265SNate Lawson 
1163a9f12690SJung-uk Kim     if (LoadTable)
1164a9f12690SJung-uk Kim     {
1165a9f12690SJung-uk Kim         Status = AcpiTbStoreTable ((ACPI_PHYSICAL_ADDRESS) Table, Table,
11661a39cfb0SJung-uk Kim                     Table->Length, ACPI_TABLE_ORIGIN_ALLOCATED, &TableIndex);
11671a39cfb0SJung-uk Kim         if (ACPI_FAILURE (Status))
11681a39cfb0SJung-uk Kim         {
11691a39cfb0SJung-uk Kim             return Status;
11701a39cfb0SJung-uk Kim         }
1171a9f12690SJung-uk Kim         Status = AcpiTbAllocateOwnerId (TableIndex);
1172a9f12690SJung-uk Kim         if (ACPI_FAILURE (Status))
1173a9f12690SJung-uk Kim         {
1174a9f12690SJung-uk Kim             return Status;
1175a9f12690SJung-uk Kim         }
1176a9f12690SJung-uk Kim         if (OwnerId)
1177a9f12690SJung-uk Kim         {
1178a9f12690SJung-uk Kim             Status = AcpiTbGetOwnerId (TableIndex, OwnerId);
1179a9f12690SJung-uk Kim             if (ACPI_FAILURE (Status))
1180a9f12690SJung-uk Kim             {
1181a9f12690SJung-uk Kim                 return Status;
1182a9f12690SJung-uk Kim             }
1183a9f12690SJung-uk Kim         }
1184a9f12690SJung-uk Kim     }
118559db4265SNate Lawson 
11861a39cfb0SJung-uk Kim     fprintf (stderr, "Pass 2 parse of [%4.4s]\n", (char *) Table->Signature);
11871a39cfb0SJung-uk Kim 
1188a9f12690SJung-uk Kim     Status = AcpiNsOneCompleteParse (ACPI_IMODE_LOAD_PASS2, TableIndex, NULL);
118959db4265SNate Lawson     if (ACPI_FAILURE (Status))
119059db4265SNate Lawson     {
119159db4265SNate Lawson         return (Status);
119259db4265SNate Lawson     }
119359db4265SNate Lawson 
1194a9f12690SJung-uk Kim     /* No need to parse control methods of external table */
1195a9f12690SJung-uk Kim 
1196a9f12690SJung-uk Kim     if (External)
1197a9f12690SJung-uk Kim     {
1198a9f12690SJung-uk Kim         return AE_OK;
1199a9f12690SJung-uk Kim     }
1200a9f12690SJung-uk Kim 
120159db4265SNate Lawson     /* Pass 3: Parse control methods and link their parse trees into the main parse tree */
120259db4265SNate Lawson 
12031a39cfb0SJung-uk Kim     Status = AdParseDeferredOps (AcpiGbl_ParseOpRoot);
12041a39cfb0SJung-uk Kim 
12051a39cfb0SJung-uk Kim     /* Process Resource Templates */
12061a39cfb0SJung-uk Kim 
12071a39cfb0SJung-uk Kim     AcpiDmFindResources (AcpiGbl_ParseOpRoot);
120859db4265SNate Lawson 
120959db4265SNate Lawson     fprintf (stderr, "Parsing completed\n");
121059db4265SNate Lawson     return AE_OK;
121159db4265SNate Lawson }
121259db4265SNate Lawson 
121359db4265SNate Lawson 
1214