159db4265SNate Lawson /****************************************************************************** 259db4265SNate Lawson * 359db4265SNate Lawson * Module Name: adisasm - Application-level disassembler routines 459db4265SNate Lawson * 559db4265SNate Lawson *****************************************************************************/ 659db4265SNate Lawson 7d244b227SJung-uk Kim /* 8*ec3fc72fSJung-uk Kim * Copyright (C) 2000 - 2012, 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 4459db4265SNate Lawson 45ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 47ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 48ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 49ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h> 50ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 51ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h> 52ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 53ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/actables.h> 54ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 5559db4265SNate Lawson 5659db4265SNate Lawson #include <stdio.h> 5759db4265SNate Lawson #include <time.h> 5859db4265SNate Lawson 5959db4265SNate Lawson 6059db4265SNate Lawson #define _COMPONENT ACPI_TOOLS 6159db4265SNate Lawson ACPI_MODULE_NAME ("adisasm") 6259db4265SNate Lawson 63f556842eSJung-uk Kim 641a39cfb0SJung-uk Kim extern int AslCompilerdebug; 65f556842eSJung-uk Kim 6659db4265SNate Lawson 671a39cfb0SJung-uk Kim ACPI_STATUS 681a39cfb0SJung-uk Kim LsDisplayNamespace ( 691a39cfb0SJung-uk Kim void); 7059db4265SNate Lawson 711a39cfb0SJung-uk Kim void 72f556842eSJung-uk Kim LsSetupNsList ( 73f556842eSJung-uk Kim void *Handle); 741a39cfb0SJung-uk Kim 751a39cfb0SJung-uk Kim 761a39cfb0SJung-uk Kim /* Local prototypes */ 771a39cfb0SJung-uk Kim 7842fecd12SJung-uk Kim static void 791a39cfb0SJung-uk Kim AdCreateTableHeader ( 801a39cfb0SJung-uk Kim char *Filename, 811a39cfb0SJung-uk Kim ACPI_TABLE_HEADER *Table); 821a39cfb0SJung-uk Kim 8342fecd12SJung-uk Kim static ACPI_STATUS 84a9f12690SJung-uk Kim AdDeferredParse ( 85a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Op, 86a9f12690SJung-uk Kim UINT8 *Aml, 87a9f12690SJung-uk Kim UINT32 AmlLength); 88a9f12690SJung-uk Kim 8942fecd12SJung-uk Kim static ACPI_STATUS 90a9f12690SJung-uk Kim AdParseDeferredOps ( 91a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Root); 92a9f12690SJung-uk Kim 931a39cfb0SJung-uk Kim 941a39cfb0SJung-uk Kim /* Stubs for ASL compiler */ 9559db4265SNate Lawson 96fba7fc7eSJung-uk Kim #ifndef ACPI_ASL_COMPILER 9759db4265SNate Lawson BOOLEAN 9859db4265SNate Lawson AcpiDsIsResultUsed ( 9959db4265SNate Lawson ACPI_PARSE_OBJECT *Op, 10059db4265SNate Lawson ACPI_WALK_STATE *WalkState) 10159db4265SNate Lawson { 10259db4265SNate Lawson return TRUE; 10359db4265SNate Lawson } 1041a39cfb0SJung-uk Kim 1051a39cfb0SJung-uk Kim ACPI_STATUS 1061a39cfb0SJung-uk Kim AcpiDsMethodError ( 1071a39cfb0SJung-uk Kim ACPI_STATUS Status, 1081a39cfb0SJung-uk Kim ACPI_WALK_STATE *WalkState) 1091a39cfb0SJung-uk Kim { 1101a39cfb0SJung-uk Kim return (Status); 1111a39cfb0SJung-uk Kim } 11259db4265SNate Lawson #endif 11359db4265SNate Lawson 11459db4265SNate Lawson ACPI_STATUS 1151a39cfb0SJung-uk Kim AcpiNsLoadTable ( 116a9f12690SJung-uk Kim UINT32 TableIndex, 1171a39cfb0SJung-uk Kim ACPI_NAMESPACE_NODE *Node) 1181a39cfb0SJung-uk Kim { 1191a39cfb0SJung-uk Kim return (AE_NOT_IMPLEMENTED); 1201a39cfb0SJung-uk Kim } 1211a39cfb0SJung-uk Kim 1221a39cfb0SJung-uk Kim ACPI_STATUS 12359db4265SNate Lawson AcpiDsRestartControlMethod ( 12459db4265SNate Lawson ACPI_WALK_STATE *WalkState, 12559db4265SNate Lawson ACPI_OPERAND_OBJECT *ReturnDesc) 12659db4265SNate Lawson { 12759db4265SNate Lawson return (AE_OK); 12859db4265SNate Lawson } 12959db4265SNate Lawson 130fba7fc7eSJung-uk Kim void 13159db4265SNate Lawson AcpiDsTerminateControlMethod ( 1321a39cfb0SJung-uk Kim ACPI_OPERAND_OBJECT *MethodDesc, 13359db4265SNate Lawson ACPI_WALK_STATE *WalkState) 13459db4265SNate Lawson { 135fba7fc7eSJung-uk Kim return; 13659db4265SNate Lawson } 13759db4265SNate Lawson 13859db4265SNate Lawson ACPI_STATUS 13959db4265SNate Lawson AcpiDsCallControlMethod ( 14059db4265SNate Lawson ACPI_THREAD_STATE *Thread, 14159db4265SNate Lawson ACPI_WALK_STATE *WalkState, 14259db4265SNate Lawson ACPI_PARSE_OBJECT *Op) 14359db4265SNate Lawson { 14459db4265SNate Lawson return (AE_OK); 14559db4265SNate Lawson } 14659db4265SNate Lawson 14759db4265SNate Lawson ACPI_STATUS 14859db4265SNate Lawson AcpiDsMethodDataInitArgs ( 14959db4265SNate Lawson ACPI_OPERAND_OBJECT **Params, 15059db4265SNate Lawson UINT32 MaxParamCount, 15159db4265SNate Lawson ACPI_WALK_STATE *WalkState) 15259db4265SNate Lawson { 15359db4265SNate Lawson return (AE_OK); 15459db4265SNate Lawson } 15559db4265SNate Lawson 15659db4265SNate Lawson 157f556842eSJung-uk Kim static ACPI_TABLE_DESC LocalTables[1]; 158f556842eSJung-uk Kim static ACPI_PARSE_OBJECT *AcpiGbl_ParseOpRoot; 15959db4265SNate Lawson 16059db4265SNate Lawson 16159db4265SNate Lawson /******************************************************************************* 16259db4265SNate Lawson * 16359db4265SNate Lawson * FUNCTION: AdInitialize 16459db4265SNate Lawson * 165f556842eSJung-uk Kim * PARAMETERS: None 16659db4265SNate Lawson * 16759db4265SNate Lawson * RETURN: Status 16859db4265SNate Lawson * 169f556842eSJung-uk Kim * DESCRIPTION: ACPICA and local initialization 17059db4265SNate Lawson * 17159db4265SNate Lawson ******************************************************************************/ 17259db4265SNate Lawson 17359db4265SNate Lawson ACPI_STATUS 17459db4265SNate Lawson AdInitialize ( 17559db4265SNate Lawson void) 17659db4265SNate Lawson { 17759db4265SNate Lawson ACPI_STATUS Status; 17859db4265SNate Lawson 17959db4265SNate Lawson 18059db4265SNate Lawson /* ACPI CA subsystem initialization */ 18159db4265SNate Lawson 1821a39cfb0SJung-uk Kim Status = AcpiOsInitialize (); 183a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 184a9f12690SJung-uk Kim { 185a9f12690SJung-uk Kim return (Status); 186a9f12690SJung-uk Kim } 187a9f12690SJung-uk Kim 188a9f12690SJung-uk Kim Status = AcpiUtInitGlobals (); 189a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 190a9f12690SJung-uk Kim { 191a9f12690SJung-uk Kim return (Status); 192a9f12690SJung-uk Kim } 1931a39cfb0SJung-uk Kim 19459db4265SNate Lawson Status = AcpiUtMutexInitialize (); 19559db4265SNate Lawson if (ACPI_FAILURE (Status)) 19659db4265SNate Lawson { 197a9f12690SJung-uk Kim return (Status); 19859db4265SNate Lawson } 19959db4265SNate Lawson 20059db4265SNate Lawson Status = AcpiNsRootInitialize (); 2011a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 2021a39cfb0SJung-uk Kim { 203a9f12690SJung-uk Kim return (Status); 2041a39cfb0SJung-uk Kim } 2051a39cfb0SJung-uk Kim 2061a39cfb0SJung-uk Kim /* Setup the Table Manager (cheat - there is no RSDT) */ 2071a39cfb0SJung-uk Kim 2083f5e024cSJung-uk Kim AcpiGbl_RootTableList.MaxTableCount = 1; 2093f5e024cSJung-uk Kim AcpiGbl_RootTableList.CurrentTableCount = 0; 2101a39cfb0SJung-uk Kim AcpiGbl_RootTableList.Tables = LocalTables; 2111a39cfb0SJung-uk Kim 212a9f12690SJung-uk Kim return (Status); 21359db4265SNate Lawson } 21459db4265SNate Lawson 21559db4265SNate Lawson 21659db4265SNate Lawson /****************************************************************************** 21759db4265SNate Lawson * 21859db4265SNate Lawson * FUNCTION: AdAmlDisassemble 21959db4265SNate Lawson * 220fba7fc7eSJung-uk Kim * PARAMETERS: Filename - AML input filename 221fba7fc7eSJung-uk Kim * OutToFile - TRUE if output should go to a file 222fba7fc7eSJung-uk Kim * Prefix - Path prefix for output 223fba7fc7eSJung-uk Kim * OutFilename - where the filename is returned 224fba7fc7eSJung-uk Kim * GetAllTables - TRUE if all tables are desired 22559db4265SNate Lawson * 22659db4265SNate Lawson * RETURN: Status 22759db4265SNate Lawson * 22859db4265SNate Lawson * DESCRIPTION: Disassemble an entire ACPI table 22959db4265SNate Lawson * 23059db4265SNate Lawson *****************************************************************************/ 23159db4265SNate Lawson 23259db4265SNate Lawson ACPI_STATUS 23359db4265SNate Lawson AdAmlDisassemble ( 23459db4265SNate Lawson BOOLEAN OutToFile, 23559db4265SNate Lawson char *Filename, 23659db4265SNate Lawson char *Prefix, 23759db4265SNate Lawson char **OutFilename, 23859db4265SNate Lawson BOOLEAN GetAllTables) 23959db4265SNate Lawson { 24059db4265SNate Lawson ACPI_STATUS Status; 24159db4265SNate Lawson char *DisasmFilename = NULL; 242a9f12690SJung-uk Kim char *ExternalFilename; 243709fac06SJung-uk Kim ACPI_EXTERNAL_FILE *ExternalFileList = AcpiGbl_ExternalFileList; 24459db4265SNate Lawson FILE *File = NULL; 245a9f12690SJung-uk Kim ACPI_TABLE_HEADER *Table = NULL; 2461a39cfb0SJung-uk Kim ACPI_TABLE_HEADER *ExternalTable; 247a9f12690SJung-uk Kim ACPI_OWNER_ID OwnerId; 24859db4265SNate Lawson 24959db4265SNate Lawson 25059db4265SNate Lawson /* 251f556842eSJung-uk Kim * Input: AML code from either a file or via GetTables (memory or 252f556842eSJung-uk Kim * registry) 25359db4265SNate Lawson */ 25459db4265SNate Lawson if (Filename) 25559db4265SNate Lawson { 25659db4265SNate Lawson Status = AcpiDbGetTableFromFile (Filename, &Table); 25759db4265SNate Lawson if (ACPI_FAILURE (Status)) 25859db4265SNate Lawson { 25959db4265SNate Lawson return Status; 26059db4265SNate Lawson } 2611a39cfb0SJung-uk Kim 262a9f12690SJung-uk Kim /* 263a9f12690SJung-uk Kim * External filenames separated by commas 264a9f12690SJung-uk Kim * Example: iasl -e file1,file2,file3 -d xxx.aml 265a9f12690SJung-uk Kim */ 266709fac06SJung-uk Kim while (ExternalFileList) 2671a39cfb0SJung-uk Kim { 268709fac06SJung-uk Kim ExternalFilename = ExternalFileList->Path; 269709fac06SJung-uk Kim if (!ACPI_STRCMP (ExternalFilename, Filename)) 270709fac06SJung-uk Kim { 271709fac06SJung-uk Kim /* Next external file */ 272a9f12690SJung-uk Kim 273709fac06SJung-uk Kim ExternalFileList = ExternalFileList->Next; 274709fac06SJung-uk Kim 275709fac06SJung-uk Kim continue; 276709fac06SJung-uk Kim } 277709fac06SJung-uk Kim 278a9f12690SJung-uk Kim Status = AcpiDbGetTableFromFile (ExternalFilename, &ExternalTable); 2791a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 2801a39cfb0SJung-uk Kim { 2811a39cfb0SJung-uk Kim return Status; 2821a39cfb0SJung-uk Kim } 283a9f12690SJung-uk Kim 284a9f12690SJung-uk Kim /* Load external table for symbol resolution */ 285a9f12690SJung-uk Kim 286a9f12690SJung-uk Kim if (ExternalTable) 287a9f12690SJung-uk Kim { 288a9f12690SJung-uk Kim Status = AdParseTable (ExternalTable, &OwnerId, TRUE, TRUE); 289a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 290a9f12690SJung-uk Kim { 291a9f12690SJung-uk Kim AcpiOsPrintf ("Could not parse external ACPI tables, %s\n", 292a9f12690SJung-uk Kim AcpiFormatException (Status)); 293a9f12690SJung-uk Kim return Status; 294a9f12690SJung-uk Kim } 295a9f12690SJung-uk Kim 296a9f12690SJung-uk Kim /* 297a9f12690SJung-uk Kim * Load namespace from names created within control methods 298a9f12690SJung-uk Kim * Set owner id of nodes in external table 299a9f12690SJung-uk Kim */ 300a9f12690SJung-uk Kim AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, 301a9f12690SJung-uk Kim AcpiGbl_RootNode, OwnerId); 302a9f12690SJung-uk Kim AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 303a9f12690SJung-uk Kim } 304a9f12690SJung-uk Kim 305709fac06SJung-uk Kim /* Next external file */ 306a9f12690SJung-uk Kim 307709fac06SJung-uk Kim ExternalFileList = ExternalFileList->Next; 308a9f12690SJung-uk Kim } 309a9f12690SJung-uk Kim 310a9f12690SJung-uk Kim /* Clear external list generated by Scope in external tables */ 311a9f12690SJung-uk Kim 312709fac06SJung-uk Kim if (AcpiGbl_ExternalFileList) 313709fac06SJung-uk Kim { 314f556842eSJung-uk Kim AcpiDmClearExternalList (); 3151a39cfb0SJung-uk Kim } 31659db4265SNate Lawson } 31759db4265SNate Lawson else 31859db4265SNate Lawson { 31959db4265SNate Lawson Status = AdGetLocalTables (Filename, GetAllTables); 32059db4265SNate Lawson if (ACPI_FAILURE (Status)) 32159db4265SNate Lawson { 32259db4265SNate Lawson AcpiOsPrintf ("Could not get ACPI tables, %s\n", 32359db4265SNate Lawson AcpiFormatException (Status)); 32459db4265SNate Lawson return Status; 32559db4265SNate Lawson } 32659db4265SNate Lawson 32759db4265SNate Lawson if (!AcpiGbl_DbOpt_disasm) 32859db4265SNate Lawson { 32959db4265SNate Lawson return AE_OK; 33059db4265SNate Lawson } 33159db4265SNate Lawson 3321a39cfb0SJung-uk Kim /* Obtained the local tables, just disassemble the DSDT */ 33359db4265SNate Lawson 3341a39cfb0SJung-uk Kim Status = AcpiGetTable (ACPI_SIG_DSDT, 0, &Table); 3351a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 3361a39cfb0SJung-uk Kim { 3371a39cfb0SJung-uk Kim AcpiOsPrintf ("Could not get DSDT, %s\n", 3381a39cfb0SJung-uk Kim AcpiFormatException (Status)); 3391a39cfb0SJung-uk Kim return Status; 3401a39cfb0SJung-uk Kim } 3411a39cfb0SJung-uk Kim 34259db4265SNate Lawson AcpiOsPrintf ("\nDisassembly of DSDT\n"); 3431a39cfb0SJung-uk Kim Prefix = AdGenerateFilename ("dsdt", Table->OemTableId); 34459db4265SNate Lawson } 34559db4265SNate Lawson 34659db4265SNate Lawson /* 347f556842eSJung-uk Kim * Output: ASL code. Redirect to a file if requested 34859db4265SNate Lawson */ 34959db4265SNate Lawson if (OutToFile) 35059db4265SNate Lawson { 35159db4265SNate Lawson /* Create/Open a disassembly output file */ 35259db4265SNate Lawson 35359db4265SNate Lawson DisasmFilename = FlGenerateFilename (Prefix, FILE_SUFFIX_DISASSEMBLY); 35459db4265SNate Lawson if (!OutFilename) 35559db4265SNate Lawson { 35659db4265SNate Lawson fprintf (stderr, "Could not generate output filename\n"); 357e50beb51SNate Lawson Status = AE_ERROR; 358e50beb51SNate Lawson goto Cleanup; 35959db4265SNate Lawson } 36059db4265SNate Lawson 36159db4265SNate Lawson File = fopen (DisasmFilename, "w+"); 36259db4265SNate Lawson if (!File) 36359db4265SNate Lawson { 3641a39cfb0SJung-uk Kim fprintf (stderr, "Could not open output file %s\n", DisasmFilename); 365e50beb51SNate Lawson Status = AE_ERROR; 366e50beb51SNate Lawson goto Cleanup; 36759db4265SNate Lawson } 36859db4265SNate Lawson 36959db4265SNate Lawson AcpiOsRedirectOutput (File); 37059db4265SNate Lawson } 37159db4265SNate Lawson 37259db4265SNate Lawson *OutFilename = DisasmFilename; 37359db4265SNate Lawson 3741a39cfb0SJung-uk Kim if (!AcpiUtIsAmlTable (Table)) 3751a39cfb0SJung-uk Kim { 3761a39cfb0SJung-uk Kim AdDisassemblerHeader (Filename); 3771a39cfb0SJung-uk Kim AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n", 3781a39cfb0SJung-uk Kim Table->Signature); 379*ec3fc72fSJung-uk Kim AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength] " 380*ec3fc72fSJung-uk Kim "FieldName : FieldValue\n */\n\n"); 3811a39cfb0SJung-uk Kim 3821a39cfb0SJung-uk Kim AcpiDmDumpDataTable (Table); 3831a39cfb0SJung-uk Kim fprintf (stderr, "Acpi Data Table [%4.4s] decoded, written to \"%s\"\n", 3841a39cfb0SJung-uk Kim Table->Signature, DisasmFilename); 3851a39cfb0SJung-uk Kim } 3861a39cfb0SJung-uk Kim else 3871a39cfb0SJung-uk Kim { 38859db4265SNate Lawson /* Always parse the tables, only option is what to display */ 38959db4265SNate Lawson 390a9f12690SJung-uk Kim Status = AdParseTable (Table, &OwnerId, TRUE, FALSE); 39159db4265SNate Lawson if (ACPI_FAILURE (Status)) 39259db4265SNate Lawson { 39359db4265SNate Lawson AcpiOsPrintf ("Could not parse ACPI tables, %s\n", 39459db4265SNate Lawson AcpiFormatException (Status)); 39559db4265SNate Lawson goto Cleanup; 39659db4265SNate Lawson } 39759db4265SNate Lawson 3981a39cfb0SJung-uk Kim if (AslCompilerdebug) 3991a39cfb0SJung-uk Kim { 4001a39cfb0SJung-uk Kim AcpiOsPrintf ("/**** Before second load\n"); 4011a39cfb0SJung-uk Kim 4021a39cfb0SJung-uk Kim LsSetupNsList (File); 4031a39cfb0SJung-uk Kim LsDisplayNamespace (); 4041a39cfb0SJung-uk Kim AcpiOsPrintf ("*****/\n"); 4051a39cfb0SJung-uk Kim } 4061a39cfb0SJung-uk Kim 407*ec3fc72fSJung-uk Kim /* Load namespace from names created within control methods */ 408*ec3fc72fSJung-uk Kim 409*ec3fc72fSJung-uk Kim AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, 410*ec3fc72fSJung-uk Kim AcpiGbl_RootNode, OwnerId); 4111a39cfb0SJung-uk Kim 4121a39cfb0SJung-uk Kim /* 413*ec3fc72fSJung-uk Kim * Cross reference the namespace here, in order to 414*ec3fc72fSJung-uk Kim * generate External() statements 4151a39cfb0SJung-uk Kim */ 416*ec3fc72fSJung-uk Kim AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot, 417*ec3fc72fSJung-uk Kim AcpiGbl_RootNode, OwnerId); 4181a39cfb0SJung-uk Kim 4191a39cfb0SJung-uk Kim if (AslCompilerdebug) 4201a39cfb0SJung-uk Kim { 4211a39cfb0SJung-uk Kim AcpiDmDumpTree (AcpiGbl_ParseOpRoot); 4221a39cfb0SJung-uk Kim } 4231a39cfb0SJung-uk Kim 4241a39cfb0SJung-uk Kim /* Find possible calls to external control methods */ 4251a39cfb0SJung-uk Kim 4261a39cfb0SJung-uk Kim AcpiDmFindOrphanMethods (AcpiGbl_ParseOpRoot); 4271a39cfb0SJung-uk Kim 4281a39cfb0SJung-uk Kim /* 429*ec3fc72fSJung-uk Kim * If we found any external control methods, we must reparse 430*ec3fc72fSJung-uk Kim * the entire tree with the new information (namely, the 431*ec3fc72fSJung-uk Kim * number of arguments per method) 4321a39cfb0SJung-uk Kim */ 433f556842eSJung-uk Kim if (AcpiDmGetExternalMethodCount ()) 4341a39cfb0SJung-uk Kim { 4351a39cfb0SJung-uk Kim fprintf (stderr, 436*ec3fc72fSJung-uk Kim "\nFound %u external control methods, " 437*ec3fc72fSJung-uk Kim "reparsing with new information\n", 438f556842eSJung-uk Kim AcpiDmGetExternalMethodCount ()); 4391a39cfb0SJung-uk Kim 440*ec3fc72fSJung-uk Kim /* Reparse, rebuild namespace. no need to xref namespace */ 441*ec3fc72fSJung-uk Kim 4421a39cfb0SJung-uk Kim AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 4431a39cfb0SJung-uk Kim AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode); 4441a39cfb0SJung-uk Kim 4451a39cfb0SJung-uk Kim AcpiGbl_RootNode = NULL; 4461a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME; 4471a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED; 4481a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.Type = ACPI_TYPE_DEVICE; 449a88e22b7SJung-uk Kim AcpiGbl_RootNodeStruct.Parent = NULL; 4501a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.Child = NULL; 4511a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.Peer = NULL; 4521a39cfb0SJung-uk Kim AcpiGbl_RootNodeStruct.Object = NULL; 453a88e22b7SJung-uk Kim AcpiGbl_RootNodeStruct.Flags = 0; 4541a39cfb0SJung-uk Kim 4551a39cfb0SJung-uk Kim Status = AcpiNsRootInitialize (); 456f556842eSJung-uk Kim AcpiDmAddExternalsToNamespace (); 4571a39cfb0SJung-uk Kim 458*ec3fc72fSJung-uk Kim /* Parse the table again. No need to reload it, however */ 459a9f12690SJung-uk Kim 460a9f12690SJung-uk Kim Status = AdParseTable (Table, NULL, FALSE, FALSE); 4611a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 4621a39cfb0SJung-uk Kim { 4631a39cfb0SJung-uk Kim AcpiOsPrintf ("Could not parse ACPI tables, %s\n", 4641a39cfb0SJung-uk Kim AcpiFormatException (Status)); 4651a39cfb0SJung-uk Kim goto Cleanup; 4661a39cfb0SJung-uk Kim } 4671a39cfb0SJung-uk Kim 4681a39cfb0SJung-uk Kim if (AslCompilerdebug) 4691a39cfb0SJung-uk Kim { 470a9f12690SJung-uk Kim AcpiOsPrintf ("/**** After second load and resource conversion\n"); 471a9f12690SJung-uk Kim LsSetupNsList (File); 472a9f12690SJung-uk Kim LsDisplayNamespace (); 473a9f12690SJung-uk Kim AcpiOsPrintf ("*****/\n"); 474a9f12690SJung-uk Kim 4751a39cfb0SJung-uk Kim AcpiDmDumpTree (AcpiGbl_ParseOpRoot); 4761a39cfb0SJung-uk Kim } 4771a39cfb0SJung-uk Kim } 478e0ef747bSNate Lawson 479*ec3fc72fSJung-uk Kim /* 480*ec3fc72fSJung-uk Kim * Now that the namespace is finalized, we can perform namespace 481*ec3fc72fSJung-uk Kim * transforms. 482*ec3fc72fSJung-uk Kim * 483*ec3fc72fSJung-uk Kim * 1) Convert fixed-offset references to resource descriptors 484*ec3fc72fSJung-uk Kim * to symbolic references (Note: modifies namespace) 485*ec3fc72fSJung-uk Kim */ 486*ec3fc72fSJung-uk Kim AcpiDmConvertResourceIndexes (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode); 487*ec3fc72fSJung-uk Kim 48859db4265SNate Lawson /* Optional displays */ 48959db4265SNate Lawson 49059db4265SNate Lawson if (AcpiGbl_DbOpt_disasm) 49159db4265SNate Lawson { 49259db4265SNate Lawson AdDisplayTables (Filename, Table); 4931a39cfb0SJung-uk Kim fprintf (stderr, 4941a39cfb0SJung-uk Kim "Disassembly completed, written to \"%s\"\n", 4951a39cfb0SJung-uk Kim DisasmFilename); 4961a39cfb0SJung-uk Kim } 49759db4265SNate Lawson } 49859db4265SNate Lawson 49959db4265SNate Lawson Cleanup: 500a9f12690SJung-uk Kim 501a9f12690SJung-uk Kim if (Table && !AcpiUtIsAmlTable (Table)) 502a9f12690SJung-uk Kim { 503a9f12690SJung-uk Kim ACPI_FREE (Table); 504a9f12690SJung-uk Kim } 505a9f12690SJung-uk Kim 506a9f12690SJung-uk Kim if (DisasmFilename) 507a9f12690SJung-uk Kim { 508a9f12690SJung-uk Kim ACPI_FREE (DisasmFilename); 509a9f12690SJung-uk Kim } 510a9f12690SJung-uk Kim 5111a39cfb0SJung-uk Kim if (OutToFile && File) 51259db4265SNate Lawson { 513*ec3fc72fSJung-uk Kim if (AslCompilerdebug) /* Display final namespace, with transforms */ 514*ec3fc72fSJung-uk Kim { 5151a39cfb0SJung-uk Kim LsSetupNsList (File); 5161a39cfb0SJung-uk Kim LsDisplayNamespace (); 517*ec3fc72fSJung-uk Kim } 518*ec3fc72fSJung-uk Kim 51959db4265SNate Lawson fclose (File); 52059db4265SNate Lawson AcpiOsRedirectOutput (stdout); 52159db4265SNate Lawson } 52259db4265SNate Lawson 5231a39cfb0SJung-uk Kim AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 524a9f12690SJung-uk Kim AcpiGbl_ParseOpRoot = NULL; 525a9f12690SJung-uk Kim return (Status); 52659db4265SNate Lawson } 52759db4265SNate Lawson 52859db4265SNate Lawson 52959db4265SNate Lawson /****************************************************************************** 53059db4265SNate Lawson * 5311a39cfb0SJung-uk Kim * FUNCTION: AdDisassemblerHeader 5321a39cfb0SJung-uk Kim * 5331a39cfb0SJung-uk Kim * PARAMETERS: Filename - Input file for the table 5341a39cfb0SJung-uk Kim * 5351a39cfb0SJung-uk Kim * RETURN: None 5361a39cfb0SJung-uk Kim * 5371a39cfb0SJung-uk Kim * DESCRIPTION: Create the disassembler header, including ACPI CA signon with 5381a39cfb0SJung-uk Kim * current time and date. 5391a39cfb0SJung-uk Kim * 5401a39cfb0SJung-uk Kim *****************************************************************************/ 5411a39cfb0SJung-uk Kim 5421a39cfb0SJung-uk Kim void 5431a39cfb0SJung-uk Kim AdDisassemblerHeader ( 5441a39cfb0SJung-uk Kim char *Filename) 5451a39cfb0SJung-uk Kim { 5461a39cfb0SJung-uk Kim time_t Timer; 5471a39cfb0SJung-uk Kim 5481a39cfb0SJung-uk Kim time (&Timer); 5491a39cfb0SJung-uk Kim 5501a39cfb0SJung-uk Kim /* Header and input table info */ 5511a39cfb0SJung-uk Kim 5523c1812acSJung-uk Kim AcpiOsPrintf ("/*\n"); 5533c1812acSJung-uk Kim AcpiOsPrintf (ACPI_COMMON_HEADER ("AML Disassembler", " * ")); 5541a39cfb0SJung-uk Kim 5553c1812acSJung-uk Kim AcpiOsPrintf (" * Disassembly of %s, %s", Filename, ctime (&Timer)); 5561a39cfb0SJung-uk Kim AcpiOsPrintf (" *\n"); 5571a39cfb0SJung-uk Kim } 5581a39cfb0SJung-uk Kim 5591a39cfb0SJung-uk Kim 5601a39cfb0SJung-uk Kim /****************************************************************************** 5611a39cfb0SJung-uk Kim * 56259db4265SNate Lawson * FUNCTION: AdCreateTableHeader 56359db4265SNate Lawson * 56459db4265SNate Lawson * PARAMETERS: Filename - Input file for the table 56559db4265SNate Lawson * Table - Pointer to the raw table 56659db4265SNate Lawson * 56759db4265SNate Lawson * RETURN: None 56859db4265SNate Lawson * 56959db4265SNate Lawson * DESCRIPTION: Create the ASL table header, including ACPI CA signon with 57059db4265SNate Lawson * current time and date. 57159db4265SNate Lawson * 57259db4265SNate Lawson *****************************************************************************/ 57359db4265SNate Lawson 57442fecd12SJung-uk Kim static void 57559db4265SNate Lawson AdCreateTableHeader ( 57659db4265SNate Lawson char *Filename, 57759db4265SNate Lawson ACPI_TABLE_HEADER *Table) 57859db4265SNate Lawson { 5791a39cfb0SJung-uk Kim char *NewFilename; 580a9f12690SJung-uk Kim UINT8 Checksum; 58159db4265SNate Lawson 58259db4265SNate Lawson 583a9f12690SJung-uk Kim /* 584a9f12690SJung-uk Kim * Print file header and dump original table header 585a9f12690SJung-uk Kim */ 5861a39cfb0SJung-uk Kim AdDisassemblerHeader (Filename); 58759db4265SNate Lawson 588a88e22b7SJung-uk Kim AcpiOsPrintf (" * Original Table Header:\n"); 5891a39cfb0SJung-uk Kim AcpiOsPrintf (" * Signature \"%4.4s\"\n", Table->Signature); 5901a39cfb0SJung-uk Kim AcpiOsPrintf (" * Length 0x%8.8X (%u)\n", Table->Length, Table->Length); 591a9f12690SJung-uk Kim 592a9f12690SJung-uk Kim /* Print and validate the revision */ 593a9f12690SJung-uk Kim 594a9f12690SJung-uk Kim AcpiOsPrintf (" * Revision 0x%2.2X", Table->Revision); 595a9f12690SJung-uk Kim 596a9f12690SJung-uk Kim switch (Table->Revision) 597a9f12690SJung-uk Kim { 598a9f12690SJung-uk Kim case 0: 599a9f12690SJung-uk Kim AcpiOsPrintf (" **** Invalid Revision"); 600a9f12690SJung-uk Kim break; 601a9f12690SJung-uk Kim 602a9f12690SJung-uk Kim case 1: 603a9f12690SJung-uk Kim /* Revision of DSDT controls the ACPI integer width */ 604a9f12690SJung-uk Kim 605a9f12690SJung-uk Kim if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT)) 606a9f12690SJung-uk Kim { 607d244b227SJung-uk Kim AcpiOsPrintf (" **** 32-bit table (V1), no 64-bit math support"); 608a9f12690SJung-uk Kim } 609a9f12690SJung-uk Kim break; 610a9f12690SJung-uk Kim 611a9f12690SJung-uk Kim default: 612a9f12690SJung-uk Kim break; 613a9f12690SJung-uk Kim } 614a9f12690SJung-uk Kim AcpiOsPrintf ("\n"); 615a9f12690SJung-uk Kim 616a9f12690SJung-uk Kim /* Print and validate the table checksum */ 617a9f12690SJung-uk Kim 618a9f12690SJung-uk Kim AcpiOsPrintf (" * Checksum 0x%2.2X", Table->Checksum); 619a9f12690SJung-uk Kim 620a9f12690SJung-uk Kim Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length); 621a9f12690SJung-uk Kim if (Checksum) 622a9f12690SJung-uk Kim { 623a9f12690SJung-uk Kim AcpiOsPrintf (" **** Incorrect checksum, should be 0x%2.2X", 624a9f12690SJung-uk Kim (UINT8) (Table->Checksum - Checksum)); 625a9f12690SJung-uk Kim } 626a9f12690SJung-uk Kim AcpiOsPrintf ("\n"); 627a9f12690SJung-uk Kim 6281a39cfb0SJung-uk Kim AcpiOsPrintf (" * OEM ID \"%.6s\"\n", Table->OemId); 6291a39cfb0SJung-uk Kim AcpiOsPrintf (" * OEM Table ID \"%.8s\"\n", Table->OemTableId); 6301a39cfb0SJung-uk Kim AcpiOsPrintf (" * OEM Revision 0x%8.8X (%u)\n", Table->OemRevision, Table->OemRevision); 631a9f12690SJung-uk Kim AcpiOsPrintf (" * Compiler ID \"%.4s\"\n", Table->AslCompilerId); 632a9f12690SJung-uk Kim AcpiOsPrintf (" * Compiler Version 0x%8.8X (%u)\n", Table->AslCompilerRevision, Table->AslCompilerRevision); 633a88e22b7SJung-uk Kim AcpiOsPrintf (" */\n\n"); 6341a39cfb0SJung-uk Kim 6351a39cfb0SJung-uk Kim /* Create AML output filename based on input filename */ 6361a39cfb0SJung-uk Kim 6371a39cfb0SJung-uk Kim if (Filename) 6381a39cfb0SJung-uk Kim { 6391a39cfb0SJung-uk Kim NewFilename = FlGenerateFilename (Filename, "aml"); 6401a39cfb0SJung-uk Kim } 6411a39cfb0SJung-uk Kim else 6421a39cfb0SJung-uk Kim { 6431a39cfb0SJung-uk Kim NewFilename = ACPI_ALLOCATE_ZEROED (9); 6441a39cfb0SJung-uk Kim strncat (NewFilename, Table->Signature, 4); 6451a39cfb0SJung-uk Kim strcat (NewFilename, ".aml"); 6461a39cfb0SJung-uk Kim } 6471a39cfb0SJung-uk Kim 6481a39cfb0SJung-uk Kim /* Open the ASL definition block */ 64959db4265SNate Lawson 65059db4265SNate Lawson AcpiOsPrintf ( 651a88e22b7SJung-uk Kim "DefinitionBlock (\"%s\", \"%4.4s\", %hu, \"%.6s\", \"%.8s\", 0x%8.8X)\n", 6521a39cfb0SJung-uk Kim NewFilename, Table->Signature, Table->Revision, 65359db4265SNate Lawson Table->OemId, Table->OemTableId, Table->OemRevision); 654a9f12690SJung-uk Kim 655a9f12690SJung-uk Kim ACPI_FREE (NewFilename); 65659db4265SNate Lawson } 65759db4265SNate Lawson 65859db4265SNate Lawson 65959db4265SNate Lawson /****************************************************************************** 66059db4265SNate Lawson * 66159db4265SNate Lawson * FUNCTION: AdDisplayTables 66259db4265SNate Lawson * 66359db4265SNate Lawson * PARAMETERS: Filename - Input file for the table 664fba7fc7eSJung-uk Kim * Table - Pointer to the raw table 66559db4265SNate Lawson * 66659db4265SNate Lawson * RETURN: Status 66759db4265SNate Lawson * 66859db4265SNate Lawson * DESCRIPTION: Display (disassemble) loaded tables and dump raw tables 66959db4265SNate Lawson * 67059db4265SNate Lawson *****************************************************************************/ 67159db4265SNate Lawson 67259db4265SNate Lawson ACPI_STATUS 67359db4265SNate Lawson AdDisplayTables ( 67459db4265SNate Lawson char *Filename, 67559db4265SNate Lawson ACPI_TABLE_HEADER *Table) 67659db4265SNate Lawson { 67759db4265SNate Lawson 67859db4265SNate Lawson 6791a39cfb0SJung-uk Kim if (!AcpiGbl_ParseOpRoot) 68059db4265SNate Lawson { 68159db4265SNate Lawson return AE_NOT_EXIST; 68259db4265SNate Lawson } 68359db4265SNate Lawson 68459db4265SNate Lawson if (!AcpiGbl_DbOpt_verbose) 68559db4265SNate Lawson { 68659db4265SNate Lawson AdCreateTableHeader (Filename, Table); 68759db4265SNate Lawson } 68859db4265SNate Lawson 6891a39cfb0SJung-uk Kim AcpiDmDisassemble (NULL, AcpiGbl_ParseOpRoot, ACPI_UINT32_MAX); 69059db4265SNate Lawson 69159db4265SNate Lawson if (AcpiGbl_DbOpt_verbose) 69259db4265SNate Lawson { 69359db4265SNate Lawson AcpiOsPrintf ("\n\nTable Header:\n"); 69459db4265SNate Lawson AcpiUtDumpBuffer ((UINT8 *) Table, sizeof (ACPI_TABLE_HEADER), 69559db4265SNate Lawson DB_BYTE_DISPLAY, ACPI_UINT32_MAX); 69659db4265SNate Lawson 69759db4265SNate Lawson AcpiOsPrintf ("Table Body (Length 0x%X)\n", Table->Length); 69859db4265SNate Lawson AcpiUtDumpBuffer (((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER)), Table->Length, 69959db4265SNate Lawson DB_BYTE_DISPLAY, ACPI_UINT32_MAX); 70059db4265SNate Lawson } 70159db4265SNate Lawson 70259db4265SNate Lawson return AE_OK; 70359db4265SNate Lawson } 70459db4265SNate Lawson 70559db4265SNate Lawson 70659db4265SNate Lawson /****************************************************************************** 70759db4265SNate Lawson * 70859db4265SNate Lawson * FUNCTION: AdDeferredParse 70959db4265SNate Lawson * 71059db4265SNate Lawson * PARAMETERS: Op - Root Op of the deferred opcode 71159db4265SNate Lawson * Aml - Pointer to the raw AML 71259db4265SNate Lawson * AmlLength - Length of the AML 71359db4265SNate Lawson * 71459db4265SNate Lawson * RETURN: Status 71559db4265SNate Lawson * 71659db4265SNate Lawson * DESCRIPTION: Parse one deferred opcode 71759db4265SNate Lawson * (Methods, operation regions, etc.) 71859db4265SNate Lawson * 71959db4265SNate Lawson *****************************************************************************/ 72059db4265SNate Lawson 72142fecd12SJung-uk Kim static ACPI_STATUS 72259db4265SNate Lawson AdDeferredParse ( 72359db4265SNate Lawson ACPI_PARSE_OBJECT *Op, 72459db4265SNate Lawson UINT8 *Aml, 72559db4265SNate Lawson UINT32 AmlLength) 72659db4265SNate Lawson { 72759db4265SNate Lawson ACPI_WALK_STATE *WalkState; 72859db4265SNate Lawson ACPI_STATUS Status; 72959db4265SNate Lawson ACPI_PARSE_OBJECT *SearchOp; 73059db4265SNate Lawson ACPI_PARSE_OBJECT *StartOp; 73159db4265SNate Lawson UINT32 BaseAmlOffset; 73259db4265SNate Lawson ACPI_PARSE_OBJECT *ExtraOp; 73359db4265SNate Lawson 73459db4265SNate Lawson 7351a39cfb0SJung-uk Kim ACPI_FUNCTION_TRACE (AdDeferredParse); 73659db4265SNate Lawson 73759db4265SNate Lawson 73859db4265SNate Lawson fprintf (stderr, "."); 73959db4265SNate Lawson 74059db4265SNate Lawson if (!Aml || !AmlLength) 74159db4265SNate Lawson { 74259db4265SNate Lawson return_ACPI_STATUS (AE_OK); 74359db4265SNate Lawson } 74459db4265SNate Lawson 74559db4265SNate Lawson ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Parsing %s [%4.4s]\n", 74659db4265SNate Lawson Op->Common.AmlOpName, (char *) &Op->Named.Name)); 74759db4265SNate Lawson 74859db4265SNate Lawson WalkState = AcpiDsCreateWalkState (0, Op, NULL, NULL); 74959db4265SNate Lawson if (!WalkState) 75059db4265SNate Lawson { 75159db4265SNate Lawson return_ACPI_STATUS (AE_NO_MEMORY); 75259db4265SNate Lawson } 75359db4265SNate Lawson 75459db4265SNate Lawson Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, Aml, 7551a39cfb0SJung-uk Kim AmlLength, NULL, ACPI_IMODE_LOAD_PASS1); 75659db4265SNate Lawson if (ACPI_FAILURE (Status)) 75759db4265SNate Lawson { 75859db4265SNate Lawson return_ACPI_STATUS (Status); 75959db4265SNate Lawson } 76059db4265SNate Lawson 76159db4265SNate Lawson /* Parse the method */ 76259db4265SNate Lawson 76359db4265SNate Lawson WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE; 764fba7fc7eSJung-uk Kim WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE; 76559db4265SNate Lawson Status = AcpiPsParseAml (WalkState); 76659db4265SNate Lawson 76759db4265SNate Lawson /* 76859db4265SNate Lawson * We need to update all of the Aml offsets, since the parser thought 76959db4265SNate Lawson * that the method began at offset zero. In reality, it began somewhere 77059db4265SNate Lawson * within the ACPI table, at the BaseAmlOffset. Walk the entire tree that 77159db4265SNate Lawson * was just created and update the AmlOffset in each Op 77259db4265SNate Lawson */ 77359db4265SNate Lawson BaseAmlOffset = (Op->Common.Value.Arg)->Common.AmlOffset + 1; 77459db4265SNate Lawson StartOp = (Op->Common.Value.Arg)->Common.Next; 77559db4265SNate Lawson SearchOp = StartOp; 77659db4265SNate Lawson 77759db4265SNate Lawson /* Walk the parse tree */ 77859db4265SNate Lawson 77959db4265SNate Lawson while (SearchOp) 78059db4265SNate Lawson { 78159db4265SNate Lawson SearchOp->Common.AmlOffset += BaseAmlOffset; 78259db4265SNate Lawson SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp); 78359db4265SNate Lawson } 78459db4265SNate Lawson 78559db4265SNate Lawson /* 78659db4265SNate Lawson * Link the newly parsed subtree into the main parse tree 78759db4265SNate Lawson */ 78859db4265SNate Lawson switch (Op->Common.AmlOpcode) 78959db4265SNate Lawson { 79059db4265SNate Lawson case AML_BUFFER_OP: 79159db4265SNate Lawson case AML_PACKAGE_OP: 79259db4265SNate Lawson case AML_VAR_PACKAGE_OP: 79359db4265SNate Lawson 79459db4265SNate Lawson switch (Op->Common.AmlOpcode) 79559db4265SNate Lawson { 79659db4265SNate Lawson case AML_PACKAGE_OP: 79759db4265SNate Lawson ExtraOp = Op->Common.Value.Arg; 79859db4265SNate Lawson ExtraOp = ExtraOp->Common.Next; 79959db4265SNate Lawson Op->Common.Value.Arg = ExtraOp->Common.Value.Arg; 80059db4265SNate Lawson break; 80159db4265SNate Lawson 802fba7fc7eSJung-uk Kim case AML_VAR_PACKAGE_OP: 80359db4265SNate Lawson case AML_BUFFER_OP: 80459db4265SNate Lawson default: 80559db4265SNate Lawson ExtraOp = Op->Common.Value.Arg; 80659db4265SNate Lawson Op->Common.Value.Arg = ExtraOp->Common.Value.Arg; 80759db4265SNate Lawson break; 80859db4265SNate Lawson } 80959db4265SNate Lawson 81059db4265SNate Lawson /* Must point all parents to the main tree */ 81159db4265SNate Lawson 81259db4265SNate Lawson StartOp = Op; 81359db4265SNate Lawson SearchOp = StartOp; 81459db4265SNate Lawson while (SearchOp) 81559db4265SNate Lawson { 81659db4265SNate Lawson if (SearchOp->Common.Parent == ExtraOp) 81759db4265SNate Lawson { 81859db4265SNate Lawson SearchOp->Common.Parent = Op; 81959db4265SNate Lawson } 82059db4265SNate Lawson SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp); 82159db4265SNate Lawson } 82259db4265SNate Lawson break; 82359db4265SNate Lawson 82459db4265SNate Lawson default: 82559db4265SNate Lawson break; 82659db4265SNate Lawson } 82759db4265SNate Lawson 82859db4265SNate Lawson return_ACPI_STATUS (AE_OK); 82959db4265SNate Lawson } 83059db4265SNate Lawson 83159db4265SNate Lawson 83259db4265SNate Lawson /****************************************************************************** 83359db4265SNate Lawson * 83459db4265SNate Lawson * FUNCTION: AdParseDeferredOps 83559db4265SNate Lawson * 83659db4265SNate Lawson * PARAMETERS: Root - Root of the parse tree 83759db4265SNate Lawson * 83859db4265SNate Lawson * RETURN: Status 83959db4265SNate Lawson * 84059db4265SNate Lawson * DESCRIPTION: Parse the deferred opcodes (Methods, regions, etc.) 84159db4265SNate Lawson * 84259db4265SNate Lawson *****************************************************************************/ 84359db4265SNate Lawson 84442fecd12SJung-uk Kim static ACPI_STATUS 84559db4265SNate Lawson AdParseDeferredOps ( 84659db4265SNate Lawson ACPI_PARSE_OBJECT *Root) 84759db4265SNate Lawson { 84859db4265SNate Lawson ACPI_PARSE_OBJECT *Op = Root; 84959db4265SNate Lawson ACPI_STATUS Status = AE_OK; 85059db4265SNate Lawson const ACPI_OPCODE_INFO *OpInfo; 85159db4265SNate Lawson 85259db4265SNate Lawson 8531a39cfb0SJung-uk Kim ACPI_FUNCTION_NAME (AdParseDeferredOps); 85459db4265SNate Lawson fprintf (stderr, "Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)\n"); 85559db4265SNate Lawson 85659db4265SNate Lawson while (Op) 85759db4265SNate Lawson { 85859db4265SNate Lawson OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 85959db4265SNate Lawson if (!(OpInfo->Flags & AML_DEFER)) 86059db4265SNate Lawson { 86159db4265SNate Lawson Op = AcpiPsGetDepthNext (Root, Op); 86259db4265SNate Lawson continue; 86359db4265SNate Lawson } 86459db4265SNate Lawson 86559db4265SNate Lawson switch (Op->Common.AmlOpcode) 86659db4265SNate Lawson { 86759db4265SNate Lawson case AML_METHOD_OP: 86859db4265SNate Lawson case AML_BUFFER_OP: 86959db4265SNate Lawson case AML_PACKAGE_OP: 87059db4265SNate Lawson case AML_VAR_PACKAGE_OP: 87159db4265SNate Lawson 87259db4265SNate Lawson Status = AdDeferredParse (Op, Op->Named.Data, Op->Named.Length); 87359db4265SNate Lawson if (ACPI_FAILURE (Status)) 87459db4265SNate Lawson { 87559db4265SNate Lawson return_ACPI_STATUS (Status); 87659db4265SNate Lawson } 87759db4265SNate Lawson break; 87859db4265SNate Lawson 87959db4265SNate Lawson case AML_REGION_OP: 8803f0275a0SJung-uk Kim case AML_DATA_REGION_OP: 88159db4265SNate Lawson case AML_CREATE_QWORD_FIELD_OP: 88259db4265SNate Lawson case AML_CREATE_DWORD_FIELD_OP: 88359db4265SNate Lawson case AML_CREATE_WORD_FIELD_OP: 88459db4265SNate Lawson case AML_CREATE_BYTE_FIELD_OP: 88559db4265SNate Lawson case AML_CREATE_BIT_FIELD_OP: 88659db4265SNate Lawson case AML_CREATE_FIELD_OP: 887a9f12690SJung-uk Kim case AML_BANK_FIELD_OP: 88859db4265SNate Lawson 88959db4265SNate Lawson /* Nothing to do in these cases */ 89059db4265SNate Lawson 89159db4265SNate Lawson break; 89259db4265SNate Lawson 89359db4265SNate Lawson default: 8941a39cfb0SJung-uk Kim ACPI_ERROR ((AE_INFO, "Unhandled deferred opcode [%s]", 89559db4265SNate Lawson Op->Common.AmlOpName)); 89659db4265SNate Lawson break; 89759db4265SNate Lawson } 89859db4265SNate Lawson 89959db4265SNate Lawson Op = AcpiPsGetDepthNext (Root, Op); 90059db4265SNate Lawson } 90159db4265SNate Lawson 90259db4265SNate Lawson fprintf (stderr, "\n"); 90359db4265SNate Lawson return Status; 90459db4265SNate Lawson } 90559db4265SNate Lawson 90659db4265SNate Lawson 90759db4265SNate Lawson /****************************************************************************** 90859db4265SNate Lawson * 90959db4265SNate Lawson * FUNCTION: AdGetLocalTables 91059db4265SNate Lawson * 911fba7fc7eSJung-uk Kim * PARAMETERS: Filename - Not used 912fba7fc7eSJung-uk Kim * GetAllTables - TRUE if all tables are desired 91359db4265SNate Lawson * 914fba7fc7eSJung-uk Kim * RETURN: Status 91559db4265SNate Lawson * 91659db4265SNate Lawson * DESCRIPTION: Get the ACPI tables from either memory or a file 91759db4265SNate Lawson * 91859db4265SNate Lawson *****************************************************************************/ 91959db4265SNate Lawson 92059db4265SNate Lawson ACPI_STATUS 92159db4265SNate Lawson AdGetLocalTables ( 92259db4265SNate Lawson char *Filename, 92359db4265SNate Lawson BOOLEAN GetAllTables) 92459db4265SNate Lawson { 92559db4265SNate Lawson ACPI_STATUS Status; 92659db4265SNate Lawson ACPI_TABLE_HEADER TableHeader; 92759db4265SNate Lawson ACPI_TABLE_HEADER *NewTable; 92859db4265SNate Lawson UINT32 NumTables; 92959db4265SNate Lawson UINT32 PointerSize; 930a9f12690SJung-uk Kim UINT32 TableIndex; 93159db4265SNate Lawson 93259db4265SNate Lawson 93359db4265SNate Lawson if (GetAllTables) 93459db4265SNate Lawson { 9351a39cfb0SJung-uk Kim ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_RSDT); 93659db4265SNate Lawson AcpiOsTableOverride (&TableHeader, &NewTable); 937e50beb51SNate Lawson if (!NewTable) 938e50beb51SNate Lawson { 939e50beb51SNate Lawson fprintf (stderr, "Could not obtain RSDT\n"); 940e50beb51SNate Lawson return AE_NO_ACPI_TABLES; 941e50beb51SNate Lawson } 942a9f12690SJung-uk Kim else 943a9f12690SJung-uk Kim { 944a9f12690SJung-uk Kim AdWriteTable (NewTable, NewTable->Length, 945a9f12690SJung-uk Kim ACPI_SIG_RSDT, NewTable->OemTableId); 946a9f12690SJung-uk Kim } 94759db4265SNate Lawson 9481a39cfb0SJung-uk Kim if (ACPI_COMPARE_NAME (NewTable->Signature, ACPI_SIG_RSDT)) 94959db4265SNate Lawson { 95059db4265SNate Lawson PointerSize = sizeof (UINT32); 95159db4265SNate Lawson } 95259db4265SNate Lawson else 95359db4265SNate Lawson { 95459db4265SNate Lawson PointerSize = sizeof (UINT64); 95559db4265SNate Lawson } 95659db4265SNate Lawson 95759db4265SNate Lawson /* 95859db4265SNate Lawson * Determine the number of tables pointed to by the RSDT/XSDT. 95959db4265SNate Lawson * This is defined by the ACPI Specification to be the number of 96059db4265SNate Lawson * pointers contained within the RSDT/XSDT. The size of the pointers 96159db4265SNate Lawson * is architecture-dependent. 96259db4265SNate Lawson */ 96359db4265SNate Lawson NumTables = (NewTable->Length - sizeof (ACPI_TABLE_HEADER)) / PointerSize; 964a88e22b7SJung-uk Kim AcpiOsPrintf ("There are %u tables defined in the %4.4s\n\n", 96559db4265SNate Lawson NumTables, NewTable->Signature); 96659db4265SNate Lawson 96759db4265SNate Lawson /* Get the FADT */ 96859db4265SNate Lawson 9691a39cfb0SJung-uk Kim ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_FADT); 97059db4265SNate Lawson AcpiOsTableOverride (&TableHeader, &NewTable); 97159db4265SNate Lawson if (NewTable) 97259db4265SNate Lawson { 97359db4265SNate Lawson AdWriteTable (NewTable, NewTable->Length, 9741a39cfb0SJung-uk Kim ACPI_SIG_FADT, NewTable->OemTableId); 97559db4265SNate Lawson } 97659db4265SNate Lawson AcpiOsPrintf ("\n"); 97759db4265SNate Lawson 9781a39cfb0SJung-uk Kim /* Don't bother with FACS, it is usually all zeros */ 97959db4265SNate Lawson } 98059db4265SNate Lawson 98159db4265SNate Lawson /* Always get the DSDT */ 98259db4265SNate Lawson 9831a39cfb0SJung-uk Kim ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_DSDT); 98459db4265SNate Lawson AcpiOsTableOverride (&TableHeader, &NewTable); 98559db4265SNate Lawson if (NewTable) 98659db4265SNate Lawson { 9871a39cfb0SJung-uk Kim AdWriteTable (NewTable, NewTable->Length, 9881a39cfb0SJung-uk Kim ACPI_SIG_DSDT, NewTable->OemTableId); 9891a39cfb0SJung-uk Kim 9901a39cfb0SJung-uk Kim /* Store DSDT in the Table Manager */ 9911a39cfb0SJung-uk Kim 9921a39cfb0SJung-uk Kim Status = AcpiTbStoreTable (0, NewTable, NewTable->Length, 9931a39cfb0SJung-uk Kim 0, &TableIndex); 994f556842eSJung-uk Kim if (ACPI_FAILURE (Status)) 995f556842eSJung-uk Kim { 996f556842eSJung-uk Kim fprintf (stderr, "Could not store DSDT\n"); 997f556842eSJung-uk Kim return AE_NO_ACPI_TABLES; 998f556842eSJung-uk Kim } 99959db4265SNate Lawson } 100059db4265SNate Lawson else 100159db4265SNate Lawson { 100259db4265SNate Lawson fprintf (stderr, "Could not obtain DSDT\n"); 1003e50beb51SNate Lawson return AE_NO_ACPI_TABLES; 100459db4265SNate Lawson } 100559db4265SNate Lawson 10061a39cfb0SJung-uk Kim #if 0 10071a39cfb0SJung-uk Kim /* TBD: Future implementation */ 10081a39cfb0SJung-uk Kim 100959db4265SNate Lawson AcpiOsPrintf ("\n"); 101059db4265SNate Lawson 101159db4265SNate Lawson /* Get all SSDTs */ 101259db4265SNate Lawson 10131a39cfb0SJung-uk Kim ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_SSDT); 10141a39cfb0SJung-uk Kim do 101559db4265SNate Lawson { 10161a39cfb0SJung-uk Kim NewTable = NULL; 101759db4265SNate Lawson Status = AcpiOsTableOverride (&TableHeader, &NewTable); 10181a39cfb0SJung-uk Kim 10191a39cfb0SJung-uk Kim } while (NewTable); 10201a39cfb0SJung-uk Kim #endif 102159db4265SNate Lawson 102259db4265SNate Lawson return AE_OK; 102359db4265SNate Lawson } 102459db4265SNate Lawson 10251a39cfb0SJung-uk Kim 102659db4265SNate Lawson /****************************************************************************** 102759db4265SNate Lawson * 102859db4265SNate Lawson * FUNCTION: AdParseTable 102959db4265SNate Lawson * 1030fba7fc7eSJung-uk Kim * PARAMETERS: Table - Pointer to the raw table 1031a9f12690SJung-uk Kim * OwnerId - Returned OwnerId of the table 1032a9f12690SJung-uk Kim * LoadTable - If add table to the global table list 1033a9f12690SJung-uk Kim * External - If this is an external table 103459db4265SNate Lawson * 103559db4265SNate Lawson * RETURN: Status 103659db4265SNate Lawson * 103759db4265SNate Lawson * DESCRIPTION: Parse the DSDT. 103859db4265SNate Lawson * 103959db4265SNate Lawson *****************************************************************************/ 104059db4265SNate Lawson 104159db4265SNate Lawson ACPI_STATUS 104259db4265SNate Lawson AdParseTable ( 1043a9f12690SJung-uk Kim ACPI_TABLE_HEADER *Table, 1044a9f12690SJung-uk Kim ACPI_OWNER_ID *OwnerId, 1045a9f12690SJung-uk Kim BOOLEAN LoadTable, 1046a9f12690SJung-uk Kim BOOLEAN External) 104759db4265SNate Lawson { 104859db4265SNate Lawson ACPI_STATUS Status = AE_OK; 104959db4265SNate Lawson ACPI_WALK_STATE *WalkState; 105059db4265SNate Lawson UINT8 *AmlStart; 105159db4265SNate Lawson UINT32 AmlLength; 1052a9f12690SJung-uk Kim UINT32 TableIndex; 105359db4265SNate Lawson 105459db4265SNate Lawson 105559db4265SNate Lawson if (!Table) 105659db4265SNate Lawson { 105759db4265SNate Lawson return AE_NOT_EXIST; 105859db4265SNate Lawson } 105959db4265SNate Lawson 106059db4265SNate Lawson /* Pass 1: Parse everything except control method bodies */ 106159db4265SNate Lawson 106259db4265SNate Lawson fprintf (stderr, "Pass 1 parse of [%4.4s]\n", (char *) Table->Signature); 106359db4265SNate Lawson 106459db4265SNate Lawson AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER); 106559db4265SNate Lawson AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER)); 106659db4265SNate Lawson 106759db4265SNate Lawson /* Create the root object */ 106859db4265SNate Lawson 10691a39cfb0SJung-uk Kim AcpiGbl_ParseOpRoot = AcpiPsCreateScopeOp (); 10701a39cfb0SJung-uk Kim if (!AcpiGbl_ParseOpRoot) 107159db4265SNate Lawson { 107259db4265SNate Lawson return AE_NO_MEMORY; 107359db4265SNate Lawson } 107459db4265SNate Lawson 107559db4265SNate Lawson /* Create and initialize a new walk state */ 107659db4265SNate Lawson 107759db4265SNate Lawson WalkState = AcpiDsCreateWalkState (0, 10781a39cfb0SJung-uk Kim AcpiGbl_ParseOpRoot, NULL, NULL); 107959db4265SNate Lawson if (!WalkState) 108059db4265SNate Lawson { 108159db4265SNate Lawson return (AE_NO_MEMORY); 108259db4265SNate Lawson } 108359db4265SNate Lawson 10841a39cfb0SJung-uk Kim Status = AcpiDsInitAmlWalk (WalkState, AcpiGbl_ParseOpRoot, 10851a39cfb0SJung-uk Kim NULL, AmlStart, AmlLength, NULL, ACPI_IMODE_LOAD_PASS1); 108659db4265SNate Lawson if (ACPI_FAILURE (Status)) 108759db4265SNate Lawson { 108859db4265SNate Lawson return (Status); 108959db4265SNate Lawson } 109059db4265SNate Lawson 109159db4265SNate Lawson WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE; 1092fba7fc7eSJung-uk Kim WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE; 109359db4265SNate Lawson 109459db4265SNate Lawson Status = AcpiPsParseAml (WalkState); 109559db4265SNate Lawson if (ACPI_FAILURE (Status)) 109659db4265SNate Lawson { 109759db4265SNate Lawson return Status; 109859db4265SNate Lawson } 109959db4265SNate Lawson 1100a9f12690SJung-uk Kim /* If LoadTable is FALSE, we are parsing the last loaded table */ 1101a9f12690SJung-uk Kim 11023f5e024cSJung-uk Kim TableIndex = AcpiGbl_RootTableList.CurrentTableCount - 1; 1103a9f12690SJung-uk Kim 110459db4265SNate Lawson /* Pass 2 */ 110559db4265SNate Lawson 1106a9f12690SJung-uk Kim if (LoadTable) 1107a9f12690SJung-uk Kim { 1108a9f12690SJung-uk Kim Status = AcpiTbStoreTable ((ACPI_PHYSICAL_ADDRESS) Table, Table, 11091a39cfb0SJung-uk Kim Table->Length, ACPI_TABLE_ORIGIN_ALLOCATED, &TableIndex); 11101a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 11111a39cfb0SJung-uk Kim { 11121a39cfb0SJung-uk Kim return Status; 11131a39cfb0SJung-uk Kim } 1114a9f12690SJung-uk Kim Status = AcpiTbAllocateOwnerId (TableIndex); 1115a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 1116a9f12690SJung-uk Kim { 1117a9f12690SJung-uk Kim return Status; 1118a9f12690SJung-uk Kim } 1119a9f12690SJung-uk Kim if (OwnerId) 1120a9f12690SJung-uk Kim { 1121a9f12690SJung-uk Kim Status = AcpiTbGetOwnerId (TableIndex, OwnerId); 1122a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 1123a9f12690SJung-uk Kim { 1124a9f12690SJung-uk Kim return Status; 1125a9f12690SJung-uk Kim } 1126a9f12690SJung-uk Kim } 1127a9f12690SJung-uk Kim } 112859db4265SNate Lawson 11291a39cfb0SJung-uk Kim fprintf (stderr, "Pass 2 parse of [%4.4s]\n", (char *) Table->Signature); 11301a39cfb0SJung-uk Kim 1131a9f12690SJung-uk Kim Status = AcpiNsOneCompleteParse (ACPI_IMODE_LOAD_PASS2, TableIndex, NULL); 113259db4265SNate Lawson if (ACPI_FAILURE (Status)) 113359db4265SNate Lawson { 113459db4265SNate Lawson return (Status); 113559db4265SNate Lawson } 113659db4265SNate Lawson 1137a9f12690SJung-uk Kim /* No need to parse control methods of external table */ 1138a9f12690SJung-uk Kim 1139a9f12690SJung-uk Kim if (External) 1140a9f12690SJung-uk Kim { 1141a9f12690SJung-uk Kim return AE_OK; 1142a9f12690SJung-uk Kim } 1143a9f12690SJung-uk Kim 114459db4265SNate Lawson /* Pass 3: Parse control methods and link their parse trees into the main parse tree */ 114559db4265SNate Lawson 11461a39cfb0SJung-uk Kim Status = AdParseDeferredOps (AcpiGbl_ParseOpRoot); 11471a39cfb0SJung-uk Kim 11481a39cfb0SJung-uk Kim /* Process Resource Templates */ 11491a39cfb0SJung-uk Kim 11501a39cfb0SJung-uk Kim AcpiDmFindResources (AcpiGbl_ParseOpRoot); 115159db4265SNate Lawson 115259db4265SNate Lawson fprintf (stderr, "Parsing completed\n"); 115359db4265SNate Lawson return AE_OK; 115459db4265SNate Lawson } 115559db4265SNate Lawson 115659db4265SNate Lawson 1157