1 2 /****************************************************************************** 3 * 4 * Module Name: asllisting - Listing file generation 5 * 6 *****************************************************************************/ 7 8 /****************************************************************************** 9 * 10 * 1. Copyright Notice 11 * 12 * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. 13 * All rights reserved. 14 * 15 * 2. License 16 * 17 * 2.1. This is your license from Intel Corp. under its intellectual property 18 * rights. You may have additional license terms from the party that provided 19 * you this software, covering your right to use that party's intellectual 20 * property rights. 21 * 22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 23 * copy of the source code appearing in this file ("Covered Code") an 24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 25 * base code distributed originally by Intel ("Original Intel Code") to copy, 26 * make derivatives, distribute, use and display any portion of the Covered 27 * Code in any form, with the right to sublicense such rights; and 28 * 29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 30 * license (with the right to sublicense), under only those claims of Intel 31 * patents that are infringed by the Original Intel Code, to make, use, sell, 32 * offer to sell, and import the Covered Code and derivative works thereof 33 * solely to the minimum extent necessary to exercise the above copyright 34 * license, and in no event shall the patent license extend to any additions 35 * to or modifications of the Original Intel Code. No other license or right 36 * is granted directly or by implication, estoppel or otherwise; 37 * 38 * The above copyright and patent license is granted only if the following 39 * conditions are met: 40 * 41 * 3. Conditions 42 * 43 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 44 * Redistribution of source code of any substantial portion of the Covered 45 * Code or modification with rights to further distribute source must include 46 * the above Copyright Notice, the above License, this list of Conditions, 47 * and the following Disclaimer and Export Compliance provision. In addition, 48 * Licensee must cause all Covered Code to which Licensee contributes to 49 * contain a file documenting the changes Licensee made to create that Covered 50 * Code and the date of any change. Licensee must include in that file the 51 * documentation of any changes made by any predecessor Licensee. Licensee 52 * must include a prominent statement that the modification is derived, 53 * directly or indirectly, from Original Intel Code. 54 * 55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 56 * Redistribution of source code of any substantial portion of the Covered 57 * Code or modification without rights to further distribute source must 58 * include the following Disclaimer and Export Compliance provision in the 59 * documentation and/or other materials provided with distribution. In 60 * addition, Licensee may not authorize further sublicense of source of any 61 * portion of the Covered Code, and must include terms to the effect that the 62 * license from Licensee to its licensee is limited to the intellectual 63 * property embodied in the software Licensee provides to its licensee, and 64 * not to intellectual property embodied in modifications its licensee may 65 * make. 66 * 67 * 3.3. Redistribution of Executable. Redistribution in executable form of any 68 * substantial portion of the Covered Code or modification must reproduce the 69 * above Copyright Notice, and the following Disclaimer and Export Compliance 70 * provision in the documentation and/or other materials provided with the 71 * distribution. 72 * 73 * 3.4. Intel retains all right, title, and interest in and to the Original 74 * Intel Code. 75 * 76 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 77 * Intel shall be used in advertising or otherwise to promote the sale, use or 78 * other dealings in products derived from or relating to the Covered Code 79 * without prior written authorization from Intel. 80 * 81 * 4. Disclaimer and Export Compliance 82 * 83 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 84 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 85 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 86 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 87 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 88 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 89 * PARTICULAR PURPOSE. 90 * 91 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 92 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 93 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 94 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 98 * LIMITED REMEDY. 99 * 100 * 4.3. Licensee shall not export, either directly or indirectly, any of this 101 * software or system incorporating such software without first obtaining any 102 * required license or other approval from the U. S. Department of Commerce or 103 * any other agency or department of the United States Government. In the 104 * event Licensee exports any such software from the United States or 105 * re-exports any such software from a foreign destination, Licensee shall 106 * ensure that the distribution and export/re-export of the software is in 107 * compliance with all laws, regulations, orders, or other restrictions of the 108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 109 * any of its subsidiaries will export/re-export any technical data, process, 110 * software, or service, directly or indirectly, to any country for which the 111 * United States government or any agency thereof requires an export license, 112 * other governmental approval, or letter of assurance, without first obtaining 113 * such license, approval or letter. 114 * 115 *****************************************************************************/ 116 117 118 #include <contrib/dev/acpica/compiler/aslcompiler.h> 119 #include "aslcompiler.y.h" 120 #include <contrib/dev/acpica/include/amlcode.h> 121 #include <contrib/dev/acpica/include/acparser.h> 122 #include <contrib/dev/acpica/include/acnamesp.h> 123 124 #define _COMPONENT ACPI_COMPILER 125 ACPI_MODULE_NAME ("aslisting") 126 127 /* Local prototypes */ 128 129 static void 130 LsDumpAscii ( 131 UINT32 FileId, 132 UINT32 Count, 133 UINT8 *Buffer); 134 135 static void 136 LsDumpAsciiInComment ( 137 UINT32 FileId, 138 UINT32 Count, 139 UINT8 *Buffer); 140 141 static ACPI_STATUS 142 LsAmlListingWalk ( 143 ACPI_PARSE_OBJECT *Op, 144 UINT32 Level, 145 void *Context); 146 147 static void 148 LsGenerateListing ( 149 UINT32 FileId); 150 151 static void 152 LsPushNode ( 153 char *Filename); 154 155 static ASL_LISTING_NODE * 156 LsPopNode ( 157 void); 158 159 static void 160 LsCheckException ( 161 UINT32 LineNumber, 162 UINT32 FileId); 163 164 static void 165 LsFlushListingBuffer ( 166 UINT32 FileId); 167 168 static void 169 LsWriteListingHexBytes ( 170 UINT8 *Buffer, 171 UINT32 Length, 172 UINT32 FileId); 173 174 static UINT32 175 LsWriteOneSourceLine ( 176 UINT32 FileId); 177 178 static void 179 LsFinishSourceListing ( 180 UINT32 FileId); 181 182 static void 183 LsWriteSourceLines ( 184 UINT32 ToLineNumber, 185 UINT32 ToLogicalLineNumber, 186 UINT32 FileId); 187 188 static void 189 LsWriteNodeToListing ( 190 ACPI_PARSE_OBJECT *Op, 191 UINT32 FileId); 192 193 static void 194 LsDoHexOutputC ( 195 void); 196 197 static void 198 LsDoHexOutputAsm ( 199 void); 200 201 static void 202 LsDoHexOutputAsl ( 203 void); 204 205 static ACPI_STATUS 206 LsTreeWriteWalk ( 207 ACPI_PARSE_OBJECT *Op, 208 UINT32 Level, 209 void *Context); 210 211 212 /******************************************************************************* 213 * 214 * FUNCTION: LsTreeWriteWalk 215 * 216 * PARAMETERS: ASL_WALK_CALLBACK 217 * 218 * 219 * RETURN: None. 220 * 221 * DESCRIPTION: Dump entire parse tree, for compiler debug only 222 * 223 ******************************************************************************/ 224 225 static ACPI_STATUS 226 LsTreeWriteWalk ( 227 ACPI_PARSE_OBJECT *Op, 228 UINT32 Level, 229 void *Context) 230 { 231 232 /* Debug output */ 233 234 DbgPrint (ASL_TREE_OUTPUT, 235 "%5.5d [%2d]", Op->Asl.LogicalLineNumber, Level); 236 UtPrintFormattedName (Op->Asl.ParseOpcode, Level); 237 238 239 DbgPrint (ASL_TREE_OUTPUT, "\n"); 240 return (AE_OK); 241 } 242 243 244 void 245 LsDumpParseTree ( 246 void) 247 { 248 249 if (!Gbl_DebugFlag) 250 { 251 return; 252 } 253 254 DbgPrint (ASL_TREE_OUTPUT, "\nOriginal parse tree from parser:\n\n"); 255 TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD, 256 LsTreeWriteWalk, NULL, NULL); 257 } 258 259 260 /******************************************************************************* 261 * 262 * FUNCTION: LsDumpAscii 263 * 264 * PARAMETERS: FileId - ID of current listing file 265 * Count - Number of bytes to convert 266 * Buffer - Buffer of bytes to convert 267 * 268 * RETURN: None. 269 * 270 * DESCRIPTION: Convert hex bytes to ascii 271 * 272 ******************************************************************************/ 273 274 static void 275 LsDumpAscii ( 276 UINT32 FileId, 277 UINT32 Count, 278 UINT8 *Buffer) 279 { 280 UINT8 BufChar; 281 UINT32 i; 282 283 284 FlPrintFile (FileId, " \""); 285 for (i = 0; i < Count; i++) 286 { 287 BufChar = Buffer[i]; 288 if (isprint (BufChar)) 289 { 290 FlPrintFile (FileId, "%c", BufChar); 291 } 292 else 293 { 294 /* Not a printable character, just put out a dot */ 295 296 FlPrintFile (FileId, "."); 297 } 298 } 299 FlPrintFile (FileId, "\""); 300 } 301 302 303 /******************************************************************************* 304 * 305 * FUNCTION: LsDumpAsciiInComment 306 * 307 * PARAMETERS: FileId - ID of current listing file 308 * Count - Number of bytes to convert 309 * Buffer - Buffer of bytes to convert 310 * 311 * RETURN: None. 312 * 313 * DESCRIPTION: Convert hex bytes to ascii 314 * 315 ******************************************************************************/ 316 317 static void 318 LsDumpAsciiInComment ( 319 UINT32 FileId, 320 UINT32 Count, 321 UINT8 *Buffer) 322 { 323 UINT8 BufChar = 0; 324 UINT8 LastChar; 325 UINT32 i; 326 327 328 FlPrintFile (FileId, " \""); 329 for (i = 0; i < Count; i++) 330 { 331 LastChar = BufChar; 332 BufChar = Buffer[i]; 333 334 if (isprint (BufChar)) 335 { 336 /* Handle embedded C comment sequences */ 337 338 if (((LastChar == '*') && (BufChar == '/')) || 339 ((LastChar == '/') && (BufChar == '*'))) 340 { 341 /* Insert a space to break the sequence */ 342 343 FlPrintFile (FileId, ".", BufChar); 344 } 345 346 FlPrintFile (FileId, "%c", BufChar); 347 } 348 else 349 { 350 /* Not a printable character, just put out a dot */ 351 352 FlPrintFile (FileId, "."); 353 } 354 } 355 FlPrintFile (FileId, "\""); 356 } 357 358 359 /******************************************************************************* 360 * 361 * FUNCTION: LsAmlListingWalk 362 * 363 * PARAMETERS: ASL_WALK_CALLBACK 364 * 365 * RETURN: Status 366 * 367 * DESCRIPTION: Process one node during a listing file generation. 368 * 369 ******************************************************************************/ 370 371 static ACPI_STATUS 372 LsAmlListingWalk ( 373 ACPI_PARSE_OBJECT *Op, 374 UINT32 Level, 375 void *Context) 376 { 377 UINT8 FileByte; 378 UINT32 i; 379 UINT32 FileId = (UINT32) ACPI_TO_INTEGER (Context); 380 381 382 LsWriteNodeToListing (Op, FileId); 383 384 if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DATA) 385 { 386 /* Buffer is a resource template, don't dump the data all at once */ 387 388 return (AE_OK); 389 } 390 391 /* Write the hex bytes to the listing file(s) (if requested) */ 392 393 for (i = 0; i < Op->Asl.FinalAmlLength; i++) 394 { 395 if (ACPI_FAILURE (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1))) 396 { 397 FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ); 398 AslAbort (); 399 } 400 LsWriteListingHexBytes (&FileByte, 1, FileId); 401 } 402 403 return (AE_OK); 404 } 405 406 407 /******************************************************************************* 408 * 409 * FUNCTION: LsGenerateListing 410 * 411 * PARAMETERS: FileId - ID of listing file 412 * 413 * RETURN: None 414 * 415 * DESCRIPTION: Generate a listing file. This can be one of the several types 416 * of "listings" supported. 417 * 418 ******************************************************************************/ 419 420 static void 421 LsGenerateListing ( 422 UINT32 FileId) 423 { 424 425 /* Start at the beginning of both the source and AML files */ 426 427 FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0); 428 FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 429 Gbl_SourceLine = 0; 430 Gbl_CurrentHexColumn = 0; 431 LsPushNode (Gbl_Files[ASL_FILE_INPUT].Filename); 432 433 /* Process all parse nodes */ 434 435 TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD, LsAmlListingWalk, 436 NULL, (void *) ACPI_TO_POINTER (FileId)); 437 438 /* Final processing */ 439 440 LsFinishSourceListing (FileId); 441 } 442 443 444 /******************************************************************************* 445 * 446 * FUNCTION: LsDoListings 447 * 448 * PARAMETERS: None. 449 * 450 * RETURN: None 451 * 452 * DESCRIPTION: Generate all requested listing files. 453 * 454 ******************************************************************************/ 455 456 void 457 LsDoListings ( 458 void) 459 { 460 461 if (Gbl_C_OutputFlag) 462 { 463 LsGenerateListing (ASL_FILE_C_SOURCE_OUTPUT); 464 } 465 466 if (Gbl_ListingFlag) 467 { 468 LsGenerateListing (ASL_FILE_LISTING_OUTPUT); 469 } 470 471 if (Gbl_AsmOutputFlag) 472 { 473 LsGenerateListing (ASL_FILE_ASM_SOURCE_OUTPUT); 474 } 475 476 if (Gbl_C_IncludeOutputFlag) 477 { 478 LsGenerateListing (ASL_FILE_C_INCLUDE_OUTPUT); 479 } 480 481 if (Gbl_AsmIncludeOutputFlag) 482 { 483 LsGenerateListing (ASL_FILE_ASM_INCLUDE_OUTPUT); 484 } 485 } 486 487 488 /******************************************************************************* 489 * 490 * FUNCTION: LsPushNode 491 * 492 * PARAMETERS: Filename - Pointer to the include filename 493 * 494 * RETURN: None 495 * 496 * DESCRIPTION: Push a listing node on the listing/include file stack. This 497 * stack enables tracking of include files (infinitely nested) 498 * and resumption of the listing of the parent file when the 499 * include file is finished. 500 * 501 ******************************************************************************/ 502 503 static void 504 LsPushNode ( 505 char *Filename) 506 { 507 ASL_LISTING_NODE *Lnode; 508 509 510 /* Create a new node */ 511 512 Lnode = UtLocalCalloc (sizeof (ASL_LISTING_NODE)); 513 514 /* Initialize */ 515 516 Lnode->Filename = Filename; 517 Lnode->LineNumber = 0; 518 519 /* Link (push) */ 520 521 Lnode->Next = Gbl_ListingNode; 522 Gbl_ListingNode = Lnode; 523 } 524 525 526 /******************************************************************************* 527 * 528 * FUNCTION: LsPopNode 529 * 530 * PARAMETERS: None 531 * 532 * RETURN: List head after current head is popped off 533 * 534 * DESCRIPTION: Pop the current head of the list, free it, and return the 535 * next node on the stack (the new current node). 536 * 537 ******************************************************************************/ 538 539 static ASL_LISTING_NODE * 540 LsPopNode ( 541 void) 542 { 543 ASL_LISTING_NODE *Lnode; 544 545 546 /* Just grab the node at the head of the list */ 547 548 Lnode = Gbl_ListingNode; 549 if ((!Lnode) || 550 (!Lnode->Next)) 551 { 552 AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, NULL, 553 "Could not pop empty listing stack"); 554 return Gbl_ListingNode; 555 } 556 557 Gbl_ListingNode = Lnode->Next; 558 ACPI_FREE (Lnode); 559 560 /* New "Current" node is the new head */ 561 562 return (Gbl_ListingNode); 563 } 564 565 566 /******************************************************************************* 567 * 568 * FUNCTION: LsCheckException 569 * 570 * PARAMETERS: LineNumber - Current logical (cumulative) line # 571 * FileId - ID of output listing file 572 * 573 * RETURN: None 574 * 575 * DESCRIPTION: Check if there is an exception for this line, and if there is, 576 * put it in the listing immediately. Handles multiple errors 577 * per line. Gbl_NextError points to the next error in the 578 * sorted (by line #) list of compile errors/warnings. 579 * 580 ******************************************************************************/ 581 582 static void 583 LsCheckException ( 584 UINT32 LineNumber, 585 UINT32 FileId) 586 { 587 588 if ((!Gbl_NextError) || 589 (LineNumber < Gbl_NextError->LogicalLineNumber )) 590 { 591 return; 592 } 593 594 /* Handle multiple errors per line */ 595 596 if (FileId == ASL_FILE_LISTING_OUTPUT) 597 { 598 while (Gbl_NextError && 599 (LineNumber >= Gbl_NextError->LogicalLineNumber)) 600 { 601 AePrintException (FileId, Gbl_NextError, "\n[****iasl****]\n"); 602 603 Gbl_NextError = Gbl_NextError->Next; 604 } 605 606 FlPrintFile (FileId, "\n"); 607 } 608 } 609 610 611 /******************************************************************************* 612 * 613 * FUNCTION: LsFlushListingBuffer 614 * 615 * PARAMETERS: FileId - ID of the listing file 616 * 617 * RETURN: None 618 * 619 * DESCRIPTION: Flush out the current contents of the 16-byte hex AML code 620 * buffer. Usually called at the termination of a single line 621 * of source code or when the buffer is full. 622 * 623 ******************************************************************************/ 624 625 static void 626 LsFlushListingBuffer ( 627 UINT32 FileId) 628 { 629 UINT32 i; 630 631 632 if (Gbl_CurrentHexColumn == 0) 633 { 634 return; 635 } 636 637 /* Write the hex bytes */ 638 639 switch (FileId) 640 { 641 case ASL_FILE_LISTING_OUTPUT: 642 643 for (i = 0; i < Gbl_CurrentHexColumn; i++) 644 { 645 FlPrintFile (FileId, "%2.2X ", Gbl_AmlBuffer[i]); 646 } 647 648 for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 3); i++) 649 { 650 FlWriteFile (FileId, ".", 1); 651 } 652 653 /* Write the ASCII character associated with each of the bytes */ 654 655 LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer); 656 break; 657 658 659 case ASL_FILE_ASM_SOURCE_OUTPUT: 660 661 for (i = 0; i < Gbl_CurrentHexColumn; i++) 662 { 663 if (i > 0) 664 { 665 FlPrintFile (FileId, ","); 666 } 667 FlPrintFile (FileId, "0%2.2Xh", Gbl_AmlBuffer[i]); 668 } 669 670 for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++) 671 { 672 FlWriteFile (FileId, " ", 1); 673 } 674 675 FlPrintFile (FileId, " ;%8.8X", 676 Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE); 677 678 /* Write the ASCII character associated with each of the bytes */ 679 680 LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer); 681 break; 682 683 684 case ASL_FILE_C_SOURCE_OUTPUT: 685 686 for (i = 0; i < Gbl_CurrentHexColumn; i++) 687 { 688 FlPrintFile (FileId, "0x%2.2X,", Gbl_AmlBuffer[i]); 689 } 690 691 for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++) 692 { 693 FlWriteFile (FileId, " ", 1); 694 } 695 696 FlPrintFile (FileId, " /* %8.8X", 697 Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE); 698 699 /* Write the ASCII character associated with each of the bytes */ 700 701 LsDumpAsciiInComment (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer); 702 FlPrintFile (FileId, " */"); 703 break; 704 705 default: 706 /* No other types supported */ 707 return; 708 } 709 710 FlPrintFile (FileId, "\n"); 711 712 Gbl_CurrentHexColumn = 0; 713 Gbl_HexBytesWereWritten = TRUE; 714 } 715 716 717 /******************************************************************************* 718 * 719 * FUNCTION: LsWriteListingHexBytes 720 * 721 * PARAMETERS: Buffer - AML code buffer 722 * Length - Number of AML bytes to write 723 * FileId - ID of current listing file. 724 * 725 * RETURN: None 726 * 727 * DESCRIPTION: Write the contents of the AML buffer to the listing file via 728 * the listing buffer. The listing buffer is flushed every 16 729 * AML bytes. 730 * 731 ******************************************************************************/ 732 733 static void 734 LsWriteListingHexBytes ( 735 UINT8 *Buffer, 736 UINT32 Length, 737 UINT32 FileId) 738 { 739 UINT32 i; 740 741 742 /* Transfer all requested bytes */ 743 744 for (i = 0; i < Length; i++) 745 { 746 /* Print line header when buffer is empty */ 747 748 if (Gbl_CurrentHexColumn == 0) 749 { 750 if (Gbl_HasIncludeFiles) 751 { 752 FlPrintFile (FileId, "%*s", 10, " "); 753 } 754 755 switch (FileId) 756 { 757 case ASL_FILE_LISTING_OUTPUT: 758 759 FlPrintFile (FileId, "%8.8X....", Gbl_CurrentAmlOffset); 760 break; 761 762 case ASL_FILE_ASM_SOURCE_OUTPUT: 763 764 FlPrintFile (FileId, " db "); 765 break; 766 767 case ASL_FILE_C_SOURCE_OUTPUT: 768 769 FlPrintFile (FileId, " "); 770 break; 771 772 default: 773 /* No other types supported */ 774 return; 775 } 776 } 777 778 /* Transfer AML byte and update counts */ 779 780 Gbl_AmlBuffer[Gbl_CurrentHexColumn] = Buffer[i]; 781 782 Gbl_CurrentHexColumn++; 783 Gbl_CurrentAmlOffset++; 784 785 /* Flush buffer when it is full */ 786 787 if (Gbl_CurrentHexColumn >= HEX_LISTING_LINE_SIZE) 788 { 789 LsFlushListingBuffer (FileId); 790 } 791 } 792 } 793 794 795 /******************************************************************************* 796 * 797 * FUNCTION: LsWriteOneSourceLine 798 * 799 * PARAMETERS: FileID - ID of current listing file 800 * 801 * RETURN: FALSE on EOF (input source file), TRUE otherwise 802 * 803 * DESCRIPTION: Read one line from the input source file and echo it to the 804 * listing file, prefixed with the line number, and if the source 805 * file contains include files, prefixed with the current filename 806 * 807 ******************************************************************************/ 808 809 static UINT32 810 LsWriteOneSourceLine ( 811 UINT32 FileId) 812 { 813 UINT8 FileByte; 814 815 816 Gbl_SourceLine++; 817 Gbl_ListingNode->LineNumber++; 818 819 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 820 { 821 FlPrintFile (FileId, " *"); 822 } 823 if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT) 824 { 825 FlPrintFile (FileId, "; "); 826 } 827 828 if (Gbl_HasIncludeFiles) 829 { 830 /* 831 * This file contains "include" statements, print the current 832 * filename and line number within the current file 833 */ 834 FlPrintFile (FileId, "%12s %5d....", 835 Gbl_ListingNode->Filename, Gbl_ListingNode->LineNumber); 836 } 837 else 838 { 839 /* No include files, just print the line number */ 840 841 FlPrintFile (FileId, "%8d....", Gbl_SourceLine); 842 } 843 844 /* Read one line (up to a newline or EOF) */ 845 846 while (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) == AE_OK) 847 { 848 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 849 { 850 if (FileByte == '/') 851 { 852 FileByte = '*'; 853 } 854 } 855 856 FlWriteFile (FileId, &FileByte, 1); 857 if (FileByte == '\n') 858 { 859 /* 860 * Check if an error occurred on this source line during the compile. 861 * If so, we print the error message after the source line. 862 */ 863 LsCheckException (Gbl_SourceLine, FileId); 864 return (1); 865 } 866 } 867 868 /* EOF on the input file was reached */ 869 870 return (0); 871 } 872 873 874 /******************************************************************************* 875 * 876 * FUNCTION: LsFinishSourceListing 877 * 878 * PARAMETERS: FileId - ID of current listing file. 879 * 880 * RETURN: None 881 * 882 * DESCRIPTION: Cleanup routine for the listing file. Flush the hex AML 883 * listing buffer, and flush out any remaining lines in the 884 * source input file. 885 * 886 ******************************************************************************/ 887 888 static void 889 LsFinishSourceListing ( 890 UINT32 FileId) 891 { 892 893 if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) || 894 (FileId == ASL_FILE_C_INCLUDE_OUTPUT)) 895 { 896 return; 897 } 898 899 LsFlushListingBuffer (FileId); 900 Gbl_CurrentAmlOffset = 0; 901 902 /* Flush any remaining text in the source file */ 903 904 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 905 { 906 FlPrintFile (FileId, " /*\n"); 907 } 908 909 while (LsWriteOneSourceLine (FileId)) 910 { ; } 911 912 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 913 { 914 FlPrintFile (FileId, "\n */\n };\n"); 915 } 916 917 FlPrintFile (FileId, "\n"); 918 919 if (FileId == ASL_FILE_LISTING_OUTPUT) 920 { 921 /* Print a summary of the compile exceptions */ 922 923 FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n"); 924 AePrintErrorLog (FileId); 925 FlPrintFile (FileId, "\n\n"); 926 UtDisplaySummary (FileId); 927 FlPrintFile (FileId, "\n\n"); 928 } 929 } 930 931 932 /******************************************************************************* 933 * 934 * FUNCTION: LsWriteSourceLines 935 * 936 * PARAMETERS: ToLineNumber - 937 * ToLogicalLineNumber - Write up to this source line number 938 * FileId - ID of current listing file 939 * 940 * RETURN: None 941 * 942 * DESCRIPTION: Read then write source lines to the listing file until we have 943 * reached the specified logical (cumulative) line number. This 944 * automatically echos out comment blocks and other non-AML 945 * generating text until we get to the actual AML-generating line 946 * of ASL code specified by the logical line number. 947 * 948 ******************************************************************************/ 949 950 static void 951 LsWriteSourceLines ( 952 UINT32 ToLineNumber, 953 UINT32 ToLogicalLineNumber, 954 UINT32 FileId) 955 { 956 957 if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) || 958 (FileId == ASL_FILE_C_INCLUDE_OUTPUT)) 959 { 960 return; 961 } 962 963 Gbl_CurrentLine = ToLogicalLineNumber; 964 965 /* Flush any hex bytes remaining from the last opcode */ 966 967 LsFlushListingBuffer (FileId); 968 969 /* Read lines and write them as long as we are not caught up */ 970 971 if (Gbl_SourceLine < Gbl_CurrentLine) 972 { 973 /* 974 * If we just completed writing some AML hex bytes, output a linefeed 975 * to add some whitespace for readability. 976 */ 977 if (Gbl_HexBytesWereWritten) 978 { 979 FlPrintFile (FileId, "\n"); 980 Gbl_HexBytesWereWritten = FALSE; 981 } 982 983 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 984 { 985 FlPrintFile (FileId, " /*\n"); 986 } 987 988 /* Write one line at a time until we have reached the target line # */ 989 990 while ((Gbl_SourceLine < Gbl_CurrentLine) && 991 LsWriteOneSourceLine (FileId)) 992 { ; } 993 994 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 995 { 996 FlPrintFile (FileId, " */"); 997 } 998 FlPrintFile (FileId, "\n"); 999 } 1000 } 1001 1002 1003 /******************************************************************************* 1004 * 1005 * FUNCTION: LsWriteNodeToListing 1006 * 1007 * PARAMETERS: Op - Parse node to write to the listing file. 1008 * FileId - ID of current listing file 1009 * 1010 * RETURN: None. 1011 * 1012 * DESCRIPTION: Write "a node" to the listing file. This means to 1013 * 1) Write out all of the source text associated with the node 1014 * 2) Write out all of the AML bytes associated with the node 1015 * 3) Write any compiler exceptions associated with the node 1016 * 1017 ******************************************************************************/ 1018 1019 static void 1020 LsWriteNodeToListing ( 1021 ACPI_PARSE_OBJECT *Op, 1022 UINT32 FileId) 1023 { 1024 const ACPI_OPCODE_INFO *OpInfo; 1025 UINT32 OpClass; 1026 char *Pathname; 1027 UINT32 Length; 1028 UINT32 i; 1029 1030 1031 OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); 1032 OpClass = OpInfo->Class; 1033 1034 /* TBD: clean this up with a single flag that says: 1035 * I start a named output block 1036 */ 1037 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 1038 { 1039 switch (Op->Asl.ParseOpcode) 1040 { 1041 case PARSEOP_DEFINITIONBLOCK: 1042 case PARSEOP_METHODCALL: 1043 case PARSEOP_INCLUDE: 1044 case PARSEOP_INCLUDE_END: 1045 case PARSEOP_DEFAULT_ARG: 1046 1047 break; 1048 1049 default: 1050 switch (OpClass) 1051 { 1052 case AML_CLASS_NAMED_OBJECT: 1053 switch (Op->Asl.AmlOpcode) 1054 { 1055 case AML_SCOPE_OP: 1056 case AML_ALIAS_OP: 1057 break; 1058 1059 default: 1060 if (Op->Asl.ExternalName) 1061 { 1062 LsFlushListingBuffer (FileId); 1063 FlPrintFile (FileId, " };\n"); 1064 } 1065 break; 1066 } 1067 break; 1068 1069 default: 1070 /* Don't care about other objects */ 1071 break; 1072 } 1073 break; 1074 } 1075 } 1076 1077 /* These cases do not have a corresponding AML opcode */ 1078 1079 switch (Op->Asl.ParseOpcode) 1080 { 1081 case PARSEOP_DEFINITIONBLOCK: 1082 1083 LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, FileId); 1084 1085 /* Use the table Signature and TableId to build a unique name */ 1086 1087 if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT) 1088 { 1089 FlPrintFile (FileId, 1090 "%s_%s_Header \\\n", 1091 Gbl_TableSignature, Gbl_TableId); 1092 } 1093 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 1094 { 1095 FlPrintFile (FileId, 1096 " unsigned char %s_%s_Header [] =\n {\n", 1097 Gbl_TableSignature, Gbl_TableId); 1098 } 1099 if (FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) 1100 { 1101 FlPrintFile (FileId, 1102 "extrn %s_%s_Header : byte\n", 1103 Gbl_TableSignature, Gbl_TableId); 1104 } 1105 if (FileId == ASL_FILE_C_INCLUDE_OUTPUT) 1106 { 1107 FlPrintFile (FileId, 1108 "extern unsigned char %s_%s_Header [];\n", 1109 Gbl_TableSignature, Gbl_TableId); 1110 } 1111 return; 1112 1113 1114 case PARSEOP_METHODCALL: 1115 1116 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 1117 FileId); 1118 return; 1119 1120 1121 case PARSEOP_INCLUDE: 1122 1123 /* Flush everything up to and including the include source line */ 1124 1125 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 1126 FileId); 1127 1128 /* Create a new listing node and push it */ 1129 1130 LsPushNode (Op->Asl.Child->Asl.Value.String); 1131 return; 1132 1133 1134 case PARSEOP_INCLUDE_END: 1135 1136 /* Flush out the rest of the include file */ 1137 1138 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 1139 FileId); 1140 1141 /* Pop off this listing node and go back to the parent file */ 1142 1143 (void) LsPopNode (); 1144 return; 1145 1146 1147 case PARSEOP_DEFAULT_ARG: 1148 1149 if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 1150 { 1151 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.EndLogicalLine, 1152 FileId); 1153 } 1154 return; 1155 1156 1157 default: 1158 /* All other opcodes have an AML opcode */ 1159 break; 1160 } 1161 1162 /* 1163 * Otherwise, we look at the AML opcode because we can 1164 * switch on the opcode type, getting an entire class 1165 * at once 1166 */ 1167 switch (OpClass) 1168 { 1169 case AML_CLASS_ARGUMENT: /* argument type only */ 1170 case AML_CLASS_INTERNAL: 1171 1172 break; 1173 1174 1175 case AML_CLASS_NAMED_OBJECT: 1176 1177 switch (Op->Asl.AmlOpcode) 1178 { 1179 case AML_FIELD_OP: 1180 case AML_INDEX_FIELD_OP: 1181 case AML_BANK_FIELD_OP: 1182 1183 /* 1184 * For fields, we want to dump all the AML after the 1185 * entire definition 1186 */ 1187 LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, 1188 FileId); 1189 break; 1190 1191 case AML_NAME_OP: 1192 1193 if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 1194 { 1195 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 1196 FileId); 1197 } 1198 else 1199 { 1200 /* 1201 * For fields, we want to dump all the AML after the 1202 * entire definition 1203 */ 1204 LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, 1205 FileId); 1206 } 1207 break; 1208 1209 default: 1210 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 1211 FileId); 1212 break; 1213 } 1214 1215 switch (Op->Asl.AmlOpcode) 1216 { 1217 case AML_SCOPE_OP: 1218 case AML_ALIAS_OP: 1219 1220 /* These opcodes do not declare a new object, ignore them */ 1221 1222 break; 1223 1224 default: 1225 1226 /* All other named object opcodes come here */ 1227 1228 switch (FileId) 1229 { 1230 case ASL_FILE_ASM_SOURCE_OUTPUT: 1231 case ASL_FILE_C_SOURCE_OUTPUT: 1232 case ASL_FILE_ASM_INCLUDE_OUTPUT: 1233 case ASL_FILE_C_INCLUDE_OUTPUT: 1234 1235 /* 1236 * For named objects, we will create a valid symbol so that the 1237 * AML code can be referenced from C or ASM 1238 */ 1239 if (Op->Asl.ExternalName) 1240 { 1241 /* Get the full pathname associated with this node */ 1242 1243 Pathname = AcpiNsGetExternalPathname (Op->Asl.Node); 1244 Length = strlen (Pathname); 1245 if (Length >= 4) 1246 { 1247 /* Convert all dots in the path to underscores */ 1248 1249 for (i = 0; i < Length; i++) 1250 { 1251 if (Pathname[i] == '.') 1252 { 1253 Pathname[i] = '_'; 1254 } 1255 } 1256 1257 /* Create the appropriate symbol in the output file */ 1258 1259 if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT) 1260 { 1261 FlPrintFile (FileId, 1262 "%s_%s_%s \\\n", 1263 Gbl_TableSignature, Gbl_TableId, &Pathname[1]); 1264 } 1265 if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 1266 { 1267 FlPrintFile (FileId, 1268 " unsigned char %s_%s_%s [] =\n {\n", 1269 Gbl_TableSignature, Gbl_TableId, &Pathname[1]); 1270 } 1271 if (FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) 1272 { 1273 FlPrintFile (FileId, 1274 "extrn %s_%s_%s : byte\n", 1275 Gbl_TableSignature, Gbl_TableId, &Pathname[1]); 1276 } 1277 if (FileId == ASL_FILE_C_INCLUDE_OUTPUT) 1278 { 1279 FlPrintFile (FileId, 1280 "extern unsigned char %s_%s_%s [];\n", 1281 Gbl_TableSignature, Gbl_TableId, &Pathname[1]); 1282 } 1283 } 1284 ACPI_FREE (Pathname); 1285 } 1286 break; 1287 1288 default: 1289 /* Nothing to do for listing file */ 1290 break; 1291 } 1292 } 1293 break; 1294 1295 case AML_CLASS_EXECUTE: 1296 case AML_CLASS_CREATE: 1297 default: 1298 1299 if ((Op->Asl.ParseOpcode == PARSEOP_BUFFER) && 1300 (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)) 1301 { 1302 return; 1303 } 1304 1305 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, 1306 FileId); 1307 break; 1308 1309 case AML_CLASS_UNKNOWN: 1310 break; 1311 } 1312 } 1313 1314 1315 /******************************************************************************* 1316 * 1317 * FUNCTION: LsDoHexOutput 1318 * 1319 * PARAMETERS: None 1320 * 1321 * RETURN: None. 1322 * 1323 * DESCRIPTION: Create the hex output file. 1324 * 1325 ******************************************************************************/ 1326 1327 void 1328 LsDoHexOutput ( 1329 void) 1330 { 1331 1332 switch (Gbl_HexOutputFlag) 1333 { 1334 case HEX_OUTPUT_C: 1335 1336 LsDoHexOutputC (); 1337 break; 1338 1339 case HEX_OUTPUT_ASM: 1340 1341 LsDoHexOutputAsm (); 1342 break; 1343 1344 case HEX_OUTPUT_ASL: 1345 1346 LsDoHexOutputAsl (); 1347 break; 1348 1349 default: 1350 /* No other output types supported */ 1351 break; 1352 } 1353 } 1354 1355 1356 /******************************************************************************* 1357 * 1358 * FUNCTION: LsDoHexOutputC 1359 * 1360 * PARAMETERS: None 1361 * 1362 * RETURN: None. 1363 * 1364 * DESCRIPTION: Create the hex output file. This is the same data as the AML 1365 * output file, but formatted into hex/ascii bytes suitable for 1366 * inclusion into a C source file. 1367 * 1368 ******************************************************************************/ 1369 1370 static void 1371 LsDoHexOutputC ( 1372 void) 1373 { 1374 UINT8 FileData[HEX_TABLE_LINE_SIZE]; 1375 UINT32 LineLength; 1376 UINT32 Offset = 0; 1377 UINT32 AmlFileSize; 1378 UINT32 i; 1379 1380 1381 /* Get AML size, seek back to start */ 1382 1383 AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT); 1384 1385 FlPrintFile (ASL_FILE_HEX_OUTPUT, " * C source code output\n"); 1386 FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n", 1387 AmlFileSize); 1388 FlPrintFile (ASL_FILE_HEX_OUTPUT, "unsigned char AmlCode[] =\n{\n"); 1389 1390 while (Offset < AmlFileSize) 1391 { 1392 /* Read enough bytes needed for one output line */ 1393 1394 LineLength = fread (FileData, 1, HEX_TABLE_LINE_SIZE, 1395 Gbl_Files[ASL_FILE_AML_OUTPUT].Handle); 1396 if (!LineLength) 1397 { 1398 break; 1399 } 1400 1401 FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 1402 1403 for (i = 0; i < LineLength; i++) 1404 { 1405 /* 1406 * Print each hex byte. 1407 * Add a comma until the very last byte of the AML file 1408 * (Some C compilers complain about a trailing comma) 1409 */ 1410 FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]); 1411 if ((Offset + i + 1) < AmlFileSize) 1412 { 1413 FlPrintFile (ASL_FILE_HEX_OUTPUT, ","); 1414 } 1415 else 1416 { 1417 FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 1418 } 1419 } 1420 1421 /* Add fill spaces if needed for last line */ 1422 1423 if (LineLength < HEX_TABLE_LINE_SIZE) 1424 { 1425 FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s", 1426 5 * (HEX_TABLE_LINE_SIZE - LineLength), " "); 1427 } 1428 1429 /* Emit the offset and ascii dump for the entire line */ 1430 1431 FlPrintFile (ASL_FILE_HEX_OUTPUT, " /* %8.8X", Offset); 1432 LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData); 1433 FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n", 1434 HEX_TABLE_LINE_SIZE - LineLength + 1, " "); 1435 1436 Offset += LineLength; 1437 } 1438 1439 FlPrintFile (ASL_FILE_HEX_OUTPUT, "};\n"); 1440 FlCloseFile (ASL_FILE_HEX_OUTPUT); 1441 } 1442 1443 1444 /******************************************************************************* 1445 * 1446 * FUNCTION: LsDoHexOutputAsl 1447 * 1448 * PARAMETERS: None 1449 * 1450 * RETURN: None. 1451 * 1452 * DESCRIPTION: Create the hex output file. This is the same data as the AML 1453 * output file, but formatted into hex/ascii bytes suitable for 1454 * inclusion into a C source file. 1455 * 1456 ******************************************************************************/ 1457 1458 static void 1459 LsDoHexOutputAsl ( 1460 void) 1461 { 1462 UINT8 FileData[HEX_TABLE_LINE_SIZE]; 1463 UINT32 LineLength; 1464 UINT32 Offset = 0; 1465 UINT32 AmlFileSize; 1466 UINT32 i; 1467 1468 1469 /* Get AML size, seek back to start */ 1470 1471 AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT); 1472 1473 FlPrintFile (ASL_FILE_HEX_OUTPUT, " * ASL source code output\n"); 1474 FlPrintFile (ASL_FILE_HEX_OUTPUT, " * AML code block contains 0x%X bytes\n *\n */\n", 1475 AmlFileSize); 1476 FlPrintFile (ASL_FILE_HEX_OUTPUT, " Name (BUF1, Buffer()\n {\n"); 1477 1478 while (Offset < AmlFileSize) 1479 { 1480 /* Read enough bytes needed for one output line */ 1481 1482 LineLength = fread (FileData, 1, HEX_TABLE_LINE_SIZE, 1483 Gbl_Files[ASL_FILE_AML_OUTPUT].Handle); 1484 if (!LineLength) 1485 { 1486 break; 1487 } 1488 1489 FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 1490 1491 for (i = 0; i < LineLength; i++) 1492 { 1493 /* 1494 * Print each hex byte. 1495 * Add a comma until the very last byte of the AML file 1496 * (Some C compilers complain about a trailing comma) 1497 */ 1498 FlPrintFile (ASL_FILE_HEX_OUTPUT, "0x%2.2X", FileData[i]); 1499 if ((Offset + i + 1) < AmlFileSize) 1500 { 1501 FlPrintFile (ASL_FILE_HEX_OUTPUT, ","); 1502 } 1503 else 1504 { 1505 FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 1506 } 1507 } 1508 1509 /* Add fill spaces if needed for last line */ 1510 1511 if (LineLength < HEX_TABLE_LINE_SIZE) 1512 { 1513 FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s", 1514 5 * (HEX_TABLE_LINE_SIZE - LineLength), " "); 1515 } 1516 1517 /* Emit the offset and ascii dump for the entire line */ 1518 1519 FlPrintFile (ASL_FILE_HEX_OUTPUT, " /* %8.8X", Offset); 1520 LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData); 1521 FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s*/\n", 1522 HEX_TABLE_LINE_SIZE - LineLength + 1, " "); 1523 1524 Offset += LineLength; 1525 } 1526 1527 FlPrintFile (ASL_FILE_HEX_OUTPUT, " })\n"); 1528 FlCloseFile (ASL_FILE_HEX_OUTPUT); 1529 } 1530 1531 1532 /******************************************************************************* 1533 * 1534 * FUNCTION: LsDoHexOutputAsm 1535 * 1536 * PARAMETERS: None 1537 * 1538 * RETURN: None. 1539 * 1540 * DESCRIPTION: Create the hex output file. This is the same data as the AML 1541 * output file, but formatted into hex/ascii bytes suitable for 1542 * inclusion into a ASM source file. 1543 * 1544 ******************************************************************************/ 1545 1546 static void 1547 LsDoHexOutputAsm ( 1548 void) 1549 { 1550 UINT8 FileData[HEX_TABLE_LINE_SIZE]; 1551 UINT32 LineLength; 1552 UINT32 Offset = 0; 1553 UINT32 AmlFileSize; 1554 UINT32 i; 1555 1556 1557 /* Get AML size, seek back to start */ 1558 1559 AmlFileSize = FlGetFileSize (ASL_FILE_AML_OUTPUT); 1560 1561 FlPrintFile (ASL_FILE_HEX_OUTPUT, "; Assembly code source output\n"); 1562 FlPrintFile (ASL_FILE_HEX_OUTPUT, "; AML code block contains 0x%X bytes\n;\n", 1563 AmlFileSize); 1564 1565 while (Offset < AmlFileSize) 1566 { 1567 /* Read enough bytes needed for one output line */ 1568 1569 LineLength = fread (FileData, 1, HEX_TABLE_LINE_SIZE, 1570 Gbl_Files[ASL_FILE_AML_OUTPUT].Handle); 1571 if (!LineLength) 1572 { 1573 break; 1574 } 1575 1576 FlPrintFile (ASL_FILE_HEX_OUTPUT, " db "); 1577 1578 for (i = 0; i < LineLength; i++) 1579 { 1580 /* 1581 * Print each hex byte. 1582 * Add a comma until the last byte of the line 1583 */ 1584 FlPrintFile (ASL_FILE_HEX_OUTPUT, "0%2.2Xh", FileData[i]); 1585 if ((i + 1) < LineLength) 1586 { 1587 FlPrintFile (ASL_FILE_HEX_OUTPUT, ","); 1588 } 1589 } 1590 1591 FlPrintFile (ASL_FILE_HEX_OUTPUT, " "); 1592 1593 /* Add fill spaces if needed for last line */ 1594 1595 if (LineLength < HEX_TABLE_LINE_SIZE) 1596 { 1597 FlPrintFile (ASL_FILE_HEX_OUTPUT, "%*s", 1598 5 * (HEX_TABLE_LINE_SIZE - LineLength), " "); 1599 } 1600 1601 /* Emit the offset and ascii dump for the entire line */ 1602 1603 FlPrintFile (ASL_FILE_HEX_OUTPUT, " ; %8.8X", Offset); 1604 LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT, LineLength, FileData); 1605 FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n"); 1606 1607 Offset += LineLength; 1608 } 1609 1610 FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n"); 1611 FlCloseFile (ASL_FILE_HEX_OUTPUT); 1612 } 1613 1614 1615