Home | History | Annotate | Line # | Download | only in compiler
aslerror.c revision 1.10
      1   1.1    jruoho /******************************************************************************
      2   1.1    jruoho  *
      3   1.1    jruoho  * Module Name: aslerror - Error handling and statistics
      4   1.1    jruoho  *
      5   1.1    jruoho  *****************************************************************************/
      6   1.1    jruoho 
      7   1.2  christos /*
      8  1.10  christos  * Copyright (C) 2000 - 2018, Intel Corp.
      9   1.1    jruoho  * All rights reserved.
     10   1.1    jruoho  *
     11   1.2  christos  * Redistribution and use in source and binary forms, with or without
     12   1.2  christos  * modification, are permitted provided that the following conditions
     13   1.2  christos  * are met:
     14   1.2  christos  * 1. Redistributions of source code must retain the above copyright
     15   1.2  christos  *    notice, this list of conditions, and the following disclaimer,
     16   1.2  christos  *    without modification.
     17   1.2  christos  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18   1.2  christos  *    substantially similar to the "NO WARRANTY" disclaimer below
     19   1.2  christos  *    ("Disclaimer") and any redistribution must be conditioned upon
     20   1.2  christos  *    including a substantially similar Disclaimer requirement for further
     21   1.2  christos  *    binary redistribution.
     22   1.2  christos  * 3. Neither the names of the above-listed copyright holders nor the names
     23   1.2  christos  *    of any contributors may be used to endorse or promote products derived
     24   1.2  christos  *    from this software without specific prior written permission.
     25   1.2  christos  *
     26   1.2  christos  * Alternatively, this software may be distributed under the terms of the
     27   1.2  christos  * GNU General Public License ("GPL") version 2 as published by the Free
     28   1.2  christos  * Software Foundation.
     29   1.2  christos  *
     30   1.2  christos  * NO WARRANTY
     31   1.2  christos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32   1.2  christos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33   1.2  christos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34   1.2  christos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35   1.2  christos  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36   1.2  christos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37   1.2  christos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38   1.2  christos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39   1.2  christos  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40   1.2  christos  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41   1.2  christos  * POSSIBILITY OF SUCH DAMAGES.
     42   1.2  christos  */
     43   1.1    jruoho 
     44   1.1    jruoho #include "aslcompiler.h"
     45   1.1    jruoho 
     46   1.1    jruoho #define _COMPONENT          ACPI_COMPILER
     47   1.1    jruoho         ACPI_MODULE_NAME    ("aslerror")
     48   1.1    jruoho 
     49   1.1    jruoho /* Local prototypes */
     50   1.1    jruoho 
     51   1.1    jruoho static void
     52   1.1    jruoho AeAddToErrorLog (
     53   1.1    jruoho     ASL_ERROR_MSG           *Enode);
     54   1.1    jruoho 
     55   1.8  christos static BOOLEAN
     56   1.8  christos AslIsExceptionExpected (
     57   1.8  christos     UINT8                   Level,
     58   1.8  christos     UINT16                  MessageId);
     59   1.8  christos 
     60   1.8  christos static BOOLEAN
     61   1.8  christos AslIsExceptionDisabled (
     62   1.8  christos     UINT8                   Level,
     63   1.8  christos     UINT16                  MessageId);
     64   1.8  christos 
     65   1.9  christos static void AslInitEnode (
     66   1.9  christos     ASL_ERROR_MSG           **Enode,
     67   1.9  christos     UINT8                   Level,
     68   1.9  christos     UINT16                  MessageId,
     69   1.9  christos     UINT32                  LineNumber,
     70   1.9  christos     UINT32                  LogicalLineNumber,
     71   1.9  christos     UINT32                  LogicalByteOffset,
     72   1.9  christos     UINT32                  Column,
     73   1.9  christos     char                    *Filename,
     74   1.9  christos     char                    *Message,
     75   1.9  christos     char                    *SourceLine,
     76   1.9  christos     ASL_ERROR_MSG           *SubError);
     77   1.9  christos 
     78   1.9  christos static void
     79   1.9  christos AslLogNewError (
     80   1.9  christos     UINT8                   Level,
     81   1.9  christos     UINT16                  MessageId,
     82   1.9  christos     UINT32                  LineNumber,
     83   1.9  christos     UINT32                  LogicalLineNumber,
     84   1.9  christos     UINT32                  LogicalByteOffset,
     85   1.9  christos     UINT32                  Column,
     86   1.9  christos     char                    *Filename,
     87   1.9  christos     char                    *Message,
     88   1.9  christos     char                    *SourceLine,
     89   1.9  christos     ASL_ERROR_MSG           *SubError);
     90   1.9  christos 
     91   1.9  christos static void
     92   1.9  christos AePrintSubError (
     93   1.9  christos     FILE                    *OutputFile,
     94   1.9  christos     ASL_ERROR_MSG           *Enode);
     95   1.9  christos 
     96   1.1    jruoho 
     97   1.2  christos /*******************************************************************************
     98   1.2  christos  *
     99   1.3  christos  * FUNCTION:    AslAbort
    100   1.3  christos  *
    101   1.3  christos  * PARAMETERS:  None
    102   1.3  christos  *
    103   1.3  christos  * RETURN:      None
    104   1.3  christos  *
    105   1.3  christos  * DESCRIPTION: Dump the error log and abort the compiler. Used for serious
    106   1.3  christos  *              I/O errors.
    107   1.3  christos  *
    108   1.3  christos  ******************************************************************************/
    109   1.3  christos 
    110   1.3  christos void
    111   1.3  christos AslAbort (
    112   1.3  christos     void)
    113   1.3  christos {
    114   1.3  christos 
    115   1.3  christos     AePrintErrorLog (ASL_FILE_STDERR);
    116   1.3  christos     if (Gbl_DebugFlag)
    117   1.3  christos     {
    118   1.3  christos         /* Print error summary to stdout also */
    119   1.3  christos 
    120   1.3  christos         AePrintErrorLog (ASL_FILE_STDOUT);
    121   1.3  christos     }
    122   1.3  christos 
    123   1.3  christos     exit (1);
    124   1.3  christos }
    125   1.3  christos 
    126   1.3  christos 
    127   1.3  christos /*******************************************************************************
    128   1.3  christos  *
    129   1.2  christos  * FUNCTION:    AeClearErrorLog
    130   1.2  christos  *
    131   1.2  christos  * PARAMETERS:  None
    132   1.2  christos  *
    133   1.2  christos  * RETURN:      None
    134   1.2  christos  *
    135   1.2  christos  * DESCRIPTION: Empty the error list
    136   1.2  christos  *
    137   1.2  christos  ******************************************************************************/
    138   1.2  christos 
    139   1.1    jruoho void
    140   1.1    jruoho AeClearErrorLog (
    141   1.1    jruoho     void)
    142   1.1    jruoho {
    143   1.1    jruoho     ASL_ERROR_MSG           *Enode = Gbl_ErrorLog;
    144   1.1    jruoho     ASL_ERROR_MSG           *Next;
    145   1.1    jruoho 
    146   1.9  christos 
    147   1.1    jruoho     /* Walk the error node list */
    148   1.1    jruoho 
    149   1.1    jruoho     while (Enode)
    150   1.1    jruoho     {
    151   1.1    jruoho         Next = Enode->Next;
    152   1.1    jruoho         ACPI_FREE (Enode);
    153   1.1    jruoho         Enode = Next;
    154   1.1    jruoho     }
    155   1.1    jruoho 
    156   1.1    jruoho     Gbl_ErrorLog = NULL;
    157   1.1    jruoho }
    158   1.1    jruoho 
    159   1.1    jruoho 
    160   1.1    jruoho /*******************************************************************************
    161   1.1    jruoho  *
    162   1.1    jruoho  * FUNCTION:    AeAddToErrorLog
    163   1.1    jruoho  *
    164   1.1    jruoho  * PARAMETERS:  Enode       - An error node to add to the log
    165   1.1    jruoho  *
    166   1.1    jruoho  * RETURN:      None
    167   1.1    jruoho  *
    168   1.2  christos  * DESCRIPTION: Add a new error node to the error log. The error log is
    169   1.1    jruoho  *              ordered by the "logical" line number (cumulative line number
    170   1.1    jruoho  *              including all include files.)
    171   1.1    jruoho  *
    172   1.1    jruoho  ******************************************************************************/
    173   1.1    jruoho 
    174   1.1    jruoho static void
    175   1.1    jruoho AeAddToErrorLog (
    176   1.1    jruoho     ASL_ERROR_MSG           *Enode)
    177   1.1    jruoho {
    178   1.1    jruoho     ASL_ERROR_MSG           *Next;
    179   1.1    jruoho     ASL_ERROR_MSG           *Prev;
    180   1.1    jruoho 
    181   1.1    jruoho 
    182   1.1    jruoho     /* If Gbl_ErrorLog is null, this is the first error node */
    183   1.1    jruoho 
    184   1.1    jruoho     if (!Gbl_ErrorLog)
    185   1.1    jruoho     {
    186   1.1    jruoho         Gbl_ErrorLog = Enode;
    187   1.1    jruoho         return;
    188   1.1    jruoho     }
    189   1.1    jruoho 
    190   1.1    jruoho     /*
    191   1.1    jruoho      * Walk error list until we find a line number greater than ours.
    192   1.1    jruoho      * List is sorted according to line number.
    193   1.1    jruoho      */
    194   1.1    jruoho     Prev = NULL;
    195   1.1    jruoho     Next = Gbl_ErrorLog;
    196   1.1    jruoho 
    197   1.9  christos     while ((Next) && (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
    198   1.1    jruoho     {
    199   1.1    jruoho         Prev = Next;
    200   1.1    jruoho         Next = Next->Next;
    201   1.1    jruoho     }
    202   1.1    jruoho 
    203   1.1    jruoho     /* Found our place in the list */
    204   1.1    jruoho 
    205   1.1    jruoho     Enode->Next = Next;
    206   1.1    jruoho 
    207   1.1    jruoho     if (Prev)
    208   1.1    jruoho     {
    209   1.1    jruoho         Prev->Next = Enode;
    210   1.1    jruoho     }
    211   1.1    jruoho     else
    212   1.1    jruoho     {
    213   1.1    jruoho         Gbl_ErrorLog = Enode;
    214   1.1    jruoho     }
    215   1.1    jruoho }
    216   1.1    jruoho 
    217   1.1    jruoho 
    218   1.1    jruoho /*******************************************************************************
    219   1.1    jruoho  *
    220   1.9  christos  * FUNCTION:    AeDecodeErrorMessageId
    221   1.1    jruoho  *
    222   1.9  christos  * PARAMETERS:  OutputFile      - Output file
    223   1.1    jruoho  *              Enode           - Error node to print
    224   1.9  christos  *              PrematureEOF    - True = PrematureEOF has been reached
    225   1.9  christos  *              Total           - Total legth of line
    226   1.1    jruoho  *
    227   1.1    jruoho  * RETURN:      None
    228   1.1    jruoho  *
    229   1.9  christos  * DESCRIPTION: Print the source line of an error.
    230   1.1    jruoho  *
    231   1.1    jruoho  ******************************************************************************/
    232   1.1    jruoho 
    233   1.9  christos static void
    234   1.9  christos AeDecodeErrorMessageId (
    235   1.9  christos     FILE                    *OutputFile,
    236   1.1    jruoho     ASL_ERROR_MSG           *Enode,
    237   1.9  christos     BOOLEAN                 PrematureEOF,
    238   1.9  christos     UINT32                  Total)
    239   1.1    jruoho {
    240   1.1    jruoho     UINT32                  MsgLength;
    241   1.3  christos     const char              *MainMessage;
    242   1.1    jruoho     char                    *ExtraMessage;
    243   1.1    jruoho     UINT32                  SourceColumn;
    244   1.1    jruoho     UINT32                  ErrorColumn;
    245   1.1    jruoho 
    246   1.1    jruoho 
    247   1.9  christos     fprintf (OutputFile, "%s %4.4d -",
    248   1.9  christos         AeDecodeExceptionLevel (Enode->Level),
    249   1.9  christos         AeBuildFullExceptionCode (Enode->Level, Enode->MessageId));
    250   1.9  christos 
    251   1.9  christos     MainMessage = AeDecodeMessageId (Enode->MessageId);
    252   1.9  christos     ExtraMessage = Enode->Message;
    253   1.9  christos 
    254   1.9  christos     /* If a NULL line number, just print the decoded message */
    255   1.9  christos 
    256   1.9  christos     if (!Enode->LineNumber)
    257   1.1    jruoho     {
    258   1.9  christos         fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
    259   1.1    jruoho         return;
    260   1.1    jruoho     }
    261   1.1    jruoho 
    262   1.9  christos     MsgLength = strlen (MainMessage);
    263   1.9  christos     if (MsgLength == 0)
    264   1.1    jruoho     {
    265   1.9  christos         /* Use the secondary/extra message as main message */
    266   1.9  christos 
    267   1.9  christos         MainMessage = Enode->Message;
    268   1.9  christos         if (!MainMessage)
    269   1.9  christos         {
    270   1.9  christos             MainMessage = "";
    271   1.9  christos         }
    272   1.9  christos 
    273   1.9  christos         MsgLength = strlen (MainMessage);
    274   1.9  christos         ExtraMessage = NULL;
    275   1.9  christos     }
    276   1.1    jruoho 
    277   1.9  christos     if (Gbl_VerboseErrors && !PrematureEOF)
    278   1.9  christos     {
    279   1.9  christos         if (Total >= 256)
    280   1.9  christos         {
    281   1.9  christos             fprintf (OutputFile, "    %s",
    282   1.9  christos                 MainMessage);
    283   1.9  christos         }
    284   1.9  christos         else
    285   1.1    jruoho         {
    286   1.9  christos             SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
    287   1.9  christos             ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
    288   1.2  christos 
    289   1.9  christos             if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
    290   1.2  christos             {
    291   1.9  christos                 fprintf (OutputFile, "%*s%s",
    292   1.9  christos                     (int) ((SourceColumn - 1) - ErrorColumn),
    293   1.9  christos                     MainMessage, " ^ ");
    294   1.2  christos             }
    295   1.9  christos             else
    296   1.1    jruoho             {
    297   1.9  christos                 fprintf (OutputFile, "%*s %s",
    298   1.9  christos                     (int) ((SourceColumn - ErrorColumn) + 1), "^",
    299   1.9  christos                     MainMessage);
    300   1.1    jruoho             }
    301   1.9  christos         }
    302   1.9  christos     }
    303   1.9  christos     else
    304   1.9  christos     {
    305   1.9  christos         fprintf (OutputFile, " %s", MainMessage);
    306   1.9  christos     }
    307   1.1    jruoho 
    308   1.9  christos     /* Print the extra info message if present */
    309   1.2  christos 
    310   1.9  christos     if (ExtraMessage)
    311   1.9  christos     {
    312   1.9  christos         fprintf (OutputFile, " (%s)", ExtraMessage);
    313   1.9  christos     }
    314   1.1    jruoho 
    315   1.9  christos     if (PrematureEOF)
    316   1.9  christos     {
    317   1.9  christos         fprintf (OutputFile, " and premature End-Of-File");
    318   1.9  christos     }
    319   1.2  christos 
    320   1.9  christos     fprintf (OutputFile, "\n");
    321   1.9  christos     if (Gbl_VerboseErrors && !Enode->SubError)
    322   1.9  christos     {
    323   1.9  christos         fprintf (OutputFile, "\n");
    324   1.1    jruoho     }
    325   1.9  christos }
    326   1.9  christos 
    327   1.9  christos 
    328   1.9  christos /*******************************************************************************
    329   1.9  christos  *
    330   1.9  christos  * FUNCTION:    AePrintErrorSourceLine
    331   1.9  christos  *
    332   1.9  christos  * PARAMETERS:  OutputFile      - Output file
    333   1.9  christos  *              Enode           - Error node to print
    334   1.9  christos  *              PrematureEOF    - True = PrematureEOF has been reached
    335   1.9  christos  *              Total           - amount of characters printed so far
    336   1.9  christos  *
    337   1.9  christos  *
    338   1.9  christos  * RETURN:      Status
    339   1.9  christos  *
    340   1.9  christos  * DESCRIPTION: Print the source line of an error.
    341   1.9  christos  *
    342   1.9  christos  ******************************************************************************/
    343   1.1    jruoho 
    344   1.9  christos static ACPI_STATUS
    345   1.9  christos AePrintErrorSourceLine (
    346   1.9  christos     FILE                    *OutputFile,
    347   1.9  christos     ASL_ERROR_MSG           *Enode,
    348   1.9  christos     BOOLEAN                 *PrematureEOF,
    349   1.9  christos     UINT32                  *Total)
    350   1.9  christos {
    351   1.9  christos     UINT8                   SourceByte;
    352   1.9  christos     int                     Actual;
    353   1.9  christos     size_t                  RActual;
    354   1.9  christos     FILE                    *SourceFile = NULL;
    355   1.9  christos     long                    FileSize;
    356   1.1    jruoho 
    357   1.2  christos 
    358   1.2  christos     if (!Enode->SourceLine)
    359   1.2  christos     {
    360   1.6  christos         /*
    361   1.6  christos          * Use the merged header/source file if present, otherwise
    362   1.6  christos          * use input file
    363   1.6  christos          */
    364   1.2  christos         SourceFile = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
    365   1.2  christos         if (!SourceFile)
    366   1.2  christos         {
    367   1.2  christos             SourceFile = Gbl_Files[ASL_FILE_INPUT].Handle;
    368   1.2  christos         }
    369   1.2  christos 
    370   1.2  christos         if (SourceFile)
    371   1.2  christos         {
    372   1.2  christos             /* Determine if the error occurred at source file EOF */
    373   1.2  christos 
    374   1.2  christos             fseek (SourceFile, 0, SEEK_END);
    375   1.2  christos             FileSize = ftell (SourceFile);
    376   1.2  christos 
    377   1.2  christos             if ((long) Enode->LogicalByteOffset >= FileSize)
    378   1.2  christos             {
    379   1.9  christos                 *PrematureEOF = TRUE;
    380   1.2  christos             }
    381   1.2  christos         }
    382   1.9  christos         else
    383   1.9  christos         {
    384   1.9  christos             fprintf (OutputFile,
    385   1.9  christos                 "[*** iASL: Source File Does not exist ***]\n");
    386   1.9  christos             return AE_IO_ERROR;
    387   1.9  christos         }
    388   1.1    jruoho     }
    389   1.1    jruoho 
    390   1.1    jruoho     /* Print filename and line number if present and valid */
    391   1.1    jruoho 
    392   1.9  christos     if (Gbl_VerboseErrors)
    393   1.1    jruoho     {
    394   1.9  christos         fprintf (OutputFile, "%-8s", Enode->Filename);
    395   1.9  christos 
    396   1.9  christos         if (Enode->SourceLine && Enode->LineNumber)
    397   1.9  christos         {
    398   1.9  christos             fprintf (OutputFile, " %6u: %s",
    399   1.9  christos                 Enode->LineNumber, Enode->SourceLine);
    400   1.9  christos         }
    401   1.9  christos         else if (Enode->LineNumber)
    402   1.1    jruoho         {
    403   1.9  christos             fprintf (OutputFile, " %6u: ", Enode->LineNumber);
    404   1.9  christos 
    405   1.9  christos             /*
    406   1.9  christos              * If not at EOF, get the corresponding source code line
    407   1.9  christos              * and display it. Don't attempt this if we have a
    408   1.9  christos              * premature EOF condition.
    409   1.9  christos              */
    410   1.9  christos             if (*PrematureEOF)
    411   1.9  christos             {
    412   1.9  christos                 fprintf (OutputFile, "\n");
    413   1.9  christos                 return AE_OK;
    414   1.9  christos             }
    415   1.9  christos             /*
    416   1.9  christos              * Seek to the offset in the combined source file,
    417   1.9  christos              * read the source line, and write it to the output.
    418   1.9  christos              */
    419   1.9  christos             Actual = fseek (SourceFile,
    420   1.9  christos                 (long) Enode->LogicalByteOffset, (int) SEEK_SET);
    421   1.9  christos             if (Actual)
    422   1.9  christos             {
    423   1.9  christos                 fprintf (OutputFile,
    424   1.9  christos                     "[*** iASL: Seek error on source code temp file %s ***]",
    425   1.9  christos                     Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
    426   1.9  christos 
    427   1.9  christos                 fprintf (OutputFile, "\n");
    428   1.9  christos                 return AE_OK;
    429   1.9  christos             }
    430   1.9  christos             RActual = fread (&SourceByte, 1, 1, SourceFile);
    431   1.9  christos             if (RActual != 1)
    432   1.9  christos             {
    433   1.9  christos                 fprintf (OutputFile,
    434   1.9  christos                     "[*** iASL: Read error on source code temp file %s ***]",
    435   1.9  christos                     Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
    436   1.9  christos                 return AE_IO_ERROR;
    437   1.9  christos             }
    438   1.9  christos                 /* Read/write the source line, up to the maximum line length */
    439   1.1    jruoho 
    440   1.9  christos             while (RActual && SourceByte && (SourceByte != '\n'))
    441   1.1    jruoho             {
    442   1.9  christos                 if (*Total < 256)
    443   1.1    jruoho                 {
    444   1.9  christos                     /* After the max line length, we will just read the line, no write */
    445   1.9  christos 
    446   1.9  christos                     if (fwrite (&SourceByte, 1, 1, OutputFile) != 1)
    447   1.9  christos                     {
    448   1.9  christos                         printf ("[*** iASL: Write error on output file ***]\n");
    449   1.9  christos                         return AE_IO_ERROR;
    450   1.9  christos                     }
    451   1.1    jruoho                 }
    452   1.9  christos                 else if (*Total == 256)
    453   1.1    jruoho                 {
    454   1.9  christos                     fprintf (OutputFile,
    455   1.9  christos                         "\n[*** iASL: Very long input line, message below refers to column %u ***]",
    456   1.9  christos                         Enode->Column);
    457   1.9  christos                 }
    458   1.2  christos 
    459   1.9  christos                 RActual = fread (&SourceByte, 1, 1, SourceFile);
    460   1.9  christos                 if (RActual != 1)
    461   1.9  christos                 {
    462   1.9  christos                     fprintf (OutputFile,
    463   1.9  christos                         "[*** iASL: Read error on source code temp file %s ***]",
    464   1.9  christos                         Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
    465   1.1    jruoho 
    466   1.9  christos                     return AE_IO_ERROR;
    467   1.1    jruoho                 }
    468   1.9  christos                 *Total += 1;
    469   1.1    jruoho             }
    470   1.1    jruoho 
    471   1.9  christos             fprintf (OutputFile, "\n");
    472   1.1    jruoho         }
    473   1.1    jruoho     }
    474   1.9  christos     else
    475   1.9  christos     {
    476   1.9  christos         /*
    477   1.9  christos          * Less verbose version of the error message, enabled via the
    478   1.9  christos          * -vi switch. The format is compatible with MS Visual Studio.
    479   1.9  christos          */
    480   1.9  christos         fprintf (OutputFile, "%s", Enode->Filename);
    481   1.1    jruoho 
    482   1.9  christos         if (Enode->LineNumber)
    483   1.9  christos         {
    484   1.9  christos             fprintf (OutputFile, "(%u) : ",
    485   1.9  christos                 Enode->LineNumber);
    486   1.9  christos         }
    487   1.3  christos     }
    488   1.3  christos 
    489   1.9  christos     return AE_OK;
    490   1.9  christos }
    491   1.3  christos 
    492   1.9  christos /*******************************************************************************
    493   1.9  christos  *
    494   1.9  christos  * FUNCTION:    AePrintException
    495   1.9  christos  *
    496   1.9  christos  * PARAMETERS:  FileId          - ID of output file
    497   1.9  christos  *              Enode           - Error node to print
    498   1.9  christos  *              Header          - Additional text before each message
    499   1.9  christos  *
    500   1.9  christos  * RETURN:      None
    501   1.9  christos  *
    502   1.9  christos  * DESCRIPTION: Print the contents of an error node.
    503   1.9  christos  *
    504   1.9  christos  * NOTE:        We don't use the FlxxxFile I/O functions here because on error
    505   1.9  christos  *              they abort the compiler and call this function!  Since we
    506   1.9  christos  *              are reporting errors here, we ignore most output errors and
    507   1.9  christos  *              just try to get out as much as we can.
    508   1.9  christos  *
    509   1.9  christos  ******************************************************************************/
    510   1.3  christos 
    511   1.9  christos void
    512   1.9  christos AePrintException (
    513   1.9  christos     UINT32                  FileId,
    514   1.9  christos     ASL_ERROR_MSG           *Enode,
    515   1.9  christos     char                    *Header)
    516   1.9  christos {
    517   1.9  christos     FILE                    *OutputFile;
    518   1.9  christos     BOOLEAN                 PrematureEOF = FALSE;
    519   1.9  christos     UINT32                  Total = 0;
    520   1.9  christos     ACPI_STATUS             Status;
    521   1.9  christos     ASL_ERROR_MSG           *Child = Enode->SubError;
    522   1.3  christos 
    523   1.3  christos 
    524   1.9  christos     if (Gbl_NoErrors)
    525   1.3  christos     {
    526   1.3  christos         return;
    527   1.1    jruoho     }
    528   1.3  christos 
    529   1.9  christos     /*
    530   1.9  christos      * Only listing files have a header, and remarks/optimizations
    531   1.9  christos      * are always output
    532   1.9  christos      */
    533   1.9  christos     if (!Header)
    534   1.1    jruoho     {
    535   1.9  christos         /* Ignore remarks if requested */
    536   1.1    jruoho 
    537   1.9  christos         switch (Enode->Level)
    538   1.2  christos         {
    539   1.9  christos         case ASL_WARNING:
    540   1.9  christos         case ASL_WARNING2:
    541   1.9  christos         case ASL_WARNING3:
    542   1.3  christos 
    543   1.9  christos             if (!Gbl_DisplayWarnings)
    544   1.9  christos             {
    545   1.9  christos                 return;
    546   1.9  christos             }
    547   1.9  christos             break;
    548   1.3  christos 
    549   1.9  christos         case ASL_REMARK:
    550   1.2  christos 
    551   1.9  christos             if (!Gbl_DisplayRemarks)
    552   1.2  christos             {
    553   1.9  christos                 return;
    554   1.1    jruoho             }
    555   1.9  christos             break;
    556   1.9  christos 
    557   1.9  christos         case ASL_OPTIMIZATION:
    558   1.9  christos 
    559   1.9  christos             if (!Gbl_DisplayOptimizations)
    560   1.1    jruoho             {
    561   1.9  christos                 return;
    562   1.1    jruoho             }
    563   1.9  christos             break;
    564   1.9  christos 
    565   1.9  christos         default:
    566   1.9  christos 
    567   1.9  christos             break;
    568   1.3  christos         }
    569   1.3  christos     }
    570   1.9  christos 
    571   1.9  christos     /* Get the various required file handles */
    572   1.9  christos 
    573   1.9  christos     OutputFile = Gbl_Files[FileId].Handle;
    574   1.9  christos 
    575   1.9  christos     if (Header)
    576   1.3  christos     {
    577   1.9  christos         fprintf (OutputFile, "%s", Header);
    578   1.3  christos     }
    579   1.1    jruoho 
    580   1.9  christos     if (!Enode->Filename)
    581   1.9  christos     {
    582   1.9  christos         AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
    583   1.9  christos         return;
    584   1.9  christos     }
    585   1.1    jruoho 
    586   1.9  christos     Status = AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
    587   1.9  christos     if (ACPI_FAILURE (Status))
    588   1.3  christos     {
    589   1.9  christos         return;
    590   1.3  christos     }
    591   1.1    jruoho 
    592   1.9  christos     /* If a NULL message ID, just print the raw message */
    593   1.9  christos 
    594   1.9  christos     if (Enode->MessageId == 0)
    595   1.3  christos     {
    596   1.9  christos         fprintf (OutputFile, "%s\n", Enode->Message);
    597   1.9  christos         return;
    598   1.3  christos     }
    599   1.2  christos 
    600   1.9  christos     AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
    601   1.9  christos 
    602   1.9  christos     while (Child)
    603   1.3  christos     {
    604   1.3  christos         fprintf (OutputFile, "\n");
    605   1.9  christos         AePrintSubError (OutputFile, Child);
    606   1.9  christos         Child = Child->SubError;
    607   1.1    jruoho     }
    608   1.1    jruoho }
    609   1.1    jruoho 
    610   1.1    jruoho 
    611   1.1    jruoho /*******************************************************************************
    612   1.1    jruoho  *
    613   1.9  christos  * FUNCTION:    AePrintSubError
    614   1.9  christos  *
    615   1.9  christos  * PARAMETERS:  OutputFile      - Output file
    616   1.9  christos  *              Enode           - Error node to print
    617   1.9  christos  *
    618   1.9  christos  * RETURN:      None
    619   1.9  christos  *
    620   1.9  christos  * DESCRIPTION: Print the contents of an error nodes. This function is tailored
    621   1.9  christos  *              to print error nodes that are SubErrors within ASL_ERROR_MSG
    622   1.9  christos  *
    623   1.9  christos  ******************************************************************************/
    624   1.9  christos 
    625   1.9  christos static void
    626   1.9  christos AePrintSubError (
    627   1.9  christos     FILE                    *OutputFile,
    628   1.9  christos     ASL_ERROR_MSG           *Enode)
    629   1.9  christos {
    630   1.9  christos     UINT32                  Total = 0;
    631   1.9  christos     BOOLEAN                 PrematureEOF = FALSE;
    632   1.9  christos     const char              *MainMessage;
    633   1.9  christos 
    634   1.9  christos 
    635   1.9  christos     MainMessage = AeDecodeMessageId (Enode->MessageId);
    636   1.9  christos 
    637   1.9  christos     fprintf (OutputFile, "    %s%s", MainMessage, "\n    ");
    638   1.9  christos     (void) AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
    639   1.9  christos     fprintf (OutputFile, "\n");
    640   1.9  christos }
    641   1.9  christos 
    642   1.9  christos 
    643   1.9  christos /*******************************************************************************
    644   1.9  christos  *
    645   1.1    jruoho  * FUNCTION:    AePrintErrorLog
    646   1.1    jruoho  *
    647   1.1    jruoho  * PARAMETERS:  FileId           - Where to output the error log
    648   1.1    jruoho  *
    649   1.1    jruoho  * RETURN:      None
    650   1.1    jruoho  *
    651   1.1    jruoho  * DESCRIPTION: Print the entire contents of the error log
    652   1.1    jruoho  *
    653   1.1    jruoho  ******************************************************************************/
    654   1.1    jruoho 
    655   1.1    jruoho void
    656   1.1    jruoho AePrintErrorLog (
    657   1.1    jruoho     UINT32                  FileId)
    658   1.1    jruoho {
    659   1.1    jruoho     ASL_ERROR_MSG           *Enode = Gbl_ErrorLog;
    660   1.1    jruoho 
    661   1.1    jruoho 
    662   1.1    jruoho     /* Walk the error node list */
    663   1.1    jruoho 
    664   1.1    jruoho     while (Enode)
    665   1.1    jruoho     {
    666   1.1    jruoho         AePrintException (FileId, Enode, NULL);
    667   1.1    jruoho         Enode = Enode->Next;
    668   1.1    jruoho     }
    669   1.1    jruoho }
    670   1.1    jruoho 
    671   1.1    jruoho 
    672   1.1    jruoho /*******************************************************************************
    673   1.1    jruoho  *
    674   1.9  christos  * FUNCTION:    AslInitEnode
    675   1.2  christos  *
    676   1.9  christos  * PARAMETERS:  InputEnode          - Input Error node to initialize
    677   1.9  christos  *              Level               - Seriousness (Warning/error, etc.)
    678   1.2  christos  *              MessageId           - Index into global message buffer
    679   1.9  christos  *              CurrentLineNumber   - Actual file line number
    680   1.9  christos  *              LogicalLineNumber   - Cumulative line number
    681   1.9  christos  *              LogicalByteOffset   - Byte offset in source file
    682   1.2  christos  *              Column              - Column in current line
    683   1.2  christos  *              Filename            - source filename
    684   1.2  christos  *              ExtraMessage        - additional error message
    685   1.9  christos  *              SourceLine          - Line of error source code
    686   1.9  christos  *              SubError            - SubError of this InputEnode
    687   1.2  christos  *
    688   1.2  christos  * RETURN:      None
    689   1.2  christos  *
    690   1.9  christos  * DESCRIPTION: Initialize an Error node
    691   1.2  christos  *
    692   1.2  christos  ******************************************************************************/
    693   1.2  christos 
    694   1.9  christos static void AslInitEnode (
    695   1.9  christos     ASL_ERROR_MSG           **InputEnode,
    696   1.2  christos     UINT8                   Level,
    697   1.3  christos     UINT16                  MessageId,
    698   1.2  christos     UINT32                  LineNumber,
    699   1.9  christos     UINT32                  LogicalLineNumber,
    700   1.9  christos     UINT32                  LogicalByteOffset,
    701   1.2  christos     UINT32                  Column,
    702   1.9  christos     char                    *Filename,
    703   1.9  christos     char                    *ExtraMessage,
    704   1.2  christos     char                    *SourceLine,
    705   1.9  christos     ASL_ERROR_MSG           *SubError)
    706   1.2  christos {
    707   1.2  christos     ASL_ERROR_MSG           *Enode;
    708   1.2  christos 
    709   1.2  christos 
    710   1.9  christos     *InputEnode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
    711   1.9  christos     Enode = *InputEnode;
    712   1.9  christos     Enode->Level                = Level;
    713   1.9  christos     Enode->MessageId            = MessageId;
    714   1.9  christos     Enode->LineNumber           = LineNumber;
    715   1.9  christos     Enode->LogicalLineNumber    = LogicalLineNumber;
    716   1.9  christos     Enode->LogicalByteOffset    = LogicalByteOffset;
    717   1.9  christos     Enode->Column               = Column;
    718   1.9  christos     Enode->SubError             = SubError;
    719   1.9  christos     Enode->Message              = NULL;
    720   1.9  christos     Enode->SourceLine           = NULL;
    721   1.9  christos     Enode->Filename             = NULL;
    722   1.2  christos 
    723   1.2  christos     if (ExtraMessage)
    724   1.2  christos     {
    725   1.2  christos         /* Allocate a buffer for the message and a new error node */
    726   1.2  christos 
    727   1.9  christos         Enode->Message = UtLocalCacheCalloc (strlen (ExtraMessage) + 1);
    728   1.2  christos 
    729   1.2  christos         /* Keep a copy of the extra message */
    730   1.2  christos 
    731   1.9  christos         strcpy (Enode->Message, ExtraMessage);
    732   1.2  christos     }
    733   1.2  christos 
    734   1.9  christos     if (SourceLine)
    735   1.9  christos     {
    736   1.9  christos         Enode->SourceLine = UtLocalCalloc (strlen (SourceLine) + 1);
    737   1.9  christos         strcpy (Enode->SourceLine, SourceLine);
    738   1.9  christos     }
    739   1.2  christos 
    740   1.2  christos 
    741   1.2  christos     if (Filename)
    742   1.2  christos     {
    743   1.3  christos         Enode->Filename = Filename;
    744   1.2  christos         Enode->FilenameLength = strlen (Filename);
    745   1.2  christos         if (Enode->FilenameLength < 6)
    746   1.2  christos         {
    747   1.2  christos             Enode->FilenameLength = 6;
    748   1.2  christos         }
    749   1.2  christos     }
    750   1.9  christos }
    751   1.2  christos 
    752   1.2  christos 
    753   1.9  christos /*******************************************************************************
    754   1.9  christos  *
    755   1.9  christos  * FUNCTION:    AslCommonError2
    756   1.9  christos  *
    757   1.9  christos  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    758   1.9  christos  *              MessageId           - Index into global message buffer
    759   1.9  christos  *              LineNumber          - Actual file line number
    760   1.9  christos  *              Column              - Column in current line
    761   1.9  christos  *              SourceLine          - Actual source code line
    762   1.9  christos  *              Filename            - source filename
    763   1.9  christos  *              ExtraMessage        - additional error message
    764   1.9  christos  *
    765   1.9  christos  * RETURN:      None
    766   1.9  christos  *
    767   1.9  christos  * DESCRIPTION: Create a new error node and add it to the error log
    768   1.9  christos  *
    769   1.9  christos  ******************************************************************************/
    770   1.2  christos 
    771   1.9  christos void
    772   1.9  christos AslCommonError2 (
    773   1.9  christos     UINT8                   Level,
    774   1.9  christos     UINT16                  MessageId,
    775   1.9  christos     UINT32                  LineNumber,
    776   1.9  christos     UINT32                  Column,
    777   1.9  christos     char                    *SourceLine,
    778   1.9  christos     char                    *Filename,
    779   1.9  christos     char                    *ExtraMessage)
    780   1.9  christos {
    781   1.9  christos     AslLogNewError (Level, MessageId, LineNumber, LineNumber, 0, Column,
    782   1.9  christos         Filename, ExtraMessage, SourceLine, NULL);
    783   1.2  christos }
    784   1.2  christos 
    785   1.2  christos 
    786   1.2  christos /*******************************************************************************
    787   1.2  christos  *
    788   1.1    jruoho  * FUNCTION:    AslCommonError
    789   1.1    jruoho  *
    790   1.1    jruoho  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    791   1.1    jruoho  *              MessageId           - Index into global message buffer
    792   1.1    jruoho  *              CurrentLineNumber   - Actual file line number
    793   1.1    jruoho  *              LogicalLineNumber   - Cumulative line number
    794   1.1    jruoho  *              LogicalByteOffset   - Byte offset in source file
    795   1.1    jruoho  *              Column              - Column in current line
    796   1.1    jruoho  *              Filename            - source filename
    797   1.1    jruoho  *              ExtraMessage        - additional error message
    798   1.1    jruoho  *
    799   1.1    jruoho  * RETURN:      None
    800   1.1    jruoho  *
    801   1.1    jruoho  * DESCRIPTION: Create a new error node and add it to the error log
    802   1.1    jruoho  *
    803   1.1    jruoho  ******************************************************************************/
    804   1.1    jruoho 
    805   1.1    jruoho void
    806   1.1    jruoho AslCommonError (
    807   1.1    jruoho     UINT8                   Level,
    808   1.3  christos     UINT16                  MessageId,
    809   1.1    jruoho     UINT32                  CurrentLineNumber,
    810   1.1    jruoho     UINT32                  LogicalLineNumber,
    811   1.1    jruoho     UINT32                  LogicalByteOffset,
    812   1.1    jruoho     UINT32                  Column,
    813   1.1    jruoho     char                    *Filename,
    814   1.1    jruoho     char                    *ExtraMessage)
    815   1.1    jruoho {
    816  1.10  christos     /* Check if user wants to ignore this exception */
    817  1.10  christos 
    818  1.10  christos     if (AslIsExceptionIgnored (Level, MessageId))
    819  1.10  christos     {
    820  1.10  christos         return;
    821  1.10  christos     }
    822  1.10  christos 
    823   1.9  christos     AslLogNewError (Level, MessageId, CurrentLineNumber, LogicalLineNumber,
    824   1.9  christos         LogicalByteOffset, Column, Filename, ExtraMessage,
    825   1.9  christos         NULL, NULL);
    826   1.9  christos }
    827   1.1    jruoho 
    828   1.1    jruoho 
    829   1.9  christos /*******************************************************************************
    830   1.9  christos  *
    831   1.9  christos  * FUNCTION:    AslLogNewError
    832   1.9  christos  *
    833   1.9  christos  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    834   1.9  christos  *              MessageId           - Index into global message buffer
    835   1.9  christos  *              CurrentLineNumber   - Actual file line number
    836   1.9  christos  *              LogicalLineNumber   - Cumulative line number
    837   1.9  christos  *              LogicalByteOffset   - Byte offset in source file
    838   1.9  christos  *              Column              - Column in current line
    839   1.9  christos  *              Filename            - source filename
    840   1.9  christos  *              Message             - additional error message
    841   1.9  christos  *              SourceLine          - Actual line of source code
    842   1.9  christos  *              SubError            - Sub-error associated with this error
    843   1.9  christos  *
    844   1.9  christos  * RETURN:      None
    845   1.9  christos  *
    846   1.9  christos  * DESCRIPTION: Create a new error node and add it to the error log
    847   1.9  christos  *
    848   1.9  christos  ******************************************************************************/
    849   1.9  christos static void
    850   1.9  christos AslLogNewError (
    851   1.9  christos     UINT8                   Level,
    852   1.9  christos     UINT16                  MessageId,
    853   1.9  christos     UINT32                  LineNumber,
    854   1.9  christos     UINT32                  LogicalLineNumber,
    855   1.9  christos     UINT32                  LogicalByteOffset,
    856   1.9  christos     UINT32                  Column,
    857   1.9  christos     char                    *Filename,
    858   1.9  christos     char                    *Message,
    859   1.9  christos     char                    *SourceLine,
    860   1.9  christos     ASL_ERROR_MSG           *SubError)
    861   1.9  christos {
    862   1.9  christos     ASL_ERROR_MSG           *Enode = NULL;
    863   1.1    jruoho 
    864   1.1    jruoho 
    865   1.9  christos     AslInitEnode (&Enode, Level, MessageId, LineNumber, LogicalLineNumber,
    866   1.9  christos         LogicalByteOffset, Column, Filename, Message, SourceLine,
    867   1.9  christos         SubError);
    868   1.1    jruoho 
    869   1.1    jruoho     /* Add the new node to the error node list */
    870   1.1    jruoho 
    871   1.1    jruoho     AeAddToErrorLog (Enode);
    872   1.1    jruoho 
    873   1.1    jruoho     if (Gbl_DebugFlag)
    874   1.1    jruoho     {
    875   1.1    jruoho         /* stderr is a file, send error to it immediately */
    876   1.1    jruoho 
    877   1.1    jruoho         AePrintException (ASL_FILE_STDERR, Enode, NULL);
    878   1.1    jruoho     }
    879   1.1    jruoho 
    880   1.1    jruoho     Gbl_ExceptionCount[Level]++;
    881   1.1    jruoho     if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
    882   1.1    jruoho     {
    883   1.1    jruoho         printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
    884   1.1    jruoho 
    885   1.1    jruoho         Gbl_SourceLine = 0;
    886   1.1    jruoho         Gbl_NextError = Gbl_ErrorLog;
    887   1.1    jruoho         CmCleanupAndExit ();
    888   1.1    jruoho         exit(1);
    889   1.1    jruoho     }
    890   1.1    jruoho 
    891   1.1    jruoho     return;
    892   1.1    jruoho }
    893   1.1    jruoho 
    894   1.8  christos /*******************************************************************************
    895   1.8  christos  *
    896   1.8  christos  * FUNCTION:    AslIsExceptionIgnored
    897   1.8  christos  *
    898   1.9  christos  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
    899   1.9  christos  *              MessageId       - Index into global message buffer
    900   1.8  christos  *
    901   1.8  christos  * RETURN:      BOOLEAN
    902   1.8  christos  *
    903   1.8  christos  * DESCRIPTION: Check if a particular exception is ignored. In this case it
    904   1.8  christos  *              means that the exception is (expected or disabled.
    905   1.8  christos  *
    906   1.8  christos  ******************************************************************************/
    907   1.8  christos 
    908   1.8  christos BOOLEAN
    909   1.8  christos AslIsExceptionIgnored (
    910   1.8  christos     UINT8                   Level,
    911   1.8  christos     UINT16                  MessageId)
    912   1.8  christos {
    913   1.9  christos     BOOLEAN                 ExceptionIgnored;
    914   1.8  christos 
    915   1.8  christos 
    916   1.8  christos     /* Note: this allows exception to be disabled and expected */
    917   1.8  christos 
    918   1.8  christos     ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
    919   1.8  christos     ExceptionIgnored |= AslIsExceptionExpected (Level, MessageId);
    920   1.8  christos 
    921   1.8  christos     return (Gbl_AllExceptionsDisabled || ExceptionIgnored);
    922   1.8  christos }
    923   1.8  christos 
    924   1.8  christos 
    925   1.8  christos /*******************************************************************************
    926   1.8  christos  *
    927   1.8  christos  * FUNCTION:    AslCheckExpectException
    928   1.8  christos  *
    929   1.8  christos  * PARAMETERS:  none
    930   1.8  christos  *
    931   1.8  christos  * RETURN:      none
    932   1.8  christos  *
    933   1.8  christos  * DESCRIPTION: Check the global expected messages table and raise an error
    934   1.8  christos  *              for each message that has not been received.
    935   1.8  christos  *
    936   1.8  christos  ******************************************************************************/
    937   1.8  christos 
    938   1.8  christos void
    939   1.8  christos AslCheckExpectedExceptions (
    940   1.8  christos     void)
    941   1.8  christos {
    942   1.9  christos     UINT8                   i;
    943   1.9  christos 
    944   1.8  christos 
    945   1.8  christos     for (i = 0; i < Gbl_ExpectedMessagesIndex; ++i)
    946   1.8  christos     {
    947   1.8  christos         if (!Gbl_ExpectedMessages[i].MessageReceived)
    948   1.8  christos         {
    949   1.8  christos             AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
    950   1.8  christos                 Gbl_ExpectedMessages[i].MessageIdStr);
    951   1.8  christos         }
    952   1.8  christos     }
    953   1.8  christos }
    954   1.8  christos 
    955   1.8  christos 
    956   1.8  christos /*******************************************************************************
    957   1.8  christos  *
    958   1.8  christos  * FUNCTION:    AslExpectException
    959   1.8  christos  *
    960   1.8  christos  * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
    961   1.8  christos  *
    962   1.8  christos  * RETURN:      Status
    963   1.8  christos  *
    964   1.8  christos  * DESCRIPTION: Enter a message ID into the global expected messages table
    965   1.8  christos  *              If these messages are not raised during the compilation, throw
    966   1.8  christos  *              an error.
    967   1.8  christos  *
    968   1.8  christos  ******************************************************************************/
    969   1.8  christos 
    970   1.8  christos ACPI_STATUS
    971   1.8  christos AslExpectException (
    972   1.8  christos     char                    *MessageIdString)
    973   1.8  christos {
    974   1.8  christos     UINT32                  MessageId;
    975   1.8  christos 
    976   1.8  christos 
    977   1.8  christos     /* Convert argument to an integer and validate it */
    978   1.8  christos 
    979   1.8  christos     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
    980   1.8  christos 
    981   1.8  christos     if (MessageId > 6999)
    982   1.8  christos     {
    983   1.8  christos         printf ("\"%s\" is not a valid warning/remark/erro ID\n",
    984   1.8  christos             MessageIdString);
    985   1.8  christos         return (AE_BAD_PARAMETER);
    986   1.8  christos     }
    987   1.8  christos 
    988   1.8  christos     /* Insert value into the global expected message array */
    989   1.8  christos 
    990   1.8  christos     if (Gbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
    991   1.8  christos     {
    992   1.8  christos         printf ("Too many messages have been registered as expected (max %u)\n",
    993   1.8  christos             ASL_MAX_DISABLED_MESSAGES);
    994   1.8  christos         return (AE_LIMIT);
    995   1.8  christos     }
    996   1.8  christos 
    997   1.8  christos     Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageId = MessageId;
    998   1.8  christos     Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
    999   1.8  christos     Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageReceived = FALSE;
   1000   1.8  christos     Gbl_ExpectedMessagesIndex++;
   1001   1.8  christos     return (AE_OK);
   1002   1.8  christos }
   1003   1.8  christos 
   1004   1.1    jruoho 
   1005   1.1    jruoho /*******************************************************************************
   1006   1.1    jruoho  *
   1007   1.2  christos  * FUNCTION:    AslDisableException
   1008   1.2  christos  *
   1009   1.2  christos  * PARAMETERS:  MessageIdString     - ID to be disabled
   1010   1.2  christos  *
   1011   1.2  christos  * RETURN:      Status
   1012   1.2  christos  *
   1013   1.2  christos  * DESCRIPTION: Enter a message ID into the global disabled messages table
   1014   1.2  christos  *
   1015   1.2  christos  ******************************************************************************/
   1016   1.2  christos 
   1017   1.2  christos ACPI_STATUS
   1018   1.2  christos AslDisableException (
   1019   1.2  christos     char                    *MessageIdString)
   1020   1.2  christos {
   1021   1.2  christos     UINT32                  MessageId;
   1022   1.2  christos 
   1023   1.2  christos 
   1024   1.2  christos     /* Convert argument to an integer and validate it */
   1025   1.2  christos 
   1026   1.2  christos     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
   1027   1.2  christos 
   1028   1.8  christos     if ((MessageId < 2000) || (MessageId > 6999))
   1029   1.2  christos     {
   1030   1.8  christos         printf ("\"%s\" is not a valid warning/remark/error ID\n",
   1031   1.2  christos             MessageIdString);
   1032   1.2  christos         return (AE_BAD_PARAMETER);
   1033   1.2  christos     }
   1034   1.2  christos 
   1035   1.2  christos     /* Insert value into the global disabled message array */
   1036   1.2  christos 
   1037   1.2  christos     if (Gbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES)
   1038   1.2  christos     {
   1039   1.2  christos         printf ("Too many messages have been disabled (max %u)\n",
   1040   1.2  christos             ASL_MAX_DISABLED_MESSAGES);
   1041   1.2  christos         return (AE_LIMIT);
   1042   1.2  christos     }
   1043   1.2  christos 
   1044   1.2  christos     Gbl_DisabledMessages[Gbl_DisabledMessagesIndex] = MessageId;
   1045   1.2  christos     Gbl_DisabledMessagesIndex++;
   1046   1.2  christos     return (AE_OK);
   1047   1.2  christos }
   1048   1.2  christos 
   1049   1.2  christos 
   1050   1.2  christos /*******************************************************************************
   1051   1.2  christos  *
   1052   1.2  christos  * FUNCTION:    AslIsExceptionDisabled
   1053   1.2  christos  *
   1054   1.9  christos  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
   1055   1.9  christos  *              MessageId       - Index into global message buffer
   1056   1.2  christos  *
   1057   1.2  christos  * RETURN:      TRUE if exception/message should be ignored
   1058   1.2  christos  *
   1059   1.2  christos  * DESCRIPTION: Check if the user has specified options such that this
   1060   1.2  christos  *              exception should be ignored
   1061   1.2  christos  *
   1062   1.2  christos  ******************************************************************************/
   1063   1.2  christos 
   1064   1.8  christos static BOOLEAN
   1065   1.8  christos AslIsExceptionExpected (
   1066   1.8  christos     UINT8                   Level,
   1067   1.8  christos     UINT16                  MessageId)
   1068   1.8  christos {
   1069   1.8  christos     UINT32                  EncodedMessageId;
   1070   1.8  christos     UINT32                  i;
   1071   1.8  christos 
   1072   1.8  christos 
   1073   1.9  christos     /* Mark this exception as received */
   1074   1.9  christos 
   1075   1.8  christos     EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
   1076   1.8  christos     for (i = 0; i < Gbl_ExpectedMessagesIndex; i++)
   1077   1.8  christos     {
   1078   1.8  christos         /* Simple implementation via fixed array */
   1079   1.8  christos 
   1080   1.8  christos         if (EncodedMessageId == Gbl_ExpectedMessages[i].MessageId)
   1081   1.8  christos         {
   1082   1.8  christos             return (Gbl_ExpectedMessages[i].MessageReceived = TRUE);
   1083   1.8  christos         }
   1084   1.8  christos     }
   1085   1.8  christos 
   1086   1.8  christos     return (FALSE);
   1087   1.8  christos }
   1088   1.8  christos 
   1089   1.8  christos 
   1090   1.8  christos /*******************************************************************************
   1091   1.8  christos  *
   1092   1.8  christos  * FUNCTION:    AslIsExceptionDisabled
   1093   1.8  christos  *
   1094   1.8  christos  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
   1095   1.8  christos  *              MessageId           - Index into global message buffer
   1096   1.8  christos  *
   1097   1.8  christos  * RETURN:      TRUE if exception/message should be ignored
   1098   1.8  christos  *
   1099   1.8  christos  * DESCRIPTION: Check if the user has specified options such that this
   1100   1.8  christos  *              exception should be ignored
   1101   1.8  christos  *
   1102   1.8  christos  ******************************************************************************/
   1103   1.8  christos 
   1104   1.8  christos static BOOLEAN
   1105   1.2  christos AslIsExceptionDisabled (
   1106   1.2  christos     UINT8                   Level,
   1107   1.3  christos     UINT16                  MessageId)
   1108   1.2  christos {
   1109   1.2  christos     UINT32                  EncodedMessageId;
   1110   1.2  christos     UINT32                  i;
   1111   1.2  christos 
   1112   1.2  christos 
   1113   1.2  christos     switch (Level)
   1114   1.2  christos     {
   1115   1.2  christos     case ASL_WARNING2:
   1116   1.2  christos     case ASL_WARNING3:
   1117   1.2  christos 
   1118   1.2  christos         /* Check for global disable via -w1/-w2/-w3 options */
   1119   1.2  christos 
   1120   1.2  christos         if (Level > Gbl_WarningLevel)
   1121   1.2  christos         {
   1122   1.2  christos             return (TRUE);
   1123   1.2  christos         }
   1124   1.2  christos         /* Fall through */
   1125   1.2  christos 
   1126   1.2  christos     case ASL_WARNING:
   1127   1.2  christos     case ASL_REMARK:
   1128   1.8  christos     case ASL_ERROR:
   1129   1.2  christos         /*
   1130   1.8  christos          * Ignore this error/warning/remark if it has been disabled by
   1131   1.2  christos          * the user (-vw option)
   1132   1.2  christos          */
   1133   1.3  christos         EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
   1134   1.2  christos         for (i = 0; i < Gbl_DisabledMessagesIndex; i++)
   1135   1.2  christos         {
   1136   1.2  christos             /* Simple implementation via fixed array */
   1137   1.2  christos 
   1138   1.2  christos             if (EncodedMessageId == Gbl_DisabledMessages[i])
   1139   1.2  christos             {
   1140   1.2  christos                 return (TRUE);
   1141   1.2  christos             }
   1142   1.2  christos         }
   1143   1.2  christos         break;
   1144   1.2  christos 
   1145   1.2  christos     default:
   1146   1.2  christos         break;
   1147   1.2  christos     }
   1148   1.2  christos 
   1149   1.2  christos     return (FALSE);
   1150   1.2  christos }
   1151   1.2  christos 
   1152   1.2  christos 
   1153   1.2  christos /*******************************************************************************
   1154   1.2  christos  *
   1155   1.9  christos  * FUNCTION:    AslDualParseOpError
   1156   1.9  christos  *
   1157   1.9  christos  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
   1158   1.9  christos  *              MainMsgId       - Index into global message buffer
   1159   1.9  christos  *              MainOp          - Parse node where error happened
   1160   1.9  christos  *              MainMsg         - Message pertaining to the MainOp
   1161   1.9  christos  *              SubMsgId        - Index into global message buffer
   1162   1.9  christos  *              SubOp           - Additional parse node for better message
   1163   1.9  christos  *              SubMsg          - Message pertainint to SubOp
   1164   1.9  christos  *
   1165   1.9  christos  *
   1166   1.9  christos  * RETURN:      None
   1167   1.9  christos  *
   1168   1.9  christos  * DESCRIPTION: Main error reporting routine for the ASL compiler for error
   1169   1.9  christos  *              messages that point to multiple parse objects.
   1170   1.9  christos  *
   1171   1.9  christos  ******************************************************************************/
   1172   1.9  christos 
   1173   1.9  christos void
   1174   1.9  christos AslDualParseOpError (
   1175   1.9  christos     UINT8                   Level,
   1176   1.9  christos     UINT16                  MainMsgId,
   1177   1.9  christos     ACPI_PARSE_OBJECT       *MainOp,
   1178   1.9  christos     char                    *MainMsg,
   1179   1.9  christos     UINT16                  SubMsgId,
   1180   1.9  christos     ACPI_PARSE_OBJECT       *SubOp,
   1181   1.9  christos     char                    *SubMsg)
   1182   1.9  christos {
   1183   1.9  christos     ASL_ERROR_MSG           *SubEnode = NULL;
   1184   1.9  christos 
   1185   1.9  christos 
   1186   1.9  christos     /* Check if user wants to ignore this exception */
   1187   1.9  christos 
   1188   1.9  christos     if (AslIsExceptionIgnored (Level, MainMsgId) || !MainOp)
   1189   1.9  christos     {
   1190   1.9  christos         return;
   1191   1.9  christos     }
   1192   1.9  christos 
   1193   1.9  christos     if (SubOp)
   1194   1.9  christos     {
   1195   1.9  christos         AslInitEnode (&SubEnode, Level, SubMsgId, SubOp->Asl.LineNumber,
   1196   1.9  christos             SubOp->Asl.LogicalLineNumber, SubOp->Asl.LogicalByteOffset,
   1197   1.9  christos             SubOp->Asl.Column, SubOp->Asl.Filename, SubMsg,
   1198   1.9  christos             NULL, NULL);
   1199   1.9  christos     }
   1200   1.9  christos 
   1201   1.9  christos     AslLogNewError (Level, MainMsgId, MainOp->Asl.LineNumber,
   1202   1.9  christos         MainOp->Asl.LogicalLineNumber, MainOp->Asl.LogicalByteOffset,
   1203   1.9  christos         MainOp->Asl.Column, MainOp->Asl.Filename, MainMsg,
   1204   1.9  christos         NULL, SubEnode);
   1205   1.9  christos }
   1206   1.9  christos 
   1207   1.9  christos 
   1208   1.9  christos /*******************************************************************************
   1209   1.9  christos  *
   1210   1.1    jruoho  * FUNCTION:    AslError
   1211   1.1    jruoho  *
   1212   1.1    jruoho  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
   1213   1.1    jruoho  *              MessageId           - Index into global message buffer
   1214   1.1    jruoho  *              Op                  - Parse node where error happened
   1215   1.1    jruoho  *              ExtraMessage        - additional error message
   1216   1.1    jruoho  *
   1217   1.1    jruoho  * RETURN:      None
   1218   1.1    jruoho  *
   1219   1.1    jruoho  * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
   1220   1.1    jruoho  *              except the parser.)
   1221   1.1    jruoho  *
   1222   1.1    jruoho  ******************************************************************************/
   1223   1.1    jruoho 
   1224   1.1    jruoho void
   1225   1.1    jruoho AslError (
   1226   1.1    jruoho     UINT8                   Level,
   1227   1.3  christos     UINT16                  MessageId,
   1228   1.1    jruoho     ACPI_PARSE_OBJECT       *Op,
   1229   1.1    jruoho     char                    *ExtraMessage)
   1230   1.1    jruoho {
   1231   1.1    jruoho     if (Op)
   1232   1.1    jruoho     {
   1233   1.1    jruoho         AslCommonError (Level, MessageId, Op->Asl.LineNumber,
   1234   1.2  christos             Op->Asl.LogicalLineNumber,
   1235   1.2  christos             Op->Asl.LogicalByteOffset,
   1236   1.2  christos             Op->Asl.Column,
   1237   1.2  christos             Op->Asl.Filename, ExtraMessage);
   1238   1.1    jruoho     }
   1239   1.1    jruoho     else
   1240   1.1    jruoho     {
   1241   1.1    jruoho         AslCommonError (Level, MessageId, 0,
   1242   1.2  christos             0, 0, 0, NULL, ExtraMessage);
   1243   1.1    jruoho     }
   1244   1.1    jruoho }
   1245   1.1    jruoho 
   1246   1.1    jruoho 
   1247   1.1    jruoho /*******************************************************************************
   1248   1.1    jruoho  *
   1249   1.1    jruoho  * FUNCTION:    AslCoreSubsystemError
   1250   1.1    jruoho  *
   1251   1.1    jruoho  * PARAMETERS:  Op                  - Parse node where error happened
   1252   1.3  christos  *              Status              - The ACPICA Exception
   1253   1.1    jruoho  *              ExtraMessage        - additional error message
   1254   1.1    jruoho  *              Abort               - TRUE -> Abort compilation
   1255   1.1    jruoho  *
   1256   1.1    jruoho  * RETURN:      None
   1257   1.1    jruoho  *
   1258   1.3  christos  * DESCRIPTION: Error reporting routine for exceptions returned by the ACPICA
   1259   1.3  christos  *              core subsystem.
   1260   1.1    jruoho  *
   1261   1.1    jruoho  ******************************************************************************/
   1262   1.1    jruoho 
   1263   1.1    jruoho void
   1264   1.1    jruoho AslCoreSubsystemError (
   1265   1.1    jruoho     ACPI_PARSE_OBJECT       *Op,
   1266   1.1    jruoho     ACPI_STATUS             Status,
   1267   1.1    jruoho     char                    *ExtraMessage,
   1268   1.1    jruoho     BOOLEAN                 Abort)
   1269   1.1    jruoho {
   1270   1.1    jruoho 
   1271   1.2  christos     snprintf (MsgBuffer, sizeof(MsgBuffer), "%s %s", AcpiFormatException (Status), ExtraMessage);
   1272   1.1    jruoho 
   1273   1.1    jruoho     if (Op)
   1274   1.1    jruoho     {
   1275   1.6  christos         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
   1276   1.6  christos             Op->Asl.LineNumber,
   1277   1.6  christos             Op->Asl.LogicalLineNumber,
   1278   1.6  christos             Op->Asl.LogicalByteOffset,
   1279   1.6  christos             Op->Asl.Column,
   1280   1.6  christos             Op->Asl.Filename, MsgBuffer);
   1281   1.1    jruoho     }
   1282   1.1    jruoho     else
   1283   1.1    jruoho     {
   1284   1.6  christos         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
   1285   1.6  christos             0, 0, 0, 0, NULL, MsgBuffer);
   1286   1.1    jruoho     }
   1287   1.1    jruoho 
   1288   1.1    jruoho     if (Abort)
   1289   1.1    jruoho     {
   1290   1.1    jruoho         AslAbort ();
   1291   1.1    jruoho     }
   1292   1.1    jruoho }
   1293   1.1    jruoho 
   1294   1.1    jruoho 
   1295   1.1    jruoho /*******************************************************************************
   1296   1.1    jruoho  *
   1297   1.1    jruoho  * FUNCTION:    AslCompilererror
   1298   1.1    jruoho  *
   1299   1.1    jruoho  * PARAMETERS:  CompilerMessage         - Error message from the parser
   1300   1.1    jruoho  *
   1301   1.1    jruoho  * RETURN:      Status (0 for now)
   1302   1.1    jruoho  *
   1303   1.1    jruoho  * DESCRIPTION: Report an error situation discovered in a production
   1304   1.1    jruoho  *              NOTE: don't change the name of this function, it is called
   1305   1.1    jruoho  *              from the auto-generated parser.
   1306   1.1    jruoho  *
   1307   1.1    jruoho  ******************************************************************************/
   1308   1.1    jruoho 
   1309   1.1    jruoho int
   1310   1.1    jruoho AslCompilererror (
   1311   1.2  christos     const char              *CompilerMessage)
   1312   1.1    jruoho {
   1313   1.1    jruoho 
   1314   1.4  christos     Gbl_SyntaxError++;
   1315   1.4  christos 
   1316   1.1    jruoho     AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber,
   1317   1.2  christos         Gbl_LogicalLineNumber, Gbl_CurrentLineOffset,
   1318   1.2  christos         Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename,
   1319   1.2  christos         ACPI_CAST_PTR (char, CompilerMessage));
   1320   1.1    jruoho 
   1321   1.2  christos     return (0);
   1322   1.1    jruoho }
   1323