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