asllistsup.c revision 249112
1249109Sjkim/****************************************************************************** 2249109Sjkim * 3249109Sjkim * Module Name: asllistsup - Listing file support utilities 4249109Sjkim * 5249109Sjkim *****************************************************************************/ 6249109Sjkim 7249109Sjkim/* 8249109Sjkim * Copyright (C) 2000 - 2013, Intel Corp. 9249109Sjkim * All rights reserved. 10249109Sjkim * 11249109Sjkim * Redistribution and use in source and binary forms, with or without 12249109Sjkim * modification, are permitted provided that the following conditions 13249109Sjkim * are met: 14249109Sjkim * 1. Redistributions of source code must retain the above copyright 15249109Sjkim * notice, this list of conditions, and the following disclaimer, 16249109Sjkim * without modification. 17249109Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18249109Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19249109Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20249109Sjkim * including a substantially similar Disclaimer requirement for further 21249109Sjkim * binary redistribution. 22249109Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23249109Sjkim * of any contributors may be used to endorse or promote products derived 24249109Sjkim * from this software without specific prior written permission. 25249109Sjkim * 26249109Sjkim * Alternatively, this software may be distributed under the terms of the 27249109Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28249109Sjkim * Software Foundation. 29249109Sjkim * 30249109Sjkim * NO WARRANTY 31249109Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32249109Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33249109Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34249109Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35249109Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36249109Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37249109Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38249109Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39249109Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40249109Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41249109Sjkim * POSSIBILITY OF SUCH DAMAGES. 42249109Sjkim */ 43249109Sjkim 44249112Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 45249109Sjkim#include "aslcompiler.y.h" 46249109Sjkim 47249109Sjkim 48249109Sjkim#define _COMPONENT ACPI_COMPILER 49249109Sjkim ACPI_MODULE_NAME ("aslistsup") 50249109Sjkim 51249109Sjkim 52249109Sjkim/******************************************************************************* 53249109Sjkim * 54249109Sjkim * FUNCTION: LsDumpAscii 55249109Sjkim * 56249109Sjkim * PARAMETERS: FileId - ID of current listing file 57249109Sjkim * Count - Number of bytes to convert 58249109Sjkim * Buffer - Buffer of bytes to convert 59249109Sjkim * 60249109Sjkim * RETURN: None 61249109Sjkim * 62249109Sjkim * DESCRIPTION: Convert hex bytes to ascii 63249109Sjkim * 64249109Sjkim ******************************************************************************/ 65249109Sjkim 66249109Sjkimvoid 67249109SjkimLsDumpAscii ( 68249109Sjkim UINT32 FileId, 69249109Sjkim UINT32 Count, 70249109Sjkim UINT8 *Buffer) 71249109Sjkim{ 72249109Sjkim UINT8 BufChar; 73249109Sjkim UINT32 i; 74249109Sjkim 75249109Sjkim 76249109Sjkim FlPrintFile (FileId, " \""); 77249109Sjkim for (i = 0; i < Count; i++) 78249109Sjkim { 79249109Sjkim BufChar = Buffer[i]; 80249109Sjkim if (isprint (BufChar)) 81249109Sjkim { 82249109Sjkim FlPrintFile (FileId, "%c", BufChar); 83249109Sjkim } 84249109Sjkim else 85249109Sjkim { 86249109Sjkim /* Not a printable character, just put out a dot */ 87249109Sjkim 88249109Sjkim FlPrintFile (FileId, "."); 89249109Sjkim } 90249109Sjkim } 91249109Sjkim FlPrintFile (FileId, "\""); 92249109Sjkim} 93249109Sjkim 94249109Sjkim 95249109Sjkim/******************************************************************************* 96249109Sjkim * 97249109Sjkim * FUNCTION: LsDumpAsciiInComment 98249109Sjkim * 99249109Sjkim * PARAMETERS: FileId - ID of current listing file 100249109Sjkim * Count - Number of bytes to convert 101249109Sjkim * Buffer - Buffer of bytes to convert 102249109Sjkim * 103249109Sjkim * RETURN: None 104249109Sjkim * 105249109Sjkim * DESCRIPTION: Convert hex bytes to ascii 106249109Sjkim * 107249109Sjkim ******************************************************************************/ 108249109Sjkim 109249109Sjkimvoid 110249109SjkimLsDumpAsciiInComment ( 111249109Sjkim UINT32 FileId, 112249109Sjkim UINT32 Count, 113249109Sjkim UINT8 *Buffer) 114249109Sjkim{ 115249109Sjkim UINT8 BufChar = 0; 116249109Sjkim UINT8 LastChar; 117249109Sjkim UINT32 i; 118249109Sjkim 119249109Sjkim 120249109Sjkim FlPrintFile (FileId, " \""); 121249109Sjkim for (i = 0; i < Count; i++) 122249109Sjkim { 123249109Sjkim LastChar = BufChar; 124249109Sjkim BufChar = Buffer[i]; 125249109Sjkim 126249109Sjkim if (isprint (BufChar)) 127249109Sjkim { 128249109Sjkim /* Handle embedded C comment sequences */ 129249109Sjkim 130249109Sjkim if (((LastChar == '*') && (BufChar == '/')) || 131249109Sjkim ((LastChar == '/') && (BufChar == '*'))) 132249109Sjkim { 133249109Sjkim /* Insert a space to break the sequence */ 134249109Sjkim 135249109Sjkim FlPrintFile (FileId, ".", BufChar); 136249109Sjkim } 137249109Sjkim 138249109Sjkim FlPrintFile (FileId, "%c", BufChar); 139249109Sjkim } 140249109Sjkim else 141249109Sjkim { 142249109Sjkim /* Not a printable character, just put out a dot */ 143249109Sjkim 144249109Sjkim FlPrintFile (FileId, "."); 145249109Sjkim } 146249109Sjkim } 147249109Sjkim 148249109Sjkim FlPrintFile (FileId, "\""); 149249109Sjkim} 150249109Sjkim 151249109Sjkim 152249109Sjkim/******************************************************************************* 153249109Sjkim * 154249109Sjkim * FUNCTION: LsCheckException 155249109Sjkim * 156249109Sjkim * PARAMETERS: LineNumber - Current logical (cumulative) line # 157249109Sjkim * FileId - ID of output listing file 158249109Sjkim * 159249109Sjkim * RETURN: None 160249109Sjkim * 161249109Sjkim * DESCRIPTION: Check if there is an exception for this line, and if there is, 162249109Sjkim * put it in the listing immediately. Handles multiple errors 163249109Sjkim * per line. Gbl_NextError points to the next error in the 164249109Sjkim * sorted (by line #) list of compile errors/warnings. 165249109Sjkim * 166249109Sjkim ******************************************************************************/ 167249109Sjkim 168249109Sjkimvoid 169249109SjkimLsCheckException ( 170249109Sjkim UINT32 LineNumber, 171249109Sjkim UINT32 FileId) 172249109Sjkim{ 173249109Sjkim 174249109Sjkim if ((!Gbl_NextError) || 175249109Sjkim (LineNumber < Gbl_NextError->LogicalLineNumber )) 176249109Sjkim { 177249109Sjkim return; 178249109Sjkim } 179249109Sjkim 180249109Sjkim /* Handle multiple errors per line */ 181249109Sjkim 182249109Sjkim if (FileId == ASL_FILE_LISTING_OUTPUT) 183249109Sjkim { 184249109Sjkim while (Gbl_NextError && 185249109Sjkim (LineNumber >= Gbl_NextError->LogicalLineNumber)) 186249109Sjkim { 187249109Sjkim AePrintException (FileId, Gbl_NextError, "\n[****iasl****]\n"); 188249109Sjkim 189249109Sjkim Gbl_NextError = Gbl_NextError->Next; 190249109Sjkim } 191249109Sjkim 192249109Sjkim FlPrintFile (FileId, "\n"); 193249109Sjkim } 194249109Sjkim} 195249109Sjkim 196249109Sjkim 197249109Sjkim/******************************************************************************* 198249109Sjkim * 199249109Sjkim * FUNCTION: LsWriteListingHexBytes 200249109Sjkim * 201249109Sjkim * PARAMETERS: Buffer - AML code buffer 202249109Sjkim * Length - Number of AML bytes to write 203249109Sjkim * FileId - ID of current listing file. 204249109Sjkim * 205249109Sjkim * RETURN: None 206249109Sjkim * 207249109Sjkim * DESCRIPTION: Write the contents of the AML buffer to the listing file via 208249109Sjkim * the listing buffer. The listing buffer is flushed every 16 209249109Sjkim * AML bytes. 210249109Sjkim * 211249109Sjkim ******************************************************************************/ 212249109Sjkim 213249109Sjkimvoid 214249109SjkimLsWriteListingHexBytes ( 215249109Sjkim UINT8 *Buffer, 216249109Sjkim UINT32 Length, 217249109Sjkim UINT32 FileId) 218249109Sjkim{ 219249109Sjkim UINT32 i; 220249109Sjkim 221249109Sjkim 222249109Sjkim /* Transfer all requested bytes */ 223249109Sjkim 224249109Sjkim for (i = 0; i < Length; i++) 225249109Sjkim { 226249109Sjkim /* Print line header when buffer is empty */ 227249109Sjkim 228249109Sjkim if (Gbl_CurrentHexColumn == 0) 229249109Sjkim { 230249109Sjkim if (Gbl_HasIncludeFiles) 231249109Sjkim { 232249109Sjkim FlPrintFile (FileId, "%*s", 10, " "); 233249109Sjkim } 234249109Sjkim 235249109Sjkim switch (FileId) 236249109Sjkim { 237249109Sjkim case ASL_FILE_LISTING_OUTPUT: 238249109Sjkim 239249109Sjkim FlPrintFile (FileId, "%8.8X%s", Gbl_CurrentAmlOffset, 240249109Sjkim ASL_LISTING_LINE_PREFIX); 241249109Sjkim break; 242249109Sjkim 243249109Sjkim case ASL_FILE_ASM_SOURCE_OUTPUT: 244249109Sjkim 245249109Sjkim FlPrintFile (FileId, " db "); 246249109Sjkim break; 247249109Sjkim 248249109Sjkim case ASL_FILE_C_SOURCE_OUTPUT: 249249109Sjkim 250249109Sjkim FlPrintFile (FileId, " "); 251249109Sjkim break; 252249109Sjkim 253249109Sjkim default: 254249109Sjkim /* No other types supported */ 255249109Sjkim return; 256249109Sjkim } 257249109Sjkim } 258249109Sjkim 259249109Sjkim /* Transfer AML byte and update counts */ 260249109Sjkim 261249109Sjkim Gbl_AmlBuffer[Gbl_CurrentHexColumn] = Buffer[i]; 262249109Sjkim 263249109Sjkim Gbl_CurrentHexColumn++; 264249109Sjkim Gbl_CurrentAmlOffset++; 265249109Sjkim 266249109Sjkim /* Flush buffer when it is full */ 267249109Sjkim 268249109Sjkim if (Gbl_CurrentHexColumn >= HEX_LISTING_LINE_SIZE) 269249109Sjkim { 270249109Sjkim LsFlushListingBuffer (FileId); 271249109Sjkim } 272249109Sjkim } 273249109Sjkim} 274249109Sjkim 275249109Sjkim 276249109Sjkim/******************************************************************************* 277249109Sjkim * 278249109Sjkim * FUNCTION: LsWriteSourceLines 279249109Sjkim * 280249109Sjkim * PARAMETERS: ToLineNumber - 281249109Sjkim * ToLogicalLineNumber - Write up to this source line number 282249109Sjkim * FileId - ID of current listing file 283249109Sjkim * 284249109Sjkim * RETURN: None 285249109Sjkim * 286249109Sjkim * DESCRIPTION: Read then write source lines to the listing file until we have 287249109Sjkim * reached the specified logical (cumulative) line number. This 288249109Sjkim * automatically echos out comment blocks and other non-AML 289249109Sjkim * generating text until we get to the actual AML-generating line 290249109Sjkim * of ASL code specified by the logical line number. 291249109Sjkim * 292249109Sjkim ******************************************************************************/ 293249109Sjkim 294249109Sjkimvoid 295249109SjkimLsWriteSourceLines ( 296249109Sjkim UINT32 ToLineNumber, 297249109Sjkim UINT32 ToLogicalLineNumber, 298249109Sjkim UINT32 FileId) 299249109Sjkim{ 300249109Sjkim 301249109Sjkim /* Nothing to do for these file types */ 302249109Sjkim 303249109Sjkim if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) || 304249109Sjkim (FileId == ASL_FILE_C_INCLUDE_OUTPUT)) 305249109Sjkim { 306249109Sjkim return; 307249109Sjkim } 308249109Sjkim 309249109Sjkim Gbl_CurrentLine = ToLogicalLineNumber; 310249109Sjkim 311249109Sjkim /* Flush any hex bytes remaining from the last opcode */ 312249109Sjkim 313249109Sjkim LsFlushListingBuffer (FileId); 314249109Sjkim 315249109Sjkim /* Read lines and write them as long as we are not caught up */ 316249109Sjkim 317249109Sjkim if (Gbl_SourceLine < Gbl_CurrentLine) 318249109Sjkim { 319249109Sjkim /* 320249109Sjkim * If we just completed writing some AML hex bytes, output a linefeed 321249109Sjkim * to add some whitespace for readability. 322249109Sjkim */ 323249109Sjkim if (Gbl_HexBytesWereWritten) 324249109Sjkim { 325249109Sjkim FlPrintFile (FileId, "\n"); 326249109Sjkim Gbl_HexBytesWereWritten = FALSE; 327249109Sjkim } 328249109Sjkim 329249109Sjkim if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 330249109Sjkim { 331249109Sjkim FlPrintFile (FileId, " /*\n"); 332249109Sjkim } 333249109Sjkim 334249109Sjkim /* Write one line at a time until we have reached the target line # */ 335249109Sjkim 336249109Sjkim while ((Gbl_SourceLine < Gbl_CurrentLine) && 337249109Sjkim LsWriteOneSourceLine (FileId)) 338249109Sjkim { ; } 339249109Sjkim 340249109Sjkim if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 341249109Sjkim { 342249109Sjkim FlPrintFile (FileId, " */"); 343249109Sjkim } 344249109Sjkim 345249109Sjkim FlPrintFile (FileId, "\n"); 346249109Sjkim } 347249109Sjkim} 348249109Sjkim 349249109Sjkim 350249109Sjkim/******************************************************************************* 351249109Sjkim * 352249109Sjkim * FUNCTION: LsWriteOneSourceLine 353249109Sjkim * 354249109Sjkim * PARAMETERS: FileId - ID of current listing file 355249109Sjkim * 356249109Sjkim * RETURN: FALSE on EOF (input source file), TRUE otherwise 357249109Sjkim * 358249109Sjkim * DESCRIPTION: Read one line from the input source file and echo it to the 359249109Sjkim * listing file, prefixed with the line number, and if the source 360249109Sjkim * file contains include files, prefixed with the current filename 361249109Sjkim * 362249109Sjkim ******************************************************************************/ 363249109Sjkim 364249109SjkimUINT32 365249109SjkimLsWriteOneSourceLine ( 366249109Sjkim UINT32 FileId) 367249109Sjkim{ 368249109Sjkim UINT8 FileByte; 369249109Sjkim UINT32 Column = 0; 370249109Sjkim UINT32 Index = 16; 371249109Sjkim BOOLEAN StartOfLine = FALSE; 372249109Sjkim BOOLEAN ProcessLongLine = FALSE; 373249109Sjkim 374249109Sjkim 375249109Sjkim Gbl_SourceLine++; 376249109Sjkim Gbl_ListingNode->LineNumber++; 377249109Sjkim 378249109Sjkim /* Ignore lines that are completely blank (but count the line above) */ 379249109Sjkim 380249109Sjkim if (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) != AE_OK) 381249109Sjkim { 382249109Sjkim return (0); 383249109Sjkim } 384249109Sjkim if (FileByte == '\n') 385249109Sjkim { 386249109Sjkim return (1); 387249109Sjkim } 388249109Sjkim 389249109Sjkim /* 390249109Sjkim * This is a non-empty line, we will print the entire line with 391249109Sjkim * the line number and possibly other prefixes and transforms. 392249109Sjkim */ 393249109Sjkim 394249109Sjkim /* Line prefixes for special files, C and ASM output */ 395249109Sjkim 396249109Sjkim if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 397249109Sjkim { 398249109Sjkim FlPrintFile (FileId, " *"); 399249109Sjkim } 400249109Sjkim if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT) 401249109Sjkim { 402249109Sjkim FlPrintFile (FileId, "; "); 403249109Sjkim } 404249109Sjkim 405249109Sjkim if (Gbl_HasIncludeFiles) 406249109Sjkim { 407249109Sjkim /* 408249109Sjkim * This file contains "include" statements, print the current 409249109Sjkim * filename and line number within the current file 410249109Sjkim */ 411249109Sjkim FlPrintFile (FileId, "%12s %5d%s", 412249109Sjkim Gbl_ListingNode->Filename, Gbl_ListingNode->LineNumber, 413249109Sjkim ASL_LISTING_LINE_PREFIX); 414249109Sjkim } 415249109Sjkim else 416249109Sjkim { 417249109Sjkim /* No include files, just print the line number */ 418249109Sjkim 419249109Sjkim FlPrintFile (FileId, "%8u%s", Gbl_SourceLine, 420249109Sjkim ASL_LISTING_LINE_PREFIX); 421249109Sjkim } 422249109Sjkim 423249109Sjkim /* Read the rest of this line (up to a newline or EOF) */ 424249109Sjkim 425249109Sjkim do 426249109Sjkim { 427249109Sjkim if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 428249109Sjkim { 429249109Sjkim if (FileByte == '/') 430249109Sjkim { 431249109Sjkim FileByte = '*'; 432249109Sjkim } 433249109Sjkim } 434249109Sjkim 435249109Sjkim /* Split long input lines for readability in the listing */ 436249109Sjkim 437249109Sjkim Column++; 438249109Sjkim if (Column >= 128) 439249109Sjkim { 440249109Sjkim if (!ProcessLongLine) 441249109Sjkim { 442249109Sjkim if ((FileByte != '}') && 443249109Sjkim (FileByte != '{')) 444249109Sjkim { 445249109Sjkim goto WriteByte; 446249109Sjkim } 447249109Sjkim 448249109Sjkim ProcessLongLine = TRUE; 449249109Sjkim } 450249109Sjkim 451249109Sjkim if (FileByte == '{') 452249109Sjkim { 453249109Sjkim FlPrintFile (FileId, "\n%*s{\n", Index, " "); 454249109Sjkim StartOfLine = TRUE; 455249109Sjkim Index += 4; 456249109Sjkim continue; 457249109Sjkim } 458249109Sjkim 459249109Sjkim else if (FileByte == '}') 460249109Sjkim { 461249109Sjkim if (!StartOfLine) 462249109Sjkim { 463249109Sjkim FlPrintFile (FileId, "\n"); 464249109Sjkim } 465249109Sjkim 466249109Sjkim StartOfLine = TRUE; 467249109Sjkim Index -= 4; 468249109Sjkim FlPrintFile (FileId, "%*s}\n", Index, " "); 469249109Sjkim continue; 470249109Sjkim } 471249109Sjkim 472249109Sjkim /* Ignore spaces/tabs at the start of line */ 473249109Sjkim 474249109Sjkim else if ((FileByte == ' ') && StartOfLine) 475249109Sjkim { 476249109Sjkim continue; 477249109Sjkim } 478249109Sjkim 479249109Sjkim else if (StartOfLine) 480249109Sjkim { 481249109Sjkim StartOfLine = FALSE; 482249109Sjkim FlPrintFile (FileId, "%*s", Index, " "); 483249109Sjkim } 484249109Sjkim 485249109SjkimWriteByte: 486249109Sjkim FlWriteFile (FileId, &FileByte, 1); 487249109Sjkim if (FileByte == '\n') 488249109Sjkim { 489249109Sjkim /* 490249109Sjkim * This line has been completed. 491249109Sjkim * Check if an error occurred on this source line during the compile. 492249109Sjkim * If so, we print the error message after the source line. 493249109Sjkim */ 494249109Sjkim LsCheckException (Gbl_SourceLine, FileId); 495249109Sjkim return (1); 496249109Sjkim } 497249109Sjkim } 498249109Sjkim else 499249109Sjkim { 500249109Sjkim FlWriteFile (FileId, &FileByte, 1); 501249109Sjkim if (FileByte == '\n') 502249109Sjkim { 503249109Sjkim /* 504249109Sjkim * This line has been completed. 505249109Sjkim * Check if an error occurred on this source line during the compile. 506249109Sjkim * If so, we print the error message after the source line. 507249109Sjkim */ 508249109Sjkim LsCheckException (Gbl_SourceLine, FileId); 509249109Sjkim return (1); 510249109Sjkim } 511249109Sjkim } 512249109Sjkim 513249109Sjkim } while (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) == AE_OK); 514249109Sjkim 515249109Sjkim /* EOF on the input file was reached */ 516249109Sjkim 517249109Sjkim return (0); 518249109Sjkim} 519249109Sjkim 520249109Sjkim 521249109Sjkim/******************************************************************************* 522249109Sjkim * 523249109Sjkim * FUNCTION: LsFlushListingBuffer 524249109Sjkim * 525249109Sjkim * PARAMETERS: FileId - ID of the listing file 526249109Sjkim * 527249109Sjkim * RETURN: None 528249109Sjkim * 529249109Sjkim * DESCRIPTION: Flush out the current contents of the 16-byte hex AML code 530249109Sjkim * buffer. Usually called at the termination of a single line 531249109Sjkim * of source code or when the buffer is full. 532249109Sjkim * 533249109Sjkim ******************************************************************************/ 534249109Sjkim 535249109Sjkimvoid 536249109SjkimLsFlushListingBuffer ( 537249109Sjkim UINT32 FileId) 538249109Sjkim{ 539249109Sjkim UINT32 i; 540249109Sjkim 541249109Sjkim 542249109Sjkim if (Gbl_CurrentHexColumn == 0) 543249109Sjkim { 544249109Sjkim return; 545249109Sjkim } 546249109Sjkim 547249109Sjkim /* Write the hex bytes */ 548249109Sjkim 549249109Sjkim switch (FileId) 550249109Sjkim { 551249109Sjkim case ASL_FILE_LISTING_OUTPUT: 552249109Sjkim 553249109Sjkim for (i = 0; i < Gbl_CurrentHexColumn; i++) 554249109Sjkim { 555249109Sjkim FlPrintFile (FileId, "%2.2X ", Gbl_AmlBuffer[i]); 556249109Sjkim } 557249109Sjkim 558249109Sjkim for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 3); i++) 559249109Sjkim { 560249109Sjkim FlWriteFile (FileId, ".", 1); 561249109Sjkim } 562249109Sjkim 563249109Sjkim /* Write the ASCII character associated with each of the bytes */ 564249109Sjkim 565249109Sjkim LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer); 566249109Sjkim break; 567249109Sjkim 568249109Sjkim 569249109Sjkim case ASL_FILE_ASM_SOURCE_OUTPUT: 570249109Sjkim 571249109Sjkim for (i = 0; i < Gbl_CurrentHexColumn; i++) 572249109Sjkim { 573249109Sjkim if (i > 0) 574249109Sjkim { 575249109Sjkim FlPrintFile (FileId, ","); 576249109Sjkim } 577249109Sjkim FlPrintFile (FileId, "0%2.2Xh", Gbl_AmlBuffer[i]); 578249109Sjkim } 579249109Sjkim 580249109Sjkim for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++) 581249109Sjkim { 582249109Sjkim FlWriteFile (FileId, " ", 1); 583249109Sjkim } 584249109Sjkim 585249109Sjkim FlPrintFile (FileId, " ;%8.8X", 586249109Sjkim Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE); 587249109Sjkim 588249109Sjkim /* Write the ASCII character associated with each of the bytes */ 589249109Sjkim 590249109Sjkim LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer); 591249109Sjkim break; 592249109Sjkim 593249109Sjkim 594249109Sjkim case ASL_FILE_C_SOURCE_OUTPUT: 595249109Sjkim 596249109Sjkim for (i = 0; i < Gbl_CurrentHexColumn; i++) 597249109Sjkim { 598249109Sjkim FlPrintFile (FileId, "0x%2.2X,", Gbl_AmlBuffer[i]); 599249109Sjkim } 600249109Sjkim 601249109Sjkim /* Pad hex output with spaces if line is shorter than max line size */ 602249109Sjkim 603249109Sjkim for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++) 604249109Sjkim { 605249109Sjkim FlWriteFile (FileId, " ", 1); 606249109Sjkim } 607249109Sjkim 608249109Sjkim /* AML offset for the start of the line */ 609249109Sjkim 610249109Sjkim FlPrintFile (FileId, " /* %8.8X", 611249109Sjkim Gbl_CurrentAmlOffset - Gbl_CurrentHexColumn); 612249109Sjkim 613249109Sjkim /* Write the ASCII character associated with each of the bytes */ 614249109Sjkim 615249109Sjkim LsDumpAsciiInComment (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer); 616249109Sjkim FlPrintFile (FileId, " */"); 617249109Sjkim break; 618249109Sjkim 619249109Sjkim default: 620249109Sjkim /* No other types supported */ 621249109Sjkim return; 622249109Sjkim } 623249109Sjkim 624249109Sjkim FlPrintFile (FileId, "\n"); 625249109Sjkim 626249109Sjkim Gbl_CurrentHexColumn = 0; 627249109Sjkim Gbl_HexBytesWereWritten = TRUE; 628249109Sjkim} 629249109Sjkim 630249109Sjkim 631249109Sjkim/******************************************************************************* 632249109Sjkim * 633249109Sjkim * FUNCTION: LsPushNode 634249109Sjkim * 635249109Sjkim * PARAMETERS: Filename - Pointer to the include filename 636249109Sjkim * 637249109Sjkim * RETURN: None 638249109Sjkim * 639249109Sjkim * DESCRIPTION: Push a listing node on the listing/include file stack. This 640249109Sjkim * stack enables tracking of include files (infinitely nested) 641249109Sjkim * and resumption of the listing of the parent file when the 642249109Sjkim * include file is finished. 643249109Sjkim * 644249109Sjkim ******************************************************************************/ 645249109Sjkim 646249109Sjkimvoid 647249109SjkimLsPushNode ( 648249109Sjkim char *Filename) 649249109Sjkim{ 650249109Sjkim ASL_LISTING_NODE *Lnode; 651249109Sjkim 652249109Sjkim 653249109Sjkim /* Create a new node */ 654249109Sjkim 655249109Sjkim Lnode = UtLocalCalloc (sizeof (ASL_LISTING_NODE)); 656249109Sjkim 657249109Sjkim /* Initialize */ 658249109Sjkim 659249109Sjkim Lnode->Filename = Filename; 660249109Sjkim Lnode->LineNumber = 0; 661249109Sjkim 662249109Sjkim /* Link (push) */ 663249109Sjkim 664249109Sjkim Lnode->Next = Gbl_ListingNode; 665249109Sjkim Gbl_ListingNode = Lnode; 666249109Sjkim} 667249109Sjkim 668249109Sjkim 669249109Sjkim/******************************************************************************* 670249109Sjkim * 671249109Sjkim * FUNCTION: LsPopNode 672249109Sjkim * 673249109Sjkim * PARAMETERS: None 674249109Sjkim * 675249109Sjkim * RETURN: List head after current head is popped off 676249109Sjkim * 677249109Sjkim * DESCRIPTION: Pop the current head of the list, free it, and return the 678249109Sjkim * next node on the stack (the new current node). 679249109Sjkim * 680249109Sjkim ******************************************************************************/ 681249109Sjkim 682249109SjkimASL_LISTING_NODE * 683249109SjkimLsPopNode ( 684249109Sjkim void) 685249109Sjkim{ 686249109Sjkim ASL_LISTING_NODE *Lnode; 687249109Sjkim 688249109Sjkim 689249109Sjkim /* Just grab the node at the head of the list */ 690249109Sjkim 691249109Sjkim Lnode = Gbl_ListingNode; 692249109Sjkim if ((!Lnode) || 693249109Sjkim (!Lnode->Next)) 694249109Sjkim { 695249109Sjkim AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, NULL, 696249109Sjkim "Could not pop empty listing stack"); 697249109Sjkim return (Gbl_ListingNode); 698249109Sjkim } 699249109Sjkim 700249109Sjkim Gbl_ListingNode = Lnode->Next; 701249109Sjkim ACPI_FREE (Lnode); 702249109Sjkim 703249109Sjkim /* New "Current" node is the new head */ 704249109Sjkim 705249109Sjkim return (Gbl_ListingNode); 706249109Sjkim} 707