1118611Snjl/****************************************************************************** 2118611Snjl * 3118611Snjl * Module Name: asllisting - Listing file generation 4118611Snjl * 5118611Snjl *****************************************************************************/ 6118611Snjl 7217365Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp. 9118611Snjl * All rights reserved. 10118611Snjl * 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. 25118611Snjl * 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. 29118611Snjl * 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 */ 43118611Snjl 44151937Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 45118611Snjl#include "aslcompiler.y.h" 46193529Sjkim#include <contrib/dev/acpica/include/amlcode.h> 47193529Sjkim#include <contrib/dev/acpica/include/acparser.h> 48193529Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 49118611Snjl 50249112Sjkim 51118611Snjl#define _COMPONENT ACPI_COMPILER 52249112Sjkim ACPI_MODULE_NAME ("asllisting") 53118611Snjl 54249112Sjkim 55151937Sjkim/* Local prototypes */ 56118611Snjl 57151937Sjkimstatic void 58249112SjkimLsGenerateListing ( 59249112Sjkim UINT32 FileId); 60151937Sjkim 61151937Sjkimstatic ACPI_STATUS 62151937SjkimLsAmlListingWalk ( 63151937Sjkim ACPI_PARSE_OBJECT *Op, 64151937Sjkim UINT32 Level, 65151937Sjkim void *Context); 66151937Sjkim 67249112Sjkimstatic ACPI_STATUS 68249112SjkimLsTreeWriteWalk ( 69249112Sjkim ACPI_PARSE_OBJECT *Op, 70249112Sjkim UINT32 Level, 71249112Sjkim void *Context); 72151937Sjkim 73151937Sjkimstatic void 74249112SjkimLsWriteNodeToListing ( 75249112Sjkim ACPI_PARSE_OBJECT *Op, 76151937Sjkim UINT32 FileId); 77151937Sjkim 78151937Sjkimstatic void 79151937SjkimLsFinishSourceListing ( 80151937Sjkim UINT32 FileId); 81151937Sjkim 82151937Sjkim 83118611Snjl/******************************************************************************* 84118611Snjl * 85245582Sjkim * FUNCTION: LsDoListings 86245582Sjkim * 87249112Sjkim * PARAMETERS: None. Examines the various output file global flags. 88245582Sjkim * 89245582Sjkim * RETURN: None 90245582Sjkim * 91245582Sjkim * DESCRIPTION: Generate all requested listing files. 92245582Sjkim * 93245582Sjkim ******************************************************************************/ 94245582Sjkim 95245582Sjkimvoid 96245582SjkimLsDoListings ( 97245582Sjkim void) 98245582Sjkim{ 99245582Sjkim 100245582Sjkim if (Gbl_C_OutputFlag) 101245582Sjkim { 102245582Sjkim LsGenerateListing (ASL_FILE_C_SOURCE_OUTPUT); 103245582Sjkim } 104245582Sjkim 105245582Sjkim if (Gbl_ListingFlag) 106245582Sjkim { 107245582Sjkim LsGenerateListing (ASL_FILE_LISTING_OUTPUT); 108245582Sjkim } 109245582Sjkim 110245582Sjkim if (Gbl_AsmOutputFlag) 111245582Sjkim { 112245582Sjkim LsGenerateListing (ASL_FILE_ASM_SOURCE_OUTPUT); 113245582Sjkim } 114245582Sjkim 115245582Sjkim if (Gbl_C_IncludeOutputFlag) 116245582Sjkim { 117245582Sjkim LsGenerateListing (ASL_FILE_C_INCLUDE_OUTPUT); 118245582Sjkim } 119245582Sjkim 120245582Sjkim if (Gbl_AsmIncludeOutputFlag) 121245582Sjkim { 122245582Sjkim LsGenerateListing (ASL_FILE_ASM_INCLUDE_OUTPUT); 123245582Sjkim } 124245582Sjkim 125249112Sjkim if (Gbl_C_OffsetTableFlag) 126167802Sjkim { 127249112Sjkim LsGenerateListing (ASL_FILE_C_OFFSET_OUTPUT); 128167802Sjkim } 129167802Sjkim} 130167802Sjkim 131167802Sjkim 132167802Sjkim/******************************************************************************* 133167802Sjkim * 134249112Sjkim * FUNCTION: LsGenerateListing 135118611Snjl * 136249112Sjkim * PARAMETERS: FileId - ID of listing file 137118611Snjl * 138245582Sjkim * RETURN: None 139118611Snjl * 140249112Sjkim * DESCRIPTION: Generate a listing file. This can be one of the several types 141249112Sjkim * of "listings" supported. 142118611Snjl * 143118611Snjl ******************************************************************************/ 144118611Snjl 145151937Sjkimstatic void 146249112SjkimLsGenerateListing ( 147249112Sjkim UINT32 FileId) 148118611Snjl{ 149118611Snjl 150249112Sjkim /* Start at the beginning of both the source and AML files */ 151118611Snjl 152249112Sjkim FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0); 153249112Sjkim FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 154249112Sjkim Gbl_SourceLine = 0; 155249112Sjkim Gbl_CurrentHexColumn = 0; 156249112Sjkim LsPushNode (Gbl_Files[ASL_FILE_INPUT].Filename); 157249112Sjkim 158249112Sjkim if (FileId == ASL_FILE_C_OFFSET_OUTPUT) 159118611Snjl { 160250838Sjkim Gbl_CurrentAmlOffset = 0; 161250838Sjkim 162249112Sjkim /* Offset table file has a special header and footer */ 163118611Snjl 164249112Sjkim LsDoOffsetTableHeader (FileId); 165249112Sjkim 166306536Sjkim TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 167306536Sjkim LsAmlOffsetWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); 168249112Sjkim LsDoOffsetTableFooter (FileId); 169249112Sjkim return; 170118611Snjl } 171118611Snjl 172249112Sjkim /* Process all parse nodes */ 173118611Snjl 174306536Sjkim TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 175306536Sjkim LsAmlListingWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); 176118611Snjl 177249112Sjkim /* Final processing */ 178118611Snjl 179249112Sjkim LsFinishSourceListing (FileId); 180118611Snjl} 181118611Snjl 182118611Snjl 183118611Snjl/******************************************************************************* 184118611Snjl * 185118611Snjl * FUNCTION: LsAmlListingWalk 186118611Snjl * 187118611Snjl * PARAMETERS: ASL_WALK_CALLBACK 188118611Snjl * 189118611Snjl * RETURN: Status 190118611Snjl * 191118611Snjl * DESCRIPTION: Process one node during a listing file generation. 192118611Snjl * 193118611Snjl ******************************************************************************/ 194118611Snjl 195151937Sjkimstatic ACPI_STATUS 196118611SnjlLsAmlListingWalk ( 197118611Snjl ACPI_PARSE_OBJECT *Op, 198118611Snjl UINT32 Level, 199118611Snjl void *Context) 200118611Snjl{ 201118611Snjl UINT8 FileByte; 202118611Snjl UINT32 i; 203167802Sjkim UINT32 FileId = (UINT32) ACPI_TO_INTEGER (Context); 204118611Snjl 205118611Snjl 206118611Snjl LsWriteNodeToListing (Op, FileId); 207118611Snjl 208167802Sjkim if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DATA) 209167802Sjkim { 210167802Sjkim /* Buffer is a resource template, don't dump the data all at once */ 211167802Sjkim 212167802Sjkim return (AE_OK); 213167802Sjkim } 214167802Sjkim 215306536Sjkim if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) || 216306536Sjkim (FileId == ASL_FILE_C_INCLUDE_OUTPUT)) 217306536Sjkim { 218306536Sjkim return (AE_OK); 219306536Sjkim } 220306536Sjkim 221118611Snjl /* Write the hex bytes to the listing file(s) (if requested) */ 222118611Snjl 223118611Snjl for (i = 0; i < Op->Asl.FinalAmlLength; i++) 224118611Snjl { 225118611Snjl if (ACPI_FAILURE (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1))) 226118611Snjl { 227118611Snjl FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ); 228118611Snjl AslAbort (); 229118611Snjl } 230306536Sjkim 231118611Snjl LsWriteListingHexBytes (&FileByte, 1, FileId); 232118611Snjl } 233118611Snjl 234118611Snjl return (AE_OK); 235118611Snjl} 236118611Snjl 237118611Snjl 238118611Snjl/******************************************************************************* 239118611Snjl * 240249112Sjkim * FUNCTION: LsDumpParseTree, LsTreeWriteWalk 241118611Snjl * 242249112Sjkim * PARAMETERS: None 243118611Snjl * 244118611Snjl * RETURN: None 245118611Snjl * 246249112Sjkim * DESCRIPTION: Dump entire parse tree, for compiler debug only 247118611Snjl * 248118611Snjl ******************************************************************************/ 249118611Snjl 250249112Sjkimvoid 251249112SjkimLsDumpParseTree ( 252151937Sjkim void) 253118611Snjl{ 254118611Snjl 255249112Sjkim if (!Gbl_DebugFlag) 256118611Snjl { 257118611Snjl return; 258118611Snjl } 259118611Snjl 260249112Sjkim DbgPrint (ASL_TREE_OUTPUT, "\nOriginal parse tree from parser:\n\n"); 261306536Sjkim DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER1); 262306536Sjkim 263306536Sjkim TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 264249112Sjkim LsTreeWriteWalk, NULL, NULL); 265306536Sjkim 266306536Sjkim DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER1); 267118611Snjl} 268118611Snjl 269118611Snjl 270249112Sjkimstatic ACPI_STATUS 271249112SjkimLsTreeWriteWalk ( 272249112Sjkim ACPI_PARSE_OBJECT *Op, 273249112Sjkim UINT32 Level, 274249112Sjkim void *Context) 275118611Snjl{ 276118611Snjl 277306536Sjkim /* Dump ParseOp name and possible value */ 278118611Snjl 279306536Sjkim switch (Op->Asl.ParseOpcode) 280306536Sjkim { 281306536Sjkim case PARSEOP_NAMESEG: 282306536Sjkim case PARSEOP_NAMESTRING: 283306536Sjkim case PARSEOP_METHODCALL: 284306536Sjkim case PARSEOP_STRING_LITERAL: 285250838Sjkim 286306536Sjkim UtDumpStringOp (Op, Level); 287306536Sjkim break; 288118611Snjl 289306536Sjkim case PARSEOP_BYTECONST: 290306536Sjkim 291306536Sjkim UtDumpIntegerOp (Op, Level, 2); 292306536Sjkim break; 293306536Sjkim 294306536Sjkim case PARSEOP_WORDCONST: 295306536Sjkim case PARSEOP_PACKAGE_LENGTH: 296306536Sjkim 297306536Sjkim UtDumpIntegerOp (Op, Level, 4); 298306536Sjkim break; 299306536Sjkim 300306536Sjkim case PARSEOP_DWORDCONST: 301306536Sjkim case PARSEOP_EISAID: 302306536Sjkim 303306536Sjkim UtDumpIntegerOp (Op, Level, 8); 304306536Sjkim break; 305306536Sjkim 306306536Sjkim case PARSEOP_QWORDCONST: 307306536Sjkim case PARSEOP_INTEGER: 308306536Sjkim case PARSEOP_ONE: 309306536Sjkim case PARSEOP_ZERO: 310306536Sjkim case PARSEOP_ONES: 311306536Sjkim 312306536Sjkim UtDumpIntegerOp (Op, Level, 16); 313306536Sjkim break; 314306536Sjkim 315306536Sjkim case PARSEOP_INCLUDE: 316306536Sjkim 317306536Sjkim DbgPrint (ASL_TREE_OUTPUT, 318306536Sjkim "Open: %s\n", Op->Asl.Value.String); 319306536Sjkim return (AE_OK); 320306536Sjkim 321306536Sjkim case PARSEOP_INCLUDE_END: 322306536Sjkim 323306536Sjkim DbgPrint (ASL_TREE_OUTPUT, 324306536Sjkim "Close: %s\n", Op->Asl.Filename); 325306536Sjkim return (AE_OK); 326306536Sjkim 327306536Sjkim default: 328306536Sjkim 329306536Sjkim UtDumpBasicOp (Op, Level); 330306536Sjkim break; 331306536Sjkim } 332306536Sjkim 333306536Sjkim /* Dump the remaining data */ 334306536Sjkim 335306536Sjkim DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_DEBUG1, 336306536Sjkim Op->Asl.ParseOpcode, Op->Asl.CompileFlags, 337306536Sjkim Op->Asl.LineNumber, Op->Asl.EndLine, 338306536Sjkim Op->Asl.LogicalLineNumber, Op->Asl.EndLogicalLine); 339306536Sjkim 340281687Sjkim TrPrintNodeCompileFlags (Op->Asl.CompileFlags); 341281687Sjkim DbgPrint (ASL_TREE_OUTPUT, "\n"); 342249112Sjkim return (AE_OK); 343118611Snjl} 344118611Snjl 345118611Snjl 346118611Snjl/******************************************************************************* 347118611Snjl * 348118611Snjl * FUNCTION: LsWriteNodeToListing 349118611Snjl * 350249112Sjkim * PARAMETERS: Op - Parse node to write to the listing file. 351118611Snjl * FileId - ID of current listing file 352118611Snjl * 353118611Snjl * RETURN: None. 354118611Snjl * 355241973Sjkim * DESCRIPTION: Write "a node" to the listing file. This means to 356118611Snjl * 1) Write out all of the source text associated with the node 357118611Snjl * 2) Write out all of the AML bytes associated with the node 358118611Snjl * 3) Write any compiler exceptions associated with the node 359118611Snjl * 360118611Snjl ******************************************************************************/ 361118611Snjl 362151937Sjkimstatic void 363118611SnjlLsWriteNodeToListing ( 364118611Snjl ACPI_PARSE_OBJECT *Op, 365118611Snjl UINT32 FileId) 366118611Snjl{ 367118611Snjl const ACPI_OPCODE_INFO *OpInfo; 368118611Snjl UINT32 OpClass; 369118611Snjl char *Pathname; 370118611Snjl UINT32 Length; 371118611Snjl UINT32 i; 372118611Snjl 373118611Snjl 374118611Snjl OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); 375118611Snjl OpClass = OpInfo->Class; 376118611Snjl 377151937Sjkim /* TBD: clean this up with a single flag that says: 378151937Sjkim * I start a named output block 379151937Sjkim */ 380118611Snjl if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 381118611Snjl { 382118611Snjl switch (Op->Asl.ParseOpcode) 383118611Snjl { 384306536Sjkim case PARSEOP_DEFINITION_BLOCK: 385118611Snjl case PARSEOP_METHODCALL: 386118611Snjl case PARSEOP_INCLUDE: 387118611Snjl case PARSEOP_INCLUDE_END: 388118611Snjl case PARSEOP_DEFAULT_ARG: 389118611Snjl 390118611Snjl break; 391118611Snjl 392118611Snjl default: 393250838Sjkim 394118611Snjl switch (OpClass) 395118611Snjl { 396118611Snjl case AML_CLASS_NAMED_OBJECT: 397250838Sjkim 398118611Snjl switch (Op->Asl.AmlOpcode) 399118611Snjl { 400118611Snjl case AML_SCOPE_OP: 401118611Snjl case AML_ALIAS_OP: 402250838Sjkim 403118611Snjl break; 404118611Snjl 405118611Snjl default: 406250838Sjkim 407118611Snjl if (Op->Asl.ExternalName) 408118611Snjl { 409118611Snjl LsFlushListingBuffer (FileId); 410118611Snjl FlPrintFile (FileId, " };\n"); 411118611Snjl } 412118611Snjl break; 413118611Snjl } 414118611Snjl break; 415118611Snjl 416118611Snjl default: 417250838Sjkim 418118611Snjl /* Don't care about other objects */ 419250838Sjkim 420118611Snjl break; 421118611Snjl } 422118611Snjl break; 423118611Snjl } 424118611Snjl } 425118611Snjl 426118611Snjl /* These cases do not have a corresponding AML opcode */ 427118611Snjl 428118611Snjl switch (Op->Asl.ParseOpcode) 429118611Snjl { 430306536Sjkim case PARSEOP_DEFINITION_BLOCK: 431118611Snjl 432306536Sjkim /* Always start a definition block at AML offset zero */ 433306536Sjkim 434306536Sjkim Gbl_CurrentAmlOffset = 0; 435118611Snjl LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, FileId); 436118611Snjl 437118611Snjl /* Use the table Signature and TableId to build a unique name */ 438118611Snjl 439306536Sjkim switch (FileId) 440118611Snjl { 441306536Sjkim case ASL_FILE_ASM_SOURCE_OUTPUT: 442306536Sjkim 443151937Sjkim FlPrintFile (FileId, 444151937Sjkim "%s_%s_Header \\\n", 445118611Snjl Gbl_TableSignature, Gbl_TableId); 446306536Sjkim break; 447306536Sjkim 448306536Sjkim case ASL_FILE_C_SOURCE_OUTPUT: 449306536Sjkim 450151937Sjkim FlPrintFile (FileId, 451151937Sjkim " unsigned char %s_%s_Header [] =\n {\n", 452118611Snjl Gbl_TableSignature, Gbl_TableId); 453306536Sjkim break; 454306536Sjkim 455306536Sjkim case ASL_FILE_ASM_INCLUDE_OUTPUT: 456306536Sjkim 457151937Sjkim FlPrintFile (FileId, 458151937Sjkim "extrn %s_%s_Header : byte\n", 459118611Snjl Gbl_TableSignature, Gbl_TableId); 460306536Sjkim break; 461306536Sjkim 462306536Sjkim case ASL_FILE_C_INCLUDE_OUTPUT: 463306536Sjkim 464151937Sjkim FlPrintFile (FileId, 465151937Sjkim "extern unsigned char %s_%s_Header [];\n", 466118611Snjl Gbl_TableSignature, Gbl_TableId); 467306536Sjkim break; 468306536Sjkim 469306536Sjkim default: 470306536Sjkim break; 471118611Snjl } 472306536Sjkim 473118611Snjl return; 474118611Snjl 475118611Snjl 476118611Snjl case PARSEOP_METHODCALL: 477118611Snjl 478151937Sjkim LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 479151937Sjkim FileId); 480118611Snjl return; 481118611Snjl 482118611Snjl 483118611Snjl case PARSEOP_INCLUDE: 484118611Snjl 485151937Sjkim /* Flush everything up to and including the include source line */ 486118611Snjl 487151937Sjkim LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 488151937Sjkim FileId); 489151937Sjkim 490151937Sjkim /* Create a new listing node and push it */ 491151937Sjkim 492306536Sjkim LsPushNode (Op->Asl.Value.String); 493118611Snjl return; 494118611Snjl 495118611Snjl 496118611Snjl case PARSEOP_INCLUDE_END: 497118611Snjl 498151937Sjkim /* Flush out the rest of the include file */ 499118611Snjl 500151937Sjkim LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 501151937Sjkim FileId); 502151937Sjkim 503151937Sjkim /* Pop off this listing node and go back to the parent file */ 504151937Sjkim 505151937Sjkim (void) LsPopNode (); 506118611Snjl return; 507118611Snjl 508118611Snjl 509118611Snjl case PARSEOP_DEFAULT_ARG: 510167802Sjkim 511167802Sjkim if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 512167802Sjkim { 513167802Sjkim LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.EndLogicalLine, 514167802Sjkim FileId); 515167802Sjkim } 516118611Snjl return; 517118611Snjl 518118611Snjl 519118611Snjl default: 520250838Sjkim 521118611Snjl /* All other opcodes have an AML opcode */ 522250838Sjkim 523118611Snjl break; 524118611Snjl } 525118611Snjl 526118611Snjl /* 527118611Snjl * Otherwise, we look at the AML opcode because we can 528118611Snjl * switch on the opcode type, getting an entire class 529118611Snjl * at once 530118611Snjl */ 531118611Snjl switch (OpClass) 532118611Snjl { 533118611Snjl case AML_CLASS_ARGUMENT: /* argument type only */ 534118611Snjl case AML_CLASS_INTERNAL: 535118611Snjl 536118611Snjl break; 537118611Snjl 538118611Snjl case AML_CLASS_NAMED_OBJECT: 539118611Snjl 540118611Snjl switch (Op->Asl.AmlOpcode) 541118611Snjl { 542118611Snjl case AML_FIELD_OP: 543118611Snjl case AML_INDEX_FIELD_OP: 544118611Snjl case AML_BANK_FIELD_OP: 545151937Sjkim /* 546151937Sjkim * For fields, we want to dump all the AML after the 547151937Sjkim * entire definition 548151937Sjkim */ 549151937Sjkim LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, 550151937Sjkim FileId); 551118611Snjl break; 552118611Snjl 553167802Sjkim case AML_NAME_OP: 554167802Sjkim 555167802Sjkim if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 556167802Sjkim { 557167802Sjkim LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 558167802Sjkim FileId); 559167802Sjkim } 560167802Sjkim else 561167802Sjkim { 562167802Sjkim /* 563167802Sjkim * For fields, we want to dump all the AML after the 564167802Sjkim * entire definition 565167802Sjkim */ 566167802Sjkim LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, 567167802Sjkim FileId); 568167802Sjkim } 569167802Sjkim break; 570167802Sjkim 571118611Snjl default: 572250838Sjkim 573151937Sjkim LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 574151937Sjkim FileId); 575118611Snjl break; 576118611Snjl } 577118611Snjl 578118611Snjl switch (Op->Asl.AmlOpcode) 579118611Snjl { 580118611Snjl case AML_SCOPE_OP: 581118611Snjl case AML_ALIAS_OP: 582118611Snjl 583118611Snjl /* These opcodes do not declare a new object, ignore them */ 584118611Snjl 585118611Snjl break; 586118611Snjl 587118611Snjl default: 588118611Snjl 589118611Snjl /* All other named object opcodes come here */ 590118611Snjl 591118611Snjl switch (FileId) 592118611Snjl { 593118611Snjl case ASL_FILE_ASM_SOURCE_OUTPUT: 594118611Snjl case ASL_FILE_C_SOURCE_OUTPUT: 595118611Snjl case ASL_FILE_ASM_INCLUDE_OUTPUT: 596118611Snjl case ASL_FILE_C_INCLUDE_OUTPUT: 597118611Snjl /* 598118611Snjl * For named objects, we will create a valid symbol so that the 599118611Snjl * AML code can be referenced from C or ASM 600118611Snjl */ 601118611Snjl if (Op->Asl.ExternalName) 602118611Snjl { 603118611Snjl /* Get the full pathname associated with this node */ 604118611Snjl 605118611Snjl Pathname = AcpiNsGetExternalPathname (Op->Asl.Node); 606118611Snjl Length = strlen (Pathname); 607118611Snjl if (Length >= 4) 608118611Snjl { 609118611Snjl /* Convert all dots in the path to underscores */ 610118611Snjl 611118611Snjl for (i = 0; i < Length; i++) 612118611Snjl { 613118611Snjl if (Pathname[i] == '.') 614118611Snjl { 615118611Snjl Pathname[i] = '_'; 616118611Snjl } 617118611Snjl } 618118611Snjl 619118611Snjl /* Create the appropriate symbol in the output file */ 620118611Snjl 621306536Sjkim switch (FileId) 622118611Snjl { 623306536Sjkim case ASL_FILE_ASM_SOURCE_OUTPUT: 624306536Sjkim 625151937Sjkim FlPrintFile (FileId, 626151937Sjkim "%s_%s_%s \\\n", 627118611Snjl Gbl_TableSignature, Gbl_TableId, &Pathname[1]); 628306536Sjkim break; 629306536Sjkim 630306536Sjkim case ASL_FILE_C_SOURCE_OUTPUT: 631306536Sjkim 632151937Sjkim FlPrintFile (FileId, 633151937Sjkim " unsigned char %s_%s_%s [] =\n {\n", 634118611Snjl Gbl_TableSignature, Gbl_TableId, &Pathname[1]); 635306536Sjkim break; 636306536Sjkim 637306536Sjkim case ASL_FILE_ASM_INCLUDE_OUTPUT: 638306536Sjkim 639151937Sjkim FlPrintFile (FileId, 640151937Sjkim "extrn %s_%s_%s : byte\n", 641118611Snjl Gbl_TableSignature, Gbl_TableId, &Pathname[1]); 642306536Sjkim break; 643306536Sjkim 644306536Sjkim case ASL_FILE_C_INCLUDE_OUTPUT: 645306536Sjkim 646151937Sjkim FlPrintFile (FileId, 647151937Sjkim "extern unsigned char %s_%s_%s [];\n", 648118611Snjl Gbl_TableSignature, Gbl_TableId, &Pathname[1]); 649306536Sjkim break; 650306536Sjkim 651306536Sjkim default: 652306536Sjkim break; 653118611Snjl } 654118611Snjl } 655306536Sjkim 656167802Sjkim ACPI_FREE (Pathname); 657118611Snjl } 658118611Snjl break; 659118611Snjl 660118611Snjl default: 661250838Sjkim 662118611Snjl /* Nothing to do for listing file */ 663250838Sjkim 664118611Snjl break; 665118611Snjl } 666118611Snjl } 667118611Snjl break; 668118611Snjl 669118611Snjl case AML_CLASS_EXECUTE: 670118611Snjl case AML_CLASS_CREATE: 671118611Snjl default: 672118611Snjl 673167802Sjkim if ((Op->Asl.ParseOpcode == PARSEOP_BUFFER) && 674167802Sjkim (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)) 675167802Sjkim { 676167802Sjkim return; 677167802Sjkim } 678167802Sjkim 679151937Sjkim LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 680151937Sjkim FileId); 681118611Snjl break; 682118611Snjl 683118611Snjl case AML_CLASS_UNKNOWN: 684250838Sjkim 685118611Snjl break; 686118611Snjl } 687118611Snjl} 688249112Sjkim 689249112Sjkim 690249112Sjkim/******************************************************************************* 691249112Sjkim * 692249112Sjkim * FUNCTION: LsFinishSourceListing 693249112Sjkim * 694249112Sjkim * PARAMETERS: FileId - ID of current listing file. 695249112Sjkim * 696249112Sjkim * RETURN: None 697249112Sjkim * 698249112Sjkim * DESCRIPTION: Cleanup routine for the listing file. Flush the hex AML 699249112Sjkim * listing buffer, and flush out any remaining lines in the 700249112Sjkim * source input file. 701249112Sjkim * 702249112Sjkim ******************************************************************************/ 703249112Sjkim 704249112Sjkimstatic void 705249112SjkimLsFinishSourceListing ( 706249112Sjkim UINT32 FileId) 707249112Sjkim{ 708249112Sjkim 709249112Sjkim if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) || 710249112Sjkim (FileId == ASL_FILE_C_INCLUDE_OUTPUT)) 711249112Sjkim { 712249112Sjkim return; 713249112Sjkim } 714249112Sjkim 715249112Sjkim LsFlushListingBuffer (FileId); 716249112Sjkim Gbl_CurrentAmlOffset = 0; 717249112Sjkim 718249112Sjkim /* Flush any remaining text in the source file */ 719249112Sjkim 720249112Sjkim if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 721249112Sjkim { 722249112Sjkim FlPrintFile (FileId, " /*\n"); 723249112Sjkim } 724249112Sjkim 725249112Sjkim while (LsWriteOneSourceLine (FileId)) 726249112Sjkim { ; } 727249112Sjkim 728249112Sjkim if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 729249112Sjkim { 730249112Sjkim FlPrintFile (FileId, "\n */\n };\n"); 731249112Sjkim } 732249112Sjkim 733249112Sjkim FlPrintFile (FileId, "\n"); 734249112Sjkim 735249112Sjkim if (FileId == ASL_FILE_LISTING_OUTPUT) 736249112Sjkim { 737249112Sjkim /* Print a summary of the compile exceptions */ 738249112Sjkim 739249112Sjkim FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n"); 740249112Sjkim AePrintErrorLog (FileId); 741249112Sjkim FlPrintFile (FileId, "\n"); 742249112Sjkim UtDisplaySummary (FileId); 743249112Sjkim FlPrintFile (FileId, "\n"); 744249112Sjkim } 745249112Sjkim} 746