1*bc36eafdSMike Gerdts /****************************************************************************** 2*bc36eafdSMike Gerdts * 3*bc36eafdSMike Gerdts * Module Name: adisasm - Application-level disassembler routines 4*bc36eafdSMike Gerdts * 5*bc36eafdSMike Gerdts *****************************************************************************/ 6*bc36eafdSMike Gerdts 7*bc36eafdSMike Gerdts /* 8*bc36eafdSMike Gerdts * Copyright (C) 2000 - 2016, Intel Corp. 9*bc36eafdSMike Gerdts * All rights reserved. 10*bc36eafdSMike Gerdts * 11*bc36eafdSMike Gerdts * Redistribution and use in source and binary forms, with or without 12*bc36eafdSMike Gerdts * modification, are permitted provided that the following conditions 13*bc36eafdSMike Gerdts * are met: 14*bc36eafdSMike Gerdts * 1. Redistributions of source code must retain the above copyright 15*bc36eafdSMike Gerdts * notice, this list of conditions, and the following disclaimer, 16*bc36eafdSMike Gerdts * without modification. 17*bc36eafdSMike Gerdts * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*bc36eafdSMike Gerdts * substantially similar to the "NO WARRANTY" disclaimer below 19*bc36eafdSMike Gerdts * ("Disclaimer") and any redistribution must be conditioned upon 20*bc36eafdSMike Gerdts * including a substantially similar Disclaimer requirement for further 21*bc36eafdSMike Gerdts * binary redistribution. 22*bc36eafdSMike Gerdts * 3. Neither the names of the above-listed copyright holders nor the names 23*bc36eafdSMike Gerdts * of any contributors may be used to endorse or promote products derived 24*bc36eafdSMike Gerdts * from this software without specific prior written permission. 25*bc36eafdSMike Gerdts * 26*bc36eafdSMike Gerdts * Alternatively, this software may be distributed under the terms of the 27*bc36eafdSMike Gerdts * GNU General Public License ("GPL") version 2 as published by the Free 28*bc36eafdSMike Gerdts * Software Foundation. 29*bc36eafdSMike Gerdts * 30*bc36eafdSMike Gerdts * NO WARRANTY 31*bc36eafdSMike Gerdts * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*bc36eafdSMike Gerdts * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*bc36eafdSMike Gerdts * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*bc36eafdSMike Gerdts * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*bc36eafdSMike Gerdts * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*bc36eafdSMike Gerdts * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*bc36eafdSMike Gerdts * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*bc36eafdSMike Gerdts * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*bc36eafdSMike Gerdts * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*bc36eafdSMike Gerdts * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*bc36eafdSMike Gerdts * POSSIBILITY OF SUCH DAMAGES. 42*bc36eafdSMike Gerdts */ 43*bc36eafdSMike Gerdts 44*bc36eafdSMike Gerdts #include "aslcompiler.h" 45*bc36eafdSMike Gerdts #include "amlcode.h" 46*bc36eafdSMike Gerdts #include "acdisasm.h" 47*bc36eafdSMike Gerdts #include "acdispat.h" 48*bc36eafdSMike Gerdts #include "acnamesp.h" 49*bc36eafdSMike Gerdts #include "acparser.h" 50*bc36eafdSMike Gerdts #include "acapps.h" 51*bc36eafdSMike Gerdts 52*bc36eafdSMike Gerdts #include <stdio.h> 53*bc36eafdSMike Gerdts 54*bc36eafdSMike Gerdts 55*bc36eafdSMike Gerdts #define _COMPONENT ACPI_TOOLS 56*bc36eafdSMike Gerdts ACPI_MODULE_NAME ("adisasm") 57*bc36eafdSMike Gerdts 58*bc36eafdSMike Gerdts /* Local prototypes */ 59*bc36eafdSMike Gerdts 60*bc36eafdSMike Gerdts static ACPI_STATUS 61*bc36eafdSMike Gerdts AdDoExternalFileList ( 62*bc36eafdSMike Gerdts char *Filename); 63*bc36eafdSMike Gerdts 64*bc36eafdSMike Gerdts static ACPI_STATUS 65*bc36eafdSMike Gerdts AdDisassembleOneTable ( 66*bc36eafdSMike Gerdts ACPI_TABLE_HEADER *Table, 67*bc36eafdSMike Gerdts FILE *File, 68*bc36eafdSMike Gerdts char *Filename, 69*bc36eafdSMike Gerdts char *DisasmFilename); 70*bc36eafdSMike Gerdts 71*bc36eafdSMike Gerdts static ACPI_STATUS 72*bc36eafdSMike Gerdts AdReparseOneTable ( 73*bc36eafdSMike Gerdts ACPI_TABLE_HEADER *Table, 74*bc36eafdSMike Gerdts FILE *File, 75*bc36eafdSMike Gerdts ACPI_OWNER_ID OwnerId); 76*bc36eafdSMike Gerdts 77*bc36eafdSMike Gerdts 78*bc36eafdSMike Gerdts ACPI_TABLE_DESC LocalTables[1]; 79*bc36eafdSMike Gerdts ACPI_PARSE_OBJECT *AcpiGbl_ParseOpRoot; 80*bc36eafdSMike Gerdts 81*bc36eafdSMike Gerdts 82*bc36eafdSMike Gerdts /* Stubs for everything except ASL compiler */ 83*bc36eafdSMike Gerdts 84*bc36eafdSMike Gerdts #ifndef ACPI_ASL_COMPILER 85*bc36eafdSMike Gerdts BOOLEAN 86*bc36eafdSMike Gerdts AcpiDsIsResultUsed ( 87*bc36eafdSMike Gerdts ACPI_PARSE_OBJECT *Op, 88*bc36eafdSMike Gerdts ACPI_WALK_STATE *WalkState) 89*bc36eafdSMike Gerdts { 90*bc36eafdSMike Gerdts return (TRUE); 91*bc36eafdSMike Gerdts } 92*bc36eafdSMike Gerdts 93*bc36eafdSMike Gerdts ACPI_STATUS 94*bc36eafdSMike Gerdts AcpiDsMethodError ( 95*bc36eafdSMike Gerdts ACPI_STATUS Status, 96*bc36eafdSMike Gerdts ACPI_WALK_STATE *WalkState) 97*bc36eafdSMike Gerdts { 98*bc36eafdSMike Gerdts return (Status); 99*bc36eafdSMike Gerdts } 100*bc36eafdSMike Gerdts #endif 101*bc36eafdSMike Gerdts 102*bc36eafdSMike Gerdts 103*bc36eafdSMike Gerdts /******************************************************************************* 104*bc36eafdSMike Gerdts * 105*bc36eafdSMike Gerdts * FUNCTION: AdInitialize 106*bc36eafdSMike Gerdts * 107*bc36eafdSMike Gerdts * PARAMETERS: None 108*bc36eafdSMike Gerdts * 109*bc36eafdSMike Gerdts * RETURN: Status 110*bc36eafdSMike Gerdts * 111*bc36eafdSMike Gerdts * DESCRIPTION: ACPICA and local initialization 112*bc36eafdSMike Gerdts * 113*bc36eafdSMike Gerdts ******************************************************************************/ 114*bc36eafdSMike Gerdts 115*bc36eafdSMike Gerdts ACPI_STATUS 116*bc36eafdSMike Gerdts AdInitialize ( 117*bc36eafdSMike Gerdts void) 118*bc36eafdSMike Gerdts { 119*bc36eafdSMike Gerdts ACPI_STATUS Status; 120*bc36eafdSMike Gerdts 121*bc36eafdSMike Gerdts 122*bc36eafdSMike Gerdts /* ACPICA subsystem initialization */ 123*bc36eafdSMike Gerdts 124*bc36eafdSMike Gerdts Status = AcpiOsInitialize (); 125*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 126*bc36eafdSMike Gerdts { 127*bc36eafdSMike Gerdts return (Status); 128*bc36eafdSMike Gerdts } 129*bc36eafdSMike Gerdts 130*bc36eafdSMike Gerdts Status = AcpiUtInitGlobals (); 131*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 132*bc36eafdSMike Gerdts { 133*bc36eafdSMike Gerdts return (Status); 134*bc36eafdSMike Gerdts } 135*bc36eafdSMike Gerdts 136*bc36eafdSMike Gerdts Status = AcpiUtMutexInitialize (); 137*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 138*bc36eafdSMike Gerdts { 139*bc36eafdSMike Gerdts return (Status); 140*bc36eafdSMike Gerdts } 141*bc36eafdSMike Gerdts 142*bc36eafdSMike Gerdts Status = AcpiNsRootInitialize (); 143*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 144*bc36eafdSMike Gerdts { 145*bc36eafdSMike Gerdts return (Status); 146*bc36eafdSMike Gerdts } 147*bc36eafdSMike Gerdts 148*bc36eafdSMike Gerdts /* Setup the Table Manager (cheat - there is no RSDT) */ 149*bc36eafdSMike Gerdts 150*bc36eafdSMike Gerdts AcpiGbl_RootTableList.MaxTableCount = 1; 151*bc36eafdSMike Gerdts AcpiGbl_RootTableList.CurrentTableCount = 0; 152*bc36eafdSMike Gerdts AcpiGbl_RootTableList.Tables = LocalTables; 153*bc36eafdSMike Gerdts 154*bc36eafdSMike Gerdts return (Status); 155*bc36eafdSMike Gerdts } 156*bc36eafdSMike Gerdts 157*bc36eafdSMike Gerdts 158*bc36eafdSMike Gerdts /****************************************************************************** 159*bc36eafdSMike Gerdts * 160*bc36eafdSMike Gerdts * FUNCTION: AdAmlDisassemble 161*bc36eafdSMike Gerdts * 162*bc36eafdSMike Gerdts * PARAMETERS: Filename - AML input filename 163*bc36eafdSMike Gerdts * OutToFile - TRUE if output should go to a file 164*bc36eafdSMike Gerdts * Prefix - Path prefix for output 165*bc36eafdSMike Gerdts * OutFilename - where the filename is returned 166*bc36eafdSMike Gerdts * 167*bc36eafdSMike Gerdts * RETURN: Status 168*bc36eafdSMike Gerdts * 169*bc36eafdSMike Gerdts * DESCRIPTION: Disassembler entry point. Disassemble an entire ACPI table. 170*bc36eafdSMike Gerdts * 171*bc36eafdSMike Gerdts *****************************************************************************/ 172*bc36eafdSMike Gerdts 173*bc36eafdSMike Gerdts ACPI_STATUS 174*bc36eafdSMike Gerdts AdAmlDisassemble ( 175*bc36eafdSMike Gerdts BOOLEAN OutToFile, 176*bc36eafdSMike Gerdts char *Filename, 177*bc36eafdSMike Gerdts char *Prefix, 178*bc36eafdSMike Gerdts char **OutFilename) 179*bc36eafdSMike Gerdts { 180*bc36eafdSMike Gerdts ACPI_STATUS Status; 181*bc36eafdSMike Gerdts char *DisasmFilename = NULL; 182*bc36eafdSMike Gerdts FILE *File = NULL; 183*bc36eafdSMike Gerdts ACPI_TABLE_HEADER *Table = NULL; 184*bc36eafdSMike Gerdts ACPI_NEW_TABLE_DESC *ListHead = NULL; 185*bc36eafdSMike Gerdts 186*bc36eafdSMike Gerdts 187*bc36eafdSMike Gerdts /* 188*bc36eafdSMike Gerdts * Input: AML code from either a file or via GetTables (memory or 189*bc36eafdSMike Gerdts * registry) 190*bc36eafdSMike Gerdts */ 191*bc36eafdSMike Gerdts if (Filename) 192*bc36eafdSMike Gerdts { 193*bc36eafdSMike Gerdts /* Get the list of all AML tables in the file */ 194*bc36eafdSMike Gerdts 195*bc36eafdSMike Gerdts Status = AcGetAllTablesFromFile (Filename, 196*bc36eafdSMike Gerdts ACPI_GET_ALL_TABLES, &ListHead); 197*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 198*bc36eafdSMike Gerdts { 199*bc36eafdSMike Gerdts AcpiOsPrintf ("Could not get ACPI tables from %s, %s\n", 200*bc36eafdSMike Gerdts Filename, AcpiFormatException (Status)); 201*bc36eafdSMike Gerdts return (Status); 202*bc36eafdSMike Gerdts } 203*bc36eafdSMike Gerdts 204*bc36eafdSMike Gerdts /* Process any user-specified files for external objects */ 205*bc36eafdSMike Gerdts 206*bc36eafdSMike Gerdts Status = AdDoExternalFileList (Filename); 207*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 208*bc36eafdSMike Gerdts { 209*bc36eafdSMike Gerdts return (Status); 210*bc36eafdSMike Gerdts } 211*bc36eafdSMike Gerdts } 212*bc36eafdSMike Gerdts else 213*bc36eafdSMike Gerdts { 214*bc36eafdSMike Gerdts Status = AdGetLocalTables (); 215*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 216*bc36eafdSMike Gerdts { 217*bc36eafdSMike Gerdts AcpiOsPrintf ("Could not get ACPI tables, %s\n", 218*bc36eafdSMike Gerdts AcpiFormatException (Status)); 219*bc36eafdSMike Gerdts return (Status); 220*bc36eafdSMike Gerdts } 221*bc36eafdSMike Gerdts 222*bc36eafdSMike Gerdts if (!AcpiGbl_DmOpt_Disasm) 223*bc36eafdSMike Gerdts { 224*bc36eafdSMike Gerdts return (AE_OK); 225*bc36eafdSMike Gerdts } 226*bc36eafdSMike Gerdts 227*bc36eafdSMike Gerdts /* Obtained the local tables, just disassemble the DSDT */ 228*bc36eafdSMike Gerdts 229*bc36eafdSMike Gerdts Status = AcpiGetTable (ACPI_SIG_DSDT, 0, &Table); 230*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 231*bc36eafdSMike Gerdts { 232*bc36eafdSMike Gerdts AcpiOsPrintf ("Could not get DSDT, %s\n", 233*bc36eafdSMike Gerdts AcpiFormatException (Status)); 234*bc36eafdSMike Gerdts return (Status); 235*bc36eafdSMike Gerdts } 236*bc36eafdSMike Gerdts 237*bc36eafdSMike Gerdts AcpiOsPrintf ("\nDisassembly of DSDT\n"); 238*bc36eafdSMike Gerdts Prefix = AdGenerateFilename ("dsdt", Table->OemTableId); 239*bc36eafdSMike Gerdts } 240*bc36eafdSMike Gerdts 241*bc36eafdSMike Gerdts /* 242*bc36eafdSMike Gerdts * Output: ASL code. Redirect to a file if requested 243*bc36eafdSMike Gerdts */ 244*bc36eafdSMike Gerdts if (OutToFile) 245*bc36eafdSMike Gerdts { 246*bc36eafdSMike Gerdts /* Create/Open a disassembly output file */ 247*bc36eafdSMike Gerdts 248*bc36eafdSMike Gerdts DisasmFilename = FlGenerateFilename (Prefix, FILE_SUFFIX_DISASSEMBLY); 249*bc36eafdSMike Gerdts if (!DisasmFilename) 250*bc36eafdSMike Gerdts { 251*bc36eafdSMike Gerdts fprintf (stderr, "Could not generate output filename\n"); 252*bc36eafdSMike Gerdts Status = AE_ERROR; 253*bc36eafdSMike Gerdts goto Cleanup; 254*bc36eafdSMike Gerdts } 255*bc36eafdSMike Gerdts 256*bc36eafdSMike Gerdts File = fopen (DisasmFilename, "w+"); 257*bc36eafdSMike Gerdts if (!File) 258*bc36eafdSMike Gerdts { 259*bc36eafdSMike Gerdts fprintf (stderr, "Could not open output file %s\n", 260*bc36eafdSMike Gerdts DisasmFilename); 261*bc36eafdSMike Gerdts Status = AE_ERROR; 262*bc36eafdSMike Gerdts goto Cleanup; 263*bc36eafdSMike Gerdts } 264*bc36eafdSMike Gerdts 265*bc36eafdSMike Gerdts AcpiOsRedirectOutput (File); 266*bc36eafdSMike Gerdts } 267*bc36eafdSMike Gerdts 268*bc36eafdSMike Gerdts *OutFilename = DisasmFilename; 269*bc36eafdSMike Gerdts 270*bc36eafdSMike Gerdts /* Disassemble all AML tables within the file */ 271*bc36eafdSMike Gerdts 272*bc36eafdSMike Gerdts while (ListHead) 273*bc36eafdSMike Gerdts { 274*bc36eafdSMike Gerdts Status = AdDisassembleOneTable (ListHead->Table, 275*bc36eafdSMike Gerdts File, Filename, DisasmFilename); 276*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 277*bc36eafdSMike Gerdts { 278*bc36eafdSMike Gerdts break; 279*bc36eafdSMike Gerdts } 280*bc36eafdSMike Gerdts 281*bc36eafdSMike Gerdts ListHead = ListHead->Next; 282*bc36eafdSMike Gerdts } 283*bc36eafdSMike Gerdts 284*bc36eafdSMike Gerdts Cleanup: 285*bc36eafdSMike Gerdts 286*bc36eafdSMike Gerdts if (Table && 287*bc36eafdSMike Gerdts !AcpiGbl_ForceAmlDisassembly && 288*bc36eafdSMike Gerdts !AcpiUtIsAmlTable (Table)) 289*bc36eafdSMike Gerdts { 290*bc36eafdSMike Gerdts ACPI_FREE (Table); 291*bc36eafdSMike Gerdts } 292*bc36eafdSMike Gerdts 293*bc36eafdSMike Gerdts if (File) 294*bc36eafdSMike Gerdts { 295*bc36eafdSMike Gerdts fclose (File); 296*bc36eafdSMike Gerdts AcpiOsRedirectOutput (stdout); 297*bc36eafdSMike Gerdts } 298*bc36eafdSMike Gerdts 299*bc36eafdSMike Gerdts AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 300*bc36eafdSMike Gerdts AcpiGbl_ParseOpRoot = NULL; 301*bc36eafdSMike Gerdts return (Status); 302*bc36eafdSMike Gerdts } 303*bc36eafdSMike Gerdts 304*bc36eafdSMike Gerdts 305*bc36eafdSMike Gerdts /****************************************************************************** 306*bc36eafdSMike Gerdts * 307*bc36eafdSMike Gerdts * FUNCTION: AdDisassembleOneTable 308*bc36eafdSMike Gerdts * 309*bc36eafdSMike Gerdts * PARAMETERS: Table - Raw AML table 310*bc36eafdSMike Gerdts * File - Pointer for the input file 311*bc36eafdSMike Gerdts * Filename - AML input filename 312*bc36eafdSMike Gerdts * DisasmFilename - Output filename 313*bc36eafdSMike Gerdts * 314*bc36eafdSMike Gerdts * RETURN: Status 315*bc36eafdSMike Gerdts * 316*bc36eafdSMike Gerdts * DESCRIPTION: Disassemble a single ACPI table. AML or data table. 317*bc36eafdSMike Gerdts * 318*bc36eafdSMike Gerdts *****************************************************************************/ 319*bc36eafdSMike Gerdts 320*bc36eafdSMike Gerdts static ACPI_STATUS 321*bc36eafdSMike Gerdts AdDisassembleOneTable ( 322*bc36eafdSMike Gerdts ACPI_TABLE_HEADER *Table, 323*bc36eafdSMike Gerdts FILE *File, 324*bc36eafdSMike Gerdts char *Filename, 325*bc36eafdSMike Gerdts char *DisasmFilename) 326*bc36eafdSMike Gerdts { 327*bc36eafdSMike Gerdts ACPI_STATUS Status; 328*bc36eafdSMike Gerdts ACPI_OWNER_ID OwnerId; 329*bc36eafdSMike Gerdts 330*bc36eafdSMike Gerdts 331*bc36eafdSMike Gerdts /* ForceAmlDisassembly means to assume the table contains valid AML */ 332*bc36eafdSMike Gerdts 333*bc36eafdSMike Gerdts if (!AcpiGbl_ForceAmlDisassembly && !AcpiUtIsAmlTable (Table)) 334*bc36eafdSMike Gerdts { 335*bc36eafdSMike Gerdts AdDisassemblerHeader (Filename, ACPI_IS_DATA_TABLE); 336*bc36eafdSMike Gerdts 337*bc36eafdSMike Gerdts /* This is a "Data Table" (non-AML table) */ 338*bc36eafdSMike Gerdts 339*bc36eafdSMike Gerdts AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n", 340*bc36eafdSMike Gerdts Table->Signature); 341*bc36eafdSMike Gerdts AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength] " 342*bc36eafdSMike Gerdts "FieldName : FieldValue\n */\n\n"); 343*bc36eafdSMike Gerdts 344*bc36eafdSMike Gerdts AcpiDmDumpDataTable (Table); 345*bc36eafdSMike Gerdts fprintf (stderr, "Acpi Data Table [%4.4s] decoded\n", 346*bc36eafdSMike Gerdts Table->Signature); 347*bc36eafdSMike Gerdts 348*bc36eafdSMike Gerdts if (File) 349*bc36eafdSMike Gerdts { 350*bc36eafdSMike Gerdts fprintf (stderr, "Formatted output: %s - %u bytes\n", 351*bc36eafdSMike Gerdts DisasmFilename, CmGetFileSize (File)); 352*bc36eafdSMike Gerdts } 353*bc36eafdSMike Gerdts 354*bc36eafdSMike Gerdts return (AE_OK); 355*bc36eafdSMike Gerdts } 356*bc36eafdSMike Gerdts 357*bc36eafdSMike Gerdts /* 358*bc36eafdSMike Gerdts * This is an AML table (DSDT or SSDT). 359*bc36eafdSMike Gerdts * Always parse the tables, only option is what to display 360*bc36eafdSMike Gerdts */ 361*bc36eafdSMike Gerdts Status = AdParseTable (Table, &OwnerId, TRUE, FALSE); 362*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 363*bc36eafdSMike Gerdts { 364*bc36eafdSMike Gerdts AcpiOsPrintf ("Could not parse ACPI tables, %s\n", 365*bc36eafdSMike Gerdts AcpiFormatException (Status)); 366*bc36eafdSMike Gerdts return (Status); 367*bc36eafdSMike Gerdts } 368*bc36eafdSMike Gerdts 369*bc36eafdSMike Gerdts /* Debug output, namespace and parse tree */ 370*bc36eafdSMike Gerdts 371*bc36eafdSMike Gerdts if (AslCompilerdebug && File) 372*bc36eafdSMike Gerdts { 373*bc36eafdSMike Gerdts AcpiOsPrintf ("/**** Before second load\n"); 374*bc36eafdSMike Gerdts 375*bc36eafdSMike Gerdts NsSetupNamespaceListing (File); 376*bc36eafdSMike Gerdts NsDisplayNamespace (); 377*bc36eafdSMike Gerdts 378*bc36eafdSMike Gerdts AcpiOsPrintf ("*****/\n"); 379*bc36eafdSMike Gerdts } 380*bc36eafdSMike Gerdts 381*bc36eafdSMike Gerdts /* Load namespace from names created within control methods */ 382*bc36eafdSMike Gerdts 383*bc36eafdSMike Gerdts AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, 384*bc36eafdSMike Gerdts AcpiGbl_RootNode, OwnerId); 385*bc36eafdSMike Gerdts 386*bc36eafdSMike Gerdts /* 387*bc36eafdSMike Gerdts * Cross reference the namespace here, in order to 388*bc36eafdSMike Gerdts * generate External() statements 389*bc36eafdSMike Gerdts */ 390*bc36eafdSMike Gerdts AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot, 391*bc36eafdSMike Gerdts AcpiGbl_RootNode, OwnerId); 392*bc36eafdSMike Gerdts 393*bc36eafdSMike Gerdts if (AslCompilerdebug) 394*bc36eafdSMike Gerdts { 395*bc36eafdSMike Gerdts AcpiDmDumpTree (AcpiGbl_ParseOpRoot); 396*bc36eafdSMike Gerdts } 397*bc36eafdSMike Gerdts 398*bc36eafdSMike Gerdts /* Find possible calls to external control methods */ 399*bc36eafdSMike Gerdts 400*bc36eafdSMike Gerdts AcpiDmFindOrphanMethods (AcpiGbl_ParseOpRoot); 401*bc36eafdSMike Gerdts 402*bc36eafdSMike Gerdts /* 403*bc36eafdSMike Gerdts * If we found any external control methods, we must reparse 404*bc36eafdSMike Gerdts * the entire tree with the new information (namely, the 405*bc36eafdSMike Gerdts * number of arguments per method) 406*bc36eafdSMike Gerdts */ 407*bc36eafdSMike Gerdts if (AcpiDmGetExternalMethodCount ()) 408*bc36eafdSMike Gerdts { 409*bc36eafdSMike Gerdts Status = AdReparseOneTable (Table, File, OwnerId); 410*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 411*bc36eafdSMike Gerdts { 412*bc36eafdSMike Gerdts return (Status); 413*bc36eafdSMike Gerdts } 414*bc36eafdSMike Gerdts } 415*bc36eafdSMike Gerdts 416*bc36eafdSMike Gerdts /* 417*bc36eafdSMike Gerdts * Now that the namespace is finalized, we can perform namespace 418*bc36eafdSMike Gerdts * transforms. 419*bc36eafdSMike Gerdts * 420*bc36eafdSMike Gerdts * 1) Convert fixed-offset references to resource descriptors 421*bc36eafdSMike Gerdts * to symbolic references (Note: modifies namespace) 422*bc36eafdSMike Gerdts */ 423*bc36eafdSMike Gerdts AcpiDmConvertResourceIndexes (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode); 424*bc36eafdSMike Gerdts 425*bc36eafdSMike Gerdts /* Optional displays */ 426*bc36eafdSMike Gerdts 427*bc36eafdSMike Gerdts if (AcpiGbl_DmOpt_Disasm) 428*bc36eafdSMike Gerdts { 429*bc36eafdSMike Gerdts /* This is the real disassembly */ 430*bc36eafdSMike Gerdts 431*bc36eafdSMike Gerdts AdDisplayTables (Filename, Table); 432*bc36eafdSMike Gerdts 433*bc36eafdSMike Gerdts /* Dump hex table if requested (-vt) */ 434*bc36eafdSMike Gerdts 435*bc36eafdSMike Gerdts AcpiDmDumpDataTable (Table); 436*bc36eafdSMike Gerdts 437*bc36eafdSMike Gerdts fprintf (stderr, "Disassembly completed\n"); 438*bc36eafdSMike Gerdts if (File) 439*bc36eafdSMike Gerdts { 440*bc36eafdSMike Gerdts fprintf (stderr, "ASL Output: %s - %u bytes\n", 441*bc36eafdSMike Gerdts DisasmFilename, CmGetFileSize (File)); 442*bc36eafdSMike Gerdts } 443*bc36eafdSMike Gerdts 444*bc36eafdSMike Gerdts if (Gbl_MapfileFlag) 445*bc36eafdSMike Gerdts { 446*bc36eafdSMike Gerdts fprintf (stderr, "%14s %s - %u bytes\n", 447*bc36eafdSMike Gerdts Gbl_Files[ASL_FILE_MAP_OUTPUT].ShortDescription, 448*bc36eafdSMike Gerdts Gbl_Files[ASL_FILE_MAP_OUTPUT].Filename, 449*bc36eafdSMike Gerdts FlGetFileSize (ASL_FILE_MAP_OUTPUT)); 450*bc36eafdSMike Gerdts } 451*bc36eafdSMike Gerdts } 452*bc36eafdSMike Gerdts 453*bc36eafdSMike Gerdts return (AE_OK); 454*bc36eafdSMike Gerdts } 455*bc36eafdSMike Gerdts 456*bc36eafdSMike Gerdts 457*bc36eafdSMike Gerdts /****************************************************************************** 458*bc36eafdSMike Gerdts * 459*bc36eafdSMike Gerdts * FUNCTION: AdReparseOneTable 460*bc36eafdSMike Gerdts * 461*bc36eafdSMike Gerdts * PARAMETERS: Table - Raw AML table 462*bc36eafdSMike Gerdts * File - Pointer for the input file 463*bc36eafdSMike Gerdts * OwnerId - ID for this table 464*bc36eafdSMike Gerdts * 465*bc36eafdSMike Gerdts * RETURN: Status 466*bc36eafdSMike Gerdts * 467*bc36eafdSMike Gerdts * DESCRIPTION: Reparse a table that has already been loaded. Used to 468*bc36eafdSMike Gerdts * integrate information about external control methods. 469*bc36eafdSMike Gerdts * These methods may have been previously parsed incorrectly. 470*bc36eafdSMike Gerdts * 471*bc36eafdSMike Gerdts *****************************************************************************/ 472*bc36eafdSMike Gerdts 473*bc36eafdSMike Gerdts static ACPI_STATUS 474*bc36eafdSMike Gerdts AdReparseOneTable ( 475*bc36eafdSMike Gerdts ACPI_TABLE_HEADER *Table, 476*bc36eafdSMike Gerdts FILE *File, 477*bc36eafdSMike Gerdts ACPI_OWNER_ID OwnerId) 478*bc36eafdSMike Gerdts { 479*bc36eafdSMike Gerdts ACPI_STATUS Status; 480*bc36eafdSMike Gerdts 481*bc36eafdSMike Gerdts 482*bc36eafdSMike Gerdts fprintf (stderr, 483*bc36eafdSMike Gerdts "\nFound %u external control methods, " 484*bc36eafdSMike Gerdts "reparsing with new information\n", 485*bc36eafdSMike Gerdts AcpiDmGetExternalMethodCount ()); 486*bc36eafdSMike Gerdts 487*bc36eafdSMike Gerdts /* Reparse, rebuild namespace */ 488*bc36eafdSMike Gerdts 489*bc36eafdSMike Gerdts AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 490*bc36eafdSMike Gerdts AcpiGbl_ParseOpRoot = NULL; 491*bc36eafdSMike Gerdts AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode); 492*bc36eafdSMike Gerdts 493*bc36eafdSMike Gerdts AcpiGbl_RootNode = NULL; 494*bc36eafdSMike Gerdts AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME; 495*bc36eafdSMike Gerdts AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED; 496*bc36eafdSMike Gerdts AcpiGbl_RootNodeStruct.Type = ACPI_TYPE_DEVICE; 497*bc36eafdSMike Gerdts AcpiGbl_RootNodeStruct.Parent = NULL; 498*bc36eafdSMike Gerdts AcpiGbl_RootNodeStruct.Child = NULL; 499*bc36eafdSMike Gerdts AcpiGbl_RootNodeStruct.Peer = NULL; 500*bc36eafdSMike Gerdts AcpiGbl_RootNodeStruct.Object = NULL; 501*bc36eafdSMike Gerdts AcpiGbl_RootNodeStruct.Flags = 0; 502*bc36eafdSMike Gerdts 503*bc36eafdSMike Gerdts Status = AcpiNsRootInitialize (); 504*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 505*bc36eafdSMike Gerdts { 506*bc36eafdSMike Gerdts return (Status); 507*bc36eafdSMike Gerdts } 508*bc36eafdSMike Gerdts 509*bc36eafdSMike Gerdts /* New namespace, add the external definitions first */ 510*bc36eafdSMike Gerdts 511*bc36eafdSMike Gerdts AcpiDmAddExternalsToNamespace (); 512*bc36eafdSMike Gerdts 513*bc36eafdSMike Gerdts /* Parse the table again. No need to reload it, however */ 514*bc36eafdSMike Gerdts 515*bc36eafdSMike Gerdts Status = AdParseTable (Table, NULL, FALSE, FALSE); 516*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 517*bc36eafdSMike Gerdts { 518*bc36eafdSMike Gerdts AcpiOsPrintf ("Could not parse ACPI tables, %s\n", 519*bc36eafdSMike Gerdts AcpiFormatException (Status)); 520*bc36eafdSMike Gerdts return (Status); 521*bc36eafdSMike Gerdts } 522*bc36eafdSMike Gerdts 523*bc36eafdSMike Gerdts /* Cross reference the namespace again */ 524*bc36eafdSMike Gerdts 525*bc36eafdSMike Gerdts AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, 526*bc36eafdSMike Gerdts AcpiGbl_RootNode, OwnerId); 527*bc36eafdSMike Gerdts 528*bc36eafdSMike Gerdts AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot, 529*bc36eafdSMike Gerdts AcpiGbl_RootNode, OwnerId); 530*bc36eafdSMike Gerdts 531*bc36eafdSMike Gerdts /* Debug output - namespace and parse tree */ 532*bc36eafdSMike Gerdts 533*bc36eafdSMike Gerdts if (AslCompilerdebug) 534*bc36eafdSMike Gerdts { 535*bc36eafdSMike Gerdts AcpiOsPrintf ("/**** After second load and resource conversion\n"); 536*bc36eafdSMike Gerdts if (File) 537*bc36eafdSMike Gerdts { 538*bc36eafdSMike Gerdts NsSetupNamespaceListing (File); 539*bc36eafdSMike Gerdts NsDisplayNamespace (); 540*bc36eafdSMike Gerdts } 541*bc36eafdSMike Gerdts 542*bc36eafdSMike Gerdts AcpiOsPrintf ("*****/\n"); 543*bc36eafdSMike Gerdts AcpiDmDumpTree (AcpiGbl_ParseOpRoot); 544*bc36eafdSMike Gerdts } 545*bc36eafdSMike Gerdts 546*bc36eafdSMike Gerdts return (AE_OK); 547*bc36eafdSMike Gerdts } 548*bc36eafdSMike Gerdts 549*bc36eafdSMike Gerdts 550*bc36eafdSMike Gerdts /****************************************************************************** 551*bc36eafdSMike Gerdts * 552*bc36eafdSMike Gerdts * FUNCTION: AdDoExternalFileList 553*bc36eafdSMike Gerdts * 554*bc36eafdSMike Gerdts * PARAMETERS: Filename - Input file for the table 555*bc36eafdSMike Gerdts * 556*bc36eafdSMike Gerdts * RETURN: Status 557*bc36eafdSMike Gerdts * 558*bc36eafdSMike Gerdts * DESCRIPTION: Process all tables found in the -e external files list 559*bc36eafdSMike Gerdts * 560*bc36eafdSMike Gerdts *****************************************************************************/ 561*bc36eafdSMike Gerdts 562*bc36eafdSMike Gerdts static ACPI_STATUS 563*bc36eafdSMike Gerdts AdDoExternalFileList ( 564*bc36eafdSMike Gerdts char *Filename) 565*bc36eafdSMike Gerdts { 566*bc36eafdSMike Gerdts ACPI_EXTERNAL_FILE *ExternalFileList; 567*bc36eafdSMike Gerdts char *ExternalFilename; 568*bc36eafdSMike Gerdts ACPI_NEW_TABLE_DESC *ExternalListHead = NULL; 569*bc36eafdSMike Gerdts ACPI_STATUS Status; 570*bc36eafdSMike Gerdts ACPI_STATUS GlobalStatus = AE_OK; 571*bc36eafdSMike Gerdts ACPI_OWNER_ID OwnerId; 572*bc36eafdSMike Gerdts 573*bc36eafdSMike Gerdts 574*bc36eafdSMike Gerdts /* 575*bc36eafdSMike Gerdts * External filenames are specified on the command line like this: 576*bc36eafdSMike Gerdts * Example: iasl -e file1,file2,file3 -d xxx.aml 577*bc36eafdSMike Gerdts */ 578*bc36eafdSMike Gerdts ExternalFileList = AcpiGbl_ExternalFileList; 579*bc36eafdSMike Gerdts 580*bc36eafdSMike Gerdts /* Process each external file */ 581*bc36eafdSMike Gerdts 582*bc36eafdSMike Gerdts while (ExternalFileList) 583*bc36eafdSMike Gerdts { 584*bc36eafdSMike Gerdts ExternalFilename = ExternalFileList->Path; 585*bc36eafdSMike Gerdts if (!strcmp (ExternalFilename, Filename)) 586*bc36eafdSMike Gerdts { 587*bc36eafdSMike Gerdts /* Next external file */ 588*bc36eafdSMike Gerdts 589*bc36eafdSMike Gerdts ExternalFileList = ExternalFileList->Next; 590*bc36eafdSMike Gerdts continue; 591*bc36eafdSMike Gerdts } 592*bc36eafdSMike Gerdts 593*bc36eafdSMike Gerdts AcpiOsPrintf ("External object resolution file %16s\n", 594*bc36eafdSMike Gerdts ExternalFilename); 595*bc36eafdSMike Gerdts 596*bc36eafdSMike Gerdts Status = AcGetAllTablesFromFile ( 597*bc36eafdSMike Gerdts ExternalFilename, ACPI_GET_ONLY_AML_TABLES, &ExternalListHead); 598*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 599*bc36eafdSMike Gerdts { 600*bc36eafdSMike Gerdts if (Status == AE_TYPE) 601*bc36eafdSMike Gerdts { 602*bc36eafdSMike Gerdts ExternalFileList = ExternalFileList->Next; 603*bc36eafdSMike Gerdts GlobalStatus = AE_TYPE; 604*bc36eafdSMike Gerdts Status = AE_OK; 605*bc36eafdSMike Gerdts continue; 606*bc36eafdSMike Gerdts } 607*bc36eafdSMike Gerdts 608*bc36eafdSMike Gerdts return (Status); 609*bc36eafdSMike Gerdts } 610*bc36eafdSMike Gerdts 611*bc36eafdSMike Gerdts /* Load external tables for symbol resolution */ 612*bc36eafdSMike Gerdts 613*bc36eafdSMike Gerdts while (ExternalListHead) 614*bc36eafdSMike Gerdts { 615*bc36eafdSMike Gerdts Status = AdParseTable ( 616*bc36eafdSMike Gerdts ExternalListHead->Table, &OwnerId, TRUE, TRUE); 617*bc36eafdSMike Gerdts if (ACPI_FAILURE (Status)) 618*bc36eafdSMike Gerdts { 619*bc36eafdSMike Gerdts AcpiOsPrintf ("Could not parse external ACPI tables, %s\n", 620*bc36eafdSMike Gerdts AcpiFormatException (Status)); 621*bc36eafdSMike Gerdts return (Status); 622*bc36eafdSMike Gerdts } 623*bc36eafdSMike Gerdts 624*bc36eafdSMike Gerdts /* 625*bc36eafdSMike Gerdts * Load namespace from names created within control methods 626*bc36eafdSMike Gerdts * Set owner id of nodes in external table 627*bc36eafdSMike Gerdts */ 628*bc36eafdSMike Gerdts AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, 629*bc36eafdSMike Gerdts AcpiGbl_RootNode, OwnerId); 630*bc36eafdSMike Gerdts AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 631*bc36eafdSMike Gerdts 632*bc36eafdSMike Gerdts ExternalListHead = ExternalListHead->Next; 633*bc36eafdSMike Gerdts } 634*bc36eafdSMike Gerdts 635*bc36eafdSMike Gerdts /* Next external file */ 636*bc36eafdSMike Gerdts 637*bc36eafdSMike Gerdts ExternalFileList = ExternalFileList->Next; 638*bc36eafdSMike Gerdts } 639*bc36eafdSMike Gerdts 640*bc36eafdSMike Gerdts if (ACPI_FAILURE (GlobalStatus)) 641*bc36eafdSMike Gerdts { 642*bc36eafdSMike Gerdts return (GlobalStatus); 643*bc36eafdSMike Gerdts } 644*bc36eafdSMike Gerdts 645*bc36eafdSMike Gerdts /* Clear external list generated by Scope in external tables */ 646*bc36eafdSMike Gerdts 647*bc36eafdSMike Gerdts if (AcpiGbl_ExternalFileList) 648*bc36eafdSMike Gerdts { 649*bc36eafdSMike Gerdts AcpiDmClearExternalList (); 650*bc36eafdSMike Gerdts } 651*bc36eafdSMike Gerdts 652*bc36eafdSMike Gerdts /* Load any externals defined in the optional external ref file */ 653*bc36eafdSMike Gerdts 654*bc36eafdSMike Gerdts AcpiDmGetExternalsFromFile (); 655*bc36eafdSMike Gerdts return (AE_OK); 656*bc36eafdSMike Gerdts } 657