Home | History | Annotate | Line # | Download | only in compiler
aslerror.c revision 1.16
      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.15  christos  * Copyright (C) 2000 - 2020, 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.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.1    jruoho         printf ("\nMaximum error count (%u) exceeded\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.1    jruoho     return;
    929   1.1    jruoho }
    930   1.1    jruoho 
    931  1.11  christos 
    932  1.11  christos /*******************************************************************************
    933  1.11  christos  *
    934  1.11  christos  * FUNCTION:    GetModifiedLevel
    935  1.11  christos  *
    936  1.11  christos  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
    937  1.11  christos  *              MessageId       - Index into global message buffer
    938  1.11  christos  *
    939  1.14  christos  * RETURN:      UINT8           - Modified level
    940  1.11  christos  *
    941  1.11  christos  * DESCRIPTION: Get the modified level of exception codes that are reported as
    942  1.11  christos  *              errors from the -ww option.
    943  1.11  christos  *
    944  1.11  christos  ******************************************************************************/
    945  1.11  christos 
    946  1.11  christos static UINT8
    947  1.11  christos GetModifiedLevel (
    948  1.11  christos     UINT8                   Level,
    949  1.11  christos     UINT16                  MessageId)
    950  1.11  christos {
    951  1.16  christos     UINT32                  i;
    952  1.11  christos     UINT16                  ExceptionCode;
    953  1.11  christos 
    954  1.11  christos 
    955  1.11  christos     ExceptionCode = AeBuildFullExceptionCode (Level, MessageId);
    956  1.11  christos 
    957  1.11  christos     for (i = 0; i < AslGbl_ElevatedMessagesIndex; i++)
    958  1.11  christos     {
    959  1.11  christos         if (ExceptionCode == AslGbl_ElevatedMessages[i])
    960  1.11  christos         {
    961  1.11  christos             return (ASL_ERROR);
    962  1.11  christos         }
    963  1.11  christos     }
    964  1.11  christos 
    965  1.11  christos     return (Level);
    966  1.11  christos }
    967  1.11  christos 
    968  1.11  christos 
    969   1.8  christos /*******************************************************************************
    970   1.8  christos  *
    971   1.8  christos  * FUNCTION:    AslIsExceptionIgnored
    972   1.8  christos  *
    973   1.9  christos  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
    974   1.9  christos  *              MessageId       - Index into global message buffer
    975   1.8  christos  *
    976   1.8  christos  * RETURN:      BOOLEAN
    977   1.8  christos  *
    978   1.8  christos  * DESCRIPTION: Check if a particular exception is ignored. In this case it
    979   1.8  christos  *              means that the exception is (expected or disabled.
    980   1.8  christos  *
    981   1.8  christos  ******************************************************************************/
    982   1.8  christos 
    983   1.8  christos BOOLEAN
    984   1.8  christos AslIsExceptionIgnored (
    985  1.15  christos     char                    *Filename,
    986  1.15  christos     UINT32                  LineNumber,
    987   1.8  christos     UINT8                   Level,
    988   1.8  christos     UINT16                  MessageId)
    989   1.8  christos {
    990   1.9  christos     BOOLEAN                 ExceptionIgnored;
    991   1.8  christos 
    992   1.8  christos 
    993   1.8  christos     /* Note: this allows exception to be disabled and expected */
    994   1.8  christos 
    995   1.8  christos     ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
    996  1.15  christos     ExceptionIgnored |=
    997  1.15  christos         AslIsExceptionExpected (Filename, LineNumber, Level, MessageId);
    998   1.8  christos 
    999  1.11  christos     return (AslGbl_AllExceptionsDisabled || ExceptionIgnored);
   1000   1.8  christos }
   1001   1.8  christos 
   1002   1.8  christos 
   1003   1.8  christos /*******************************************************************************
   1004   1.8  christos  *
   1005  1.15  christos  * FUNCTION:    AslCheckExpectedException
   1006   1.8  christos  *
   1007   1.8  christos  * PARAMETERS:  none
   1008   1.8  christos  *
   1009   1.8  christos  * RETURN:      none
   1010   1.8  christos  *
   1011   1.8  christos  * DESCRIPTION: Check the global expected messages table and raise an error
   1012   1.8  christos  *              for each message that has not been received.
   1013   1.8  christos  *
   1014   1.8  christos  ******************************************************************************/
   1015   1.8  christos 
   1016   1.8  christos void
   1017   1.8  christos AslCheckExpectedExceptions (
   1018   1.8  christos     void)
   1019   1.8  christos {
   1020   1.9  christos     UINT8                   i;
   1021  1.15  christos     ASL_EXPECTED_MSG_NODE   *Current = AslGbl_ExpectedErrorCodeList;
   1022  1.15  christos     ASL_LOCATION_NODE       *LocationNode;
   1023   1.9  christos 
   1024   1.8  christos 
   1025  1.11  christos     for (i = 0; i < AslGbl_ExpectedMessagesIndex; ++i)
   1026   1.8  christos     {
   1027  1.11  christos         if (!AslGbl_ExpectedMessages[i].MessageReceived)
   1028   1.8  christos         {
   1029   1.8  christos             AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
   1030  1.11  christos                 AslGbl_ExpectedMessages[i].MessageIdStr);
   1031   1.8  christos         }
   1032   1.8  christos     }
   1033  1.15  christos 
   1034  1.15  christos     while (Current)
   1035  1.15  christos     {
   1036  1.15  christos         LocationNode = Current->LocationList;
   1037  1.15  christos 
   1038  1.15  christos         while (LocationNode)
   1039  1.15  christos         {
   1040  1.15  christos             if (!LocationNode->MessageReceived)
   1041  1.15  christos             {
   1042  1.15  christos                 AslCommonError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED,
   1043  1.15  christos                     LocationNode->LineNumber, LocationNode->LineNumber,
   1044  1.15  christos                     LocationNode->LogicalByteOffset, LocationNode->Column,
   1045  1.15  christos                     LocationNode->Filename, Current->MessageIdStr);
   1046  1.15  christos             }
   1047  1.15  christos 
   1048  1.15  christos             LocationNode = LocationNode->Next;
   1049  1.15  christos         }
   1050  1.15  christos 
   1051  1.15  christos         Current = Current->Next;
   1052  1.15  christos     }
   1053   1.8  christos }
   1054   1.8  christos 
   1055   1.8  christos 
   1056   1.8  christos /*******************************************************************************
   1057   1.8  christos  *
   1058  1.15  christos  * FUNCTION:    AslLogExpectedException
   1059   1.8  christos  *
   1060   1.8  christos  * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
   1061   1.8  christos  *
   1062   1.8  christos  * RETURN:      Status
   1063   1.8  christos  *
   1064   1.8  christos  * DESCRIPTION: Enter a message ID into the global expected messages table
   1065   1.8  christos  *              If these messages are not raised during the compilation, throw
   1066   1.8  christos  *              an error.
   1067   1.8  christos  *
   1068   1.8  christos  ******************************************************************************/
   1069   1.8  christos 
   1070   1.8  christos ACPI_STATUS
   1071  1.15  christos AslLogExpectedException (
   1072   1.8  christos     char                    *MessageIdString)
   1073   1.8  christos {
   1074   1.8  christos     UINT32                  MessageId;
   1075   1.8  christos 
   1076   1.8  christos 
   1077   1.8  christos     /* Convert argument to an integer and validate it */
   1078   1.8  christos 
   1079   1.8  christos     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
   1080   1.8  christos 
   1081   1.8  christos     if (MessageId > 6999)
   1082   1.8  christos     {
   1083   1.8  christos         printf ("\"%s\" is not a valid warning/remark/erro ID\n",
   1084   1.8  christos             MessageIdString);
   1085   1.8  christos         return (AE_BAD_PARAMETER);
   1086   1.8  christos     }
   1087   1.8  christos 
   1088   1.8  christos     /* Insert value into the global expected message array */
   1089   1.8  christos 
   1090  1.11  christos     if (AslGbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
   1091   1.8  christos     {
   1092  1.11  christos         printf ("Too many messages have been registered as expected (max %d)\n",
   1093   1.8  christos             ASL_MAX_DISABLED_MESSAGES);
   1094   1.8  christos         return (AE_LIMIT);
   1095   1.8  christos     }
   1096   1.8  christos 
   1097  1.11  christos     AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageId = MessageId;
   1098  1.11  christos     AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
   1099  1.11  christos     AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageReceived = FALSE;
   1100  1.11  christos     AslGbl_ExpectedMessagesIndex++;
   1101   1.8  christos     return (AE_OK);
   1102   1.8  christos }
   1103   1.8  christos 
   1104   1.1    jruoho 
   1105   1.1    jruoho /*******************************************************************************
   1106   1.1    jruoho  *
   1107  1.15  christos  * FUNCTION:    AslLogExpectedExceptionByLine
   1108  1.15  christos  *
   1109  1.15  christos  * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
   1110  1.15  christos  *
   1111  1.15  christos  * RETURN:      Status
   1112  1.15  christos  *
   1113  1.15  christos  * DESCRIPTION: Enter a message ID into the global expected messages table
   1114  1.15  christos  *              based on file and line number. If these messages are not raised
   1115  1.15  christos  *              during the compilation, throw an error.
   1116  1.15  christos  *
   1117  1.15  christos  ******************************************************************************/
   1118  1.15  christos 
   1119  1.15  christos void
   1120  1.15  christos AslLogExpectedExceptionByLine (
   1121  1.15  christos     char                    *MessageIdString)
   1122  1.15  christos {
   1123  1.15  christos     ASL_LOCATION_NODE       *NewErrorLocationNode;
   1124  1.15  christos     ASL_EXPECTED_MSG_NODE   *Current = AslGbl_ExpectedErrorCodeList;
   1125  1.15  christos     UINT32                  MessageId;
   1126  1.15  christos 
   1127  1.15  christos 
   1128  1.15  christos     NewErrorLocationNode = UtLocalCalloc (sizeof (ASL_LOCATION_NODE));
   1129  1.15  christos 
   1130  1.15  christos     NewErrorLocationNode->LineNumber = AslGbl_CurrentLineNumber;
   1131  1.15  christos     NewErrorLocationNode->Filename = AslGbl_Files[ASL_FILE_INPUT].Filename;
   1132  1.15  christos     NewErrorLocationNode->LogicalByteOffset = AslGbl_CurrentLineOffset;
   1133  1.15  christos     NewErrorLocationNode->Column = AslGbl_CurrentColumn;
   1134  1.15  christos 
   1135  1.15  christos     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
   1136  1.15  christos 
   1137  1.15  christos     /* search the existing list for a matching message ID */
   1138  1.15  christos 
   1139  1.15  christos     while (Current && Current->MessageId != MessageId )
   1140  1.15  christos     {
   1141  1.15  christos         Current = Current->Next;
   1142  1.15  christos     }
   1143  1.15  christos     if (!Current)
   1144  1.15  christos     {
   1145  1.15  christos         /* ID was not found, create a new node for this message ID */
   1146  1.15  christos 
   1147  1.15  christos         Current = UtLocalCalloc (sizeof (ASL_EXPECTED_MSG_NODE));
   1148  1.15  christos 
   1149  1.15  christos         Current->Next = AslGbl_ExpectedErrorCodeList;
   1150  1.15  christos         Current->MessageIdStr = MessageIdString;
   1151  1.15  christos         Current->MessageId = MessageId;
   1152  1.15  christos         AslGbl_ExpectedErrorCodeList = Current;
   1153  1.15  christos     }
   1154  1.15  christos 
   1155  1.15  christos     NewErrorLocationNode->Next = Current->LocationList;
   1156  1.15  christos     Current->LocationList = NewErrorLocationNode;
   1157  1.15  christos }
   1158  1.15  christos 
   1159  1.15  christos 
   1160  1.15  christos /*******************************************************************************
   1161  1.15  christos  *
   1162   1.2  christos  * FUNCTION:    AslDisableException
   1163   1.2  christos  *
   1164   1.2  christos  * PARAMETERS:  MessageIdString     - ID to be disabled
   1165   1.2  christos  *
   1166   1.2  christos  * RETURN:      Status
   1167   1.2  christos  *
   1168   1.2  christos  * DESCRIPTION: Enter a message ID into the global disabled messages table
   1169   1.2  christos  *
   1170   1.2  christos  ******************************************************************************/
   1171   1.2  christos 
   1172   1.2  christos ACPI_STATUS
   1173   1.2  christos AslDisableException (
   1174   1.2  christos     char                    *MessageIdString)
   1175   1.2  christos {
   1176   1.2  christos     UINT32                  MessageId;
   1177   1.2  christos 
   1178   1.2  christos 
   1179   1.2  christos     /* Convert argument to an integer and validate it */
   1180   1.2  christos 
   1181   1.2  christos     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
   1182   1.2  christos 
   1183   1.8  christos     if ((MessageId < 2000) || (MessageId > 6999))
   1184   1.2  christos     {
   1185   1.8  christos         printf ("\"%s\" is not a valid warning/remark/error ID\n",
   1186   1.2  christos             MessageIdString);
   1187   1.2  christos         return (AE_BAD_PARAMETER);
   1188   1.2  christos     }
   1189   1.2  christos 
   1190   1.2  christos     /* Insert value into the global disabled message array */
   1191   1.2  christos 
   1192  1.11  christos     if (AslGbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES)
   1193   1.2  christos     {
   1194  1.11  christos         printf ("Too many messages have been disabled (max %d)\n",
   1195   1.2  christos             ASL_MAX_DISABLED_MESSAGES);
   1196   1.2  christos         return (AE_LIMIT);
   1197   1.2  christos     }
   1198   1.2  christos 
   1199  1.11  christos     AslGbl_DisabledMessages[AslGbl_DisabledMessagesIndex] = MessageId;
   1200  1.11  christos     AslGbl_DisabledMessagesIndex++;
   1201   1.2  christos     return (AE_OK);
   1202   1.2  christos }
   1203   1.2  christos 
   1204   1.2  christos 
   1205   1.2  christos /*******************************************************************************
   1206   1.2  christos  *
   1207  1.11  christos  * FUNCTION:    AslElevateException
   1208  1.11  christos  *
   1209  1.11  christos  * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
   1210  1.11  christos  *
   1211  1.11  christos  * RETURN:      Status
   1212  1.11  christos  *
   1213  1.11  christos  * DESCRIPTION: Enter a message ID into the global elevated exceptions table.
   1214  1.11  christos  *              These messages will be considered as compilation errors.
   1215  1.11  christos  *
   1216  1.11  christos  ******************************************************************************/
   1217  1.11  christos 
   1218  1.11  christos ACPI_STATUS
   1219  1.11  christos AslElevateException (
   1220  1.11  christos     char                    *MessageIdString)
   1221  1.11  christos {
   1222  1.11  christos     UINT32                  MessageId;
   1223  1.11  christos 
   1224  1.11  christos 
   1225  1.11  christos     /* Convert argument to an integer and validate it */
   1226  1.11  christos 
   1227  1.11  christos     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
   1228  1.11  christos 
   1229  1.11  christos     if (MessageId > 6999)
   1230  1.11  christos     {
   1231  1.11  christos         printf ("\"%s\" is not a valid warning/remark/erro ID\n",
   1232  1.11  christos             MessageIdString);
   1233  1.11  christos         return (AE_BAD_PARAMETER);
   1234  1.11  christos     }
   1235  1.11  christos 
   1236  1.11  christos     /* Insert value into the global expected message array */
   1237  1.11  christos 
   1238  1.11  christos     if (AslGbl_ElevatedMessagesIndex >= ASL_MAX_ELEVATED_MESSAGES)
   1239  1.11  christos     {
   1240  1.11  christos         printf ("Too many messages have been registered as elevated (max %d)\n",
   1241  1.11  christos             ASL_MAX_DISABLED_MESSAGES);
   1242  1.11  christos         return (AE_LIMIT);
   1243  1.11  christos     }
   1244  1.11  christos 
   1245  1.12  christos     AslGbl_ElevatedMessages[AslGbl_ElevatedMessagesIndex] = MessageId;
   1246  1.11  christos     AslGbl_ElevatedMessagesIndex++;
   1247  1.11  christos     return (AE_OK);
   1248  1.11  christos }
   1249  1.11  christos 
   1250  1.15  christos 
   1251  1.11  christos /*******************************************************************************
   1252  1.11  christos  *
   1253   1.2  christos  * FUNCTION:    AslIsExceptionDisabled
   1254   1.2  christos  *
   1255   1.9  christos  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
   1256   1.9  christos  *              MessageId       - Index into global message buffer
   1257   1.2  christos  *
   1258   1.2  christos  * RETURN:      TRUE if exception/message should be ignored
   1259   1.2  christos  *
   1260   1.2  christos  * DESCRIPTION: Check if the user has specified options such that this
   1261   1.2  christos  *              exception should be ignored
   1262   1.2  christos  *
   1263   1.2  christos  ******************************************************************************/
   1264   1.2  christos 
   1265   1.8  christos static BOOLEAN
   1266   1.8  christos AslIsExceptionExpected (
   1267  1.15  christos     char                    *Filename,
   1268  1.15  christos     UINT32                  LineNumber,
   1269   1.8  christos     UINT8                   Level,
   1270   1.8  christos     UINT16                  MessageId)
   1271   1.8  christos {
   1272  1.15  christos     ASL_EXPECTED_MSG_NODE   *Current = AslGbl_ExpectedErrorCodeList;
   1273  1.15  christos     ASL_LOCATION_NODE       *CurrentErrorLocation;
   1274   1.8  christos     UINT32                  EncodedMessageId;
   1275   1.8  christos     UINT32                  i;
   1276   1.8  christos 
   1277   1.8  christos 
   1278   1.9  christos     /* Mark this exception as received */
   1279   1.9  christos 
   1280   1.8  christos     EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
   1281  1.11  christos     for (i = 0; i < AslGbl_ExpectedMessagesIndex; i++)
   1282   1.8  christos     {
   1283   1.8  christos         /* Simple implementation via fixed array */
   1284   1.8  christos 
   1285  1.11  christos         if (EncodedMessageId == AslGbl_ExpectedMessages[i].MessageId)
   1286   1.8  christos         {
   1287  1.11  christos             return (AslGbl_ExpectedMessages[i].MessageReceived = TRUE);
   1288   1.8  christos         }
   1289   1.8  christos     }
   1290   1.8  christos 
   1291  1.15  christos     while (Current && Current->MessageId != EncodedMessageId)
   1292  1.15  christos     {
   1293  1.15  christos         Current = Current->Next;
   1294  1.15  christos     }
   1295  1.15  christos     if (!Current)
   1296  1.15  christos     {
   1297  1.15  christos         return (FALSE);
   1298  1.15  christos     }
   1299  1.15  christos 
   1300  1.15  christos     CurrentErrorLocation = Current->LocationList;
   1301  1.15  christos 
   1302  1.15  christos     while (CurrentErrorLocation)
   1303  1.15  christos     {
   1304  1.15  christos         if (!strcmp (CurrentErrorLocation->Filename, Filename) &&
   1305  1.15  christos             CurrentErrorLocation->LineNumber == LineNumber)
   1306  1.15  christos         {
   1307  1.15  christos             return (CurrentErrorLocation->MessageReceived = TRUE);
   1308  1.15  christos         }
   1309  1.15  christos 
   1310  1.15  christos         CurrentErrorLocation = CurrentErrorLocation->Next;
   1311  1.15  christos     }
   1312  1.15  christos 
   1313   1.8  christos     return (FALSE);
   1314   1.8  christos }
   1315   1.8  christos 
   1316   1.8  christos 
   1317   1.8  christos /*******************************************************************************
   1318   1.8  christos  *
   1319   1.8  christos  * FUNCTION:    AslIsExceptionDisabled
   1320   1.8  christos  *
   1321   1.8  christos  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
   1322   1.8  christos  *              MessageId           - Index into global message buffer
   1323   1.8  christos  *
   1324   1.8  christos  * RETURN:      TRUE if exception/message should be ignored
   1325   1.8  christos  *
   1326   1.8  christos  * DESCRIPTION: Check if the user has specified options such that this
   1327   1.8  christos  *              exception should be ignored
   1328   1.8  christos  *
   1329   1.8  christos  ******************************************************************************/
   1330   1.8  christos 
   1331   1.8  christos static BOOLEAN
   1332   1.2  christos AslIsExceptionDisabled (
   1333   1.2  christos     UINT8                   Level,
   1334   1.3  christos     UINT16                  MessageId)
   1335   1.2  christos {
   1336   1.2  christos     UINT32                  EncodedMessageId;
   1337   1.2  christos     UINT32                  i;
   1338   1.2  christos 
   1339   1.2  christos 
   1340   1.2  christos     switch (Level)
   1341   1.2  christos     {
   1342   1.2  christos     case ASL_WARNING2:
   1343   1.2  christos     case ASL_WARNING3:
   1344   1.2  christos 
   1345   1.2  christos         /* Check for global disable via -w1/-w2/-w3 options */
   1346   1.2  christos 
   1347  1.11  christos         if (Level > AslGbl_WarningLevel)
   1348   1.2  christos         {
   1349   1.2  christos             return (TRUE);
   1350   1.2  christos         }
   1351   1.2  christos         /* Fall through */
   1352   1.2  christos 
   1353   1.2  christos     case ASL_WARNING:
   1354   1.2  christos     case ASL_REMARK:
   1355   1.8  christos     case ASL_ERROR:
   1356   1.2  christos         /*
   1357   1.8  christos          * Ignore this error/warning/remark if it has been disabled by
   1358   1.2  christos          * the user (-vw option)
   1359   1.2  christos          */
   1360   1.3  christos         EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
   1361  1.11  christos         for (i = 0; i < AslGbl_DisabledMessagesIndex; i++)
   1362   1.2  christos         {
   1363   1.2  christos             /* Simple implementation via fixed array */
   1364   1.2  christos 
   1365  1.11  christos             if (EncodedMessageId == AslGbl_DisabledMessages[i])
   1366   1.2  christos             {
   1367   1.2  christos                 return (TRUE);
   1368   1.2  christos             }
   1369   1.2  christos         }
   1370   1.2  christos         break;
   1371   1.2  christos 
   1372   1.2  christos     default:
   1373   1.2  christos         break;
   1374   1.2  christos     }
   1375   1.2  christos 
   1376   1.2  christos     return (FALSE);
   1377   1.2  christos }
   1378   1.2  christos 
   1379   1.2  christos 
   1380   1.2  christos /*******************************************************************************
   1381   1.2  christos  *
   1382   1.9  christos  * FUNCTION:    AslDualParseOpError
   1383   1.9  christos  *
   1384   1.9  christos  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
   1385   1.9  christos  *              MainMsgId       - Index into global message buffer
   1386   1.9  christos  *              MainOp          - Parse node where error happened
   1387   1.9  christos  *              MainMsg         - Message pertaining to the MainOp
   1388   1.9  christos  *              SubMsgId        - Index into global message buffer
   1389   1.9  christos  *              SubOp           - Additional parse node for better message
   1390  1.14  christos  *              SubMsg          - Message pertaining to SubOp
   1391   1.9  christos  *
   1392   1.9  christos  *
   1393   1.9  christos  * RETURN:      None
   1394   1.9  christos  *
   1395   1.9  christos  * DESCRIPTION: Main error reporting routine for the ASL compiler for error
   1396   1.9  christos  *              messages that point to multiple parse objects.
   1397   1.9  christos  *
   1398   1.9  christos  ******************************************************************************/
   1399   1.9  christos 
   1400   1.9  christos void
   1401   1.9  christos AslDualParseOpError (
   1402   1.9  christos     UINT8                   Level,
   1403   1.9  christos     UINT16                  MainMsgId,
   1404   1.9  christos     ACPI_PARSE_OBJECT       *MainOp,
   1405   1.9  christos     char                    *MainMsg,
   1406   1.9  christos     UINT16                  SubMsgId,
   1407   1.9  christos     ACPI_PARSE_OBJECT       *SubOp,
   1408   1.9  christos     char                    *SubMsg)
   1409   1.9  christos {
   1410   1.9  christos     ASL_ERROR_MSG           *SubEnode = NULL;
   1411   1.9  christos 
   1412   1.9  christos 
   1413   1.9  christos     /* Check if user wants to ignore this exception */
   1414   1.9  christos 
   1415  1.15  christos     if (!MainOp || AslIsExceptionIgnored (MainOp->Asl.Filename,
   1416  1.15  christos         MainOp->Asl.LogicalLineNumber, Level, MainMsgId))
   1417   1.9  christos     {
   1418   1.9  christos         return;
   1419   1.9  christos     }
   1420   1.9  christos 
   1421   1.9  christos     if (SubOp)
   1422   1.9  christos     {
   1423   1.9  christos         AslInitEnode (&SubEnode, Level, SubMsgId, SubOp->Asl.LineNumber,
   1424   1.9  christos             SubOp->Asl.LogicalLineNumber, SubOp->Asl.LogicalByteOffset,
   1425   1.9  christos             SubOp->Asl.Column, SubOp->Asl.Filename, SubMsg,
   1426   1.9  christos             NULL, NULL);
   1427   1.9  christos     }
   1428   1.9  christos 
   1429   1.9  christos     AslLogNewError (Level, MainMsgId, MainOp->Asl.LineNumber,
   1430   1.9  christos         MainOp->Asl.LogicalLineNumber, MainOp->Asl.LogicalByteOffset,
   1431   1.9  christos         MainOp->Asl.Column, MainOp->Asl.Filename, MainMsg,
   1432   1.9  christos         NULL, SubEnode);
   1433   1.9  christos }
   1434   1.9  christos 
   1435   1.9  christos 
   1436   1.9  christos /*******************************************************************************
   1437   1.9  christos  *
   1438   1.1    jruoho  * FUNCTION:    AslError
   1439   1.1    jruoho  *
   1440   1.1    jruoho  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
   1441   1.1    jruoho  *              MessageId           - Index into global message buffer
   1442   1.1    jruoho  *              Op                  - Parse node where error happened
   1443  1.14  christos  *              ExtraMessage        - Additional error message
   1444   1.1    jruoho  *
   1445   1.1    jruoho  * RETURN:      None
   1446   1.1    jruoho  *
   1447   1.1    jruoho  * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
   1448   1.1    jruoho  *              except the parser.)
   1449   1.1    jruoho  *
   1450   1.1    jruoho  ******************************************************************************/
   1451   1.1    jruoho 
   1452   1.1    jruoho void
   1453   1.1    jruoho AslError (
   1454   1.1    jruoho     UINT8                   Level,
   1455   1.3  christos     UINT16                  MessageId,
   1456   1.1    jruoho     ACPI_PARSE_OBJECT       *Op,
   1457   1.1    jruoho     char                    *ExtraMessage)
   1458   1.1    jruoho {
   1459   1.1    jruoho     if (Op)
   1460   1.1    jruoho     {
   1461   1.1    jruoho         AslCommonError (Level, MessageId, Op->Asl.LineNumber,
   1462   1.2  christos             Op->Asl.LogicalLineNumber,
   1463   1.2  christos             Op->Asl.LogicalByteOffset,
   1464   1.2  christos             Op->Asl.Column,
   1465   1.2  christos             Op->Asl.Filename, ExtraMessage);
   1466   1.1    jruoho     }
   1467   1.1    jruoho     else
   1468   1.1    jruoho     {
   1469   1.1    jruoho         AslCommonError (Level, MessageId, 0,
   1470   1.2  christos             0, 0, 0, NULL, ExtraMessage);
   1471   1.1    jruoho     }
   1472   1.1    jruoho }
   1473   1.1    jruoho 
   1474   1.1    jruoho 
   1475   1.1    jruoho /*******************************************************************************
   1476   1.1    jruoho  *
   1477   1.1    jruoho  * FUNCTION:    AslCoreSubsystemError
   1478   1.1    jruoho  *
   1479   1.1    jruoho  * PARAMETERS:  Op                  - Parse node where error happened
   1480   1.3  christos  *              Status              - The ACPICA Exception
   1481  1.14  christos  *              ExtraMessage        - Additional error message
   1482   1.1    jruoho  *              Abort               - TRUE -> Abort compilation
   1483   1.1    jruoho  *
   1484   1.1    jruoho  * RETURN:      None
   1485   1.1    jruoho  *
   1486   1.3  christos  * DESCRIPTION: Error reporting routine for exceptions returned by the ACPICA
   1487   1.3  christos  *              core subsystem.
   1488   1.1    jruoho  *
   1489   1.1    jruoho  ******************************************************************************/
   1490   1.1    jruoho 
   1491   1.1    jruoho void
   1492   1.1    jruoho AslCoreSubsystemError (
   1493   1.1    jruoho     ACPI_PARSE_OBJECT       *Op,
   1494   1.1    jruoho     ACPI_STATUS             Status,
   1495   1.1    jruoho     char                    *ExtraMessage,
   1496   1.1    jruoho     BOOLEAN                 Abort)
   1497   1.1    jruoho {
   1498   1.1    jruoho 
   1499  1.11  christos     snprintf (AslGbl_MsgBuffer, sizeof(AslGbl_MsgBuffer), "%s %s", AcpiFormatException (Status), ExtraMessage);
   1500   1.1    jruoho 
   1501   1.1    jruoho     if (Op)
   1502   1.1    jruoho     {
   1503   1.6  christos         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
   1504   1.6  christos             Op->Asl.LineNumber,
   1505   1.6  christos             Op->Asl.LogicalLineNumber,
   1506   1.6  christos             Op->Asl.LogicalByteOffset,
   1507   1.6  christos             Op->Asl.Column,
   1508  1.11  christos             Op->Asl.Filename, AslGbl_MsgBuffer);
   1509   1.1    jruoho     }
   1510   1.1    jruoho     else
   1511   1.1    jruoho     {
   1512   1.6  christos         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
   1513  1.11  christos             0, 0, 0, 0, NULL, AslGbl_MsgBuffer);
   1514   1.1    jruoho     }
   1515   1.1    jruoho 
   1516   1.1    jruoho     if (Abort)
   1517   1.1    jruoho     {
   1518   1.1    jruoho         AslAbort ();
   1519   1.1    jruoho     }
   1520   1.1    jruoho }
   1521   1.1    jruoho 
   1522   1.1    jruoho 
   1523   1.1    jruoho /*******************************************************************************
   1524   1.1    jruoho  *
   1525   1.1    jruoho  * FUNCTION:    AslCompilererror
   1526   1.1    jruoho  *
   1527   1.1    jruoho  * PARAMETERS:  CompilerMessage         - Error message from the parser
   1528   1.1    jruoho  *
   1529   1.1    jruoho  * RETURN:      Status (0 for now)
   1530   1.1    jruoho  *
   1531   1.1    jruoho  * DESCRIPTION: Report an error situation discovered in a production
   1532   1.1    jruoho  *              NOTE: don't change the name of this function, it is called
   1533   1.1    jruoho  *              from the auto-generated parser.
   1534   1.1    jruoho  *
   1535   1.1    jruoho  ******************************************************************************/
   1536   1.1    jruoho 
   1537   1.1    jruoho int
   1538   1.1    jruoho AslCompilererror (
   1539   1.2  christos     const char              *CompilerMessage)
   1540   1.1    jruoho {
   1541   1.1    jruoho 
   1542  1.11  christos     AslGbl_SyntaxError++;
   1543   1.4  christos 
   1544  1.11  christos     AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber,
   1545  1.11  christos         AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset,
   1546  1.11  christos         AslGbl_CurrentColumn, AslGbl_Files[ASL_FILE_INPUT].Filename,
   1547   1.2  christos         ACPI_CAST_PTR (char, CompilerMessage));
   1548   1.1    jruoho 
   1549   1.2  christos     return (0);
   1550   1.1    jruoho }
   1551