1 /******************************************************************************
   2  *
   3  * Module Name: aslerror - Error handling and statistics
   4  *
   5  *****************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2014, Intel Corp.
   9  * All rights reserved.
  10  *
  11  * Redistribution and use in source and binary forms, with or without
  12  * modification, are permitted provided that the following conditions
  13  * are met:
  14  * 1. Redistributions of source code must retain the above copyright
  15  *    notice, this list of conditions, and the following disclaimer,
  16  *    without modification.
  17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  18  *    substantially similar to the "NO WARRANTY" disclaimer below
  19  *    ("Disclaimer") and any redistribution must be conditioned upon
  20  *    including a substantially similar Disclaimer requirement for further
  21  *    binary redistribution.
  22  * 3. Neither the names of the above-listed copyright holders nor the names
  23  *    of any contributors may be used to endorse or promote products derived
  24  *    from this software without specific prior written permission.
  25  *
  26  * Alternatively, this software may be distributed under the terms of the
  27  * GNU General Public License ("GPL") version 2 as published by the Free
  28  * Software Foundation.
  29  *
  30  * NO WARRANTY
  31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  41  * POSSIBILITY OF SUCH DAMAGES.
  42  */
  43 
  44 #define ASL_EXCEPTIONS
  45 #include "aslcompiler.h"
  46 
  47 #define _COMPONENT          ACPI_COMPILER
  48         ACPI_MODULE_NAME    ("aslerror")
  49 
  50 /* Local prototypes */
  51 
  52 static void
  53 AeAddToErrorLog (
  54     ASL_ERROR_MSG           *Enode);
  55 
  56 
  57 /*******************************************************************************
  58  *
  59  * FUNCTION:    AeClearErrorLog
  60  *
  61  * PARAMETERS:  None
  62  *
  63  * RETURN:      None
  64  *
  65  * DESCRIPTION: Empty the error list
  66  *
  67  ******************************************************************************/
  68 
  69 void
  70 AeClearErrorLog (
  71     void)
  72 {
  73     ASL_ERROR_MSG           *Enode = Gbl_ErrorLog;
  74     ASL_ERROR_MSG           *Next;
  75 
  76     /* Walk the error node list */
  77 
  78     while (Enode)
  79     {
  80         Next = Enode->Next;
  81         ACPI_FREE (Enode);
  82         Enode = Next;
  83     }
  84 
  85     Gbl_ErrorLog = NULL;
  86 }
  87 
  88 
  89 /*******************************************************************************
  90  *
  91  * FUNCTION:    AeAddToErrorLog
  92  *
  93  * PARAMETERS:  Enode       - An error node to add to the log
  94  *
  95  * RETURN:      None
  96  *
  97  * DESCRIPTION: Add a new error node to the error log. The error log is
  98  *              ordered by the "logical" line number (cumulative line number
  99  *              including all include files.)
 100  *
 101  ******************************************************************************/
 102 
 103 static void
 104 AeAddToErrorLog (
 105     ASL_ERROR_MSG           *Enode)
 106 {
 107     ASL_ERROR_MSG           *Next;
 108     ASL_ERROR_MSG           *Prev;
 109 
 110 
 111     /* If Gbl_ErrorLog is null, this is the first error node */
 112 
 113     if (!Gbl_ErrorLog)
 114     {
 115         Gbl_ErrorLog = Enode;
 116         return;
 117     }
 118 
 119     /*
 120      * Walk error list until we find a line number greater than ours.
 121      * List is sorted according to line number.
 122      */
 123     Prev = NULL;
 124     Next = Gbl_ErrorLog;
 125 
 126     while ((Next) &&
 127            (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
 128     {
 129         Prev = Next;
 130         Next = Next->Next;
 131     }
 132 
 133     /* Found our place in the list */
 134 
 135     Enode->Next = Next;
 136 
 137     if (Prev)
 138     {
 139         Prev->Next = Enode;
 140     }
 141     else
 142     {
 143         Gbl_ErrorLog = Enode;
 144     }
 145 }
 146 
 147 
 148 /*******************************************************************************
 149  *
 150  * FUNCTION:    AePrintException
 151  *
 152  * PARAMETERS:  FileId          - ID of output file
 153  *              Enode           - Error node to print
 154  *              Header          - Additional text before each message
 155  *
 156  * RETURN:      None
 157  *
 158  * DESCRIPTION: Print the contents of an error node.
 159  *
 160  * NOTE:        We don't use the FlxxxFile I/O functions here because on error
 161  *              they abort the compiler and call this function!  Since we
 162  *              are reporting errors here, we ignore most output errors and
 163  *              just try to get out as much as we can.
 164  *
 165  ******************************************************************************/
 166 
 167 void
 168 AePrintException (
 169     UINT32                  FileId,
 170     ASL_ERROR_MSG           *Enode,
 171     char                    *Header)
 172 {
 173     UINT8                   SourceByte;
 174     int                     Actual;
 175     size_t                  RActual;
 176     UINT32                  MsgLength;
 177     char                    *MainMessage;
 178     char                    *ExtraMessage;
 179     UINT32                  SourceColumn;
 180     UINT32                  ErrorColumn;
 181     FILE                    *OutputFile;
 182     FILE                    *SourceFile = NULL;
 183     long                    FileSize;
 184     BOOLEAN                 PrematureEOF = FALSE;
 185     UINT32                  Total = 0;
 186 
 187 
 188     if (Gbl_NoErrors)
 189     {
 190         return;
 191     }
 192 
 193     /*
 194      * Only listing files have a header, and remarks/optimizations
 195      * are always output
 196      */
 197     if (!Header)
 198     {
 199         /* Ignore remarks if requested */
 200 
 201         switch (Enode->Level)
 202         {
 203         case ASL_WARNING:
 204         case ASL_WARNING2:
 205         case ASL_WARNING3:
 206 
 207             if (!Gbl_DisplayWarnings)
 208             {
 209                 return;
 210             }
 211             break;
 212 
 213         case ASL_REMARK:
 214 
 215             if (!Gbl_DisplayRemarks)
 216             {
 217                 return;
 218             }
 219             break;
 220 
 221         case ASL_OPTIMIZATION:
 222 
 223             if (!Gbl_DisplayOptimizations)
 224             {
 225                 return;
 226             }
 227             break;
 228 
 229         default:
 230 
 231             break;
 232         }
 233     }
 234 
 235     /* Get the various required file handles */
 236 
 237     OutputFile = Gbl_Files[FileId].Handle;
 238 
 239     if (!Enode->SourceLine)
 240     {
 241         /* Use the merged header/source file if present, otherwise use input file */
 242 
 243         SourceFile = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
 244         if (!SourceFile)
 245         {
 246             SourceFile = Gbl_Files[ASL_FILE_INPUT].Handle;
 247         }
 248 
 249         if (SourceFile)
 250         {
 251             /* Determine if the error occurred at source file EOF */
 252 
 253             fseek (SourceFile, 0, SEEK_END);
 254             FileSize = ftell (SourceFile);
 255 
 256             if ((long) Enode->LogicalByteOffset >= FileSize)
 257             {
 258                 PrematureEOF = TRUE;
 259             }
 260         }
 261     }
 262 
 263     if (Header)
 264     {
 265         fprintf (OutputFile, "%s", Header);
 266     }
 267 
 268     /* Print filename and line number if present and valid */
 269 
 270     if (Enode->Filename)
 271     {
 272         if (Gbl_VerboseErrors)
 273         {
 274             fprintf (OutputFile, "%-8s", Enode->Filename);
 275 
 276             if (Enode->LineNumber)
 277             {
 278                 if (Enode->SourceLine)
 279                 {
 280                     fprintf (OutputFile, " %6u: %s",
 281                         Enode->LineNumber, Enode->SourceLine);
 282                 }
 283                 else
 284                 {
 285                     fprintf (OutputFile, " %6u: ", Enode->LineNumber);
 286 
 287                     /*
 288                      * If not at EOF, get the corresponding source code line and
 289                      * display it. Don't attempt this if we have a premature EOF
 290                      * condition.
 291                      */
 292                     if (!PrematureEOF)
 293                     {
 294                         /*
 295                          * Seek to the offset in the combined source file, read
 296                          * the source line, and write it to the output.
 297                          */
 298                         Actual = fseek (SourceFile, (long) Enode->LogicalByteOffset,
 299                                     (int) SEEK_SET);
 300                         if (Actual)
 301                         {
 302                             fprintf (OutputFile,
 303                                 "[*** iASL: Seek error on source code temp file %s ***]",
 304                                 Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
 305                         }
 306                         else
 307                         {
 308                             RActual = fread (&SourceByte, 1, 1, SourceFile);
 309                             if (RActual != 1)
 310                             {
 311                                 fprintf (OutputFile,
 312                                     "[*** iASL: Read error on source code temp file %s ***]",
 313                                     Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
 314                             }
 315                             else
 316                             {
 317                                 /* Read/write the source line, up to the maximum line length */
 318 
 319                                 while (RActual && SourceByte && (SourceByte != '\n'))
 320                                 {
 321                                     if (Total < 256)
 322                                     {
 323                                         /* After the max line length, we will just read the line, no write */
 324 
 325                                         if (fwrite (&SourceByte, 1, 1, OutputFile) != 1)
 326                                         {
 327                                             printf ("[*** iASL: Write error on output file ***]\n");
 328                                             return;
 329                                         }
 330                                     }
 331                                     else if (Total == 256)
 332                                     {
 333                                         fprintf (OutputFile,
 334                                             "\n[*** iASL: Very long input line, message below refers to column %u ***]",
 335                                             Enode->Column);
 336                                     }
 337 
 338                                     RActual = fread (&SourceByte, 1, 1, SourceFile);
 339                                     if (RActual != 1)
 340                                     {
 341                                         fprintf (OutputFile,
 342                                             "[*** iASL: Read error on source code temp file %s ***]",
 343                                             Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
 344                                         return;
 345                                     }
 346                                     Total++;
 347                                 }
 348                             }
 349                         }
 350                     }
 351 
 352                     fprintf (OutputFile, "\n");
 353                 }
 354             }
 355         }
 356         else
 357         {
 358             /*
 359              * Less verbose version of the error message, enabled via the
 360              * -vi switch. The format is compatible with MS Visual Studio.
 361              */
 362             fprintf (OutputFile, "%s", Enode->Filename);
 363 
 364             if (Enode->LineNumber)
 365             {
 366                 fprintf (OutputFile, "(%u) : ",
 367                     Enode->LineNumber);
 368             }
 369         }
 370     }
 371 
 372     /* NULL message ID, just print the raw message */
 373 
 374     if (Enode->MessageId == 0)
 375     {
 376         fprintf (OutputFile, "%s\n", Enode->Message);
 377     }
 378     else
 379     {
 380         /* Decode the message ID */
 381 
 382         if (Gbl_VerboseErrors)
 383         {
 384             fprintf (OutputFile, "%s %4.4d -",
 385                         AslErrorLevel[Enode->Level],
 386                         Enode->MessageId + ((Enode->Level+1) * 1000));
 387         }
 388         else /* IDE case */
 389         {
 390             fprintf (OutputFile, "%s %4.4d:",
 391                         AslErrorLevelIde[Enode->Level],
 392                         Enode->MessageId + ((Enode->Level+1) * 1000));
 393         }
 394 
 395         MainMessage = AslMessages[Enode->MessageId];
 396         ExtraMessage = Enode->Message;
 397 
 398         if (Enode->LineNumber)
 399         {
 400             /* Main message: try to use string from AslMessages first */
 401 
 402             if (!MainMessage)
 403             {
 404                 MainMessage = "";
 405             }
 406 
 407             MsgLength = strlen (MainMessage);
 408             if (MsgLength == 0)
 409             {
 410                 /* Use the secondary/extra message as main message */
 411 
 412                 MainMessage = Enode->Message;
 413                 if (!MainMessage)
 414                 {
 415                     MainMessage = "";
 416                 }
 417 
 418                 MsgLength = strlen (MainMessage);
 419                 ExtraMessage = NULL;
 420             }
 421 
 422             if (Gbl_VerboseErrors && !PrematureEOF)
 423             {
 424                 if (Total >= 256)
 425                 {
 426                     fprintf (OutputFile, "    %s",
 427                         MainMessage);
 428                 }
 429                 else
 430                 {
 431                     SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
 432                     ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
 433 
 434                     if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
 435                     {
 436                         fprintf (OutputFile, "%*s%s",
 437                             (int) ((SourceColumn - 1) - ErrorColumn),
 438                             MainMessage, " ^ ");
 439                     }
 440                     else
 441                     {
 442                         fprintf (OutputFile, "%*s %s",
 443                             (int) ((SourceColumn - ErrorColumn) + 1), "^",
 444                             MainMessage);
 445                     }
 446                 }
 447             }
 448             else
 449             {
 450                 fprintf (OutputFile, " %s", MainMessage);
 451             }
 452 
 453             /* Print the extra info message if present */
 454 
 455             if (ExtraMessage)
 456             {
 457                 fprintf (OutputFile, " (%s)", ExtraMessage);
 458             }
 459 
 460             if (PrematureEOF)
 461             {
 462                 fprintf (OutputFile, " and premature End-Of-File");
 463             }
 464 
 465             fprintf (OutputFile, "\n");
 466             if (Gbl_VerboseErrors)
 467             {
 468                 fprintf (OutputFile, "\n");
 469             }
 470         }
 471         else
 472         {
 473             fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
 474         }
 475     }
 476 }
 477 
 478 
 479 /*******************************************************************************
 480  *
 481  * FUNCTION:    AePrintErrorLog
 482  *
 483  * PARAMETERS:  FileId           - Where to output the error log
 484  *
 485  * RETURN:      None
 486  *
 487  * DESCRIPTION: Print the entire contents of the error log
 488  *
 489  ******************************************************************************/
 490 
 491 void
 492 AePrintErrorLog (
 493     UINT32                  FileId)
 494 {
 495     ASL_ERROR_MSG           *Enode = Gbl_ErrorLog;
 496 
 497 
 498     /* Walk the error node list */
 499 
 500     while (Enode)
 501     {
 502         AePrintException (FileId, Enode, NULL);
 503         Enode = Enode->Next;
 504     }
 505 }
 506 
 507 
 508 /*******************************************************************************
 509  *
 510  * FUNCTION:    AslCommonError2
 511  *
 512  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
 513  *              MessageId           - Index into global message buffer
 514  *              LineNumber          - Actual file line number
 515  *              Column              - Column in current line
 516  *              SourceLine          - Actual source code line
 517  *              Filename            - source filename
 518  *              ExtraMessage        - additional error message
 519  *
 520  * RETURN:      None
 521  *
 522  * DESCRIPTION: Create a new error node and add it to the error log
 523  *
 524  ******************************************************************************/
 525 
 526 void
 527 AslCommonError2 (
 528     UINT8                   Level,
 529     UINT8                   MessageId,
 530     UINT32                  LineNumber,
 531     UINT32                  Column,
 532     char                    *SourceLine,
 533     char                    *Filename,
 534     char                    *ExtraMessage)
 535 {
 536     char                    *MessageBuffer = NULL;
 537     char                    *LineBuffer;
 538     ASL_ERROR_MSG           *Enode;
 539 
 540 
 541     Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
 542 
 543     if (ExtraMessage)
 544     {
 545         /* Allocate a buffer for the message and a new error node */
 546 
 547         MessageBuffer = UtLocalCalloc (strlen (ExtraMessage) + 1);
 548 
 549         /* Keep a copy of the extra message */
 550 
 551         ACPI_STRCPY (MessageBuffer, ExtraMessage);
 552     }
 553 
 554     LineBuffer = UtLocalCalloc (strlen (SourceLine) + 1);
 555     ACPI_STRCPY (LineBuffer, SourceLine);
 556 
 557     /* Initialize the error node */
 558 
 559     if (Filename)
 560     {
 561         Enode->Filename       = Filename;
 562         Enode->FilenameLength = strlen (Filename);
 563         if (Enode->FilenameLength < 6)
 564         {
 565             Enode->FilenameLength = 6;
 566         }
 567     }
 568 
 569     Enode->MessageId            = MessageId;
 570     Enode->Level                = Level;
 571     Enode->LineNumber           = LineNumber;
 572     Enode->LogicalLineNumber    = LineNumber;
 573     Enode->LogicalByteOffset    = 0;
 574     Enode->Column               = Column;
 575     Enode->Message              = MessageBuffer;
 576     Enode->SourceLine           = LineBuffer;
 577 
 578     /* Add the new node to the error node list */
 579 
 580     AeAddToErrorLog (Enode);
 581 
 582     if (Gbl_DebugFlag)
 583     {
 584         /* stderr is a file, send error to it immediately */
 585 
 586         AePrintException (ASL_FILE_STDERR, Enode, NULL);
 587     }
 588 
 589     Gbl_ExceptionCount[Level]++;
 590 }
 591 
 592 
 593 /*******************************************************************************
 594  *
 595  * FUNCTION:    AslCommonError
 596  *
 597  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
 598  *              MessageId           - Index into global message buffer
 599  *              CurrentLineNumber   - Actual file line number
 600  *              LogicalLineNumber   - Cumulative line number
 601  *              LogicalByteOffset   - Byte offset in source file
 602  *              Column              - Column in current line
 603  *              Filename            - source filename
 604  *              ExtraMessage        - additional error message
 605  *
 606  * RETURN:      None
 607  *
 608  * DESCRIPTION: Create a new error node and add it to the error log
 609  *
 610  ******************************************************************************/
 611 
 612 void
 613 AslCommonError (
 614     UINT8                   Level,
 615     UINT8                   MessageId,
 616     UINT32                  CurrentLineNumber,
 617     UINT32                  LogicalLineNumber,
 618     UINT32                  LogicalByteOffset,
 619     UINT32                  Column,
 620     char                    *Filename,
 621     char                    *ExtraMessage)
 622 {
 623     char                    *MessageBuffer = NULL;
 624     ASL_ERROR_MSG           *Enode;
 625 
 626 
 627     Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
 628 
 629     if (ExtraMessage)
 630     {
 631         /* Allocate a buffer for the message and a new error node */
 632 
 633         MessageBuffer = UtLocalCalloc (strlen (ExtraMessage) + 1);
 634 
 635         /* Keep a copy of the extra message */
 636 
 637         ACPI_STRCPY (MessageBuffer, ExtraMessage);
 638     }
 639 
 640     /* Initialize the error node */
 641 
 642     if (Filename)
 643     {
 644         Enode->Filename       = Filename;
 645         Enode->FilenameLength = strlen (Filename);
 646         if (Enode->FilenameLength < 6)
 647         {
 648             Enode->FilenameLength = 6;
 649         }
 650     }
 651 
 652     Enode->MessageId            = MessageId;
 653     Enode->Level                = Level;
 654     Enode->LineNumber           = CurrentLineNumber;
 655     Enode->LogicalLineNumber    = LogicalLineNumber;
 656     Enode->LogicalByteOffset    = LogicalByteOffset;
 657     Enode->Column               = Column;
 658     Enode->Message              = MessageBuffer;
 659     Enode->SourceLine           = NULL;
 660 
 661     /* Add the new node to the error node list */
 662 
 663     AeAddToErrorLog (Enode);
 664 
 665     if (Gbl_DebugFlag)
 666     {
 667         /* stderr is a file, send error to it immediately */
 668 
 669         AePrintException (ASL_FILE_STDERR, Enode, NULL);
 670     }
 671 
 672     Gbl_ExceptionCount[Level]++;
 673     if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
 674     {
 675         printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
 676 
 677         Gbl_SourceLine = 0;
 678         Gbl_NextError = Gbl_ErrorLog;
 679         CmCleanupAndExit ();
 680         exit(1);
 681     }
 682 
 683     return;
 684 }
 685 
 686 
 687 /*******************************************************************************
 688  *
 689  * FUNCTION:    AslDisableException
 690  *
 691  * PARAMETERS:  MessageIdString     - ID to be disabled
 692  *
 693  * RETURN:      Status
 694  *
 695  * DESCRIPTION: Enter a message ID into the global disabled messages table
 696  *
 697  ******************************************************************************/
 698 
 699 ACPI_STATUS
 700 AslDisableException (
 701     char                    *MessageIdString)
 702 {
 703     UINT32                  MessageId;
 704 
 705 
 706     /* Convert argument to an integer and validate it */
 707 
 708     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
 709 
 710     if ((MessageId < 2000) || (MessageId > 5999))
 711     {
 712         printf ("\"%s\" is not a valid warning/remark ID\n",
 713             MessageIdString);
 714         return (AE_BAD_PARAMETER);
 715     }
 716 
 717     /* Insert value into the global disabled message array */
 718 
 719     if (Gbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES)
 720     {
 721         printf ("Too many messages have been disabled (max %u)\n",
 722             ASL_MAX_DISABLED_MESSAGES);
 723         return (AE_LIMIT);
 724     }
 725 
 726     Gbl_DisabledMessages[Gbl_DisabledMessagesIndex] = MessageId;
 727     Gbl_DisabledMessagesIndex++;
 728     return (AE_OK);
 729 }
 730 
 731 
 732 /*******************************************************************************
 733  *
 734  * FUNCTION:    AslIsExceptionDisabled
 735  *
 736  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
 737  *              MessageId           - Index into global message buffer
 738  *
 739  * RETURN:      TRUE if exception/message should be ignored
 740  *
 741  * DESCRIPTION: Check if the user has specified options such that this
 742  *              exception should be ignored
 743  *
 744  ******************************************************************************/
 745 
 746 BOOLEAN
 747 AslIsExceptionDisabled (
 748     UINT8                   Level,
 749     UINT8                   MessageId)
 750 {
 751     UINT32                  EncodedMessageId;
 752     UINT32                  i;
 753 
 754 
 755     switch (Level)
 756     {
 757     case ASL_WARNING2:
 758     case ASL_WARNING3:
 759 
 760         /* Check for global disable via -w1/-w2/-w3 options */
 761 
 762         if (Level > Gbl_WarningLevel)
 763         {
 764             return (TRUE);
 765         }
 766         /* Fall through */
 767 
 768     case ASL_WARNING:
 769     case ASL_REMARK:
 770         /*
 771          * Ignore this warning/remark if it has been disabled by
 772          * the user (-vw option)
 773          */
 774         EncodedMessageId = MessageId + ((Level + 1) * 1000);
 775         for (i = 0; i < Gbl_DisabledMessagesIndex; i++)
 776         {
 777             /* Simple implementation via fixed array */
 778 
 779             if (EncodedMessageId == Gbl_DisabledMessages[i])
 780             {
 781                 return (TRUE);
 782             }
 783         }
 784         break;
 785 
 786     default:
 787         break;
 788     }
 789 
 790     return (FALSE);
 791 }
 792 
 793 
 794 /*******************************************************************************
 795  *
 796  * FUNCTION:    AslError
 797  *
 798  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
 799  *              MessageId           - Index into global message buffer
 800  *              Op                  - Parse node where error happened
 801  *              ExtraMessage        - additional error message
 802  *
 803  * RETURN:      None
 804  *
 805  * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
 806  *              except the parser.)
 807  *
 808  ******************************************************************************/
 809 
 810 void
 811 AslError (
 812     UINT8                   Level,
 813     UINT8                   MessageId,
 814     ACPI_PARSE_OBJECT       *Op,
 815     char                    *ExtraMessage)
 816 {
 817 
 818     /* Check if user wants to ignore this exception */
 819 
 820     if (AslIsExceptionDisabled (Level, MessageId))
 821     {
 822         return;
 823     }
 824 
 825     if (Op)
 826     {
 827         AslCommonError (Level, MessageId, Op->Asl.LineNumber,
 828             Op->Asl.LogicalLineNumber,
 829             Op->Asl.LogicalByteOffset,
 830             Op->Asl.Column,
 831             Op->Asl.Filename, ExtraMessage);
 832     }
 833     else
 834     {
 835         AslCommonError (Level, MessageId, 0,
 836             0, 0, 0, NULL, ExtraMessage);
 837     }
 838 }
 839 
 840 
 841 /*******************************************************************************
 842  *
 843  * FUNCTION:    AslCoreSubsystemError
 844  *
 845  * PARAMETERS:  Op                  - Parse node where error happened
 846  *              Status              - The ACPI CA Exception
 847  *              ExtraMessage        - additional error message
 848  *              Abort               - TRUE -> Abort compilation
 849  *
 850  * RETURN:      None
 851  *
 852  * DESCRIPTION: Error reporting routine for exceptions returned by the ACPI
 853  *              CA core subsystem.
 854  *
 855  ******************************************************************************/
 856 
 857 void
 858 AslCoreSubsystemError (
 859     ACPI_PARSE_OBJECT       *Op,
 860     ACPI_STATUS             Status,
 861     char                    *ExtraMessage,
 862     BOOLEAN                 Abort)
 863 {
 864 
 865     sprintf (MsgBuffer, "%s %s", AcpiFormatException (Status), ExtraMessage);
 866 
 867     if (Op)
 868     {
 869         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Op->Asl.LineNumber,
 870                         Op->Asl.LogicalLineNumber,
 871                         Op->Asl.LogicalByteOffset,
 872                         Op->Asl.Column,
 873                         Op->Asl.Filename, MsgBuffer);
 874     }
 875     else
 876     {
 877         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, 0,
 878                         0, 0, 0, NULL, MsgBuffer);
 879     }
 880 
 881     if (Abort)
 882     {
 883         AslAbort ();
 884     }
 885 }
 886 
 887 
 888 /*******************************************************************************
 889  *
 890  * FUNCTION:    AslCompilererror
 891  *
 892  * PARAMETERS:  CompilerMessage         - Error message from the parser
 893  *
 894  * RETURN:      Status (0 for now)
 895  *
 896  * DESCRIPTION: Report an error situation discovered in a production
 897  *              NOTE: don't change the name of this function, it is called
 898  *              from the auto-generated parser.
 899  *
 900  ******************************************************************************/
 901 
 902 int
 903 AslCompilererror (
 904     const char              *CompilerMessage)
 905 {
 906 
 907     AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber,
 908         Gbl_LogicalLineNumber, Gbl_CurrentLineOffset,
 909         Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename,
 910         ACPI_CAST_PTR (char, CompilerMessage));
 911 
 912     return (0);
 913 }