1 /****************************************************************************** 2 * 3 * Module Name: asllisting - Listing file generation 4 * 5 *****************************************************************************/ 6 7 /****************************************************************************** 8 * 9 * 1. Copyright Notice 10 * 11 * Some or all of this work - Copyright (c) 1999 - 2023, Intel Corp. 12 * All rights reserved. 13 * 14 * 2. License 15 * 16 * 2.1. This is your license from Intel Corp. under its intellectual property 17 * rights. You may have additional license terms from the party that provided 18 * you this software, covering your right to use that party's intellectual 19 * property rights. 20 * 21 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 * copy of the source code appearing in this file ("Covered Code") an 23 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 * base code distributed originally by Intel ("Original Intel Code") to copy, 25 * make derivatives, distribute, use and display any portion of the Covered 26 * Code in any form, with the right to sublicense such rights; and 27 * 28 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 * license (with the right to sublicense), under only those claims of Intel 30 * patents that are infringed by the Original Intel Code, to make, use, sell, 31 * offer to sell, and import the Covered Code and derivative works thereof 32 * solely to the minimum extent necessary to exercise the above copyright 33 * license, and in no event shall the patent license extend to any additions 34 * to or modifications of the Original Intel Code. No other license or right 35 * is granted directly or by implication, estoppel or otherwise; 36 * 37 * The above copyright and patent license is granted only if the following 38 * conditions are met: 39 * 40 * 3. Conditions 41 * 42 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 * Redistribution of source code of any substantial portion of the Covered 44 * Code or modification with rights to further distribute source must include 45 * the above Copyright Notice, the above License, this list of Conditions, 46 * and the following Disclaimer and Export Compliance provision. In addition, 47 * Licensee must cause all Covered Code to which Licensee contributes to 48 * contain a file documenting the changes Licensee made to create that Covered 49 * Code and the date of any change. Licensee must include in that file the 50 * documentation of any changes made by any predecessor Licensee. Licensee 51 * must include a prominent statement that the modification is derived, 52 * directly or indirectly, from Original Intel Code. 53 * 54 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 * Redistribution of source code of any substantial portion of the Covered 56 * Code or modification without rights to further distribute source must 57 * include the following Disclaimer and Export Compliance provision in the 58 * documentation and/or other materials provided with distribution. In 59 * addition, Licensee may not authorize further sublicense of source of any 60 * portion of the Covered Code, and must include terms to the effect that the 61 * license from Licensee to its licensee is limited to the intellectual 62 * property embodied in the software Licensee provides to its licensee, and 63 * not to intellectual property embodied in modifications its licensee may 64 * make. 65 * 66 * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 * substantial portion of the Covered Code or modification must reproduce the 68 * above Copyright Notice, and the following Disclaimer and Export Compliance 69 * provision in the documentation and/or other materials provided with the 70 * distribution. 71 * 72 * 3.4. Intel retains all right, title, and interest in and to the Original 73 * Intel Code. 74 * 75 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 * Intel shall be used in advertising or otherwise to promote the sale, use or 77 * other dealings in products derived from or relating to the Covered Code 78 * without prior written authorization from Intel. 79 * 80 * 4. Disclaimer and Export Compliance 81 * 82 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 * PARTICULAR PURPOSE. 89 * 90 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 * LIMITED REMEDY. 98 * 99 * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 * software or system incorporating such software without first obtaining any 101 * required license or other approval from the U. S. Department of Commerce or 102 * any other agency or department of the United States Government. In the 103 * event Licensee exports any such software from the United States or 104 * re-exports any such software from a foreign destination, Licensee shall 105 * ensure that the distribution and export/re-export of the software is in 106 * compliance with all laws, regulations, orders, or other restrictions of the 107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 * any of its subsidiaries will export/re-export any technical data, process, 109 * software, or service, directly or indirectly, to any country for which the 110 * United States government or any agency thereof requires an export license, 111 * other governmental approval, or letter of assurance, without first obtaining 112 * such license, approval or letter. 113 * 114 ***************************************************************************** 115 * 116 * Alternatively, you may choose to be licensed under the terms of the 117 * following license: 118 * 119 * Redistribution and use in source and binary forms, with or without 120 * modification, are permitted provided that the following conditions 121 * are met: 122 * 1. Redistributions of source code must retain the above copyright 123 * notice, this list of conditions, and the following disclaimer, 124 * without modification. 125 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126 * substantially similar to the "NO WARRANTY" disclaimer below 127 * ("Disclaimer") and any redistribution must be conditioned upon 128 * including a substantially similar Disclaimer requirement for further 129 * binary redistribution. 130 * 3. Neither the names of the above-listed copyright holders nor the names 131 * of any contributors may be used to endorse or promote products derived 132 * from this software without specific prior written permission. 133 * 134 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 * 146 * Alternatively, you may choose to be licensed under the terms of the 147 * GNU General Public License ("GPL") version 2 as published by the Free 148 * Software Foundation. 149 * 150 *****************************************************************************/ 151 152 #include <contrib/dev/acpica/compiler/aslcompiler.h> 153 #include "aslcompiler.y.h" 154 #include <contrib/dev/acpica/include/amlcode.h> 155 #include <contrib/dev/acpica/include/acparser.h> 156 #include <contrib/dev/acpica/include/acnamesp.h> 157 158 159 #define _COMPONENT ACPI_COMPILER 160 ACPI_MODULE_NAME ("asllisting") 161 162 163 /* Local prototypes */ 164 165 static void 166 LsGenerateListing ( 167 UINT32 FileId); 168 169 static ACPI_STATUS 170 LsAmlListingWalk ( 171 ACPI_PARSE_OBJECT *Op, 172 UINT32 Level, 173 void *Context); 174 175 static ACPI_STATUS 176 LsTreeWriteWalk ( 177 ACPI_PARSE_OBJECT *Op, 178 UINT32 Level, 179 void *Context); 180 181 static void 182 LsWriteNodeToListing ( 183 ACPI_PARSE_OBJECT *Op, 184 UINT32 FileId); 185 186 static void 187 LsFinishSourceListing ( 188 UINT32 FileId); 189 190 191 /******************************************************************************* 192 * 193 * FUNCTION: LsDoListings 194 * 195 * PARAMETERS: None. Examines the various output file global flags. 196 * 197 * RETURN: None 198 * 199 * DESCRIPTION: Generate all requested listing files. 200 * 201 ******************************************************************************/ 202 203 void 204 LsDoListings ( 205 void) 206 { 207 208 if (AslGbl_C_OutputFlag) 209 { 210 LsGenerateListing (ASL_FILE_C_SOURCE_OUTPUT); 211 } 212 213 if (AslGbl_ListingFlag) 214 { 215 LsGenerateListing (ASL_FILE_LISTING_OUTPUT); 216 } 217 218 if (AslGbl_AsmOutputFlag) 219 { 220 LsGenerateListing (ASL_FILE_ASM_SOURCE_OUTPUT); 221 } 222 223 if (AslGbl_C_IncludeOutputFlag) 224 { 225 LsGenerateListing (ASL_FILE_C_INCLUDE_OUTPUT); 226 } 227 228 if (AslGbl_AsmIncludeOutputFlag) 229 { 230 LsGenerateListing (ASL_FILE_ASM_INCLUDE_OUTPUT); 231 } 232 233 if (AslGbl_C_OffsetTableFlag) 234 { 235 LsGenerateListing (ASL_FILE_C_OFFSET_OUTPUT); 236 } 237 } 238 239 240 /******************************************************************************* 241 * 242 * FUNCTION: LsGenerateListing 243 * 244 * PARAMETERS: FileId - ID of listing file 245 * 246 * RETURN: None 247 * 248 * DESCRIPTION: Generate a listing file. This can be one of the several types 249 * of "listings" supported. 250 * 251 ******************************************************************************/ 252 253 static void 254 LsGenerateListing ( 255 UINT32 FileId) 256 { 257 UINT32 WalkMode = ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_DB_SEPARATELY; 258 259 /* Start at the beginning of both the source and AML files */ 260 261 FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0); 262 FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 263 AslGbl_SourceLine = 0; 264 AslGbl_CurrentHexColumn = 0; 265 LsPushNode (AslGbl_Files[ASL_FILE_INPUT].Filename); 266 267 if (FileId == ASL_FILE_C_OFFSET_OUTPUT) 268 { 269 AslGbl_CurrentAmlOffset = 0; 270 271 /* Offset table file has a special header and footer */ 272 273 LsDoOffsetTableHeader (FileId); 274 275 TrWalkParseTree (AslGbl_CurrentDB, WalkMode, 276 LsAmlOffsetWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); 277 LsDoOffsetTableFooter (FileId); 278 return; 279 } 280 281 /* Process all parse nodes */ 282 283 TrWalkParseTree (AslGbl_CurrentDB, WalkMode, 284 LsAmlListingWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); 285 286 /* Final processing */ 287 288 LsFinishSourceListing (FileId); 289 } 290 291 292 /******************************************************************************* 293 * 294 * FUNCTION: LsAmlListingWalk 295 * 296 * PARAMETERS: ASL_WALK_CALLBACK 297 * 298 * RETURN: Status 299 * 300 * DESCRIPTION: Process one node during a listing file generation. 301 * 302 ******************************************************************************/ 303 304 static ACPI_STATUS 305 LsAmlListingWalk ( 306 ACPI_PARSE_OBJECT *Op, 307 UINT32 Level, 308 void *Context) 309 { 310 UINT8 FileByte; 311 UINT32 i; 312 UINT32 FileId = (UINT32) ACPI_TO_INTEGER (Context); 313 314 315 LsWriteNodeToListing (Op, FileId); 316 317 if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DATA) 318 { 319 /* Buffer is a resource template, don't dump the data all at once */ 320 321 return (AE_OK); 322 } 323 324 if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) || 325 (FileId == ASL_FILE_C_INCLUDE_OUTPUT)) 326 { 327 return (AE_OK); 328 } 329 330 /* Write the hex bytes to the listing file(s) (if requested) */ 331 332 for (i = 0; i < Op->Asl.FinalAmlLength; i++) 333 { 334 if (ACPI_FAILURE (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1))) 335 { 336 FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ); 337 AslAbort (); 338 } 339 340 LsWriteListingHexBytes (&FileByte, 1, FileId); 341 } 342 343 return (AE_OK); 344 } 345 346 347 /******************************************************************************* 348 * 349 * FUNCTION: LsDumpParseTree, LsTreeWriteWalk 350 * 351 * PARAMETERS: None 352 * 353 * RETURN: None 354 * 355 * DESCRIPTION: Dump entire parse tree, for compiler debug only 356 * 357 ******************************************************************************/ 358 359 void 360 LsDumpParseTree ( 361 void) 362 { 363 364 if (!AslGbl_DebugFlag) 365 { 366 return; 367 } 368 369 DbgPrint (ASL_TREE_OUTPUT, "\nOriginal parse tree from parser:\n\n"); 370 DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER1); 371 372 TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, 373 LsTreeWriteWalk, NULL, NULL); 374 375 DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER1); 376 } 377 378 379 static ACPI_STATUS 380 LsTreeWriteWalk ( 381 ACPI_PARSE_OBJECT *Op, 382 UINT32 Level, 383 void *Context) 384 { 385 386 /* Dump ParseOp name and possible value */ 387 388 switch (Op->Asl.ParseOpcode) 389 { 390 case PARSEOP_NAMESEG: 391 case PARSEOP_NAMESTRING: 392 case PARSEOP_METHODCALL: 393 case PARSEOP_STRING_LITERAL: 394 395 UtDumpStringOp (Op, Level); 396 break; 397 398 case PARSEOP_BYTECONST: 399 400 UtDumpIntegerOp (Op, Level, 2); 401 break; 402 403 case PARSEOP_WORDCONST: 404 case PARSEOP_PACKAGE_LENGTH: 405 406 UtDumpIntegerOp (Op, Level, 4); 407 break; 408 409 case PARSEOP_DWORDCONST: 410 case PARSEOP_EISAID: 411 412 UtDumpIntegerOp (Op, Level, 8); 413 break; 414 415 case PARSEOP_QWORDCONST: 416 case PARSEOP_INTEGER: 417 case PARSEOP_ONE: 418 case PARSEOP_ZERO: 419 case PARSEOP_ONES: 420 421 UtDumpIntegerOp (Op, Level, 16); 422 break; 423 424 case PARSEOP_INCLUDE: 425 426 DbgPrint (ASL_TREE_OUTPUT, 427 "Open: %s\n", Op->Asl.Value.String); 428 return (AE_OK); 429 430 case PARSEOP_INCLUDE_END: 431 432 DbgPrint (ASL_TREE_OUTPUT, 433 "Close: %s\n", Op->Asl.Filename); 434 return (AE_OK); 435 436 default: 437 438 UtDumpBasicOp (Op, Level); 439 break; 440 } 441 442 /* Dump the remaining data */ 443 444 DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_DEBUG1, 445 Op->Asl.ParseOpcode, Op->Asl.CompileFlags, 446 Op->Asl.LineNumber, Op->Asl.EndLine, 447 Op->Asl.LogicalLineNumber, Op->Asl.EndLogicalLine); 448 449 TrPrintOpFlags (Op->Asl.CompileFlags, ASL_TREE_OUTPUT); 450 DbgPrint (ASL_TREE_OUTPUT, "\n"); 451 return (AE_OK); 452 } 453 454 455 /******************************************************************************* 456 * 457 * FUNCTION: LsWriteNodeToListing 458 * 459 * PARAMETERS: Op - Parse node to write to the listing file. 460 * FileId - ID of current listing file 461 * 462 * RETURN: None. 463 * 464 * DESCRIPTION: Write "a node" to the listing file. This means to 465 * 1) Write out all of the source text associated with the node 466 * 2) Write out all of the AML bytes associated with the node 467 * 3) Write any compiler exceptions associated with the node 468 * 469 ******************************************************************************/ 470 471 static void 472 LsWriteNodeToListing ( 473 ACPI_PARSE_OBJECT *Op, 474 UINT32 FileId) 475 { 476 const ACPI_OPCODE_INFO *OpInfo; 477 UINT32 OpClass; 478 char *Pathname; 479 UINT32 Length; 480 UINT32 i; 481 482 483 OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); 484 OpClass = OpInfo->Class; 485 486 /* TBD: clean this up with a single flag that says: 487 * I start a named output block 488 */ 489 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 490 { 491 switch (Op->Asl.ParseOpcode) 492 { 493 case PARSEOP_DEFINITION_BLOCK: 494 case PARSEOP_METHODCALL: 495 case PARSEOP_INCLUDE: 496 case PARSEOP_INCLUDE_END: 497 case PARSEOP_DEFAULT_ARG: 498 499 break; 500 501 default: 502 503 switch (OpClass) 504 { 505 case AML_CLASS_NAMED_OBJECT: 506 507 switch (Op->Asl.AmlOpcode) 508 { 509 case AML_SCOPE_OP: 510 case AML_ALIAS_OP: 511 512 break; 513 514 default: 515 516 if (Op->Asl.ExternalName) 517 { 518 LsFlushListingBuffer (FileId); 519 FlPrintFile (FileId, " };\n"); 520 } 521 break; 522 } 523 break; 524 525 default: 526 527 /* Don't care about other objects */ 528 529 break; 530 } 531 break; 532 } 533 } 534 535 /* These cases do not have a corresponding AML opcode */ 536 537 switch (Op->Asl.ParseOpcode) 538 { 539 case PARSEOP_DEFINITION_BLOCK: 540 541 /* Always start a definition block at AML offset zero */ 542 543 AslGbl_CurrentAmlOffset = 0; 544 LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, FileId); 545 546 /* Use the table Signature and TableId to build a unique name */ 547 548 switch (FileId) 549 { 550 case ASL_FILE_ASM_SOURCE_OUTPUT: 551 552 FlPrintFile (FileId, 553 "%s_%s_Header \\\n", 554 AslGbl_TableSignature, AslGbl_TableId); 555 break; 556 557 case ASL_FILE_C_SOURCE_OUTPUT: 558 559 FlPrintFile (FileId, 560 " unsigned char %s_%s_Header [] =\n {\n", 561 AslGbl_TableSignature, AslGbl_TableId); 562 break; 563 564 case ASL_FILE_ASM_INCLUDE_OUTPUT: 565 566 FlPrintFile (FileId, 567 "extrn %s_%s_Header : byte\n", 568 AslGbl_TableSignature, AslGbl_TableId); 569 break; 570 571 case ASL_FILE_C_INCLUDE_OUTPUT: 572 573 FlPrintFile (FileId, 574 "extern unsigned char %s_%s_Header [];\n", 575 AslGbl_TableSignature, AslGbl_TableId); 576 break; 577 578 default: 579 break; 580 } 581 582 return; 583 584 585 case PARSEOP_METHODCALL: 586 587 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 588 FileId); 589 return; 590 591 592 case PARSEOP_INCLUDE: 593 594 /* Flush everything up to and including the include source line */ 595 596 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 597 FileId); 598 599 /* Create a new listing node and push it */ 600 601 LsPushNode (Op->Asl.Value.String); 602 return; 603 604 605 case PARSEOP_INCLUDE_END: 606 607 /* Flush out the rest of the include file */ 608 609 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 610 FileId); 611 612 /* Pop off this listing node and go back to the parent file */ 613 614 (void) LsPopNode (); 615 return; 616 617 618 case PARSEOP_DEFAULT_ARG: 619 620 if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC) 621 { 622 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.EndLogicalLine, 623 FileId); 624 } 625 return; 626 627 628 default: 629 630 /* All other opcodes have an AML opcode */ 631 632 break; 633 } 634 635 /* 636 * Otherwise, we look at the AML opcode because we can 637 * switch on the opcode type, getting an entire class 638 * at once 639 */ 640 switch (OpClass) 641 { 642 case AML_CLASS_ARGUMENT: /* argument type only */ 643 case AML_CLASS_INTERNAL: 644 645 break; 646 647 case AML_CLASS_NAMED_OBJECT: 648 649 switch (Op->Asl.AmlOpcode) 650 { 651 case AML_FIELD_OP: 652 case AML_INDEX_FIELD_OP: 653 case AML_BANK_FIELD_OP: 654 /* 655 * For fields, we want to dump all the AML after the 656 * entire definition 657 */ 658 LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, 659 FileId); 660 break; 661 662 case AML_NAME_OP: 663 664 if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC) 665 { 666 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 667 FileId); 668 } 669 else 670 { 671 /* 672 * For fields, we want to dump all the AML after the 673 * entire definition 674 */ 675 LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, 676 FileId); 677 } 678 break; 679 680 default: 681 682 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 683 FileId); 684 break; 685 } 686 687 switch (Op->Asl.AmlOpcode) 688 { 689 case AML_SCOPE_OP: 690 case AML_ALIAS_OP: 691 692 /* These opcodes do not declare a new object, ignore them */ 693 694 break; 695 696 default: 697 698 /* All other named object opcodes come here */ 699 700 switch (FileId) 701 { 702 case ASL_FILE_ASM_SOURCE_OUTPUT: 703 case ASL_FILE_C_SOURCE_OUTPUT: 704 case ASL_FILE_ASM_INCLUDE_OUTPUT: 705 case ASL_FILE_C_INCLUDE_OUTPUT: 706 /* 707 * For named objects, we will create a valid symbol so that the 708 * AML code can be referenced from C or ASM 709 */ 710 if (Op->Asl.ExternalName) 711 { 712 /* Get the full pathname associated with this node */ 713 714 Pathname = AcpiNsGetExternalPathname (Op->Asl.Node); 715 Length = strlen (Pathname); 716 if (Length >= 4) 717 { 718 /* Convert all dots in the path to underscores */ 719 720 for (i = 0; i < Length; i++) 721 { 722 if (Pathname[i] == '.') 723 { 724 Pathname[i] = '_'; 725 } 726 } 727 728 /* Create the appropriate symbol in the output file */ 729 730 switch (FileId) 731 { 732 case ASL_FILE_ASM_SOURCE_OUTPUT: 733 734 FlPrintFile (FileId, 735 "%s_%s_%s \\\n", 736 AslGbl_TableSignature, AslGbl_TableId, &Pathname[1]); 737 break; 738 739 case ASL_FILE_C_SOURCE_OUTPUT: 740 741 FlPrintFile (FileId, 742 " unsigned char %s_%s_%s [] =\n {\n", 743 AslGbl_TableSignature, AslGbl_TableId, &Pathname[1]); 744 break; 745 746 case ASL_FILE_ASM_INCLUDE_OUTPUT: 747 748 FlPrintFile (FileId, 749 "extrn %s_%s_%s : byte\n", 750 AslGbl_TableSignature, AslGbl_TableId, &Pathname[1]); 751 break; 752 753 case ASL_FILE_C_INCLUDE_OUTPUT: 754 755 FlPrintFile (FileId, 756 "extern unsigned char %s_%s_%s [];\n", 757 AslGbl_TableSignature, AslGbl_TableId, &Pathname[1]); 758 break; 759 760 default: 761 break; 762 } 763 } 764 765 ACPI_FREE (Pathname); 766 } 767 break; 768 769 default: 770 771 /* Nothing to do for listing file */ 772 773 break; 774 } 775 } 776 break; 777 778 case AML_CLASS_EXECUTE: 779 case AML_CLASS_CREATE: 780 default: 781 782 if ((Op->Asl.ParseOpcode == PARSEOP_BUFFER) && 783 (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC)) 784 { 785 return; 786 } 787 788 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 789 FileId); 790 break; 791 792 case AML_CLASS_UNKNOWN: 793 794 break; 795 } 796 } 797 798 799 /******************************************************************************* 800 * 801 * FUNCTION: LsFinishSourceListing 802 * 803 * PARAMETERS: FileId - ID of current listing file. 804 * 805 * RETURN: None 806 * 807 * DESCRIPTION: Cleanup routine for the listing file. Flush the hex AML 808 * listing buffer, and flush out any remaining lines in the 809 * source input file. 810 * 811 ******************************************************************************/ 812 813 static void 814 LsFinishSourceListing ( 815 UINT32 FileId) 816 { 817 818 if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) || 819 (FileId == ASL_FILE_C_INCLUDE_OUTPUT)) 820 { 821 return; 822 } 823 824 LsFlushListingBuffer (FileId); 825 AslGbl_CurrentAmlOffset = 0; 826 827 /* Flush any remaining text in the source file */ 828 829 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 830 { 831 FlPrintFile (FileId, " /*\n"); 832 } 833 834 while (LsWriteOneSourceLine (FileId)) 835 { ; } 836 837 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 838 { 839 FlPrintFile (FileId, "\n */\n };\n"); 840 } 841 842 FlPrintFile (FileId, "\n"); 843 844 if (FileId == ASL_FILE_LISTING_OUTPUT) 845 { 846 /* Print a summary of the compile exceptions */ 847 848 FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n"); 849 AePrintErrorLog (FileId); 850 FlPrintFile (FileId, "\n"); 851 UtDisplayOneSummary (FileId, TRUE); 852 FlPrintFile (FileId, "\n"); 853 } 854 } 855