Home | History | Annotate | Line # | Download | only in compiler
aslerror.c revision 1.13
      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.13  christos         Enode->SourceFilename =
    765  1.13  christos             FileNode->Files[ASL_FILE_SOURCE_OUTPUT].Filename;
    766   1.2  christos     }
    767   1.9  christos }
    768   1.2  christos 
    769   1.2  christos 
    770   1.9  christos /*******************************************************************************
    771   1.9  christos  *
    772   1.9  christos  * FUNCTION:    AslCommonError2
    773   1.9  christos  *
    774   1.9  christos  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    775   1.9  christos  *              MessageId           - Index into global message buffer
    776   1.9  christos  *              LineNumber          - Actual file line number
    777   1.9  christos  *              Column              - Column in current line
    778   1.9  christos  *              SourceLine          - Actual source code line
    779   1.9  christos  *              Filename            - source filename
    780   1.9  christos  *              ExtraMessage        - additional error message
    781   1.9  christos  *
    782   1.9  christos  * RETURN:      None
    783   1.9  christos  *
    784   1.9  christos  * DESCRIPTION: Create a new error node and add it to the error log
    785   1.9  christos  *
    786   1.9  christos  ******************************************************************************/
    787   1.2  christos 
    788   1.9  christos void
    789   1.9  christos AslCommonError2 (
    790   1.9  christos     UINT8                   Level,
    791   1.9  christos     UINT16                  MessageId,
    792   1.9  christos     UINT32                  LineNumber,
    793   1.9  christos     UINT32                  Column,
    794   1.9  christos     char                    *SourceLine,
    795   1.9  christos     char                    *Filename,
    796   1.9  christos     char                    *ExtraMessage)
    797   1.9  christos {
    798   1.9  christos     AslLogNewError (Level, MessageId, LineNumber, LineNumber, 0, Column,
    799   1.9  christos         Filename, ExtraMessage, SourceLine, NULL);
    800   1.2  christos }
    801   1.2  christos 
    802   1.2  christos 
    803   1.2  christos /*******************************************************************************
    804   1.2  christos  *
    805   1.1    jruoho  * FUNCTION:    AslCommonError
    806   1.1    jruoho  *
    807   1.1    jruoho  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    808   1.1    jruoho  *              MessageId           - Index into global message buffer
    809   1.1    jruoho  *              CurrentLineNumber   - Actual file line number
    810   1.1    jruoho  *              LogicalLineNumber   - Cumulative line number
    811   1.1    jruoho  *              LogicalByteOffset   - Byte offset in source file
    812   1.1    jruoho  *              Column              - Column in current line
    813   1.1    jruoho  *              Filename            - source filename
    814   1.1    jruoho  *              ExtraMessage        - additional error message
    815   1.1    jruoho  *
    816   1.1    jruoho  * RETURN:      None
    817   1.1    jruoho  *
    818   1.1    jruoho  * DESCRIPTION: Create a new error node and add it to the error log
    819   1.1    jruoho  *
    820   1.1    jruoho  ******************************************************************************/
    821   1.1    jruoho 
    822   1.1    jruoho void
    823   1.1    jruoho AslCommonError (
    824   1.1    jruoho     UINT8                   Level,
    825   1.3  christos     UINT16                  MessageId,
    826   1.1    jruoho     UINT32                  CurrentLineNumber,
    827   1.1    jruoho     UINT32                  LogicalLineNumber,
    828   1.1    jruoho     UINT32                  LogicalByteOffset,
    829   1.1    jruoho     UINT32                  Column,
    830   1.1    jruoho     char                    *Filename,
    831   1.1    jruoho     char                    *ExtraMessage)
    832   1.1    jruoho {
    833  1.10  christos     /* Check if user wants to ignore this exception */
    834  1.10  christos 
    835  1.10  christos     if (AslIsExceptionIgnored (Level, MessageId))
    836  1.10  christos     {
    837  1.10  christos         return;
    838  1.10  christos     }
    839  1.10  christos 
    840   1.9  christos     AslLogNewError (Level, MessageId, CurrentLineNumber, LogicalLineNumber,
    841   1.9  christos         LogicalByteOffset, Column, Filename, ExtraMessage,
    842   1.9  christos         NULL, NULL);
    843   1.9  christos }
    844   1.1    jruoho 
    845   1.1    jruoho 
    846   1.9  christos /*******************************************************************************
    847   1.9  christos  *
    848   1.9  christos  * FUNCTION:    AslLogNewError
    849   1.9  christos  *
    850   1.9  christos  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    851   1.9  christos  *              MessageId           - Index into global message buffer
    852   1.9  christos  *              CurrentLineNumber   - Actual file line number
    853   1.9  christos  *              LogicalLineNumber   - Cumulative line number
    854   1.9  christos  *              LogicalByteOffset   - Byte offset in source file
    855   1.9  christos  *              Column              - Column in current line
    856   1.9  christos  *              Filename            - source filename
    857   1.9  christos  *              Message             - additional error message
    858   1.9  christos  *              SourceLine          - Actual line of source code
    859   1.9  christos  *              SubError            - Sub-error associated with this error
    860   1.9  christos  *
    861   1.9  christos  * RETURN:      None
    862   1.9  christos  *
    863   1.9  christos  * DESCRIPTION: Create a new error node and add it to the error log
    864   1.9  christos  *
    865   1.9  christos  ******************************************************************************/
    866   1.9  christos static void
    867   1.9  christos AslLogNewError (
    868   1.9  christos     UINT8                   Level,
    869   1.9  christos     UINT16                  MessageId,
    870   1.9  christos     UINT32                  LineNumber,
    871   1.9  christos     UINT32                  LogicalLineNumber,
    872   1.9  christos     UINT32                  LogicalByteOffset,
    873   1.9  christos     UINT32                  Column,
    874   1.9  christos     char                    *Filename,
    875   1.9  christos     char                    *Message,
    876   1.9  christos     char                    *SourceLine,
    877   1.9  christos     ASL_ERROR_MSG           *SubError)
    878   1.9  christos {
    879   1.9  christos     ASL_ERROR_MSG           *Enode = NULL;
    880  1.11  christos     UINT8                   ModifiedLevel = GetModifiedLevel (Level, MessageId);
    881   1.1    jruoho 
    882   1.1    jruoho 
    883  1.11  christos     AslInitEnode (&Enode, ModifiedLevel, MessageId, LineNumber,
    884  1.11  christos         LogicalLineNumber, LogicalByteOffset, Column, Filename, Message,
    885  1.11  christos         SourceLine, SubError);
    886   1.1    jruoho 
    887   1.1    jruoho     /* Add the new node to the error node list */
    888   1.1    jruoho 
    889   1.1    jruoho     AeAddToErrorLog (Enode);
    890   1.1    jruoho 
    891  1.11  christos     if (AslGbl_DebugFlag)
    892   1.1    jruoho     {
    893   1.1    jruoho         /* stderr is a file, send error to it immediately */
    894   1.1    jruoho 
    895   1.1    jruoho         AePrintException (ASL_FILE_STDERR, Enode, NULL);
    896   1.1    jruoho     }
    897   1.1    jruoho 
    898  1.11  christos     AslGbl_ExceptionCount[ModifiedLevel]++;
    899  1.12  christos     if (!AslGbl_IgnoreErrors && AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
    900   1.1    jruoho     {
    901   1.1    jruoho         printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
    902   1.1    jruoho 
    903  1.11  christos         AslGbl_SourceLine = 0;
    904  1.11  christos         AslGbl_NextError = AslGbl_ErrorLog;
    905   1.1    jruoho         CmCleanupAndExit ();
    906   1.1    jruoho         exit(1);
    907   1.1    jruoho     }
    908   1.1    jruoho 
    909   1.1    jruoho     return;
    910   1.1    jruoho }
    911   1.1    jruoho 
    912  1.11  christos 
    913  1.11  christos /*******************************************************************************
    914  1.11  christos  *
    915  1.11  christos  * FUNCTION:    GetModifiedLevel
    916  1.11  christos  *
    917  1.11  christos  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
    918  1.11  christos  *              MessageId       - Index into global message buffer
    919  1.11  christos  *
    920  1.11  christos  * RETURN:      UINT8           - modified level
    921  1.11  christos  *
    922  1.11  christos  * DESCRIPTION: Get the modified level of exception codes that are reported as
    923  1.11  christos  *              errors from the -ww option.
    924  1.11  christos  *
    925  1.11  christos  ******************************************************************************/
    926  1.11  christos 
    927  1.11  christos static UINT8
    928  1.11  christos GetModifiedLevel (
    929  1.11  christos     UINT8                   Level,
    930  1.11  christos     UINT16                  MessageId)
    931  1.11  christos {
    932  1.11  christos     UINT16                  i;
    933  1.11  christos     UINT16                  ExceptionCode;
    934  1.11  christos 
    935  1.11  christos 
    936  1.11  christos     ExceptionCode = AeBuildFullExceptionCode (Level, MessageId);
    937  1.11  christos 
    938  1.11  christos     for (i = 0; i < AslGbl_ElevatedMessagesIndex; i++)
    939  1.11  christos     {
    940  1.11  christos         if (ExceptionCode == AslGbl_ElevatedMessages[i])
    941  1.11  christos         {
    942  1.11  christos             return (ASL_ERROR);
    943  1.11  christos         }
    944  1.11  christos     }
    945  1.11  christos 
    946  1.11  christos     return (Level);
    947  1.11  christos }
    948  1.11  christos 
    949  1.11  christos 
    950   1.8  christos /*******************************************************************************
    951   1.8  christos  *
    952   1.8  christos  * FUNCTION:    AslIsExceptionIgnored
    953   1.8  christos  *
    954   1.9  christos  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
    955   1.9  christos  *              MessageId       - Index into global message buffer
    956   1.8  christos  *
    957   1.8  christos  * RETURN:      BOOLEAN
    958   1.8  christos  *
    959   1.8  christos  * DESCRIPTION: Check if a particular exception is ignored. In this case it
    960   1.8  christos  *              means that the exception is (expected or disabled.
    961   1.8  christos  *
    962   1.8  christos  ******************************************************************************/
    963   1.8  christos 
    964   1.8  christos BOOLEAN
    965   1.8  christos AslIsExceptionIgnored (
    966   1.8  christos     UINT8                   Level,
    967   1.8  christos     UINT16                  MessageId)
    968   1.8  christos {
    969   1.9  christos     BOOLEAN                 ExceptionIgnored;
    970   1.8  christos 
    971   1.8  christos 
    972   1.8  christos     /* Note: this allows exception to be disabled and expected */
    973   1.8  christos 
    974   1.8  christos     ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
    975   1.8  christos     ExceptionIgnored |= AslIsExceptionExpected (Level, MessageId);
    976   1.8  christos 
    977  1.11  christos     return (AslGbl_AllExceptionsDisabled || ExceptionIgnored);
    978   1.8  christos }
    979   1.8  christos 
    980   1.8  christos 
    981   1.8  christos /*******************************************************************************
    982   1.8  christos  *
    983   1.8  christos  * FUNCTION:    AslCheckExpectException
    984   1.8  christos  *
    985   1.8  christos  * PARAMETERS:  none
    986   1.8  christos  *
    987   1.8  christos  * RETURN:      none
    988   1.8  christos  *
    989   1.8  christos  * DESCRIPTION: Check the global expected messages table and raise an error
    990   1.8  christos  *              for each message that has not been received.
    991   1.8  christos  *
    992   1.8  christos  ******************************************************************************/
    993   1.8  christos 
    994   1.8  christos void
    995   1.8  christos AslCheckExpectedExceptions (
    996   1.8  christos     void)
    997   1.8  christos {
    998   1.9  christos     UINT8                   i;
    999   1.9  christos 
   1000   1.8  christos 
   1001  1.11  christos     for (i = 0; i < AslGbl_ExpectedMessagesIndex; ++i)
   1002   1.8  christos     {
   1003  1.11  christos         if (!AslGbl_ExpectedMessages[i].MessageReceived)
   1004   1.8  christos         {
   1005   1.8  christos             AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
   1006  1.11  christos                 AslGbl_ExpectedMessages[i].MessageIdStr);
   1007   1.8  christos         }
   1008   1.8  christos     }
   1009   1.8  christos }
   1010   1.8  christos 
   1011   1.8  christos 
   1012   1.8  christos /*******************************************************************************
   1013   1.8  christos  *
   1014   1.8  christos  * FUNCTION:    AslExpectException
   1015   1.8  christos  *
   1016   1.8  christos  * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
   1017   1.8  christos  *
   1018   1.8  christos  * RETURN:      Status
   1019   1.8  christos  *
   1020   1.8  christos  * DESCRIPTION: Enter a message ID into the global expected messages table
   1021   1.8  christos  *              If these messages are not raised during the compilation, throw
   1022   1.8  christos  *              an error.
   1023   1.8  christos  *
   1024   1.8  christos  ******************************************************************************/
   1025   1.8  christos 
   1026   1.8  christos ACPI_STATUS
   1027   1.8  christos AslExpectException (
   1028   1.8  christos     char                    *MessageIdString)
   1029   1.8  christos {
   1030   1.8  christos     UINT32                  MessageId;
   1031   1.8  christos 
   1032   1.8  christos 
   1033   1.8  christos     /* Convert argument to an integer and validate it */
   1034   1.8  christos 
   1035   1.8  christos     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
   1036   1.8  christos 
   1037   1.8  christos     if (MessageId > 6999)
   1038   1.8  christos     {
   1039   1.8  christos         printf ("\"%s\" is not a valid warning/remark/erro ID\n",
   1040   1.8  christos             MessageIdString);
   1041   1.8  christos         return (AE_BAD_PARAMETER);
   1042   1.8  christos     }
   1043   1.8  christos 
   1044   1.8  christos     /* Insert value into the global expected message array */
   1045   1.8  christos 
   1046  1.11  christos     if (AslGbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
   1047   1.8  christos     {
   1048  1.11  christos         printf ("Too many messages have been registered as expected (max %d)\n",
   1049   1.8  christos             ASL_MAX_DISABLED_MESSAGES);
   1050   1.8  christos         return (AE_LIMIT);
   1051   1.8  christos     }
   1052   1.8  christos 
   1053  1.11  christos     AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageId = MessageId;
   1054  1.11  christos     AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
   1055  1.11  christos     AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageReceived = FALSE;
   1056  1.11  christos     AslGbl_ExpectedMessagesIndex++;
   1057   1.8  christos     return (AE_OK);
   1058   1.8  christos }
   1059   1.8  christos 
   1060   1.1    jruoho 
   1061   1.1    jruoho /*******************************************************************************
   1062   1.1    jruoho  *
   1063   1.2  christos  * FUNCTION:    AslDisableException
   1064   1.2  christos  *
   1065   1.2  christos  * PARAMETERS:  MessageIdString     - ID to be disabled
   1066   1.2  christos  *
   1067   1.2  christos  * RETURN:      Status
   1068   1.2  christos  *
   1069   1.2  christos  * DESCRIPTION: Enter a message ID into the global disabled messages table
   1070   1.2  christos  *
   1071   1.2  christos  ******************************************************************************/
   1072   1.2  christos 
   1073   1.2  christos ACPI_STATUS
   1074   1.2  christos AslDisableException (
   1075   1.2  christos     char                    *MessageIdString)
   1076   1.2  christos {
   1077   1.2  christos     UINT32                  MessageId;
   1078   1.2  christos 
   1079   1.2  christos 
   1080   1.2  christos     /* Convert argument to an integer and validate it */
   1081   1.2  christos 
   1082   1.2  christos     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
   1083   1.2  christos 
   1084   1.8  christos     if ((MessageId < 2000) || (MessageId > 6999))
   1085   1.2  christos     {
   1086   1.8  christos         printf ("\"%s\" is not a valid warning/remark/error ID\n",
   1087   1.2  christos             MessageIdString);
   1088   1.2  christos         return (AE_BAD_PARAMETER);
   1089   1.2  christos     }
   1090   1.2  christos 
   1091   1.2  christos     /* Insert value into the global disabled message array */
   1092   1.2  christos 
   1093  1.11  christos     if (AslGbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES)
   1094   1.2  christos     {
   1095  1.11  christos         printf ("Too many messages have been disabled (max %d)\n",
   1096   1.2  christos             ASL_MAX_DISABLED_MESSAGES);
   1097   1.2  christos         return (AE_LIMIT);
   1098   1.2  christos     }
   1099   1.2  christos 
   1100  1.11  christos     AslGbl_DisabledMessages[AslGbl_DisabledMessagesIndex] = MessageId;
   1101  1.11  christos     AslGbl_DisabledMessagesIndex++;
   1102   1.2  christos     return (AE_OK);
   1103   1.2  christos }
   1104   1.2  christos 
   1105   1.2  christos 
   1106   1.2  christos /*******************************************************************************
   1107   1.2  christos  *
   1108  1.11  christos  * FUNCTION:    AslElevateException
   1109  1.11  christos  *
   1110  1.11  christos  * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
   1111  1.11  christos  *
   1112  1.11  christos  * RETURN:      Status
   1113  1.11  christos  *
   1114  1.11  christos  * DESCRIPTION: Enter a message ID into the global elevated exceptions table.
   1115  1.11  christos  *              These messages will be considered as compilation errors.
   1116  1.11  christos  *
   1117  1.11  christos  ******************************************************************************/
   1118  1.11  christos 
   1119  1.11  christos ACPI_STATUS
   1120  1.11  christos AslElevateException (
   1121  1.11  christos     char                    *MessageIdString)
   1122  1.11  christos {
   1123  1.11  christos     UINT32                  MessageId;
   1124  1.11  christos 
   1125  1.11  christos 
   1126  1.11  christos     /* Convert argument to an integer and validate it */
   1127  1.11  christos 
   1128  1.11  christos     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
   1129  1.11  christos 
   1130  1.11  christos     if (MessageId > 6999)
   1131  1.11  christos     {
   1132  1.11  christos         printf ("\"%s\" is not a valid warning/remark/erro ID\n",
   1133  1.11  christos             MessageIdString);
   1134  1.11  christos         return (AE_BAD_PARAMETER);
   1135  1.11  christos     }
   1136  1.11  christos 
   1137  1.11  christos     /* Insert value into the global expected message array */
   1138  1.11  christos 
   1139  1.11  christos     if (AslGbl_ElevatedMessagesIndex >= ASL_MAX_ELEVATED_MESSAGES)
   1140  1.11  christos     {
   1141  1.11  christos         printf ("Too many messages have been registered as elevated (max %d)\n",
   1142  1.11  christos             ASL_MAX_DISABLED_MESSAGES);
   1143  1.11  christos         return (AE_LIMIT);
   1144  1.11  christos     }
   1145  1.11  christos 
   1146  1.12  christos     AslGbl_ElevatedMessages[AslGbl_ElevatedMessagesIndex] = MessageId;
   1147  1.11  christos     AslGbl_ElevatedMessagesIndex++;
   1148  1.11  christos     return (AE_OK);
   1149  1.11  christos }
   1150  1.11  christos 
   1151  1.11  christos /*******************************************************************************
   1152  1.11  christos  *
   1153   1.2  christos  * FUNCTION:    AslIsExceptionDisabled
   1154   1.2  christos  *
   1155   1.9  christos  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
   1156   1.9  christos  *              MessageId       - Index into global message buffer
   1157   1.2  christos  *
   1158   1.2  christos  * RETURN:      TRUE if exception/message should be ignored
   1159   1.2  christos  *
   1160   1.2  christos  * DESCRIPTION: Check if the user has specified options such that this
   1161   1.2  christos  *              exception should be ignored
   1162   1.2  christos  *
   1163   1.2  christos  ******************************************************************************/
   1164   1.2  christos 
   1165   1.8  christos static BOOLEAN
   1166   1.8  christos AslIsExceptionExpected (
   1167   1.8  christos     UINT8                   Level,
   1168   1.8  christos     UINT16                  MessageId)
   1169   1.8  christos {
   1170   1.8  christos     UINT32                  EncodedMessageId;
   1171   1.8  christos     UINT32                  i;
   1172   1.8  christos 
   1173   1.8  christos 
   1174   1.9  christos     /* Mark this exception as received */
   1175   1.9  christos 
   1176   1.8  christos     EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
   1177  1.11  christos     for (i = 0; i < AslGbl_ExpectedMessagesIndex; i++)
   1178   1.8  christos     {
   1179   1.8  christos         /* Simple implementation via fixed array */
   1180   1.8  christos 
   1181  1.11  christos         if (EncodedMessageId == AslGbl_ExpectedMessages[i].MessageId)
   1182   1.8  christos         {
   1183  1.11  christos             return (AslGbl_ExpectedMessages[i].MessageReceived = TRUE);
   1184   1.8  christos         }
   1185   1.8  christos     }
   1186   1.8  christos 
   1187   1.8  christos     return (FALSE);
   1188   1.8  christos }
   1189   1.8  christos 
   1190   1.8  christos 
   1191   1.8  christos /*******************************************************************************
   1192   1.8  christos  *
   1193   1.8  christos  * FUNCTION:    AslIsExceptionDisabled
   1194   1.8  christos  *
   1195   1.8  christos  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
   1196   1.8  christos  *              MessageId           - Index into global message buffer
   1197   1.8  christos  *
   1198   1.8  christos  * RETURN:      TRUE if exception/message should be ignored
   1199   1.8  christos  *
   1200   1.8  christos  * DESCRIPTION: Check if the user has specified options such that this
   1201   1.8  christos  *              exception should be ignored
   1202   1.8  christos  *
   1203   1.8  christos  ******************************************************************************/
   1204   1.8  christos 
   1205   1.8  christos static BOOLEAN
   1206   1.2  christos AslIsExceptionDisabled (
   1207   1.2  christos     UINT8                   Level,
   1208   1.3  christos     UINT16                  MessageId)
   1209   1.2  christos {
   1210   1.2  christos     UINT32                  EncodedMessageId;
   1211   1.2  christos     UINT32                  i;
   1212   1.2  christos 
   1213   1.2  christos 
   1214   1.2  christos     switch (Level)
   1215   1.2  christos     {
   1216   1.2  christos     case ASL_WARNING2:
   1217   1.2  christos     case ASL_WARNING3:
   1218   1.2  christos 
   1219   1.2  christos         /* Check for global disable via -w1/-w2/-w3 options */
   1220   1.2  christos 
   1221  1.11  christos         if (Level > AslGbl_WarningLevel)
   1222   1.2  christos         {
   1223   1.2  christos             return (TRUE);
   1224   1.2  christos         }
   1225   1.2  christos         /* Fall through */
   1226   1.2  christos 
   1227   1.2  christos     case ASL_WARNING:
   1228   1.2  christos     case ASL_REMARK:
   1229   1.8  christos     case ASL_ERROR:
   1230   1.2  christos         /*
   1231   1.8  christos          * Ignore this error/warning/remark if it has been disabled by
   1232   1.2  christos          * the user (-vw option)
   1233   1.2  christos          */
   1234   1.3  christos         EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
   1235  1.11  christos         for (i = 0; i < AslGbl_DisabledMessagesIndex; i++)
   1236   1.2  christos         {
   1237   1.2  christos             /* Simple implementation via fixed array */
   1238   1.2  christos 
   1239  1.11  christos             if (EncodedMessageId == AslGbl_DisabledMessages[i])
   1240   1.2  christos             {
   1241   1.2  christos                 return (TRUE);
   1242   1.2  christos             }
   1243   1.2  christos         }
   1244   1.2  christos         break;
   1245   1.2  christos 
   1246   1.2  christos     default:
   1247   1.2  christos         break;
   1248   1.2  christos     }
   1249   1.2  christos 
   1250   1.2  christos     return (FALSE);
   1251   1.2  christos }
   1252   1.2  christos 
   1253   1.2  christos 
   1254   1.2  christos /*******************************************************************************
   1255   1.2  christos  *
   1256   1.9  christos  * FUNCTION:    AslDualParseOpError
   1257   1.9  christos  *
   1258   1.9  christos  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
   1259   1.9  christos  *              MainMsgId       - Index into global message buffer
   1260   1.9  christos  *              MainOp          - Parse node where error happened
   1261   1.9  christos  *              MainMsg         - Message pertaining to the MainOp
   1262   1.9  christos  *              SubMsgId        - Index into global message buffer
   1263   1.9  christos  *              SubOp           - Additional parse node for better message
   1264   1.9  christos  *              SubMsg          - Message pertainint to SubOp
   1265   1.9  christos  *
   1266   1.9  christos  *
   1267   1.9  christos  * RETURN:      None
   1268   1.9  christos  *
   1269   1.9  christos  * DESCRIPTION: Main error reporting routine for the ASL compiler for error
   1270   1.9  christos  *              messages that point to multiple parse objects.
   1271   1.9  christos  *
   1272   1.9  christos  ******************************************************************************/
   1273   1.9  christos 
   1274   1.9  christos void
   1275   1.9  christos AslDualParseOpError (
   1276   1.9  christos     UINT8                   Level,
   1277   1.9  christos     UINT16                  MainMsgId,
   1278   1.9  christos     ACPI_PARSE_OBJECT       *MainOp,
   1279   1.9  christos     char                    *MainMsg,
   1280   1.9  christos     UINT16                  SubMsgId,
   1281   1.9  christos     ACPI_PARSE_OBJECT       *SubOp,
   1282   1.9  christos     char                    *SubMsg)
   1283   1.9  christos {
   1284   1.9  christos     ASL_ERROR_MSG           *SubEnode = NULL;
   1285   1.9  christos 
   1286   1.9  christos 
   1287   1.9  christos     /* Check if user wants to ignore this exception */
   1288   1.9  christos 
   1289   1.9  christos     if (AslIsExceptionIgnored (Level, MainMsgId) || !MainOp)
   1290   1.9  christos     {
   1291   1.9  christos         return;
   1292   1.9  christos     }
   1293   1.9  christos 
   1294   1.9  christos     if (SubOp)
   1295   1.9  christos     {
   1296   1.9  christos         AslInitEnode (&SubEnode, Level, SubMsgId, SubOp->Asl.LineNumber,
   1297   1.9  christos             SubOp->Asl.LogicalLineNumber, SubOp->Asl.LogicalByteOffset,
   1298   1.9  christos             SubOp->Asl.Column, SubOp->Asl.Filename, SubMsg,
   1299   1.9  christos             NULL, NULL);
   1300   1.9  christos     }
   1301   1.9  christos 
   1302   1.9  christos     AslLogNewError (Level, MainMsgId, MainOp->Asl.LineNumber,
   1303   1.9  christos         MainOp->Asl.LogicalLineNumber, MainOp->Asl.LogicalByteOffset,
   1304   1.9  christos         MainOp->Asl.Column, MainOp->Asl.Filename, MainMsg,
   1305   1.9  christos         NULL, SubEnode);
   1306   1.9  christos }
   1307   1.9  christos 
   1308   1.9  christos 
   1309   1.9  christos /*******************************************************************************
   1310   1.9  christos  *
   1311   1.1    jruoho  * FUNCTION:    AslError
   1312   1.1    jruoho  *
   1313   1.1    jruoho  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
   1314   1.1    jruoho  *              MessageId           - Index into global message buffer
   1315   1.1    jruoho  *              Op                  - Parse node where error happened
   1316   1.1    jruoho  *              ExtraMessage        - additional error message
   1317   1.1    jruoho  *
   1318   1.1    jruoho  * RETURN:      None
   1319   1.1    jruoho  *
   1320   1.1    jruoho  * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
   1321   1.1    jruoho  *              except the parser.)
   1322   1.1    jruoho  *
   1323   1.1    jruoho  ******************************************************************************/
   1324   1.1    jruoho 
   1325   1.1    jruoho void
   1326   1.1    jruoho AslError (
   1327   1.1    jruoho     UINT8                   Level,
   1328   1.3  christos     UINT16                  MessageId,
   1329   1.1    jruoho     ACPI_PARSE_OBJECT       *Op,
   1330   1.1    jruoho     char                    *ExtraMessage)
   1331   1.1    jruoho {
   1332   1.1    jruoho     if (Op)
   1333   1.1    jruoho     {
   1334   1.1    jruoho         AslCommonError (Level, MessageId, Op->Asl.LineNumber,
   1335   1.2  christos             Op->Asl.LogicalLineNumber,
   1336   1.2  christos             Op->Asl.LogicalByteOffset,
   1337   1.2  christos             Op->Asl.Column,
   1338   1.2  christos             Op->Asl.Filename, ExtraMessage);
   1339   1.1    jruoho     }
   1340   1.1    jruoho     else
   1341   1.1    jruoho     {
   1342   1.1    jruoho         AslCommonError (Level, MessageId, 0,
   1343   1.2  christos             0, 0, 0, NULL, ExtraMessage);
   1344   1.1    jruoho     }
   1345   1.1    jruoho }
   1346   1.1    jruoho 
   1347   1.1    jruoho 
   1348   1.1    jruoho /*******************************************************************************
   1349   1.1    jruoho  *
   1350   1.1    jruoho  * FUNCTION:    AslCoreSubsystemError
   1351   1.1    jruoho  *
   1352   1.1    jruoho  * PARAMETERS:  Op                  - Parse node where error happened
   1353   1.3  christos  *              Status              - The ACPICA Exception
   1354   1.1    jruoho  *              ExtraMessage        - additional error message
   1355   1.1    jruoho  *              Abort               - TRUE -> Abort compilation
   1356   1.1    jruoho  *
   1357   1.1    jruoho  * RETURN:      None
   1358   1.1    jruoho  *
   1359   1.3  christos  * DESCRIPTION: Error reporting routine for exceptions returned by the ACPICA
   1360   1.3  christos  *              core subsystem.
   1361   1.1    jruoho  *
   1362   1.1    jruoho  ******************************************************************************/
   1363   1.1    jruoho 
   1364   1.1    jruoho void
   1365   1.1    jruoho AslCoreSubsystemError (
   1366   1.1    jruoho     ACPI_PARSE_OBJECT       *Op,
   1367   1.1    jruoho     ACPI_STATUS             Status,
   1368   1.1    jruoho     char                    *ExtraMessage,
   1369   1.1    jruoho     BOOLEAN                 Abort)
   1370   1.1    jruoho {
   1371   1.1    jruoho 
   1372  1.11  christos     snprintf (AslGbl_MsgBuffer, sizeof(AslGbl_MsgBuffer), "%s %s", AcpiFormatException (Status), ExtraMessage);
   1373   1.1    jruoho 
   1374   1.1    jruoho     if (Op)
   1375   1.1    jruoho     {
   1376   1.6  christos         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
   1377   1.6  christos             Op->Asl.LineNumber,
   1378   1.6  christos             Op->Asl.LogicalLineNumber,
   1379   1.6  christos             Op->Asl.LogicalByteOffset,
   1380   1.6  christos             Op->Asl.Column,
   1381  1.11  christos             Op->Asl.Filename, AslGbl_MsgBuffer);
   1382   1.1    jruoho     }
   1383   1.1    jruoho     else
   1384   1.1    jruoho     {
   1385   1.6  christos         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
   1386  1.11  christos             0, 0, 0, 0, NULL, AslGbl_MsgBuffer);
   1387   1.1    jruoho     }
   1388   1.1    jruoho 
   1389   1.1    jruoho     if (Abort)
   1390   1.1    jruoho     {
   1391   1.1    jruoho         AslAbort ();
   1392   1.1    jruoho     }
   1393   1.1    jruoho }
   1394   1.1    jruoho 
   1395   1.1    jruoho 
   1396   1.1    jruoho /*******************************************************************************
   1397   1.1    jruoho  *
   1398   1.1    jruoho  * FUNCTION:    AslCompilererror
   1399   1.1    jruoho  *
   1400   1.1    jruoho  * PARAMETERS:  CompilerMessage         - Error message from the parser
   1401   1.1    jruoho  *
   1402   1.1    jruoho  * RETURN:      Status (0 for now)
   1403   1.1    jruoho  *
   1404   1.1    jruoho  * DESCRIPTION: Report an error situation discovered in a production
   1405   1.1    jruoho  *              NOTE: don't change the name of this function, it is called
   1406   1.1    jruoho  *              from the auto-generated parser.
   1407   1.1    jruoho  *
   1408   1.1    jruoho  ******************************************************************************/
   1409   1.1    jruoho 
   1410   1.1    jruoho int
   1411   1.1    jruoho AslCompilererror (
   1412   1.2  christos     const char              *CompilerMessage)
   1413   1.1    jruoho {
   1414   1.1    jruoho 
   1415  1.11  christos     AslGbl_SyntaxError++;
   1416   1.4  christos 
   1417  1.11  christos     AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber,
   1418  1.11  christos         AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset,
   1419  1.11  christos         AslGbl_CurrentColumn, AslGbl_Files[ASL_FILE_INPUT].Filename,
   1420   1.2  christos         ACPI_CAST_PTR (char, CompilerMessage));
   1421   1.1    jruoho 
   1422   1.2  christos     return (0);
   1423   1.1    jruoho }
   1424