159db4265SNate Lawson /****************************************************************************** 259db4265SNate Lawson * 359db4265SNate Lawson * Module Name: adisasm - Application-level disassembler routines 459db4265SNate Lawson * 559db4265SNate Lawson *****************************************************************************/ 659db4265SNate Lawson 7d244b227SJung-uk Kim /* 8*313a0c13SJung-uk Kim * Copyright (C) 2000 - 2014, Intel Corp. 959db4265SNate Lawson * All rights reserved. 1059db4265SNate Lawson * 11d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 13d244b227SJung-uk Kim * are met: 14d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16d244b227SJung-uk Kim * without modification. 17d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21d244b227SJung-uk Kim * binary redistribution. 22d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24d244b227SJung-uk Kim * from this software without specific prior written permission. 2559db4265SNate Lawson * 26d244b227SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28d244b227SJung-uk Kim * Software Foundation. 2959db4265SNate Lawson * 30d244b227SJung-uk Kim * NO WARRANTY 31d244b227SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32d244b227SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33d244b227SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34d244b227SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35d244b227SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36d244b227SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37d244b227SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38d244b227SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39d244b227SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40d244b227SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41d244b227SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42d244b227SJung-uk Kim */ 4359db4265SNate Lawson 44*313a0c13SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 45ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 47ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 48ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h> 49ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 50ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/actables.h> 51ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 5259db4265SNate Lawson 5359db4265SNate Lawson #include <stdio.h> 5459db4265SNate Lawson #include <time.h> 5559db4265SNate Lawson 5659db4265SNate Lawson 5759db4265SNate Lawson #define _COMPONENT ACPI_TOOLS 5859db4265SNate Lawson ACPI_MODULE_NAME ("adisasm") 5959db4265SNate Lawson 601a39cfb0SJung-uk Kim /* Local prototypes */ 611a39cfb0SJung-uk Kim 6242fecd12SJung-uk Kim static void 631a39cfb0SJung-uk Kim AdCreateTableHeader ( 641a39cfb0SJung-uk Kim char *Filename, 651a39cfb0SJung-uk Kim ACPI_TABLE_HEADER *Table); 661a39cfb0SJung-uk Kim 671a39cfb0SJung-uk Kim /* Stubs for ASL compiler */ 6859db4265SNate Lawson 69fba7fc7eSJung-uk Kim #ifndef ACPI_ASL_COMPILER 7059db4265SNate Lawson BOOLEAN 7159db4265SNate Lawson AcpiDsIsResultUsed ( 7259db4265SNate Lawson ACPI_PARSE_OBJECT *Op, 7359db4265SNate Lawson ACPI_WALK_STATE *WalkState) 7459db4265SNate Lawson { 7559db4265SNate Lawson return TRUE; 7659db4265SNate Lawson } 771a39cfb0SJung-uk Kim 781a39cfb0SJung-uk Kim ACPI_STATUS 791a39cfb0SJung-uk Kim AcpiDsMethodError ( 801a39cfb0SJung-uk Kim ACPI_STATUS Status, 811a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState) 821a39cfb0SJung-uk Kim { 831a39cfb0SJung-uk Kim return (Status); 841a39cfb0SJung-uk Kim } 8559db4265SNate Lawson #endif 8659db4265SNate Lawson 8759db4265SNate Lawson ACPI_STATUS 881a39cfb0SJung-uk Kim AcpiNsLoadTable ( 89a9f12690SJung-uk Kim UINT32 TableIndex, 901a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *Node) 911a39cfb0SJung-uk Kim { 921a39cfb0SJung-uk Kim return (AE_NOT_IMPLEMENTED); 931a39cfb0SJung-uk Kim } 941a39cfb0SJung-uk Kim 951a39cfb0SJung-uk Kim ACPI_STATUS 9659db4265SNate Lawson AcpiDsRestartControlMethod ( 9759db4265SNate Lawson ACPI_WALK_STATE *WalkState, 9859db4265SNate Lawson ACPI_OPERAND_OBJECT *ReturnDesc) 9959db4265SNate Lawson { 10059db4265SNate Lawson return (AE_OK); 10159db4265SNate Lawson } 10259db4265SNate Lawson 103fba7fc7eSJung-uk Kim void 10459db4265SNate Lawson AcpiDsTerminateControlMethod ( 1051a39cfb0SJung-uk Kim ACPI_OPERAND_OBJECT *MethodDesc, 10659db4265SNate Lawson ACPI_WALK_STATE *WalkState) 10759db4265SNate Lawson { 108fba7fc7eSJung-uk Kim return; 10959db4265SNate Lawson } 11059db4265SNate Lawson 11159db4265SNate Lawson ACPI_STATUS 11259db4265SNate Lawson AcpiDsCallControlMethod ( 11359db4265SNate Lawson ACPI_THREAD_STATE *Thread, 11459db4265SNate Lawson ACPI_WALK_STATE *WalkState, 11559db4265SNate Lawson ACPI_PARSE_OBJECT *Op) 11659db4265SNate Lawson { 11759db4265SNate Lawson return (AE_OK); 11859db4265SNate Lawson } 11959db4265SNate Lawson 12059db4265SNate Lawson ACPI_STATUS 12159db4265SNate Lawson AcpiDsMethodDataInitArgs ( 12259db4265SNate Lawson ACPI_OPERAND_OBJECT **Params, 12359db4265SNate Lawson UINT32 MaxParamCount, 12459db4265SNate Lawson ACPI_WALK_STATE *WalkState) 12559db4265SNate Lawson { 12659db4265SNate Lawson return (AE_OK); 12759db4265SNate Lawson } 12859db4265SNate Lawson 12959db4265SNate Lawson 130f556842eSJung-uk Kim static ACPI_TABLE_DESC LocalTables[1]; 131*313a0c13SJung-uk Kim ACPI_PARSE_OBJECT *AcpiGbl_ParseOpRoot; 1324c52cad2SJung-uk Kim 1334c52cad2SJung-uk Kim 1344c52cad2SJung-uk Kim /******************************************************************************* 1354c52cad2SJung-uk Kim * 13659db4265SNate Lawson * FUNCTION: AdInitialize 13759db4265SNate Lawson * 138f556842eSJung-uk Kim * PARAMETERS: None 13959db4265SNate Lawson * 14059db4265SNate Lawson * RETURN: Status 14159db4265SNate Lawson * 142f556842eSJung-uk Kim * DESCRIPTION: ACPICA and local initialization 14359db4265SNate Lawson * 14459db4265SNate Lawson ******************************************************************************/ 14559db4265SNate Lawson 14659db4265SNate Lawson ACPI_STATUS 14759db4265SNate Lawson AdInitialize ( 14859db4265SNate Lawson void) 14959db4265SNate Lawson { 15059db4265SNate Lawson ACPI_STATUS Status; 15159db4265SNate Lawson 15259db4265SNate Lawson 15359db4265SNate Lawson /* ACPICA subsystem initialization */ 15459db4265SNate Lawson 1551a39cfb0SJung-uk Kim Status = AcpiOsInitialize (); 156a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 157a9f12690SJung-uk Kim { 158a9f12690SJung-uk Kim return (Status); 159a9f12690SJung-uk Kim } 160a9f12690SJung-uk Kim 161a9f12690SJung-uk Kim Status = AcpiUtInitGlobals (); 162a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 163a9f12690SJung-uk Kim { 164a9f12690SJung-uk Kim return (Status); 165a9f12690SJung-uk Kim } 1661a39cfb0SJung-uk Kim 16759db4265SNate Lawson Status = AcpiUtMutexInitialize (); 16859db4265SNate Lawson if (ACPI_FAILURE (Status)) 16959db4265SNate Lawson { 170a9f12690SJung-uk Kim return (Status); 17159db4265SNate Lawson } 17259db4265SNate Lawson 17359db4265SNate Lawson Status = AcpiNsRootInitialize (); 1741a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 1751a39cfb0SJung-uk Kim { 176a9f12690SJung-uk Kim return (Status); 1771a39cfb0SJung-uk Kim } 1781a39cfb0SJung-uk Kim 1791a39cfb0SJung-uk Kim /* Setup the Table Manager (cheat - there is no RSDT) */ 1801a39cfb0SJung-uk Kim 1813f5e024cSJung-uk Kim AcpiGbl_RootTableList.MaxTableCount = 1; 1823f5e024cSJung-uk Kim AcpiGbl_RootTableList.CurrentTableCount = 0; 1831a39cfb0SJung-uk Kim AcpiGbl_RootTableList.Tables = LocalTables; 1841a39cfb0SJung-uk Kim 185a9f12690SJung-uk Kim return (Status); 18659db4265SNate Lawson } 18759db4265SNate Lawson 18859db4265SNate Lawson 18959db4265SNate Lawson /****************************************************************************** 19059db4265SNate Lawson * 19159db4265SNate Lawson * FUNCTION: AdAmlDisassemble 19259db4265SNate Lawson * 193fba7fc7eSJung-uk Kim * PARAMETERS: Filename - AML input filename 194fba7fc7eSJung-uk Kim * OutToFile - TRUE if output should go to a file 195fba7fc7eSJung-uk Kim * Prefix - Path prefix for output 196fba7fc7eSJung-uk Kim * OutFilename - where the filename is returned 19759db4265SNate Lawson * 19859db4265SNate Lawson * RETURN: Status 19959db4265SNate Lawson * 20059db4265SNate Lawson * DESCRIPTION: Disassemble an entire ACPI table 20159db4265SNate Lawson * 20259db4265SNate Lawson *****************************************************************************/ 20359db4265SNate Lawson 20459db4265SNate Lawson ACPI_STATUS 20559db4265SNate Lawson AdAmlDisassemble ( 20659db4265SNate Lawson BOOLEAN OutToFile, 20759db4265SNate Lawson char *Filename, 20859db4265SNate Lawson char *Prefix, 209*313a0c13SJung-uk Kim char **OutFilename) 21059db4265SNate Lawson { 21159db4265SNate Lawson ACPI_STATUS Status; 21259db4265SNate Lawson char *DisasmFilename = NULL; 213a9f12690SJung-uk Kim char *ExternalFilename; 214709fac06SJung-uk Kim ACPI_EXTERNAL_FILE *ExternalFileList = AcpiGbl_ExternalFileList; 21559db4265SNate Lawson FILE *File = NULL; 216a9f12690SJung-uk Kim ACPI_TABLE_HEADER *Table = NULL; 2171a39cfb0SJung-uk Kim ACPI_TABLE_HEADER *ExternalTable; 218a9f12690SJung-uk Kim ACPI_OWNER_ID OwnerId; 21959db4265SNate Lawson 22059db4265SNate Lawson 22159db4265SNate Lawson /* 222f556842eSJung-uk Kim * Input: AML code from either a file or via GetTables (memory or 223f556842eSJung-uk Kim * registry) 22459db4265SNate Lawson */ 22559db4265SNate Lawson if (Filename) 22659db4265SNate Lawson { 22759db4265SNate Lawson Status = AcpiDbGetTableFromFile (Filename, &Table); 22859db4265SNate Lawson if (ACPI_FAILURE (Status)) 22959db4265SNate Lawson { 2308ef1a331SJung-uk Kim return (Status); 23159db4265SNate Lawson } 2321a39cfb0SJung-uk Kim 233a9f12690SJung-uk Kim /* 234a9f12690SJung-uk Kim * External filenames separated by commas 235a9f12690SJung-uk Kim * Example: iasl -e file1,file2,file3 -d xxx.aml 236a9f12690SJung-uk Kim */ 237709fac06SJung-uk Kim while (ExternalFileList) 2381a39cfb0SJung-uk Kim { 239709fac06SJung-uk Kim ExternalFilename = ExternalFileList->Path; 240709fac06SJung-uk Kim if (!ACPI_STRCMP (ExternalFilename, Filename)) 241709fac06SJung-uk Kim { 242709fac06SJung-uk Kim /* Next external file */ 243a9f12690SJung-uk Kim 244709fac06SJung-uk Kim ExternalFileList = ExternalFileList->Next; 245709fac06SJung-uk Kim continue; 246709fac06SJung-uk Kim } 247709fac06SJung-uk Kim 248a9f12690SJung-uk Kim Status = AcpiDbGetTableFromFile (ExternalFilename, &ExternalTable); 2491a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 2501a39cfb0SJung-uk Kim { 2518ef1a331SJung-uk Kim return (Status); 2521a39cfb0SJung-uk Kim } 253a9f12690SJung-uk Kim 254a9f12690SJung-uk Kim /* Load external table for symbol resolution */ 255a9f12690SJung-uk Kim 256a9f12690SJung-uk Kim if (ExternalTable) 257a9f12690SJung-uk Kim { 258a9f12690SJung-uk Kim Status = AdParseTable (ExternalTable, &OwnerId, TRUE, TRUE); 259a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 260a9f12690SJung-uk Kim { 261a9f12690SJung-uk Kim AcpiOsPrintf ("Could not parse external ACPI tables, %s\n", 262a9f12690SJung-uk Kim AcpiFormatException (Status)); 2638ef1a331SJung-uk Kim return (Status); 264a9f12690SJung-uk Kim } 265a9f12690SJung-uk Kim 266a9f12690SJung-uk Kim /* 267a9f12690SJung-uk Kim * Load namespace from names created within control methods 268a9f12690SJung-uk Kim * Set owner id of nodes in external table 269a9f12690SJung-uk Kim */ 270a9f12690SJung-uk Kim AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, 271a9f12690SJung-uk Kim AcpiGbl_RootNode, OwnerId); 272a9f12690SJung-uk Kim AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 273a9f12690SJung-uk Kim } 274a9f12690SJung-uk Kim 275709fac06SJung-uk Kim /* Next external file */ 276a9f12690SJung-uk Kim 277709fac06SJung-uk Kim ExternalFileList = ExternalFileList->Next; 278a9f12690SJung-uk Kim } 279a9f12690SJung-uk Kim 280a9f12690SJung-uk Kim /* Clear external list generated by Scope in external tables */ 281a9f12690SJung-uk Kim 282709fac06SJung-uk Kim if (AcpiGbl_ExternalFileList) 283709fac06SJung-uk Kim { 284f556842eSJung-uk Kim AcpiDmClearExternalList (); 2851a39cfb0SJung-uk Kim } 28679c6d946SJung-uk Kim 28779c6d946SJung-uk Kim /* Load any externals defined in the optional external ref file */ 28879c6d946SJung-uk Kim 28979c6d946SJung-uk Kim AcpiDmGetExternalsFromFile (); 29059db4265SNate Lawson } 29159db4265SNate Lawson else 29259db4265SNate Lawson { 293*313a0c13SJung-uk Kim Status = AdGetLocalTables (); 29459db4265SNate Lawson if (ACPI_FAILURE (Status)) 29559db4265SNate Lawson { 29659db4265SNate Lawson AcpiOsPrintf ("Could not get ACPI tables, %s\n", 29759db4265SNate Lawson AcpiFormatException (Status)); 2988ef1a331SJung-uk Kim return (Status); 29959db4265SNate Lawson } 30059db4265SNate Lawson 30159db4265SNate Lawson if (!AcpiGbl_DbOpt_disasm) 30259db4265SNate Lawson { 3038ef1a331SJung-uk Kim return (AE_OK); 30459db4265SNate Lawson } 30559db4265SNate Lawson 3061a39cfb0SJung-uk Kim /* Obtained the local tables, just disassemble the DSDT */ 30759db4265SNate Lawson 3081a39cfb0SJung-uk Kim Status = AcpiGetTable (ACPI_SIG_DSDT, 0, &Table); 3091a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 3101a39cfb0SJung-uk Kim { 3111a39cfb0SJung-uk Kim AcpiOsPrintf ("Could not get DSDT, %s\n", 3121a39cfb0SJung-uk Kim AcpiFormatException (Status)); 3138ef1a331SJung-uk Kim return (Status); 3141a39cfb0SJung-uk Kim } 3151a39cfb0SJung-uk Kim 31659db4265SNate Lawson AcpiOsPrintf ("\nDisassembly of DSDT\n"); 3171a39cfb0SJung-uk Kim Prefix = AdGenerateFilename ("dsdt", Table->OemTableId); 31859db4265SNate Lawson } 31959db4265SNate Lawson 32059db4265SNate Lawson /* 321f556842eSJung-uk Kim * Output: ASL code. Redirect to a file if requested 32259db4265SNate Lawson */ 32359db4265SNate Lawson if (OutToFile) 32459db4265SNate Lawson { 32559db4265SNate Lawson /* Create/Open a disassembly output file */ 32659db4265SNate Lawson 32759db4265SNate Lawson DisasmFilename = FlGenerateFilename (Prefix, FILE_SUFFIX_DISASSEMBLY); 328*313a0c13SJung-uk Kim if (!DisasmFilename) 32959db4265SNate Lawson { 33059db4265SNate Lawson fprintf (stderr, "Could not generate output filename\n"); 331e50beb51SNate Lawson Status = AE_ERROR; 332e50beb51SNate Lawson goto Cleanup; 33359db4265SNate Lawson } 33459db4265SNate Lawson 33559db4265SNate Lawson File = fopen (DisasmFilename, "w+"); 33659db4265SNate Lawson if (!File) 33759db4265SNate Lawson { 3381a39cfb0SJung-uk Kim fprintf (stderr, "Could not open output file %s\n", DisasmFilename); 339e50beb51SNate Lawson Status = AE_ERROR; 340*313a0c13SJung-uk Kim ACPI_FREE (DisasmFilename); 341e50beb51SNate Lawson goto Cleanup; 34259db4265SNate Lawson } 34359db4265SNate Lawson 34459db4265SNate Lawson AcpiOsRedirectOutput (File); 34559db4265SNate Lawson } 34659db4265SNate Lawson 34759db4265SNate Lawson *OutFilename = DisasmFilename; 34859db4265SNate Lawson 3491a39cfb0SJung-uk Kim if (!AcpiUtIsAmlTable (Table)) 3501a39cfb0SJung-uk Kim { 3511a39cfb0SJung-uk Kim AdDisassemblerHeader (Filename); 3521a39cfb0SJung-uk Kim AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n", 3531a39cfb0SJung-uk Kim Table->Signature); 354ec3fc72fSJung-uk Kim AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength] " 355ec3fc72fSJung-uk Kim "FieldName : FieldValue\n */\n\n"); 3561a39cfb0SJung-uk Kim 3571a39cfb0SJung-uk Kim AcpiDmDumpDataTable (Table); 3584c52cad2SJung-uk Kim fprintf (stderr, "Acpi Data Table [%4.4s] decoded\n", 3594c52cad2SJung-uk Kim Table->Signature); 3604c52cad2SJung-uk Kim fprintf (stderr, "Formatted output: %s - %u bytes\n", 361*313a0c13SJung-uk Kim DisasmFilename, CmGetFileSize (File)); 3621a39cfb0SJung-uk Kim } 3631a39cfb0SJung-uk Kim else 3641a39cfb0SJung-uk Kim { 36559db4265SNate Lawson /* Always parse the tables, only option is what to display */ 36659db4265SNate Lawson 367a9f12690SJung-uk Kim Status = AdParseTable (Table, &OwnerId, TRUE, FALSE); 36859db4265SNate Lawson if (ACPI_FAILURE (Status)) 36959db4265SNate Lawson { 37059db4265SNate Lawson AcpiOsPrintf ("Could not parse ACPI tables, %s\n", 37159db4265SNate Lawson AcpiFormatException (Status)); 37259db4265SNate Lawson goto Cleanup; 37359db4265SNate Lawson } 37459db4265SNate Lawson 3751a39cfb0SJung-uk Kim if (AslCompilerdebug) 3761a39cfb0SJung-uk Kim { 3771a39cfb0SJung-uk Kim AcpiOsPrintf ("/**** Before second load\n"); 3781a39cfb0SJung-uk Kim 379efcc2a30SJung-uk Kim NsSetupNamespaceListing (File); 380efcc2a30SJung-uk Kim NsDisplayNamespace (); 3811a39cfb0SJung-uk Kim AcpiOsPrintf ("*****/\n"); 3821a39cfb0SJung-uk Kim } 3831a39cfb0SJung-uk Kim 384ec3fc72fSJung-uk Kim /* Load namespace from names created within control methods */ 385ec3fc72fSJung-uk Kim 386ec3fc72fSJung-uk Kim AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, 387ec3fc72fSJung-uk Kim AcpiGbl_RootNode, OwnerId); 3881a39cfb0SJung-uk Kim 3891a39cfb0SJung-uk Kim /* 390ec3fc72fSJung-uk Kim * Cross reference the namespace here, in order to 391ec3fc72fSJung-uk Kim * generate External() statements 3921a39cfb0SJung-uk Kim */ 393ec3fc72fSJung-uk Kim AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot, 394ec3fc72fSJung-uk Kim AcpiGbl_RootNode, OwnerId); 3951a39cfb0SJung-uk Kim 3961a39cfb0SJung-uk Kim if (AslCompilerdebug) 3971a39cfb0SJung-uk Kim { 3981a39cfb0SJung-uk Kim AcpiDmDumpTree (AcpiGbl_ParseOpRoot); 3991a39cfb0SJung-uk Kim } 4001a39cfb0SJung-uk Kim 4011a39cfb0SJung-uk Kim /* Find possible calls to external control methods */ 4021a39cfb0SJung-uk Kim 4031a39cfb0SJung-uk Kim AcpiDmFindOrphanMethods (AcpiGbl_ParseOpRoot); 4041a39cfb0SJung-uk Kim 4051a39cfb0SJung-uk Kim /* 406ec3fc72fSJung-uk Kim * If we found any external control methods, we must reparse 407ec3fc72fSJung-uk Kim * the entire tree with the new information (namely, the 408ec3fc72fSJung-uk Kim * number of arguments per method) 4091a39cfb0SJung-uk Kim */ 410f556842eSJung-uk Kim if (AcpiDmGetExternalMethodCount ()) 4111a39cfb0SJung-uk Kim { 4121a39cfb0SJung-uk Kim fprintf (stderr, 413ec3fc72fSJung-uk Kim "\nFound %u external control methods, " 414ec3fc72fSJung-uk Kim "reparsing with new information\n", 415f556842eSJung-uk Kim AcpiDmGetExternalMethodCount ()); 4161a39cfb0SJung-uk Kim 417*313a0c13SJung-uk Kim /* Reparse, rebuild namespace */ 418ec3fc72fSJung-uk Kim 4191a39cfb0SJung-uk Kim AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 420*313a0c13SJung-uk Kim AcpiGbl_ParseOpRoot = NULL; 4211a39cfb0SJung-uk Kim AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode); 4221a39cfb0SJung-uk Kim 4231a39cfb0SJung-uk Kim AcpiGbl_RootNode = NULL; 4241a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME; 4251a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED; 4261a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.Type = ACPI_TYPE_DEVICE; 427a88e22b7SJung-uk Kim AcpiGbl_RootNodeStruct.Parent = NULL; 4281a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.Child = NULL; 4291a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.Peer = NULL; 4301a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.Object = NULL; 431a88e22b7SJung-uk Kim AcpiGbl_RootNodeStruct.Flags = 0; 4321a39cfb0SJung-uk Kim 4331a39cfb0SJung-uk Kim Status = AcpiNsRootInitialize (); 434*313a0c13SJung-uk Kim 435*313a0c13SJung-uk Kim /* New namespace, add the external definitions first */ 436*313a0c13SJung-uk Kim 437f556842eSJung-uk Kim AcpiDmAddExternalsToNamespace (); 4381a39cfb0SJung-uk Kim 439ec3fc72fSJung-uk Kim /* Parse the table again. No need to reload it, however */ 440a9f12690SJung-uk Kim 441a9f12690SJung-uk Kim Status = AdParseTable (Table, NULL, FALSE, FALSE); 4421a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 4431a39cfb0SJung-uk Kim { 4441a39cfb0SJung-uk Kim AcpiOsPrintf ("Could not parse ACPI tables, %s\n", 4451a39cfb0SJung-uk Kim AcpiFormatException (Status)); 4461a39cfb0SJung-uk Kim goto Cleanup; 4471a39cfb0SJung-uk Kim } 4481a39cfb0SJung-uk Kim 449*313a0c13SJung-uk Kim /* Cross reference the namespace again */ 450*313a0c13SJung-uk Kim 451*313a0c13SJung-uk Kim AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, 452*313a0c13SJung-uk Kim AcpiGbl_RootNode, OwnerId); 453*313a0c13SJung-uk Kim 454*313a0c13SJung-uk Kim AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot, 455*313a0c13SJung-uk Kim AcpiGbl_RootNode, OwnerId); 456*313a0c13SJung-uk Kim 4571a39cfb0SJung-uk Kim if (AslCompilerdebug) 4581a39cfb0SJung-uk Kim { 459a9f12690SJung-uk Kim AcpiOsPrintf ("/**** After second load and resource conversion\n"); 460efcc2a30SJung-uk Kim NsSetupNamespaceListing (File); 461efcc2a30SJung-uk Kim NsDisplayNamespace (); 462a9f12690SJung-uk Kim AcpiOsPrintf ("*****/\n"); 463a9f12690SJung-uk Kim 4641a39cfb0SJung-uk Kim AcpiDmDumpTree (AcpiGbl_ParseOpRoot); 4651a39cfb0SJung-uk Kim } 4661a39cfb0SJung-uk Kim } 467e0ef747bSNate Lawson 468ec3fc72fSJung-uk Kim /* 469ec3fc72fSJung-uk Kim * Now that the namespace is finalized, we can perform namespace 470ec3fc72fSJung-uk Kim * transforms. 471ec3fc72fSJung-uk Kim * 472ec3fc72fSJung-uk Kim * 1) Convert fixed-offset references to resource descriptors 473ec3fc72fSJung-uk Kim * to symbolic references (Note: modifies namespace) 474ec3fc72fSJung-uk Kim */ 475ec3fc72fSJung-uk Kim AcpiDmConvertResourceIndexes (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode); 476ec3fc72fSJung-uk Kim 47759db4265SNate Lawson /* Optional displays */ 47859db4265SNate Lawson 47959db4265SNate Lawson if (AcpiGbl_DbOpt_disasm) 48059db4265SNate Lawson { 4818ef1a331SJung-uk Kim /* This is the real disassembly */ 4828ef1a331SJung-uk Kim 48359db4265SNate Lawson AdDisplayTables (Filename, Table); 4848ef1a331SJung-uk Kim 4858ef1a331SJung-uk Kim /* Dump hex table if requested (-vt) */ 4868ef1a331SJung-uk Kim 4878ef1a331SJung-uk Kim AcpiDmDumpDataTable (Table); 4888ef1a331SJung-uk Kim 4894c52cad2SJung-uk Kim fprintf (stderr, "Disassembly completed\n"); 4904c52cad2SJung-uk Kim fprintf (stderr, "ASL Output: %s - %u bytes\n", 491*313a0c13SJung-uk Kim DisasmFilename, CmGetFileSize (File)); 492*313a0c13SJung-uk Kim 493*313a0c13SJung-uk Kim if (Gbl_MapfileFlag) 494*313a0c13SJung-uk Kim { 495*313a0c13SJung-uk Kim fprintf (stderr, "%14s %s - %u bytes\n", 496*313a0c13SJung-uk Kim Gbl_Files[ASL_FILE_MAP_OUTPUT].ShortDescription, 497*313a0c13SJung-uk Kim Gbl_Files[ASL_FILE_MAP_OUTPUT].Filename, 498*313a0c13SJung-uk Kim FlGetFileSize (ASL_FILE_MAP_OUTPUT)); 499*313a0c13SJung-uk Kim } 5001a39cfb0SJung-uk Kim } 50159db4265SNate Lawson } 50259db4265SNate Lawson 50359db4265SNate Lawson Cleanup: 504a9f12690SJung-uk Kim 505a9f12690SJung-uk Kim if (Table && !AcpiUtIsAmlTable (Table)) 506a9f12690SJung-uk Kim { 507a9f12690SJung-uk Kim ACPI_FREE (Table); 508a9f12690SJung-uk Kim } 509a9f12690SJung-uk Kim 5101a39cfb0SJung-uk Kim if (OutToFile && File) 51159db4265SNate Lawson { 512ec3fc72fSJung-uk Kim if (AslCompilerdebug) /* Display final namespace, with transforms */ 513ec3fc72fSJung-uk Kim { 514efcc2a30SJung-uk Kim NsSetupNamespaceListing (File); 515efcc2a30SJung-uk Kim NsDisplayNamespace (); 516ec3fc72fSJung-uk Kim } 517ec3fc72fSJung-uk Kim 51859db4265SNate Lawson fclose (File); 51959db4265SNate Lawson AcpiOsRedirectOutput (stdout); 52059db4265SNate Lawson } 52159db4265SNate Lawson 5221a39cfb0SJung-uk Kim AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 523a9f12690SJung-uk Kim AcpiGbl_ParseOpRoot = NULL; 524a9f12690SJung-uk Kim return (Status); 52559db4265SNate Lawson } 52659db4265SNate Lawson 52759db4265SNate Lawson 52859db4265SNate Lawson /****************************************************************************** 52959db4265SNate Lawson * 5301a39cfb0SJung-uk Kim * FUNCTION: AdDisassemblerHeader 5311a39cfb0SJung-uk Kim * 5321a39cfb0SJung-uk Kim * PARAMETERS: Filename - Input file for the table 5331a39cfb0SJung-uk Kim * 5341a39cfb0SJung-uk Kim * RETURN: None 5351a39cfb0SJung-uk Kim * 5361a39cfb0SJung-uk Kim * DESCRIPTION: Create the disassembler header, including ACPICA signon with 5371a39cfb0SJung-uk Kim * current time and date. 5381a39cfb0SJung-uk Kim * 5391a39cfb0SJung-uk Kim *****************************************************************************/ 5401a39cfb0SJung-uk Kim 5411a39cfb0SJung-uk Kim void 5421a39cfb0SJung-uk Kim AdDisassemblerHeader ( 5431a39cfb0SJung-uk Kim char *Filename) 5441a39cfb0SJung-uk Kim { 5451a39cfb0SJung-uk Kim time_t Timer; 5461a39cfb0SJung-uk Kim 5471a39cfb0SJung-uk Kim time (&Timer); 5481a39cfb0SJung-uk Kim 5491a39cfb0SJung-uk Kim /* Header and input table info */ 5501a39cfb0SJung-uk Kim 5513c1812acSJung-uk Kim AcpiOsPrintf ("/*\n"); 5523c1812acSJung-uk Kim AcpiOsPrintf (ACPI_COMMON_HEADER ("AML Disassembler", " * ")); 5531a39cfb0SJung-uk Kim 5543c1812acSJung-uk Kim AcpiOsPrintf (" * Disassembly of %s, %s", Filename, ctime (&Timer)); 5551a39cfb0SJung-uk Kim AcpiOsPrintf (" *\n"); 5561a39cfb0SJung-uk Kim } 5571a39cfb0SJung-uk Kim 5581a39cfb0SJung-uk Kim 5591a39cfb0SJung-uk Kim /****************************************************************************** 5601a39cfb0SJung-uk Kim * 56159db4265SNate Lawson * FUNCTION: AdCreateTableHeader 56259db4265SNate Lawson * 56359db4265SNate Lawson * PARAMETERS: Filename - Input file for the table 56459db4265SNate Lawson * Table - Pointer to the raw table 56559db4265SNate Lawson * 56659db4265SNate Lawson * RETURN: None 56759db4265SNate Lawson * 56859db4265SNate Lawson * DESCRIPTION: Create the ASL table header, including ACPICA signon with 56959db4265SNate Lawson * current time and date. 57059db4265SNate Lawson * 57159db4265SNate Lawson *****************************************************************************/ 57259db4265SNate Lawson 57342fecd12SJung-uk Kim static void 57459db4265SNate Lawson AdCreateTableHeader ( 57559db4265SNate Lawson char *Filename, 57659db4265SNate Lawson ACPI_TABLE_HEADER *Table) 57759db4265SNate Lawson { 5781a39cfb0SJung-uk Kim char *NewFilename; 579a9f12690SJung-uk Kim UINT8 Checksum; 58059db4265SNate Lawson 58159db4265SNate Lawson 582a9f12690SJung-uk Kim /* 583a9f12690SJung-uk Kim * Print file header and dump original table header 584a9f12690SJung-uk Kim */ 5851a39cfb0SJung-uk Kim AdDisassemblerHeader (Filename); 58659db4265SNate Lawson 587a88e22b7SJung-uk Kim AcpiOsPrintf (" * Original Table Header:\n"); 5881a39cfb0SJung-uk Kim AcpiOsPrintf (" * Signature \"%4.4s\"\n", Table->Signature); 5891a39cfb0SJung-uk Kim AcpiOsPrintf (" * Length 0x%8.8X (%u)\n", Table->Length, Table->Length); 590a9f12690SJung-uk Kim 591a9f12690SJung-uk Kim /* Print and validate the revision */ 592a9f12690SJung-uk Kim 593a9f12690SJung-uk Kim AcpiOsPrintf (" * Revision 0x%2.2X", Table->Revision); 594a9f12690SJung-uk Kim 595a9f12690SJung-uk Kim switch (Table->Revision) 596a9f12690SJung-uk Kim { 597a9f12690SJung-uk Kim case 0: 598a9d8d09cSJung-uk Kim 599a9f12690SJung-uk Kim AcpiOsPrintf (" **** Invalid Revision"); 600a9f12690SJung-uk Kim break; 601a9f12690SJung-uk Kim 602a9f12690SJung-uk Kim case 1: 603a9d8d09cSJung-uk Kim 604a9f12690SJung-uk Kim /* Revision of DSDT controls the ACPI integer width */ 605a9f12690SJung-uk Kim 606a9f12690SJung-uk Kim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT)) 607a9f12690SJung-uk Kim { 608d244b227SJung-uk Kim AcpiOsPrintf (" **** 32-bit table (V1), no 64-bit math support"); 609a9f12690SJung-uk Kim } 610a9f12690SJung-uk Kim break; 611a9f12690SJung-uk Kim 612a9f12690SJung-uk Kim default: 613a9d8d09cSJung-uk Kim 614a9f12690SJung-uk Kim break; 615a9f12690SJung-uk Kim } 616a9f12690SJung-uk Kim AcpiOsPrintf ("\n"); 617a9f12690SJung-uk Kim 618a9f12690SJung-uk Kim /* Print and validate the table checksum */ 619a9f12690SJung-uk Kim 620a9f12690SJung-uk Kim AcpiOsPrintf (" * Checksum 0x%2.2X", Table->Checksum); 621a9f12690SJung-uk Kim 622a9f12690SJung-uk Kim Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length); 623a9f12690SJung-uk Kim if (Checksum) 624a9f12690SJung-uk Kim { 625a9f12690SJung-uk Kim AcpiOsPrintf (" **** Incorrect checksum, should be 0x%2.2X", 626a9f12690SJung-uk Kim (UINT8) (Table->Checksum - Checksum)); 627a9f12690SJung-uk Kim } 628a9f12690SJung-uk Kim AcpiOsPrintf ("\n"); 629a9f12690SJung-uk Kim 6301a39cfb0SJung-uk Kim AcpiOsPrintf (" * OEM ID \"%.6s\"\n", Table->OemId); 6311a39cfb0SJung-uk Kim AcpiOsPrintf (" * OEM Table ID \"%.8s\"\n", Table->OemTableId); 6321a39cfb0SJung-uk Kim AcpiOsPrintf (" * OEM Revision 0x%8.8X (%u)\n", Table->OemRevision, Table->OemRevision); 633a9f12690SJung-uk Kim AcpiOsPrintf (" * Compiler ID \"%.4s\"\n", Table->AslCompilerId); 634a9f12690SJung-uk Kim AcpiOsPrintf (" * Compiler Version 0x%8.8X (%u)\n", Table->AslCompilerRevision, Table->AslCompilerRevision); 6359c48c75eSJung-uk Kim AcpiOsPrintf (" */\n"); 6361a39cfb0SJung-uk Kim 6371a39cfb0SJung-uk Kim /* Create AML output filename based on input filename */ 6381a39cfb0SJung-uk Kim 6391a39cfb0SJung-uk Kim if (Filename) 6401a39cfb0SJung-uk Kim { 6411a39cfb0SJung-uk Kim NewFilename = FlGenerateFilename (Filename, "aml"); 6421a39cfb0SJung-uk Kim } 6431a39cfb0SJung-uk Kim else 6441a39cfb0SJung-uk Kim { 645*313a0c13SJung-uk Kim NewFilename = UtStringCacheCalloc (9); 646*313a0c13SJung-uk Kim if (NewFilename) 647*313a0c13SJung-uk Kim { 6481a39cfb0SJung-uk Kim strncat (NewFilename, Table->Signature, 4); 6491a39cfb0SJung-uk Kim strcat (NewFilename, ".aml"); 6501a39cfb0SJung-uk Kim } 651*313a0c13SJung-uk Kim } 652*313a0c13SJung-uk Kim 653*313a0c13SJung-uk Kim if (!NewFilename) 654*313a0c13SJung-uk Kim { 655*313a0c13SJung-uk Kim AcpiOsPrintf (" **** Could not generate AML output filename\n"); 656*313a0c13SJung-uk Kim return; 657*313a0c13SJung-uk Kim } 6581a39cfb0SJung-uk Kim 6591a39cfb0SJung-uk Kim /* Open the ASL definition block */ 66059db4265SNate Lawson 66159db4265SNate Lawson AcpiOsPrintf ( 662a88e22b7SJung-uk Kim "DefinitionBlock (\"%s\", \"%4.4s\", %hu, \"%.6s\", \"%.8s\", 0x%8.8X)\n", 6631a39cfb0SJung-uk Kim NewFilename, Table->Signature, Table->Revision, 66459db4265SNate Lawson Table->OemId, Table->OemTableId, Table->OemRevision); 66559db4265SNate Lawson } 66659db4265SNate Lawson 66759db4265SNate Lawson 66859db4265SNate Lawson /****************************************************************************** 66959db4265SNate Lawson * 67059db4265SNate Lawson * FUNCTION: AdDisplayTables 67159db4265SNate Lawson * 67259db4265SNate Lawson * PARAMETERS: Filename - Input file for the table 673fba7fc7eSJung-uk Kim * Table - Pointer to the raw table 67459db4265SNate Lawson * 67559db4265SNate Lawson * RETURN: Status 67659db4265SNate Lawson * 67759db4265SNate Lawson * DESCRIPTION: Display (disassemble) loaded tables and dump raw tables 67859db4265SNate Lawson * 67959db4265SNate Lawson *****************************************************************************/ 68059db4265SNate Lawson 68159db4265SNate Lawson ACPI_STATUS 68259db4265SNate Lawson AdDisplayTables ( 68359db4265SNate Lawson char *Filename, 68459db4265SNate Lawson ACPI_TABLE_HEADER *Table) 68559db4265SNate Lawson { 68659db4265SNate Lawson 68759db4265SNate Lawson 6881a39cfb0SJung-uk Kim if (!AcpiGbl_ParseOpRoot) 68959db4265SNate Lawson { 6908ef1a331SJung-uk Kim return (AE_NOT_EXIST); 69159db4265SNate Lawson } 69259db4265SNate Lawson 69359db4265SNate Lawson if (!AcpiGbl_DbOpt_verbose) 69459db4265SNate Lawson { 69559db4265SNate Lawson AdCreateTableHeader (Filename, Table); 69659db4265SNate Lawson } 69759db4265SNate Lawson 6981a39cfb0SJung-uk Kim AcpiDmDisassemble (NULL, AcpiGbl_ParseOpRoot, ACPI_UINT32_MAX); 699*313a0c13SJung-uk Kim MpEmitMappingInfo (); 70059db4265SNate Lawson 70159db4265SNate Lawson if (AcpiGbl_DbOpt_verbose) 70259db4265SNate Lawson { 70359db4265SNate Lawson AcpiOsPrintf ("\n\nTable Header:\n"); 7048ef1a331SJung-uk Kim AcpiUtDebugDumpBuffer ((UINT8 *) Table, sizeof (ACPI_TABLE_HEADER), 70559db4265SNate Lawson DB_BYTE_DISPLAY, ACPI_UINT32_MAX); 70659db4265SNate Lawson 70759db4265SNate Lawson AcpiOsPrintf ("Table Body (Length 0x%X)\n", Table->Length); 7088ef1a331SJung-uk Kim AcpiUtDebugDumpBuffer (((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER)), 7098ef1a331SJung-uk Kim Table->Length, DB_BYTE_DISPLAY, ACPI_UINT32_MAX); 71059db4265SNate Lawson } 71159db4265SNate Lawson 7128ef1a331SJung-uk Kim return (AE_OK); 71359db4265SNate Lawson } 71459db4265SNate Lawson 71559db4265SNate Lawson 71659db4265SNate Lawson /****************************************************************************** 71759db4265SNate Lawson * 71859db4265SNate Lawson * FUNCTION: AdGetLocalTables 71959db4265SNate Lawson * 720*313a0c13SJung-uk Kim * PARAMETERS: None 72159db4265SNate Lawson * 722fba7fc7eSJung-uk Kim * RETURN: Status 72359db4265SNate Lawson * 72459db4265SNate Lawson * DESCRIPTION: Get the ACPI tables from either memory or a file 72559db4265SNate Lawson * 72659db4265SNate Lawson *****************************************************************************/ 72759db4265SNate Lawson 72859db4265SNate Lawson ACPI_STATUS 72959db4265SNate Lawson AdGetLocalTables ( 730*313a0c13SJung-uk Kim void) 73159db4265SNate Lawson { 73259db4265SNate Lawson ACPI_STATUS Status; 73359db4265SNate Lawson ACPI_TABLE_HEADER TableHeader; 73459db4265SNate Lawson ACPI_TABLE_HEADER *NewTable; 735a9f12690SJung-uk Kim UINT32 TableIndex; 73659db4265SNate Lawson 73759db4265SNate Lawson 738*313a0c13SJung-uk Kim /* Get the DSDT via table override */ 73959db4265SNate Lawson 7401a39cfb0SJung-uk Kim ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_DSDT); 74159db4265SNate Lawson AcpiOsTableOverride (&TableHeader, &NewTable); 742*313a0c13SJung-uk Kim if (!NewTable) 74359db4265SNate Lawson { 744*313a0c13SJung-uk Kim fprintf (stderr, "Could not obtain DSDT\n"); 745*313a0c13SJung-uk Kim return (AE_NO_ACPI_TABLES); 746*313a0c13SJung-uk Kim } 747*313a0c13SJung-uk Kim 7481a39cfb0SJung-uk Kim AdWriteTable (NewTable, NewTable->Length, 7491a39cfb0SJung-uk Kim ACPI_SIG_DSDT, NewTable->OemTableId); 7501a39cfb0SJung-uk Kim 7511a39cfb0SJung-uk Kim /* Store DSDT in the Table Manager */ 7521a39cfb0SJung-uk Kim 7531a39cfb0SJung-uk Kim Status = AcpiTbStoreTable (0, NewTable, NewTable->Length, 7541a39cfb0SJung-uk Kim 0, &TableIndex); 755f556842eSJung-uk Kim if (ACPI_FAILURE (Status)) 756f556842eSJung-uk Kim { 757f556842eSJung-uk Kim fprintf (stderr, "Could not store DSDT\n"); 7588ef1a331SJung-uk Kim return (AE_NO_ACPI_TABLES); 759f556842eSJung-uk Kim } 76059db4265SNate Lawson 7618ef1a331SJung-uk Kim return (AE_OK); 76259db4265SNate Lawson } 76359db4265SNate Lawson 7641a39cfb0SJung-uk Kim 76559db4265SNate Lawson /****************************************************************************** 76659db4265SNate Lawson * 76759db4265SNate Lawson * FUNCTION: AdParseTable 76859db4265SNate Lawson * 769fba7fc7eSJung-uk Kim * PARAMETERS: Table - Pointer to the raw table 770a9f12690SJung-uk Kim * OwnerId - Returned OwnerId of the table 771a9f12690SJung-uk Kim * LoadTable - If add table to the global table list 772a9f12690SJung-uk Kim * External - If this is an external table 77359db4265SNate Lawson * 77459db4265SNate Lawson * RETURN: Status 77559db4265SNate Lawson * 77659db4265SNate Lawson * DESCRIPTION: Parse the DSDT. 77759db4265SNate Lawson * 77859db4265SNate Lawson *****************************************************************************/ 77959db4265SNate Lawson 78059db4265SNate Lawson ACPI_STATUS 78159db4265SNate Lawson AdParseTable ( 782a9f12690SJung-uk Kim ACPI_TABLE_HEADER *Table, 783a9f12690SJung-uk Kim ACPI_OWNER_ID *OwnerId, 784a9f12690SJung-uk Kim BOOLEAN LoadTable, 785a9f12690SJung-uk Kim BOOLEAN External) 78659db4265SNate Lawson { 78759db4265SNate Lawson ACPI_STATUS Status = AE_OK; 78859db4265SNate Lawson ACPI_WALK_STATE *WalkState; 78959db4265SNate Lawson UINT8 *AmlStart; 79059db4265SNate Lawson UINT32 AmlLength; 791a9f12690SJung-uk Kim UINT32 TableIndex; 79259db4265SNate Lawson 79359db4265SNate Lawson 79459db4265SNate Lawson if (!Table) 79559db4265SNate Lawson { 7968ef1a331SJung-uk Kim return (AE_NOT_EXIST); 79759db4265SNate Lawson } 79859db4265SNate Lawson 79959db4265SNate Lawson /* Pass 1: Parse everything except control method bodies */ 80059db4265SNate Lawson 80159db4265SNate Lawson fprintf (stderr, "Pass 1 parse of [%4.4s]\n", (char *) Table->Signature); 80259db4265SNate Lawson 80359db4265SNate Lawson AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER); 80459db4265SNate Lawson AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER)); 80559db4265SNate Lawson 80659db4265SNate Lawson /* Create the root object */ 80759db4265SNate Lawson 8081a39cfb0SJung-uk Kim AcpiGbl_ParseOpRoot = AcpiPsCreateScopeOp (); 8091a39cfb0SJung-uk Kim if (!AcpiGbl_ParseOpRoot) 81059db4265SNate Lawson { 8118ef1a331SJung-uk Kim return (AE_NO_MEMORY); 81259db4265SNate Lawson } 81359db4265SNate Lawson 81459db4265SNate Lawson /* Create and initialize a new walk state */ 81559db4265SNate Lawson 81659db4265SNate Lawson WalkState = AcpiDsCreateWalkState (0, 8171a39cfb0SJung-uk Kim AcpiGbl_ParseOpRoot, NULL, NULL); 81859db4265SNate Lawson if (!WalkState) 81959db4265SNate Lawson { 82059db4265SNate Lawson return (AE_NO_MEMORY); 82159db4265SNate Lawson } 82259db4265SNate Lawson 8231a39cfb0SJung-uk Kim Status = AcpiDsInitAmlWalk (WalkState, AcpiGbl_ParseOpRoot, 8241a39cfb0SJung-uk Kim NULL, AmlStart, AmlLength, NULL, ACPI_IMODE_LOAD_PASS1); 82559db4265SNate Lawson if (ACPI_FAILURE (Status)) 82659db4265SNate Lawson { 82759db4265SNate Lawson return (Status); 82859db4265SNate Lawson } 82959db4265SNate Lawson 83059db4265SNate Lawson WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE; 831fba7fc7eSJung-uk Kim WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE; 83259db4265SNate Lawson 83359db4265SNate Lawson Status = AcpiPsParseAml (WalkState); 83459db4265SNate Lawson if (ACPI_FAILURE (Status)) 83559db4265SNate Lawson { 8368ef1a331SJung-uk Kim return (Status); 83759db4265SNate Lawson } 83859db4265SNate Lawson 839a9f12690SJung-uk Kim /* If LoadTable is FALSE, we are parsing the last loaded table */ 840a9f12690SJung-uk Kim 8413f5e024cSJung-uk Kim TableIndex = AcpiGbl_RootTableList.CurrentTableCount - 1; 842a9f12690SJung-uk Kim 84359db4265SNate Lawson /* Pass 2 */ 84459db4265SNate Lawson 845a9f12690SJung-uk Kim if (LoadTable) 846a9f12690SJung-uk Kim { 847a9f12690SJung-uk Kim Status = AcpiTbStoreTable ((ACPI_PHYSICAL_ADDRESS) Table, Table, 848*313a0c13SJung-uk Kim Table->Length, ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, 849*313a0c13SJung-uk Kim &TableIndex); 8501a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 8511a39cfb0SJung-uk Kim { 8528ef1a331SJung-uk Kim return (Status); 8531a39cfb0SJung-uk Kim } 854a9f12690SJung-uk Kim Status = AcpiTbAllocateOwnerId (TableIndex); 855a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 856a9f12690SJung-uk Kim { 8578ef1a331SJung-uk Kim return (Status); 858a9f12690SJung-uk Kim } 859a9f12690SJung-uk Kim if (OwnerId) 860a9f12690SJung-uk Kim { 861a9f12690SJung-uk Kim Status = AcpiTbGetOwnerId (TableIndex, OwnerId); 862a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 863a9f12690SJung-uk Kim { 8648ef1a331SJung-uk Kim return (Status); 865a9f12690SJung-uk Kim } 866a9f12690SJung-uk Kim } 867a9f12690SJung-uk Kim } 86859db4265SNate Lawson 8691a39cfb0SJung-uk Kim fprintf (stderr, "Pass 2 parse of [%4.4s]\n", (char *) Table->Signature); 8701a39cfb0SJung-uk Kim 871a9f12690SJung-uk Kim Status = AcpiNsOneCompleteParse (ACPI_IMODE_LOAD_PASS2, TableIndex, NULL); 87259db4265SNate Lawson if (ACPI_FAILURE (Status)) 87359db4265SNate Lawson { 87459db4265SNate Lawson return (Status); 87559db4265SNate Lawson } 87659db4265SNate Lawson 877a9f12690SJung-uk Kim /* No need to parse control methods of external table */ 878a9f12690SJung-uk Kim 879a9f12690SJung-uk Kim if (External) 880a9f12690SJung-uk Kim { 8818ef1a331SJung-uk Kim return (AE_OK); 882a9f12690SJung-uk Kim } 883a9f12690SJung-uk Kim 884*313a0c13SJung-uk Kim /* 885*313a0c13SJung-uk Kim * Pass 3: Parse control methods and link their parse trees 886*313a0c13SJung-uk Kim * into the main parse tree 887*313a0c13SJung-uk Kim */ 888*313a0c13SJung-uk Kim fprintf (stderr, 889*313a0c13SJung-uk Kim "Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)\n"); 890ed17e06eSJung-uk Kim Status = AcpiDmParseDeferredOps (AcpiGbl_ParseOpRoot); 891ed17e06eSJung-uk Kim fprintf (stderr, "\n"); 8921a39cfb0SJung-uk Kim 8931a39cfb0SJung-uk Kim /* Process Resource Templates */ 8941a39cfb0SJung-uk Kim 8951a39cfb0SJung-uk Kim AcpiDmFindResources (AcpiGbl_ParseOpRoot); 89659db4265SNate Lawson 89759db4265SNate Lawson fprintf (stderr, "Parsing completed\n"); 8988ef1a331SJung-uk Kim return (AE_OK); 89959db4265SNate Lawson } 900