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