1249109Sjkim/****************************************************************************** 2249109Sjkim * 3249109Sjkim * Module Name: asllistsup - Listing file support utilities 4249109Sjkim * 5249109Sjkim *****************************************************************************/ 6249109Sjkim 7249109Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, 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 } 91306536Sjkim 92249109Sjkim FlPrintFile (FileId, "\""); 93249109Sjkim} 94249109Sjkim 95249109Sjkim 96249109Sjkim/******************************************************************************* 97249109Sjkim * 98249109Sjkim * FUNCTION: LsDumpAsciiInComment 99249109Sjkim * 100249109Sjkim * PARAMETERS: FileId - ID of current listing file 101249109Sjkim * Count - Number of bytes to convert 102249109Sjkim * Buffer - Buffer of bytes to convert 103249109Sjkim * 104249109Sjkim * RETURN: None 105249109Sjkim * 106249109Sjkim * DESCRIPTION: Convert hex bytes to ascii 107249109Sjkim * 108249109Sjkim ******************************************************************************/ 109249109Sjkim 110249109Sjkimvoid 111249109SjkimLsDumpAsciiInComment ( 112249109Sjkim UINT32 FileId, 113249109Sjkim UINT32 Count, 114249109Sjkim UINT8 *Buffer) 115249109Sjkim{ 116249109Sjkim UINT8 BufChar = 0; 117249109Sjkim UINT8 LastChar; 118249109Sjkim UINT32 i; 119249109Sjkim 120249109Sjkim 121249109Sjkim FlPrintFile (FileId, " \""); 122249109Sjkim for (i = 0; i < Count; i++) 123249109Sjkim { 124249109Sjkim LastChar = BufChar; 125249109Sjkim BufChar = Buffer[i]; 126249109Sjkim 127249109Sjkim if (isprint (BufChar)) 128249109Sjkim { 129249109Sjkim /* Handle embedded C comment sequences */ 130249109Sjkim 131249109Sjkim if (((LastChar == '*') && (BufChar == '/')) || 132249109Sjkim ((LastChar == '/') && (BufChar == '*'))) 133249109Sjkim { 134249109Sjkim /* Insert a space to break the sequence */ 135249109Sjkim 136249109Sjkim FlPrintFile (FileId, ".", BufChar); 137249109Sjkim } 138249109Sjkim 139249109Sjkim FlPrintFile (FileId, "%c", BufChar); 140249109Sjkim } 141249109Sjkim else 142249109Sjkim { 143249109Sjkim /* Not a printable character, just put out a dot */ 144249109Sjkim 145249109Sjkim FlPrintFile (FileId, "."); 146249109Sjkim } 147249109Sjkim } 148249109Sjkim 149249109Sjkim FlPrintFile (FileId, "\""); 150249109Sjkim} 151249109Sjkim 152249109Sjkim 153249109Sjkim/******************************************************************************* 154249109Sjkim * 155249109Sjkim * FUNCTION: LsCheckException 156249109Sjkim * 157249109Sjkim * PARAMETERS: LineNumber - Current logical (cumulative) line # 158249109Sjkim * FileId - ID of output listing file 159249109Sjkim * 160249109Sjkim * RETURN: None 161249109Sjkim * 162249109Sjkim * DESCRIPTION: Check if there is an exception for this line, and if there is, 163249109Sjkim * put it in the listing immediately. Handles multiple errors 164249109Sjkim * per line. Gbl_NextError points to the next error in the 165249109Sjkim * sorted (by line #) list of compile errors/warnings. 166249109Sjkim * 167249109Sjkim ******************************************************************************/ 168249109Sjkim 169249109Sjkimvoid 170249109SjkimLsCheckException ( 171249109Sjkim UINT32 LineNumber, 172249109Sjkim UINT32 FileId) 173249109Sjkim{ 174249109Sjkim 175249109Sjkim if ((!Gbl_NextError) || 176249109Sjkim (LineNumber < Gbl_NextError->LogicalLineNumber )) 177249109Sjkim { 178249109Sjkim return; 179249109Sjkim } 180249109Sjkim 181249109Sjkim /* Handle multiple errors per line */ 182249109Sjkim 183249109Sjkim if (FileId == ASL_FILE_LISTING_OUTPUT) 184249109Sjkim { 185249109Sjkim while (Gbl_NextError && 186249109Sjkim (LineNumber >= Gbl_NextError->LogicalLineNumber)) 187249109Sjkim { 188249109Sjkim AePrintException (FileId, Gbl_NextError, "\n[****iasl****]\n"); 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: 254250838Sjkim 255249109Sjkim /* No other types supported */ 256250838Sjkim 257249109Sjkim return; 258249109Sjkim } 259249109Sjkim } 260249109Sjkim 261249109Sjkim /* Transfer AML byte and update counts */ 262249109Sjkim 263249109Sjkim Gbl_AmlBuffer[Gbl_CurrentHexColumn] = Buffer[i]; 264249109Sjkim 265249109Sjkim Gbl_CurrentHexColumn++; 266249109Sjkim Gbl_CurrentAmlOffset++; 267249109Sjkim 268249109Sjkim /* Flush buffer when it is full */ 269249109Sjkim 270249109Sjkim if (Gbl_CurrentHexColumn >= HEX_LISTING_LINE_SIZE) 271249109Sjkim { 272249109Sjkim LsFlushListingBuffer (FileId); 273249109Sjkim } 274249109Sjkim } 275249109Sjkim} 276249109Sjkim 277249109Sjkim 278249109Sjkim/******************************************************************************* 279249109Sjkim * 280249109Sjkim * FUNCTION: LsWriteSourceLines 281249109Sjkim * 282249109Sjkim * PARAMETERS: ToLineNumber - 283249109Sjkim * ToLogicalLineNumber - Write up to this source line number 284249109Sjkim * FileId - ID of current listing file 285249109Sjkim * 286249109Sjkim * RETURN: None 287249109Sjkim * 288249109Sjkim * DESCRIPTION: Read then write source lines to the listing file until we have 289249109Sjkim * reached the specified logical (cumulative) line number. This 290249109Sjkim * automatically echos out comment blocks and other non-AML 291249109Sjkim * generating text until we get to the actual AML-generating line 292249109Sjkim * of ASL code specified by the logical line number. 293249109Sjkim * 294249109Sjkim ******************************************************************************/ 295249109Sjkim 296249109Sjkimvoid 297249109SjkimLsWriteSourceLines ( 298249109Sjkim UINT32 ToLineNumber, 299249109Sjkim UINT32 ToLogicalLineNumber, 300249109Sjkim UINT32 FileId) 301249109Sjkim{ 302249109Sjkim 303249109Sjkim /* Nothing to do for these file types */ 304249109Sjkim 305249109Sjkim if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) || 306249109Sjkim (FileId == ASL_FILE_C_INCLUDE_OUTPUT)) 307249109Sjkim { 308249109Sjkim return; 309249109Sjkim } 310249109Sjkim 311249109Sjkim Gbl_CurrentLine = ToLogicalLineNumber; 312249109Sjkim 313249109Sjkim /* Flush any hex bytes remaining from the last opcode */ 314249109Sjkim 315249109Sjkim LsFlushListingBuffer (FileId); 316249109Sjkim 317249109Sjkim /* Read lines and write them as long as we are not caught up */ 318249109Sjkim 319249109Sjkim if (Gbl_SourceLine < Gbl_CurrentLine) 320249109Sjkim { 321249109Sjkim /* 322249109Sjkim * If we just completed writing some AML hex bytes, output a linefeed 323249109Sjkim * to add some whitespace for readability. 324249109Sjkim */ 325249109Sjkim if (Gbl_HexBytesWereWritten) 326249109Sjkim { 327249109Sjkim FlPrintFile (FileId, "\n"); 328249109Sjkim Gbl_HexBytesWereWritten = FALSE; 329249109Sjkim } 330249109Sjkim 331249109Sjkim if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 332249109Sjkim { 333249109Sjkim FlPrintFile (FileId, " /*\n"); 334249109Sjkim } 335249109Sjkim 336249109Sjkim /* Write one line at a time until we have reached the target line # */ 337249109Sjkim 338249109Sjkim while ((Gbl_SourceLine < Gbl_CurrentLine) && 339249109Sjkim LsWriteOneSourceLine (FileId)) 340249109Sjkim { ; } 341249109Sjkim 342249109Sjkim if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 343249109Sjkim { 344249109Sjkim FlPrintFile (FileId, " */"); 345249109Sjkim } 346249109Sjkim 347249109Sjkim FlPrintFile (FileId, "\n"); 348249109Sjkim } 349249109Sjkim} 350249109Sjkim 351249109Sjkim 352249109Sjkim/******************************************************************************* 353249109Sjkim * 354249109Sjkim * FUNCTION: LsWriteOneSourceLine 355249109Sjkim * 356249109Sjkim * PARAMETERS: FileId - ID of current listing file 357249109Sjkim * 358249109Sjkim * RETURN: FALSE on EOF (input source file), TRUE otherwise 359249109Sjkim * 360249109Sjkim * DESCRIPTION: Read one line from the input source file and echo it to the 361249109Sjkim * listing file, prefixed with the line number, and if the source 362249109Sjkim * file contains include files, prefixed with the current filename 363249109Sjkim * 364249109Sjkim ******************************************************************************/ 365249109Sjkim 366249109SjkimUINT32 367249109SjkimLsWriteOneSourceLine ( 368249109Sjkim UINT32 FileId) 369249109Sjkim{ 370249109Sjkim UINT8 FileByte; 371249109Sjkim UINT32 Column = 0; 372249109Sjkim UINT32 Index = 16; 373249109Sjkim BOOLEAN StartOfLine = FALSE; 374249109Sjkim BOOLEAN ProcessLongLine = FALSE; 375249109Sjkim 376249109Sjkim 377249109Sjkim Gbl_SourceLine++; 378249109Sjkim Gbl_ListingNode->LineNumber++; 379249109Sjkim 380249109Sjkim /* Ignore lines that are completely blank (but count the line above) */ 381249109Sjkim 382249109Sjkim if (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) != AE_OK) 383249109Sjkim { 384249109Sjkim return (0); 385249109Sjkim } 386249109Sjkim if (FileByte == '\n') 387249109Sjkim { 388249109Sjkim return (1); 389249109Sjkim } 390249109Sjkim 391249109Sjkim /* 392249109Sjkim * This is a non-empty line, we will print the entire line with 393249109Sjkim * the line number and possibly other prefixes and transforms. 394249109Sjkim */ 395249109Sjkim 396249109Sjkim /* Line prefixes for special files, C and ASM output */ 397249109Sjkim 398249109Sjkim if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 399249109Sjkim { 400249109Sjkim FlPrintFile (FileId, " *"); 401249109Sjkim } 402249109Sjkim if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT) 403249109Sjkim { 404249109Sjkim FlPrintFile (FileId, "; "); 405249109Sjkim } 406249109Sjkim 407249109Sjkim if (Gbl_HasIncludeFiles) 408249109Sjkim { 409249109Sjkim /* 410249109Sjkim * This file contains "include" statements, print the current 411249109Sjkim * filename and line number within the current file 412249109Sjkim */ 413249109Sjkim FlPrintFile (FileId, "%12s %5d%s", 414249109Sjkim Gbl_ListingNode->Filename, Gbl_ListingNode->LineNumber, 415249109Sjkim ASL_LISTING_LINE_PREFIX); 416249109Sjkim } 417249109Sjkim else 418249109Sjkim { 419249109Sjkim /* No include files, just print the line number */ 420249109Sjkim 421249109Sjkim FlPrintFile (FileId, "%8u%s", Gbl_SourceLine, 422249109Sjkim ASL_LISTING_LINE_PREFIX); 423249109Sjkim } 424249109Sjkim 425249109Sjkim /* Read the rest of this line (up to a newline or EOF) */ 426249109Sjkim 427249109Sjkim do 428249109Sjkim { 429249109Sjkim if (FileId == ASL_FILE_C_SOURCE_OUTPUT) 430249109Sjkim { 431249109Sjkim if (FileByte == '/') 432249109Sjkim { 433249109Sjkim FileByte = '*'; 434249109Sjkim } 435249109Sjkim } 436249109Sjkim 437249109Sjkim /* Split long input lines for readability in the listing */ 438249109Sjkim 439249109Sjkim Column++; 440249109Sjkim if (Column >= 128) 441249109Sjkim { 442249109Sjkim if (!ProcessLongLine) 443249109Sjkim { 444249109Sjkim if ((FileByte != '}') && 445249109Sjkim (FileByte != '{')) 446249109Sjkim { 447249109Sjkim goto WriteByte; 448249109Sjkim } 449249109Sjkim 450249109Sjkim ProcessLongLine = TRUE; 451249109Sjkim } 452249109Sjkim 453249109Sjkim if (FileByte == '{') 454249109Sjkim { 455249109Sjkim FlPrintFile (FileId, "\n%*s{\n", Index, " "); 456249109Sjkim StartOfLine = TRUE; 457249109Sjkim Index += 4; 458249109Sjkim continue; 459249109Sjkim } 460249109Sjkim 461249109Sjkim else if (FileByte == '}') 462249109Sjkim { 463249109Sjkim if (!StartOfLine) 464249109Sjkim { 465249109Sjkim FlPrintFile (FileId, "\n"); 466249109Sjkim } 467249109Sjkim 468249109Sjkim StartOfLine = TRUE; 469249109Sjkim Index -= 4; 470249109Sjkim FlPrintFile (FileId, "%*s}\n", Index, " "); 471249109Sjkim continue; 472249109Sjkim } 473249109Sjkim 474249109Sjkim /* Ignore spaces/tabs at the start of line */ 475249109Sjkim 476249109Sjkim else if ((FileByte == ' ') && StartOfLine) 477249109Sjkim { 478249109Sjkim continue; 479249109Sjkim } 480249109Sjkim 481249109Sjkim else if (StartOfLine) 482249109Sjkim { 483249109Sjkim StartOfLine = FALSE; 484249109Sjkim FlPrintFile (FileId, "%*s", Index, " "); 485249109Sjkim } 486249109Sjkim 487249109SjkimWriteByte: 488249109Sjkim FlWriteFile (FileId, &FileByte, 1); 489249109Sjkim if (FileByte == '\n') 490249109Sjkim { 491249109Sjkim /* 492249109Sjkim * This line has been completed. 493249109Sjkim * Check if an error occurred on this source line during the compile. 494249109Sjkim * If so, we print the error message after the source line. 495249109Sjkim */ 496249109Sjkim LsCheckException (Gbl_SourceLine, FileId); 497249109Sjkim return (1); 498249109Sjkim } 499249109Sjkim } 500249109Sjkim else 501249109Sjkim { 502249109Sjkim FlWriteFile (FileId, &FileByte, 1); 503249109Sjkim if (FileByte == '\n') 504249109Sjkim { 505249109Sjkim /* 506249109Sjkim * This line has been completed. 507249109Sjkim * Check if an error occurred on this source line during the compile. 508249109Sjkim * If so, we print the error message after the source line. 509249109Sjkim */ 510249109Sjkim LsCheckException (Gbl_SourceLine, FileId); 511249109Sjkim return (1); 512249109Sjkim } 513249109Sjkim } 514249109Sjkim 515249109Sjkim } while (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) == AE_OK); 516249109Sjkim 517249109Sjkim /* EOF on the input file was reached */ 518249109Sjkim 519249109Sjkim return (0); 520249109Sjkim} 521249109Sjkim 522249109Sjkim 523249109Sjkim/******************************************************************************* 524249109Sjkim * 525249109Sjkim * FUNCTION: LsFlushListingBuffer 526249109Sjkim * 527249109Sjkim * PARAMETERS: FileId - ID of the listing file 528249109Sjkim * 529249109Sjkim * RETURN: None 530249109Sjkim * 531249109Sjkim * DESCRIPTION: Flush out the current contents of the 16-byte hex AML code 532249109Sjkim * buffer. Usually called at the termination of a single line 533249109Sjkim * of source code or when the buffer is full. 534249109Sjkim * 535249109Sjkim ******************************************************************************/ 536249109Sjkim 537249109Sjkimvoid 538249109SjkimLsFlushListingBuffer ( 539249109Sjkim UINT32 FileId) 540249109Sjkim{ 541249109Sjkim UINT32 i; 542249109Sjkim 543249109Sjkim 544249109Sjkim if (Gbl_CurrentHexColumn == 0) 545249109Sjkim { 546249109Sjkim return; 547249109Sjkim } 548249109Sjkim 549249109Sjkim /* Write the hex bytes */ 550249109Sjkim 551249109Sjkim switch (FileId) 552249109Sjkim { 553249109Sjkim case ASL_FILE_LISTING_OUTPUT: 554249109Sjkim 555249109Sjkim for (i = 0; i < Gbl_CurrentHexColumn; i++) 556249109Sjkim { 557249109Sjkim FlPrintFile (FileId, "%2.2X ", Gbl_AmlBuffer[i]); 558249109Sjkim } 559249109Sjkim 560249109Sjkim for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 3); i++) 561249109Sjkim { 562249109Sjkim FlWriteFile (FileId, ".", 1); 563249109Sjkim } 564249109Sjkim 565249109Sjkim /* Write the ASCII character associated with each of the bytes */ 566249109Sjkim 567249109Sjkim LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer); 568249109Sjkim break; 569249109Sjkim 570249109Sjkim 571249109Sjkim case ASL_FILE_ASM_SOURCE_OUTPUT: 572249109Sjkim 573249109Sjkim for (i = 0; i < Gbl_CurrentHexColumn; i++) 574249109Sjkim { 575249109Sjkim if (i > 0) 576249109Sjkim { 577249109Sjkim FlPrintFile (FileId, ","); 578249109Sjkim } 579306536Sjkim 580249109Sjkim FlPrintFile (FileId, "0%2.2Xh", Gbl_AmlBuffer[i]); 581249109Sjkim } 582249109Sjkim 583249109Sjkim for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++) 584249109Sjkim { 585249109Sjkim FlWriteFile (FileId, " ", 1); 586249109Sjkim } 587249109Sjkim 588249109Sjkim FlPrintFile (FileId, " ;%8.8X", 589249109Sjkim Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE); 590249109Sjkim 591249109Sjkim /* Write the ASCII character associated with each of the bytes */ 592249109Sjkim 593249109Sjkim LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer); 594249109Sjkim break; 595249109Sjkim 596249109Sjkim 597249109Sjkim case ASL_FILE_C_SOURCE_OUTPUT: 598249109Sjkim 599249109Sjkim for (i = 0; i < Gbl_CurrentHexColumn; i++) 600249109Sjkim { 601249109Sjkim FlPrintFile (FileId, "0x%2.2X,", Gbl_AmlBuffer[i]); 602249109Sjkim } 603249109Sjkim 604249109Sjkim /* Pad hex output with spaces if line is shorter than max line size */ 605249109Sjkim 606249109Sjkim for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++) 607249109Sjkim { 608249109Sjkim FlWriteFile (FileId, " ", 1); 609249109Sjkim } 610249109Sjkim 611249109Sjkim /* AML offset for the start of the line */ 612249109Sjkim 613249109Sjkim FlPrintFile (FileId, " /* %8.8X", 614249109Sjkim Gbl_CurrentAmlOffset - Gbl_CurrentHexColumn); 615249109Sjkim 616249109Sjkim /* Write the ASCII character associated with each of the bytes */ 617249109Sjkim 618249109Sjkim LsDumpAsciiInComment (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer); 619249109Sjkim FlPrintFile (FileId, " */"); 620249109Sjkim break; 621249109Sjkim 622249109Sjkim default: 623250838Sjkim 624249109Sjkim /* No other types supported */ 625250838Sjkim 626249109Sjkim return; 627249109Sjkim } 628249109Sjkim 629249109Sjkim FlPrintFile (FileId, "\n"); 630249109Sjkim 631249109Sjkim Gbl_CurrentHexColumn = 0; 632249109Sjkim Gbl_HexBytesWereWritten = TRUE; 633249109Sjkim} 634249109Sjkim 635249109Sjkim 636249109Sjkim/******************************************************************************* 637249109Sjkim * 638249109Sjkim * FUNCTION: LsPushNode 639249109Sjkim * 640249109Sjkim * PARAMETERS: Filename - Pointer to the include filename 641249109Sjkim * 642249109Sjkim * RETURN: None 643249109Sjkim * 644249109Sjkim * DESCRIPTION: Push a listing node on the listing/include file stack. This 645249109Sjkim * stack enables tracking of include files (infinitely nested) 646249109Sjkim * and resumption of the listing of the parent file when the 647249109Sjkim * include file is finished. 648249109Sjkim * 649249109Sjkim ******************************************************************************/ 650249109Sjkim 651249109Sjkimvoid 652249109SjkimLsPushNode ( 653249109Sjkim char *Filename) 654249109Sjkim{ 655249109Sjkim ASL_LISTING_NODE *Lnode; 656249109Sjkim 657249109Sjkim 658249109Sjkim /* Create a new node */ 659249109Sjkim 660249109Sjkim Lnode = UtLocalCalloc (sizeof (ASL_LISTING_NODE)); 661249109Sjkim 662249109Sjkim /* Initialize */ 663249109Sjkim 664249109Sjkim Lnode->Filename = Filename; 665249109Sjkim Lnode->LineNumber = 0; 666249109Sjkim 667249109Sjkim /* Link (push) */ 668249109Sjkim 669249109Sjkim Lnode->Next = Gbl_ListingNode; 670249109Sjkim Gbl_ListingNode = Lnode; 671249109Sjkim} 672249109Sjkim 673249109Sjkim 674249109Sjkim/******************************************************************************* 675249109Sjkim * 676249109Sjkim * FUNCTION: LsPopNode 677249109Sjkim * 678249109Sjkim * PARAMETERS: None 679249109Sjkim * 680249109Sjkim * RETURN: List head after current head is popped off 681249109Sjkim * 682249109Sjkim * DESCRIPTION: Pop the current head of the list, free it, and return the 683249109Sjkim * next node on the stack (the new current node). 684249109Sjkim * 685249109Sjkim ******************************************************************************/ 686249109Sjkim 687249109SjkimASL_LISTING_NODE * 688249109SjkimLsPopNode ( 689249109Sjkim void) 690249109Sjkim{ 691249109Sjkim ASL_LISTING_NODE *Lnode; 692249109Sjkim 693249109Sjkim 694249109Sjkim /* Just grab the node at the head of the list */ 695249109Sjkim 696249109Sjkim Lnode = Gbl_ListingNode; 697249109Sjkim if ((!Lnode) || 698249109Sjkim (!Lnode->Next)) 699249109Sjkim { 700249109Sjkim AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, NULL, 701249109Sjkim "Could not pop empty listing stack"); 702249109Sjkim return (Gbl_ListingNode); 703249109Sjkim } 704249109Sjkim 705249109Sjkim Gbl_ListingNode = Lnode->Next; 706249109Sjkim ACPI_FREE (Lnode); 707249109Sjkim 708249109Sjkim /* New "Current" node is the new head */ 709249109Sjkim 710249109Sjkim return (Gbl_ListingNode); 711249109Sjkim} 712