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