1118613Snjl/****************************************************************************** 2118613Snjl * 3118613Snjl * Module Name: adisasm - Application-level disassembler routines 4118613Snjl * 5118613Snjl *****************************************************************************/ 6118613Snjl 7217365Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp. 9118613Snjl * All rights reserved. 10118613Snjl * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25118613Snjl * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29118613Snjl * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43118613Snjl 44281075Sdim#include <contrib/dev/acpica/compiler/aslcompiler.h> 45193529Sjkim#include <contrib/dev/acpica/include/amlcode.h> 46193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 47193529Sjkim#include <contrib/dev/acpica/include/acdispat.h> 48193529Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 49306536Sjkim#include <contrib/dev/acpica/include/acparser.h> 50193529Sjkim#include <contrib/dev/acpica/include/acapps.h> 51118613Snjl 52118613Snjl#include <stdio.h> 53118613Snjl 54118613Snjl 55118613Snjl#define _COMPONENT ACPI_TOOLS 56118613Snjl ACPI_MODULE_NAME ("adisasm") 57118613Snjl 58167802Sjkim/* Local prototypes */ 59167802Sjkim 60306536Sjkimstatic ACPI_STATUS 61306536SjkimAdDoExternalFileList ( 62306536Sjkim char *Filename); 63306536Sjkim 64306536Sjkimstatic ACPI_STATUS 65306536SjkimAdDisassembleOneTable ( 66306536Sjkim ACPI_TABLE_HEADER *Table, 67306536Sjkim FILE *File, 68167802Sjkim char *Filename, 69306536Sjkim char *DisasmFilename); 70167802Sjkim 71281687Sjkimstatic ACPI_STATUS 72306536SjkimAdReparseOneTable ( 73281687Sjkim ACPI_TABLE_HEADER *Table, 74306536Sjkim FILE *File, 75306536Sjkim ACPI_OWNER_ID OwnerId); 76281687Sjkim 77167802Sjkim 78306536SjkimACPI_TABLE_DESC LocalTables[1]; 79306536SjkimACPI_PARSE_OBJECT *AcpiGbl_ParseOpRoot; 80306536Sjkim 81306536Sjkim 82306536Sjkim/* Stubs for everything except ASL compiler */ 83306536Sjkim 84151937Sjkim#ifndef ACPI_ASL_COMPILER 85118613SnjlBOOLEAN 86118613SnjlAcpiDsIsResultUsed ( 87118613Snjl ACPI_PARSE_OBJECT *Op, 88118613Snjl ACPI_WALK_STATE *WalkState) 89118613Snjl{ 90306536Sjkim return (TRUE); 91118613Snjl} 92167802Sjkim 93167802SjkimACPI_STATUS 94167802SjkimAcpiDsMethodError ( 95167802Sjkim ACPI_STATUS Status, 96167802Sjkim ACPI_WALK_STATE *WalkState) 97167802Sjkim{ 98167802Sjkim return (Status); 99167802Sjkim} 100118613Snjl#endif 101118613Snjl 102167802Sjkim 103118613Snjl/******************************************************************************* 104118613Snjl * 105118613Snjl * FUNCTION: AdInitialize 106118613Snjl * 107198237Sjkim * PARAMETERS: None 108118613Snjl * 109118613Snjl * RETURN: Status 110118613Snjl * 111198237Sjkim * DESCRIPTION: ACPICA and local initialization 112118613Snjl * 113118613Snjl ******************************************************************************/ 114118613Snjl 115118613SnjlACPI_STATUS 116118613SnjlAdInitialize ( 117118613Snjl void) 118118613Snjl{ 119118613Snjl ACPI_STATUS Status; 120118613Snjl 121118613Snjl 122281075Sdim /* ACPICA subsystem initialization */ 123118613Snjl 124167802Sjkim Status = AcpiOsInitialize (); 125193529Sjkim if (ACPI_FAILURE (Status)) 126193529Sjkim { 127193529Sjkim return (Status); 128193529Sjkim } 129167802Sjkim 130193529Sjkim Status = AcpiUtInitGlobals (); 131193529Sjkim if (ACPI_FAILURE (Status)) 132193529Sjkim { 133193529Sjkim return (Status); 134193529Sjkim } 135193529Sjkim 136118613Snjl Status = AcpiUtMutexInitialize (); 137118613Snjl if (ACPI_FAILURE (Status)) 138118613Snjl { 139193529Sjkim return (Status); 140118613Snjl } 141118613Snjl 142118613Snjl Status = AcpiNsRootInitialize (); 143167802Sjkim if (ACPI_FAILURE (Status)) 144167802Sjkim { 145193529Sjkim return (Status); 146167802Sjkim } 147167802Sjkim 148167802Sjkim /* Setup the Table Manager (cheat - there is no RSDT) */ 149167802Sjkim 150207344Sjkim AcpiGbl_RootTableList.MaxTableCount = 1; 151207344Sjkim AcpiGbl_RootTableList.CurrentTableCount = 0; 152167802Sjkim AcpiGbl_RootTableList.Tables = LocalTables; 153167802Sjkim 154193529Sjkim return (Status); 155118613Snjl} 156118613Snjl 157118613Snjl 158118613Snjl/****************************************************************************** 159118613Snjl * 160118613Snjl * FUNCTION: AdAmlDisassemble 161118613Snjl * 162198237Sjkim * PARAMETERS: Filename - AML input filename 163198237Sjkim * OutToFile - TRUE if output should go to a file 164198237Sjkim * Prefix - Path prefix for output 165198237Sjkim * OutFilename - where the filename is returned 166118613Snjl * 167118613Snjl * RETURN: Status 168118613Snjl * 169306536Sjkim * DESCRIPTION: Disassembler entry point. Disassemble an entire ACPI table. 170118613Snjl * 171118613Snjl *****************************************************************************/ 172118613Snjl 173118613SnjlACPI_STATUS 174118613SnjlAdAmlDisassemble ( 175118613Snjl BOOLEAN OutToFile, 176118613Snjl char *Filename, 177118613Snjl char *Prefix, 178281075Sdim char **OutFilename) 179118613Snjl{ 180118613Snjl ACPI_STATUS Status; 181118613Snjl char *DisasmFilename = NULL; 182118613Snjl FILE *File = NULL; 183193529Sjkim ACPI_TABLE_HEADER *Table = NULL; 184306536Sjkim ACPI_NEW_TABLE_DESC *ListHead = NULL; 185118613Snjl 186118613Snjl 187118613Snjl /* 188198237Sjkim * Input: AML code from either a file or via GetTables (memory or 189198237Sjkim * registry) 190118613Snjl */ 191118613Snjl if (Filename) 192118613Snjl { 193306536Sjkim /* Get the list of all AML tables in the file */ 194306536Sjkim 195306536Sjkim Status = AcGetAllTablesFromFile (Filename, 196306536Sjkim ACPI_GET_ALL_TABLES, &ListHead); 197118613Snjl if (ACPI_FAILURE (Status)) 198118613Snjl { 199306536Sjkim AcpiOsPrintf ("Could not get ACPI tables from %s, %s\n", 200306536Sjkim Filename, AcpiFormatException (Status)); 201241973Sjkim return (Status); 202118613Snjl } 203167802Sjkim 204306536Sjkim /* Process any user-specified files for external objects */ 205193529Sjkim 206306536Sjkim Status = AdDoExternalFileList (Filename); 207306536Sjkim if (ACPI_FAILURE (Status)) 208284460Sjkim { 209306536Sjkim return (Status); 210284460Sjkim } 211118613Snjl } 212118613Snjl else 213118613Snjl { 214281075Sdim Status = AdGetLocalTables (); 215118613Snjl if (ACPI_FAILURE (Status)) 216118613Snjl { 217118613Snjl AcpiOsPrintf ("Could not get ACPI tables, %s\n", 218118613Snjl AcpiFormatException (Status)); 219241973Sjkim return (Status); 220118613Snjl } 221118613Snjl 222306536Sjkim if (!AcpiGbl_DmOpt_Disasm) 223118613Snjl { 224241973Sjkim return (AE_OK); 225118613Snjl } 226118613Snjl 227167802Sjkim /* Obtained the local tables, just disassemble the DSDT */ 228118613Snjl 229167802Sjkim Status = AcpiGetTable (ACPI_SIG_DSDT, 0, &Table); 230167802Sjkim if (ACPI_FAILURE (Status)) 231167802Sjkim { 232167802Sjkim AcpiOsPrintf ("Could not get DSDT, %s\n", 233167802Sjkim AcpiFormatException (Status)); 234241973Sjkim return (Status); 235167802Sjkim } 236167802Sjkim 237118613Snjl AcpiOsPrintf ("\nDisassembly of DSDT\n"); 238167802Sjkim Prefix = AdGenerateFilename ("dsdt", Table->OemTableId); 239118613Snjl } 240118613Snjl 241118613Snjl /* 242246849Sjkim * Output: ASL code. Redirect to a file if requested 243118613Snjl */ 244118613Snjl if (OutToFile) 245118613Snjl { 246118613Snjl /* Create/Open a disassembly output file */ 247118613Snjl 248118613Snjl DisasmFilename = FlGenerateFilename (Prefix, FILE_SUFFIX_DISASSEMBLY); 249281075Sdim if (!DisasmFilename) 250118613Snjl { 251118613Snjl fprintf (stderr, "Could not generate output filename\n"); 252123315Snjl Status = AE_ERROR; 253123315Snjl goto Cleanup; 254118613Snjl } 255118613Snjl 256118613Snjl File = fopen (DisasmFilename, "w+"); 257118613Snjl if (!File) 258118613Snjl { 259306536Sjkim fprintf (stderr, "Could not open output file %s\n", 260306536Sjkim DisasmFilename); 261123315Snjl Status = AE_ERROR; 262123315Snjl goto Cleanup; 263118613Snjl } 264118613Snjl 265118613Snjl AcpiOsRedirectOutput (File); 266118613Snjl } 267118613Snjl 268118613Snjl *OutFilename = DisasmFilename; 269118613Snjl 270306536Sjkim /* Disassemble all AML tables within the file */ 271281687Sjkim 272306536Sjkim while (ListHead) 273167802Sjkim { 274306536Sjkim Status = AdDisassembleOneTable (ListHead->Table, 275306536Sjkim File, Filename, DisasmFilename); 276167802Sjkim if (ACPI_FAILURE (Status)) 277167802Sjkim { 278306536Sjkim break; 279167802Sjkim } 280128212Snjl 281306536Sjkim ListHead = ListHead->Next; 282118613Snjl } 283118613Snjl 284118613SnjlCleanup: 285193529Sjkim 286306536Sjkim if (Table && 287306536Sjkim !AcpiGbl_ForceAmlDisassembly && 288306536Sjkim !AcpiUtIsAmlTable (Table)) 289193529Sjkim { 290193529Sjkim ACPI_FREE (Table); 291193529Sjkim } 292193529Sjkim 293281075Sdim if (File) 294118613Snjl { 295118613Snjl fclose (File); 296118613Snjl AcpiOsRedirectOutput (stdout); 297118613Snjl } 298118613Snjl 299167802Sjkim AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 300193529Sjkim AcpiGbl_ParseOpRoot = NULL; 301193529Sjkim return (Status); 302118613Snjl} 303118613Snjl 304118613Snjl 305118613Snjl/****************************************************************************** 306118613Snjl * 307306536Sjkim * FUNCTION: AdDisassembleOneTable 308167802Sjkim * 309306536Sjkim * PARAMETERS: Table - Raw AML table 310306536Sjkim * File - Pointer for the input file 311306536Sjkim * Filename - AML input filename 312306536Sjkim * DisasmFilename - Output filename 313167802Sjkim * 314306536Sjkim * RETURN: Status 315167802Sjkim * 316306536Sjkim * DESCRIPTION: Disassemble a single ACPI table. AML or data table. 317167802Sjkim * 318167802Sjkim *****************************************************************************/ 319167802Sjkim 320306536Sjkimstatic ACPI_STATUS 321306536SjkimAdDisassembleOneTable ( 322306536Sjkim ACPI_TABLE_HEADER *Table, 323306536Sjkim FILE *File, 324281687Sjkim char *Filename, 325306536Sjkim char *DisasmFilename) 326167802Sjkim{ 327306536Sjkim ACPI_STATUS Status; 328306536Sjkim ACPI_OWNER_ID OwnerId; 329167802Sjkim 330281075Sdim 331306536Sjkim /* ForceAmlDisassembly means to assume the table contains valid AML */ 332167802Sjkim 333306536Sjkim if (!AcpiGbl_ForceAmlDisassembly && !AcpiUtIsAmlTable (Table)) 334306536Sjkim { 335306536Sjkim AdDisassemblerHeader (Filename, ACPI_IS_DATA_TABLE); 336167802Sjkim 337306536Sjkim /* This is a "Data Table" (non-AML table) */ 338167802Sjkim 339306536Sjkim AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n", 340306536Sjkim Table->Signature); 341306536Sjkim AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength] " 342306536Sjkim "FieldName : FieldValue\n */\n\n"); 343306536Sjkim 344306536Sjkim AcpiDmDumpDataTable (Table); 345306536Sjkim fprintf (stderr, "Acpi Data Table [%4.4s] decoded\n", 346306536Sjkim Table->Signature); 347306536Sjkim 348306536Sjkim if (File) 349281687Sjkim { 350306536Sjkim fprintf (stderr, "Formatted output: %s - %u bytes\n", 351306536Sjkim DisasmFilename, CmGetFileSize (File)); 352281687Sjkim } 353306536Sjkim 354306536Sjkim return (AE_OK); 355281075Sdim } 356281075Sdim 357306536Sjkim /* 358306536Sjkim * This is an AML table (DSDT or SSDT). 359306536Sjkim * Always parse the tables, only option is what to display 360306536Sjkim */ 361306536Sjkim Status = AdParseTable (Table, &OwnerId, TRUE, FALSE); 362306536Sjkim if (ACPI_FAILURE (Status)) 363306536Sjkim { 364306536Sjkim AcpiOsPrintf ("Could not parse ACPI tables, %s\n", 365306536Sjkim AcpiFormatException (Status)); 366306536Sjkim return (Status); 367306536Sjkim } 368167802Sjkim 369306536Sjkim /* Debug output, namespace and parse tree */ 370167802Sjkim 371306536Sjkim if (AslCompilerdebug && File) 372306536Sjkim { 373306536Sjkim AcpiOsPrintf ("/**** Before second load\n"); 374118613Snjl 375306536Sjkim NsSetupNamespaceListing (File); 376306536Sjkim NsDisplayNamespace (); 377118613Snjl 378306536Sjkim AcpiOsPrintf ("*****/\n"); 379306536Sjkim } 380118613Snjl 381306536Sjkim /* Load namespace from names created within control methods */ 382306536Sjkim 383306536Sjkim AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, 384306536Sjkim AcpiGbl_RootNode, OwnerId); 385306536Sjkim 386193529Sjkim /* 387306536Sjkim * Cross reference the namespace here, in order to 388306536Sjkim * generate External() statements 389193529Sjkim */ 390306536Sjkim AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot, 391306536Sjkim AcpiGbl_RootNode, OwnerId); 392118613Snjl 393306536Sjkim if (AslCompilerdebug) 394306536Sjkim { 395306536Sjkim AcpiDmDumpTree (AcpiGbl_ParseOpRoot); 396306536Sjkim } 397193529Sjkim 398306536Sjkim /* Find possible calls to external control methods */ 399193529Sjkim 400306536Sjkim AcpiDmFindOrphanMethods (AcpiGbl_ParseOpRoot); 401193529Sjkim 402306536Sjkim /* 403306536Sjkim * If we found any external control methods, we must reparse 404306536Sjkim * the entire tree with the new information (namely, the 405306536Sjkim * number of arguments per method) 406306536Sjkim */ 407306536Sjkim if (AcpiDmGetExternalMethodCount ()) 408193529Sjkim { 409306536Sjkim Status = AdReparseOneTable (Table, File, OwnerId); 410306536Sjkim if (ACPI_FAILURE (Status)) 411193529Sjkim { 412306536Sjkim return (Status); 413193529Sjkim } 414193529Sjkim } 415193529Sjkim 416306536Sjkim /* 417306536Sjkim * Now that the namespace is finalized, we can perform namespace 418306536Sjkim * transforms. 419306536Sjkim * 420306536Sjkim * 1) Convert fixed-offset references to resource descriptors 421306536Sjkim * to symbolic references (Note: modifies namespace) 422306536Sjkim */ 423306536Sjkim AcpiDmConvertResourceIndexes (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode); 424193529Sjkim 425306536Sjkim /* Optional displays */ 426193529Sjkim 427306536Sjkim if (AcpiGbl_DmOpt_Disasm) 428193529Sjkim { 429306536Sjkim /* This is the real disassembly */ 430193529Sjkim 431306536Sjkim AdDisplayTables (Filename, Table); 432118613Snjl 433306536Sjkim /* Dump hex table if requested (-vt) */ 434167802Sjkim 435306536Sjkim AcpiDmDumpDataTable (Table); 436306536Sjkim 437306536Sjkim fprintf (stderr, "Disassembly completed\n"); 438306536Sjkim if (File) 439281075Sdim { 440306536Sjkim fprintf (stderr, "ASL Output: %s - %u bytes\n", 441306536Sjkim DisasmFilename, CmGetFileSize (File)); 442281075Sdim } 443167802Sjkim 444306536Sjkim if (Gbl_MapfileFlag) 445306536Sjkim { 446306536Sjkim fprintf (stderr, "%14s %s - %u bytes\n", 447306536Sjkim Gbl_Files[ASL_FILE_MAP_OUTPUT].ShortDescription, 448306536Sjkim Gbl_Files[ASL_FILE_MAP_OUTPUT].Filename, 449306536Sjkim FlGetFileSize (ASL_FILE_MAP_OUTPUT)); 450306536Sjkim } 451281075Sdim } 452281075Sdim 453306536Sjkim return (AE_OK); 454118613Snjl} 455118613Snjl 456118613Snjl 457118613Snjl/****************************************************************************** 458118613Snjl * 459306536Sjkim * FUNCTION: AdReparseOneTable 460118613Snjl * 461306536Sjkim * PARAMETERS: Table - Raw AML table 462306536Sjkim * File - Pointer for the input file 463306536Sjkim * OwnerId - ID for this table 464118613Snjl * 465118613Snjl * RETURN: Status 466118613Snjl * 467306536Sjkim * DESCRIPTION: Reparse a table that has already been loaded. Used to 468306536Sjkim * integrate information about external control methods. 469306536Sjkim * These methods may have been previously parsed incorrectly. 470118613Snjl * 471118613Snjl *****************************************************************************/ 472118613Snjl 473306536Sjkimstatic ACPI_STATUS 474306536SjkimAdReparseOneTable ( 475306536Sjkim ACPI_TABLE_HEADER *Table, 476306536Sjkim FILE *File, 477306536Sjkim ACPI_OWNER_ID OwnerId) 478118613Snjl{ 479306536Sjkim ACPI_STATUS Status; 480118613Snjl 481118613Snjl 482306536Sjkim fprintf (stderr, 483306536Sjkim "\nFound %u external control methods, " 484306536Sjkim "reparsing with new information\n", 485306536Sjkim AcpiDmGetExternalMethodCount ()); 486118613Snjl 487306536Sjkim /* Reparse, rebuild namespace */ 488118613Snjl 489306536Sjkim AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 490306536Sjkim AcpiGbl_ParseOpRoot = NULL; 491306536Sjkim AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode); 492118613Snjl 493306536Sjkim AcpiGbl_RootNode = NULL; 494306536Sjkim AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME; 495306536Sjkim AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED; 496306536Sjkim AcpiGbl_RootNodeStruct.Type = ACPI_TYPE_DEVICE; 497306536Sjkim AcpiGbl_RootNodeStruct.Parent = NULL; 498306536Sjkim AcpiGbl_RootNodeStruct.Child = NULL; 499306536Sjkim AcpiGbl_RootNodeStruct.Peer = NULL; 500306536Sjkim AcpiGbl_RootNodeStruct.Object = NULL; 501306536Sjkim AcpiGbl_RootNodeStruct.Flags = 0; 502306536Sjkim 503306536Sjkim Status = AcpiNsRootInitialize (); 504306536Sjkim if (ACPI_FAILURE (Status)) 505118613Snjl { 506306536Sjkim return (Status); 507118613Snjl } 508118613Snjl 509306536Sjkim /* New namespace, add the external definitions first */ 510118613Snjl 511306536Sjkim AcpiDmAddExternalsToNamespace (); 512118613Snjl 513306536Sjkim /* Parse the table again. No need to reload it, however */ 514281687Sjkim 515306536Sjkim Status = AdParseTable (Table, NULL, FALSE, FALSE); 516281687Sjkim if (ACPI_FAILURE (Status)) 517281687Sjkim { 518306536Sjkim AcpiOsPrintf ("Could not parse ACPI tables, %s\n", 519306536Sjkim AcpiFormatException (Status)); 520281687Sjkim return (Status); 521281687Sjkim } 522281687Sjkim 523306536Sjkim /* Cross reference the namespace again */ 524281687Sjkim 525306536Sjkim AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, 526306536Sjkim AcpiGbl_RootNode, OwnerId); 527281687Sjkim 528306536Sjkim AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot, 529306536Sjkim AcpiGbl_RootNode, OwnerId); 530281687Sjkim 531306536Sjkim /* Debug output - namespace and parse tree */ 532118613Snjl 533306536Sjkim if (AslCompilerdebug) 534118613Snjl { 535306536Sjkim AcpiOsPrintf ("/**** After second load and resource conversion\n"); 536306536Sjkim if (File) 537306536Sjkim { 538306536Sjkim NsSetupNamespaceListing (File); 539306536Sjkim NsDisplayNamespace (); 540306536Sjkim } 541118613Snjl 542306536Sjkim AcpiOsPrintf ("*****/\n"); 543306536Sjkim AcpiDmDumpTree (AcpiGbl_ParseOpRoot); 544281075Sdim } 545118613Snjl 546241973Sjkim return (AE_OK); 547118613Snjl} 548118613Snjl 549167802Sjkim 550118613Snjl/****************************************************************************** 551118613Snjl * 552306536Sjkim * FUNCTION: AdDoExternalFileList 553118613Snjl * 554306536Sjkim * PARAMETERS: Filename - Input file for the table 555118613Snjl * 556118613Snjl * RETURN: Status 557118613Snjl * 558306536Sjkim * DESCRIPTION: Process all tables found in the -e external files list 559118613Snjl * 560118613Snjl *****************************************************************************/ 561118613Snjl 562306536Sjkimstatic ACPI_STATUS 563306536SjkimAdDoExternalFileList ( 564306536Sjkim char *Filename) 565118613Snjl{ 566306536Sjkim ACPI_EXTERNAL_FILE *ExternalFileList; 567306536Sjkim char *ExternalFilename; 568306536Sjkim ACPI_NEW_TABLE_DESC *ExternalListHead = NULL; 569306536Sjkim ACPI_STATUS Status; 570306536Sjkim ACPI_STATUS GlobalStatus = AE_OK; 571306536Sjkim ACPI_OWNER_ID OwnerId; 572118613Snjl 573118613Snjl 574306536Sjkim /* 575306536Sjkim * External filenames are specified on the command line like this: 576306536Sjkim * Example: iasl -e file1,file2,file3 -d xxx.aml 577306536Sjkim */ 578306536Sjkim ExternalFileList = AcpiGbl_ExternalFileList; 579118613Snjl 580306536Sjkim /* Process each external file */ 581118613Snjl 582306536Sjkim while (ExternalFileList) 583118613Snjl { 584306536Sjkim ExternalFilename = ExternalFileList->Path; 585306536Sjkim if (!strcmp (ExternalFilename, Filename)) 586306536Sjkim { 587306536Sjkim /* Next external file */ 588118613Snjl 589306536Sjkim ExternalFileList = ExternalFileList->Next; 590306536Sjkim continue; 591306536Sjkim } 592118613Snjl 593306536Sjkim AcpiOsPrintf ("External object resolution file %16s\n", 594306536Sjkim ExternalFilename); 595118613Snjl 596306536Sjkim Status = AcGetAllTablesFromFile ( 597306536Sjkim ExternalFilename, ACPI_GET_ONLY_AML_TABLES, &ExternalListHead); 598193529Sjkim if (ACPI_FAILURE (Status)) 599193529Sjkim { 600306536Sjkim if (Status == AE_TYPE) 601306536Sjkim { 602306536Sjkim ExternalFileList = ExternalFileList->Next; 603306536Sjkim GlobalStatus = AE_TYPE; 604306536Sjkim Status = AE_OK; 605306536Sjkim continue; 606306536Sjkim } 607306536Sjkim 608241973Sjkim return (Status); 609193529Sjkim } 610306536Sjkim 611306536Sjkim /* Load external tables for symbol resolution */ 612306536Sjkim 613306536Sjkim while (ExternalListHead) 614193529Sjkim { 615306536Sjkim Status = AdParseTable ( 616306536Sjkim ExternalListHead->Table, &OwnerId, TRUE, TRUE); 617193529Sjkim if (ACPI_FAILURE (Status)) 618193529Sjkim { 619306536Sjkim AcpiOsPrintf ("Could not parse external ACPI tables, %s\n", 620306536Sjkim AcpiFormatException (Status)); 621241973Sjkim return (Status); 622193529Sjkim } 623306536Sjkim 624306536Sjkim /* 625306536Sjkim * Load namespace from names created within control methods 626306536Sjkim * Set owner id of nodes in external table 627306536Sjkim */ 628306536Sjkim AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, 629306536Sjkim AcpiGbl_RootNode, OwnerId); 630306536Sjkim AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); 631306536Sjkim 632306536Sjkim ExternalListHead = ExternalListHead->Next; 633193529Sjkim } 634306536Sjkim 635306536Sjkim /* Next external file */ 636306536Sjkim 637306536Sjkim ExternalFileList = ExternalFileList->Next; 638167802Sjkim } 639167802Sjkim 640306536Sjkim if (ACPI_FAILURE (GlobalStatus)) 641118613Snjl { 642306536Sjkim return (GlobalStatus); 643118613Snjl } 644118613Snjl 645306536Sjkim /* Clear external list generated by Scope in external tables */ 646193529Sjkim 647306536Sjkim if (AcpiGbl_ExternalFileList) 648193529Sjkim { 649306536Sjkim AcpiDmClearExternalList (); 650193529Sjkim } 651193529Sjkim 652306536Sjkim /* Load any externals defined in the optional external ref file */ 653118613Snjl 654306536Sjkim AcpiDmGetExternalsFromFile (); 655241973Sjkim return (AE_OK); 656118613Snjl} 657