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