xref: /dflybsd-src/sys/contrib/dev/acpica/source/compiler/aslerror.c (revision 01d5d5df55caa9c47886aef5197b8c4301cc621b)
10d02842fSSascha Wildner /******************************************************************************
20d02842fSSascha Wildner  *
30d02842fSSascha Wildner  * Module Name: aslerror - Error handling and statistics
40d02842fSSascha Wildner  *
50d02842fSSascha Wildner  *****************************************************************************/
60d02842fSSascha Wildner 
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner  *
9b4315fc7SSascha Wildner  * 1. Copyright Notice
10b4315fc7SSascha Wildner  *
11383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
120d02842fSSascha Wildner  * All rights reserved.
130d02842fSSascha Wildner  *
14b4315fc7SSascha Wildner  * 2. License
15b4315fc7SSascha Wildner  *
16b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner  * property rights.
20b4315fc7SSascha Wildner  *
21b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner  *
28b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner  *
37b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner  * conditions are met:
39b4315fc7SSascha Wildner  *
40b4315fc7SSascha Wildner  * 3. Conditions
41b4315fc7SSascha Wildner  *
42b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner  *
54b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner  * make.
65b4315fc7SSascha Wildner  *
66b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner  * distribution.
71b4315fc7SSascha Wildner  *
72b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner  * Intel Code.
74b4315fc7SSascha Wildner  *
75b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79b4315fc7SSascha Wildner  *
80b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner  *
82b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner  *
90b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner  * LIMITED REMEDY.
98b4315fc7SSascha Wildner  *
99b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner  * such license, approval or letter.
113b4315fc7SSascha Wildner  *
114b4315fc7SSascha Wildner  *****************************************************************************
115b4315fc7SSascha Wildner  *
116b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner  * following license:
118b4315fc7SSascha Wildner  *
1190d02842fSSascha Wildner  * Redistribution and use in source and binary forms, with or without
1200d02842fSSascha Wildner  * modification, are permitted provided that the following conditions
1210d02842fSSascha Wildner  * are met:
1220d02842fSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
1230d02842fSSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
1240d02842fSSascha Wildner  *    without modification.
1250d02842fSSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1260d02842fSSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
1270d02842fSSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
1280d02842fSSascha Wildner  *    including a substantially similar Disclaimer requirement for further
1290d02842fSSascha Wildner  *    binary redistribution.
1300d02842fSSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
1310d02842fSSascha Wildner  *    of any contributors may be used to endorse or promote products derived
1320d02842fSSascha Wildner  *    from this software without specific prior written permission.
1330d02842fSSascha Wildner  *
134b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner  *
146b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
1470d02842fSSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
1480d02842fSSascha Wildner  * Software Foundation.
1490d02842fSSascha Wildner  *
150b4315fc7SSascha Wildner  *****************************************************************************/
1510d02842fSSascha Wildner 
1520d02842fSSascha Wildner #include "aslcompiler.h"
1530d02842fSSascha Wildner 
1540d02842fSSascha Wildner #define _COMPONENT          ACPI_COMPILER
1550d02842fSSascha Wildner         ACPI_MODULE_NAME    ("aslerror")
1560d02842fSSascha Wildner 
1570d02842fSSascha Wildner /* Local prototypes */
1580d02842fSSascha Wildner 
1590d02842fSSascha Wildner static void
1600d02842fSSascha Wildner AeAddToErrorLog (
1610d02842fSSascha Wildner     ASL_ERROR_MSG           *Enode);
1620d02842fSSascha Wildner 
1633c639e0cSSascha Wildner static BOOLEAN
1643c639e0cSSascha Wildner AslIsExceptionExpected (
16571c97a3cSSascha Wildner     char                    *Filename,
16671c97a3cSSascha Wildner     UINT32                  LineNumber,
1673c639e0cSSascha Wildner     UINT8                   Level,
1683c639e0cSSascha Wildner     UINT16                  MessageId);
1693c639e0cSSascha Wildner 
1703c639e0cSSascha Wildner static BOOLEAN
1713c639e0cSSascha Wildner AslIsExceptionDisabled (
1723c639e0cSSascha Wildner     UINT8                   Level,
1733c639e0cSSascha Wildner     UINT16                  MessageId);
1743c639e0cSSascha Wildner 
17571c97a3cSSascha Wildner static void
17671c97a3cSSascha Wildner AslInitEnode (
1777bcb6cafSSascha Wildner     ASL_ERROR_MSG           **Enode,
1787bcb6cafSSascha Wildner     UINT8                   Level,
1797bcb6cafSSascha Wildner     UINT16                  MessageId,
1807bcb6cafSSascha Wildner     UINT32                  LineNumber,
1817bcb6cafSSascha Wildner     UINT32                  LogicalLineNumber,
1827bcb6cafSSascha Wildner     UINT32                  LogicalByteOffset,
1837bcb6cafSSascha Wildner     UINT32                  Column,
1847bcb6cafSSascha Wildner     char                    *Filename,
1857bcb6cafSSascha Wildner     char                    *Message,
1867bcb6cafSSascha Wildner     char                    *SourceLine,
1877bcb6cafSSascha Wildner     ASL_ERROR_MSG           *SubError);
1887bcb6cafSSascha Wildner 
1897bcb6cafSSascha Wildner static void
1907bcb6cafSSascha Wildner AslLogNewError (
1917bcb6cafSSascha Wildner     UINT8                   Level,
1927bcb6cafSSascha Wildner     UINT16                  MessageId,
1937bcb6cafSSascha Wildner     UINT32                  LineNumber,
1947bcb6cafSSascha Wildner     UINT32                  LogicalLineNumber,
1957bcb6cafSSascha Wildner     UINT32                  LogicalByteOffset,
1967bcb6cafSSascha Wildner     UINT32                  Column,
1977bcb6cafSSascha Wildner     char                    *Filename,
1987bcb6cafSSascha Wildner     char                    *Message,
1997bcb6cafSSascha Wildner     char                    *SourceLine,
2007bcb6cafSSascha Wildner     ASL_ERROR_MSG           *SubError);
2017bcb6cafSSascha Wildner 
2027bcb6cafSSascha Wildner static void
2037bcb6cafSSascha Wildner AePrintSubError (
2047bcb6cafSSascha Wildner     FILE                    *OutputFile,
2057bcb6cafSSascha Wildner     ASL_ERROR_MSG           *Enode);
2067bcb6cafSSascha Wildner 
207ef944814SSascha Wildner static UINT8
208ef944814SSascha Wildner GetModifiedLevel (
209ef944814SSascha Wildner     UINT8                   Level,
210ef944814SSascha Wildner     UINT16                  MessageId);
211ef944814SSascha Wildner 
2120d02842fSSascha Wildner 
2130d02842fSSascha Wildner /*******************************************************************************
2140d02842fSSascha Wildner  *
2156a0135c2SSascha Wildner  * FUNCTION:    AslAbort
2166a0135c2SSascha Wildner  *
2176a0135c2SSascha Wildner  * PARAMETERS:  None
2186a0135c2SSascha Wildner  *
2196a0135c2SSascha Wildner  * RETURN:      None
2206a0135c2SSascha Wildner  *
2216a0135c2SSascha Wildner  * DESCRIPTION: Dump the error log and abort the compiler. Used for serious
2226a0135c2SSascha Wildner  *              I/O errors.
2236a0135c2SSascha Wildner  *
2246a0135c2SSascha Wildner  ******************************************************************************/
2256a0135c2SSascha Wildner 
2266a0135c2SSascha Wildner void
AslAbort(void)2276a0135c2SSascha Wildner AslAbort (
2286a0135c2SSascha Wildner     void)
2296a0135c2SSascha Wildner {
2306a0135c2SSascha Wildner 
2316a0135c2SSascha Wildner     AePrintErrorLog (ASL_FILE_STDERR);
232806343b9SSascha Wildner     if (AslGbl_DebugFlag)
2336a0135c2SSascha Wildner     {
2346a0135c2SSascha Wildner         /* Print error summary to stdout also */
2356a0135c2SSascha Wildner 
2366a0135c2SSascha Wildner         AePrintErrorLog (ASL_FILE_STDOUT);
2376a0135c2SSascha Wildner     }
2386a0135c2SSascha Wildner 
2396a0135c2SSascha Wildner     exit (1);
2406a0135c2SSascha Wildner }
2416a0135c2SSascha Wildner 
2426a0135c2SSascha Wildner 
2436a0135c2SSascha Wildner /*******************************************************************************
2446a0135c2SSascha Wildner  *
2450d02842fSSascha Wildner  * FUNCTION:    AeClearErrorLog
2460d02842fSSascha Wildner  *
2470d02842fSSascha Wildner  * PARAMETERS:  None
2480d02842fSSascha Wildner  *
2490d02842fSSascha Wildner  * RETURN:      None
2500d02842fSSascha Wildner  *
2510d02842fSSascha Wildner  * DESCRIPTION: Empty the error list
2520d02842fSSascha Wildner  *
2530d02842fSSascha Wildner  ******************************************************************************/
2540d02842fSSascha Wildner 
2550d02842fSSascha Wildner void
AeClearErrorLog(void)2560d02842fSSascha Wildner AeClearErrorLog (
2570d02842fSSascha Wildner     void)
2580d02842fSSascha Wildner {
259806343b9SSascha Wildner     ASL_ERROR_MSG           *Enode = AslGbl_ErrorLog;
2600d02842fSSascha Wildner     ASL_ERROR_MSG           *Next;
2610d02842fSSascha Wildner 
2627bcb6cafSSascha Wildner 
2630d02842fSSascha Wildner     /* Walk the error node list */
2640d02842fSSascha Wildner 
2650d02842fSSascha Wildner     while (Enode)
2660d02842fSSascha Wildner     {
2670d02842fSSascha Wildner         Next = Enode->Next;
2680d02842fSSascha Wildner         ACPI_FREE (Enode);
2690d02842fSSascha Wildner         Enode = Next;
2700d02842fSSascha Wildner     }
2710d02842fSSascha Wildner 
272806343b9SSascha Wildner    AslGbl_ErrorLog = NULL;
2730d02842fSSascha Wildner }
2740d02842fSSascha Wildner 
2750d02842fSSascha Wildner 
2760d02842fSSascha Wildner /*******************************************************************************
2770d02842fSSascha Wildner  *
2780d02842fSSascha Wildner  * FUNCTION:    AeAddToErrorLog
2790d02842fSSascha Wildner  *
2800d02842fSSascha Wildner  * PARAMETERS:  Enode       - An error node to add to the log
2810d02842fSSascha Wildner  *
2820d02842fSSascha Wildner  * RETURN:      None
2830d02842fSSascha Wildner  *
2840d02842fSSascha Wildner  * DESCRIPTION: Add a new error node to the error log. The error log is
2850d02842fSSascha Wildner  *              ordered by the "logical" line number (cumulative line number
2860d02842fSSascha Wildner  *              including all include files.)
2870d02842fSSascha Wildner  *
2880d02842fSSascha Wildner  ******************************************************************************/
2890d02842fSSascha Wildner 
2900d02842fSSascha Wildner static void
AeAddToErrorLog(ASL_ERROR_MSG * Enode)2910d02842fSSascha Wildner AeAddToErrorLog (
2920d02842fSSascha Wildner     ASL_ERROR_MSG           *Enode)
2930d02842fSSascha Wildner {
2940d02842fSSascha Wildner     ASL_ERROR_MSG           *Next;
2950d02842fSSascha Wildner     ASL_ERROR_MSG           *Prev;
2960d02842fSSascha Wildner 
2970d02842fSSascha Wildner 
2980d02842fSSascha Wildner     /* If Gbl_ErrorLog is null, this is the first error node */
2990d02842fSSascha Wildner 
300806343b9SSascha Wildner     if (!AslGbl_ErrorLog)
3010d02842fSSascha Wildner     {
302806343b9SSascha Wildner         AslGbl_ErrorLog = Enode;
3030d02842fSSascha Wildner         return;
3040d02842fSSascha Wildner     }
3050d02842fSSascha Wildner 
3060d02842fSSascha Wildner     /*
3070d02842fSSascha Wildner      * Walk error list until we find a line number greater than ours.
3080d02842fSSascha Wildner      * List is sorted according to line number.
3090d02842fSSascha Wildner      */
3100d02842fSSascha Wildner     Prev = NULL;
311806343b9SSascha Wildner     Next = AslGbl_ErrorLog;
3120d02842fSSascha Wildner 
3137bcb6cafSSascha Wildner     while ((Next) && (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
3140d02842fSSascha Wildner     {
3150d02842fSSascha Wildner         Prev = Next;
3160d02842fSSascha Wildner         Next = Next->Next;
3170d02842fSSascha Wildner     }
3180d02842fSSascha Wildner 
3190d02842fSSascha Wildner     /* Found our place in the list */
3200d02842fSSascha Wildner 
3210d02842fSSascha Wildner     Enode->Next = Next;
3220d02842fSSascha Wildner 
3230d02842fSSascha Wildner     if (Prev)
3240d02842fSSascha Wildner     {
3250d02842fSSascha Wildner         Prev->Next = Enode;
3260d02842fSSascha Wildner     }
3270d02842fSSascha Wildner     else
3280d02842fSSascha Wildner     {
329806343b9SSascha Wildner         AslGbl_ErrorLog = Enode;
3300d02842fSSascha Wildner     }
3310d02842fSSascha Wildner }
3320d02842fSSascha Wildner 
3330d02842fSSascha Wildner 
3340d02842fSSascha Wildner /*******************************************************************************
3350d02842fSSascha Wildner  *
3367bcb6cafSSascha Wildner  * FUNCTION:    AeDecodeErrorMessageId
3370d02842fSSascha Wildner  *
3387bcb6cafSSascha Wildner  * PARAMETERS:  OutputFile      - Output file
3390d02842fSSascha Wildner  *              Enode           - Error node to print
3407bcb6cafSSascha Wildner  *              PrematureEOF    - True = PrematureEOF has been reached
341e5412f1eSSascha Wildner  *              Total           - Total length of line
3420d02842fSSascha Wildner  *
3430d02842fSSascha Wildner  * RETURN:      None
3440d02842fSSascha Wildner  *
3457bcb6cafSSascha Wildner  * DESCRIPTION: Print the source line of an error.
3460d02842fSSascha Wildner  *
3470d02842fSSascha Wildner  ******************************************************************************/
3480d02842fSSascha Wildner 
3497bcb6cafSSascha Wildner static void
AeDecodeErrorMessageId(FILE * OutputFile,ASL_ERROR_MSG * Enode,BOOLEAN PrematureEOF,UINT32 Total)3507bcb6cafSSascha Wildner AeDecodeErrorMessageId (
3517bcb6cafSSascha Wildner     FILE                    *OutputFile,
3520d02842fSSascha Wildner     ASL_ERROR_MSG           *Enode,
3537bcb6cafSSascha Wildner     BOOLEAN                 PrematureEOF,
3547bcb6cafSSascha Wildner     UINT32                  Total)
3550d02842fSSascha Wildner {
3560d02842fSSascha Wildner     UINT32                  MsgLength;
3579e1c0880SSascha Wildner     const char              *MainMessage;
3580d02842fSSascha Wildner     char                    *ExtraMessage;
3590d02842fSSascha Wildner     UINT32                  SourceColumn;
3600d02842fSSascha Wildner     UINT32                  ErrorColumn;
3610d02842fSSascha Wildner 
3620d02842fSSascha Wildner 
3630d02842fSSascha Wildner     fprintf (OutputFile, "%s %4.4d -",
3649e1c0880SSascha Wildner         AeDecodeExceptionLevel (Enode->Level),
3659e1c0880SSascha Wildner         AeBuildFullExceptionCode (Enode->Level, Enode->MessageId));
3660d02842fSSascha Wildner 
3679e1c0880SSascha Wildner     MainMessage = AeDecodeMessageId (Enode->MessageId);
3680d02842fSSascha Wildner     ExtraMessage = Enode->Message;
3690d02842fSSascha Wildner 
3709e1c0880SSascha Wildner     /* If a NULL line number, just print the decoded message */
3710d02842fSSascha Wildner 
3729e1c0880SSascha Wildner     if (!Enode->LineNumber)
3730d02842fSSascha Wildner     {
3749e1c0880SSascha Wildner         fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
3759e1c0880SSascha Wildner         return;
3760d02842fSSascha Wildner     }
3770d02842fSSascha Wildner 
3780d02842fSSascha Wildner     MsgLength = strlen (MainMessage);
3790d02842fSSascha Wildner     if (MsgLength == 0)
3800d02842fSSascha Wildner     {
3810d02842fSSascha Wildner         /* Use the secondary/extra message as main message */
3820d02842fSSascha Wildner 
3830d02842fSSascha Wildner         MainMessage = Enode->Message;
3840d02842fSSascha Wildner         if (!MainMessage)
3850d02842fSSascha Wildner         {
3860d02842fSSascha Wildner             MainMessage = "";
3870d02842fSSascha Wildner         }
3880d02842fSSascha Wildner 
3890d02842fSSascha Wildner         MsgLength = strlen (MainMessage);
3900d02842fSSascha Wildner         ExtraMessage = NULL;
3910d02842fSSascha Wildner     }
3920d02842fSSascha Wildner 
393806343b9SSascha Wildner     if (AslGbl_VerboseErrors && !PrematureEOF)
3940d02842fSSascha Wildner     {
3950d02842fSSascha Wildner         if (Total >= 256)
3960d02842fSSascha Wildner         {
3970d02842fSSascha Wildner             fprintf (OutputFile, "    %s",
3980d02842fSSascha Wildner                 MainMessage);
3990d02842fSSascha Wildner         }
4000d02842fSSascha Wildner         else
4010d02842fSSascha Wildner         {
4020d02842fSSascha Wildner             SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
4030d02842fSSascha Wildner             ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
4040d02842fSSascha Wildner 
4050d02842fSSascha Wildner             if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
4060d02842fSSascha Wildner             {
4070d02842fSSascha Wildner                 fprintf (OutputFile, "%*s%s",
4080d02842fSSascha Wildner                     (int) ((SourceColumn - 1) - ErrorColumn),
4090d02842fSSascha Wildner                     MainMessage, " ^ ");
4100d02842fSSascha Wildner             }
4110d02842fSSascha Wildner             else
4120d02842fSSascha Wildner             {
4130d02842fSSascha Wildner                 fprintf (OutputFile, "%*s %s",
4140d02842fSSascha Wildner                     (int) ((SourceColumn - ErrorColumn) + 1), "^",
4150d02842fSSascha Wildner                     MainMessage);
4160d02842fSSascha Wildner             }
4170d02842fSSascha Wildner         }
4180d02842fSSascha Wildner     }
4190d02842fSSascha Wildner     else
4200d02842fSSascha Wildner     {
4210d02842fSSascha Wildner         fprintf (OutputFile, " %s", MainMessage);
4220d02842fSSascha Wildner     }
4230d02842fSSascha Wildner 
4240d02842fSSascha Wildner     /* Print the extra info message if present */
4250d02842fSSascha Wildner 
4260d02842fSSascha Wildner     if (ExtraMessage)
4270d02842fSSascha Wildner     {
4280d02842fSSascha Wildner         fprintf (OutputFile, " (%s)", ExtraMessage);
4290d02842fSSascha Wildner     }
4300d02842fSSascha Wildner 
4310d02842fSSascha Wildner     if (PrematureEOF)
4320d02842fSSascha Wildner     {
4330d02842fSSascha Wildner         fprintf (OutputFile, " and premature End-Of-File");
4340d02842fSSascha Wildner     }
4350d02842fSSascha Wildner 
4360d02842fSSascha Wildner     fprintf (OutputFile, "\n");
437806343b9SSascha Wildner     if (AslGbl_VerboseErrors && !Enode->SubError)
4380d02842fSSascha Wildner     {
4390d02842fSSascha Wildner         fprintf (OutputFile, "\n");
4400d02842fSSascha Wildner     }
4410d02842fSSascha Wildner }
4420d02842fSSascha Wildner 
4430d02842fSSascha Wildner 
4440d02842fSSascha Wildner /*******************************************************************************
4450d02842fSSascha Wildner  *
4467bcb6cafSSascha Wildner  * FUNCTION:    AePrintErrorSourceLine
4477bcb6cafSSascha Wildner  *
4487bcb6cafSSascha Wildner  * PARAMETERS:  OutputFile      - Output file
4497bcb6cafSSascha Wildner  *              Enode           - Error node to print
4507bcb6cafSSascha Wildner  *              PrematureEOF    - True = PrematureEOF has been reached
451e5412f1eSSascha Wildner  *              Total           - Number of characters printed so far
4527bcb6cafSSascha Wildner  *
4537bcb6cafSSascha Wildner  *
4547bcb6cafSSascha Wildner  * RETURN:      Status
4557bcb6cafSSascha Wildner  *
4567bcb6cafSSascha Wildner  * DESCRIPTION: Print the source line of an error.
4577bcb6cafSSascha Wildner  *
4587bcb6cafSSascha Wildner  ******************************************************************************/
4597bcb6cafSSascha Wildner 
4607bcb6cafSSascha Wildner static ACPI_STATUS
AePrintErrorSourceLine(FILE * OutputFile,ASL_ERROR_MSG * Enode,BOOLEAN * PrematureEOF,UINT32 * Total)4617bcb6cafSSascha Wildner AePrintErrorSourceLine (
4627bcb6cafSSascha Wildner     FILE                    *OutputFile,
4637bcb6cafSSascha Wildner     ASL_ERROR_MSG           *Enode,
4647bcb6cafSSascha Wildner     BOOLEAN                 *PrematureEOF,
4657bcb6cafSSascha Wildner     UINT32                  *Total)
4667bcb6cafSSascha Wildner {
4677bcb6cafSSascha Wildner     UINT8                   SourceByte;
4687bcb6cafSSascha Wildner     int                     Actual;
4697bcb6cafSSascha Wildner     size_t                  RActual;
4707bcb6cafSSascha Wildner     FILE                    *SourceFile = NULL;
4717bcb6cafSSascha Wildner     long                    FileSize;
4727bcb6cafSSascha Wildner 
4737bcb6cafSSascha Wildner 
4747bcb6cafSSascha Wildner     if (!Enode->SourceLine)
4757bcb6cafSSascha Wildner     {
4767bcb6cafSSascha Wildner         /*
4777bcb6cafSSascha Wildner          * Use the merged header/source file if present, otherwise
4787bcb6cafSSascha Wildner          * use input file
4797bcb6cafSSascha Wildner          */
480a4b9c0c9SSascha Wildner         SourceFile = FlGetFileHandle (ASL_FILE_SOURCE_OUTPUT,
481a4b9c0c9SSascha Wildner             ASL_FILE_SOURCE_OUTPUT, Enode->SourceFilename);
4827bcb6cafSSascha Wildner         if (!SourceFile)
4837bcb6cafSSascha Wildner         {
484a4b9c0c9SSascha Wildner             SourceFile = FlGetFileHandle (ASL_FILE_INPUT,
485a4b9c0c9SSascha Wildner                 ASL_FILE_INPUT, Enode->Filename);
4867bcb6cafSSascha Wildner         }
4877bcb6cafSSascha Wildner 
4887bcb6cafSSascha Wildner         if (SourceFile)
4897bcb6cafSSascha Wildner         {
4907bcb6cafSSascha Wildner             /* Determine if the error occurred at source file EOF */
4917bcb6cafSSascha Wildner 
4927bcb6cafSSascha Wildner             fseek (SourceFile, 0, SEEK_END);
4937bcb6cafSSascha Wildner             FileSize = ftell (SourceFile);
4947bcb6cafSSascha Wildner 
4957bcb6cafSSascha Wildner             if ((long) Enode->LogicalByteOffset >= FileSize)
4967bcb6cafSSascha Wildner             {
4977bcb6cafSSascha Wildner                 *PrematureEOF = TRUE;
4987bcb6cafSSascha Wildner             }
4997bcb6cafSSascha Wildner         }
5007bcb6cafSSascha Wildner         else
5017bcb6cafSSascha Wildner         {
5027bcb6cafSSascha Wildner             fprintf (OutputFile,
5037bcb6cafSSascha Wildner                 "[*** iASL: Source File Does not exist ***]\n");
5047bcb6cafSSascha Wildner             return AE_IO_ERROR;
5057bcb6cafSSascha Wildner         }
5067bcb6cafSSascha Wildner     }
5077bcb6cafSSascha Wildner 
5087bcb6cafSSascha Wildner     /* Print filename and line number if present and valid */
5097bcb6cafSSascha Wildner 
510806343b9SSascha Wildner     if (AslGbl_VerboseErrors)
5117bcb6cafSSascha Wildner     {
5127bcb6cafSSascha Wildner         fprintf (OutputFile, "%-8s", Enode->Filename);
5137bcb6cafSSascha Wildner 
5147bcb6cafSSascha Wildner         if (Enode->SourceLine && Enode->LineNumber)
5157bcb6cafSSascha Wildner         {
5167bcb6cafSSascha Wildner             fprintf (OutputFile, " %6u: %s",
5177bcb6cafSSascha Wildner                 Enode->LineNumber, Enode->SourceLine);
5187bcb6cafSSascha Wildner         }
5197bcb6cafSSascha Wildner         else if (Enode->LineNumber)
5207bcb6cafSSascha Wildner         {
5217bcb6cafSSascha Wildner             fprintf (OutputFile, " %6u: ", Enode->LineNumber);
5227bcb6cafSSascha Wildner 
5237bcb6cafSSascha Wildner             /*
5247bcb6cafSSascha Wildner              * If not at EOF, get the corresponding source code line
5257bcb6cafSSascha Wildner              * and display it. Don't attempt this if we have a
5267bcb6cafSSascha Wildner              * premature EOF condition.
5277bcb6cafSSascha Wildner              */
5287bcb6cafSSascha Wildner             if (*PrematureEOF)
5297bcb6cafSSascha Wildner             {
5307bcb6cafSSascha Wildner                 fprintf (OutputFile, "\n");
5317bcb6cafSSascha Wildner                 return AE_OK;
5327bcb6cafSSascha Wildner             }
533e5412f1eSSascha Wildner 
5347bcb6cafSSascha Wildner             /*
5357bcb6cafSSascha Wildner              * Seek to the offset in the combined source file,
5367bcb6cafSSascha Wildner              * read the source line, and write it to the output.
5377bcb6cafSSascha Wildner              */
5387bcb6cafSSascha Wildner             Actual = fseek (SourceFile,
5397bcb6cafSSascha Wildner                 (long) Enode->LogicalByteOffset, (int) SEEK_SET);
5407bcb6cafSSascha Wildner             if (Actual)
5417bcb6cafSSascha Wildner             {
5427bcb6cafSSascha Wildner                 fprintf (OutputFile,
5437bcb6cafSSascha Wildner                     "[*** iASL: Seek error on source code temp file %s ***]",
544806343b9SSascha Wildner                     AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
5457bcb6cafSSascha Wildner 
5467bcb6cafSSascha Wildner                 fprintf (OutputFile, "\n");
5477bcb6cafSSascha Wildner                 return AE_OK;
5487bcb6cafSSascha Wildner             }
5497bcb6cafSSascha Wildner             RActual = fread (&SourceByte, 1, 1, SourceFile);
5507bcb6cafSSascha Wildner             if (RActual != 1)
5517bcb6cafSSascha Wildner             {
5527bcb6cafSSascha Wildner                 fprintf (OutputFile,
5537bcb6cafSSascha Wildner                     "[*** iASL: Read error on source code temp file %s ***]",
554806343b9SSascha Wildner                     AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
5557bcb6cafSSascha Wildner                 return AE_IO_ERROR;
5567bcb6cafSSascha Wildner             }
557e5412f1eSSascha Wildner 
5587bcb6cafSSascha Wildner             /* Read/write the source line, up to the maximum line length */
5597bcb6cafSSascha Wildner 
5607bcb6cafSSascha Wildner             while (RActual && SourceByte && (SourceByte != '\n'))
5617bcb6cafSSascha Wildner             {
5627bcb6cafSSascha Wildner                 if (*Total < 256)
5637bcb6cafSSascha Wildner                 {
5647bcb6cafSSascha Wildner                     /* After the max line length, we will just read the line, no write */
5657bcb6cafSSascha Wildner 
5667bcb6cafSSascha Wildner                     if (fwrite (&SourceByte, 1, 1, OutputFile) != 1)
5677bcb6cafSSascha Wildner                     {
5687bcb6cafSSascha Wildner                         printf ("[*** iASL: Write error on output file ***]\n");
5697bcb6cafSSascha Wildner                         return AE_IO_ERROR;
5707bcb6cafSSascha Wildner                     }
5717bcb6cafSSascha Wildner                 }
5727bcb6cafSSascha Wildner                 else if (*Total == 256)
5737bcb6cafSSascha Wildner                 {
5747bcb6cafSSascha Wildner                     fprintf (OutputFile,
5757bcb6cafSSascha Wildner                         "\n[*** iASL: Very long input line, message below refers to column %u ***]",
5767bcb6cafSSascha Wildner                         Enode->Column);
5777bcb6cafSSascha Wildner                 }
5787bcb6cafSSascha Wildner 
5797bcb6cafSSascha Wildner                 RActual = fread (&SourceByte, 1, 1, SourceFile);
5807bcb6cafSSascha Wildner                 if (RActual != 1)
5817bcb6cafSSascha Wildner                 {
5827bcb6cafSSascha Wildner                     fprintf (OutputFile,
5837bcb6cafSSascha Wildner                         "[*** iASL: Read error on source code temp file %s ***]",
584806343b9SSascha Wildner                         AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
5857bcb6cafSSascha Wildner 
5867bcb6cafSSascha Wildner                     return AE_IO_ERROR;
5877bcb6cafSSascha Wildner                 }
5887bcb6cafSSascha Wildner                 *Total += 1;
5897bcb6cafSSascha Wildner             }
5907bcb6cafSSascha Wildner 
5917bcb6cafSSascha Wildner             fprintf (OutputFile, "\n");
5927bcb6cafSSascha Wildner         }
5937bcb6cafSSascha Wildner     }
5947bcb6cafSSascha Wildner     else
5957bcb6cafSSascha Wildner     {
5967bcb6cafSSascha Wildner         /*
5977bcb6cafSSascha Wildner          * Less verbose version of the error message, enabled via the
5987bcb6cafSSascha Wildner          * -vi switch. The format is compatible with MS Visual Studio.
5997bcb6cafSSascha Wildner          */
6007bcb6cafSSascha Wildner         fprintf (OutputFile, "%s", Enode->Filename);
6017bcb6cafSSascha Wildner 
6027bcb6cafSSascha Wildner         if (Enode->LineNumber)
6037bcb6cafSSascha Wildner         {
6047bcb6cafSSascha Wildner             fprintf (OutputFile, "(%u) : ",
6057bcb6cafSSascha Wildner                 Enode->LineNumber);
6067bcb6cafSSascha Wildner         }
6077bcb6cafSSascha Wildner     }
6087bcb6cafSSascha Wildner 
6097bcb6cafSSascha Wildner     return AE_OK;
6107bcb6cafSSascha Wildner }
6117bcb6cafSSascha Wildner 
6127bcb6cafSSascha Wildner /*******************************************************************************
6137bcb6cafSSascha Wildner  *
6147bcb6cafSSascha Wildner  * FUNCTION:    AePrintException
6157bcb6cafSSascha Wildner  *
6167bcb6cafSSascha Wildner  * PARAMETERS:  FileId          - ID of output file
6177bcb6cafSSascha Wildner  *              Enode           - Error node to print
6187bcb6cafSSascha Wildner  *              Header          - Additional text before each message
6197bcb6cafSSascha Wildner  *
6207bcb6cafSSascha Wildner  * RETURN:      None
6217bcb6cafSSascha Wildner  *
6227bcb6cafSSascha Wildner  * DESCRIPTION: Print the contents of an error node.
6237bcb6cafSSascha Wildner  *
6247bcb6cafSSascha Wildner  * NOTE:        We don't use the FlxxxFile I/O functions here because on error
6257bcb6cafSSascha Wildner  *              they abort the compiler and call this function!  Since we
6267bcb6cafSSascha Wildner  *              are reporting errors here, we ignore most output errors and
6277bcb6cafSSascha Wildner  *              just try to get out as much as we can.
6287bcb6cafSSascha Wildner  *
6297bcb6cafSSascha Wildner  ******************************************************************************/
6307bcb6cafSSascha Wildner 
6317bcb6cafSSascha Wildner void
AePrintException(UINT32 FileId,ASL_ERROR_MSG * Enode,char * Header)6327bcb6cafSSascha Wildner AePrintException (
6337bcb6cafSSascha Wildner     UINT32                  FileId,
6347bcb6cafSSascha Wildner     ASL_ERROR_MSG           *Enode,
6357bcb6cafSSascha Wildner     char                    *Header)
6367bcb6cafSSascha Wildner {
6377bcb6cafSSascha Wildner     FILE                    *OutputFile;
6387bcb6cafSSascha Wildner     BOOLEAN                 PrematureEOF = FALSE;
6397bcb6cafSSascha Wildner     UINT32                  Total = 0;
6407bcb6cafSSascha Wildner     ACPI_STATUS             Status;
6417bcb6cafSSascha Wildner     ASL_ERROR_MSG           *Child = Enode->SubError;
6427bcb6cafSSascha Wildner 
6437bcb6cafSSascha Wildner 
644806343b9SSascha Wildner     if (AslGbl_NoErrors)
6457bcb6cafSSascha Wildner     {
6467bcb6cafSSascha Wildner         return;
6477bcb6cafSSascha Wildner     }
6487bcb6cafSSascha Wildner 
6497bcb6cafSSascha Wildner     /*
6507bcb6cafSSascha Wildner      * Only listing files have a header, and remarks/optimizations
6517bcb6cafSSascha Wildner      * are always output
6527bcb6cafSSascha Wildner      */
6537bcb6cafSSascha Wildner     if (!Header)
6547bcb6cafSSascha Wildner     {
6557bcb6cafSSascha Wildner         /* Ignore remarks if requested */
6567bcb6cafSSascha Wildner 
6577bcb6cafSSascha Wildner         switch (Enode->Level)
6587bcb6cafSSascha Wildner         {
6597bcb6cafSSascha Wildner         case ASL_WARNING:
6607bcb6cafSSascha Wildner         case ASL_WARNING2:
6617bcb6cafSSascha Wildner         case ASL_WARNING3:
6627bcb6cafSSascha Wildner 
663806343b9SSascha Wildner             if (!AslGbl_DisplayWarnings)
6647bcb6cafSSascha Wildner             {
6657bcb6cafSSascha Wildner                 return;
6667bcb6cafSSascha Wildner             }
6677bcb6cafSSascha Wildner             break;
6687bcb6cafSSascha Wildner 
6697bcb6cafSSascha Wildner         case ASL_REMARK:
6707bcb6cafSSascha Wildner 
671806343b9SSascha Wildner             if (!AslGbl_DisplayRemarks)
6727bcb6cafSSascha Wildner             {
6737bcb6cafSSascha Wildner                 return;
6747bcb6cafSSascha Wildner             }
6757bcb6cafSSascha Wildner             break;
6767bcb6cafSSascha Wildner 
6777bcb6cafSSascha Wildner         case ASL_OPTIMIZATION:
6787bcb6cafSSascha Wildner 
679806343b9SSascha Wildner             if (!AslGbl_DisplayOptimizations)
6807bcb6cafSSascha Wildner             {
6817bcb6cafSSascha Wildner                 return;
6827bcb6cafSSascha Wildner             }
6837bcb6cafSSascha Wildner             break;
6847bcb6cafSSascha Wildner 
6857bcb6cafSSascha Wildner         default:
6867bcb6cafSSascha Wildner 
6877bcb6cafSSascha Wildner             break;
6887bcb6cafSSascha Wildner         }
6897bcb6cafSSascha Wildner     }
6907bcb6cafSSascha Wildner 
6917bcb6cafSSascha Wildner     /* Get the various required file handles */
6927bcb6cafSSascha Wildner 
693806343b9SSascha Wildner     OutputFile = AslGbl_Files[FileId].Handle;
6947bcb6cafSSascha Wildner 
6957bcb6cafSSascha Wildner     if (Header)
6967bcb6cafSSascha Wildner     {
6977bcb6cafSSascha Wildner         fprintf (OutputFile, "%s", Header);
6987bcb6cafSSascha Wildner     }
6997bcb6cafSSascha Wildner 
7007bcb6cafSSascha Wildner     if (!Enode->Filename)
7017bcb6cafSSascha Wildner     {
7027bcb6cafSSascha Wildner         AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
7037bcb6cafSSascha Wildner         return;
7047bcb6cafSSascha Wildner     }
7057bcb6cafSSascha Wildner 
7067bcb6cafSSascha Wildner     Status = AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
7077bcb6cafSSascha Wildner     if (ACPI_FAILURE (Status))
7087bcb6cafSSascha Wildner     {
7097bcb6cafSSascha Wildner         return;
7107bcb6cafSSascha Wildner     }
7117bcb6cafSSascha Wildner 
7127bcb6cafSSascha Wildner     /* If a NULL message ID, just print the raw message */
7137bcb6cafSSascha Wildner 
7147bcb6cafSSascha Wildner     if (Enode->MessageId == 0)
7157bcb6cafSSascha Wildner     {
7167bcb6cafSSascha Wildner         fprintf (OutputFile, "%s\n", Enode->Message);
7177bcb6cafSSascha Wildner         return;
7187bcb6cafSSascha Wildner     }
7197bcb6cafSSascha Wildner 
7207bcb6cafSSascha Wildner     AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
7217bcb6cafSSascha Wildner 
7227bcb6cafSSascha Wildner     while (Child)
7237bcb6cafSSascha Wildner     {
7247bcb6cafSSascha Wildner         fprintf (OutputFile, "\n");
7257bcb6cafSSascha Wildner         AePrintSubError (OutputFile, Child);
7267bcb6cafSSascha Wildner         Child = Child->SubError;
7277bcb6cafSSascha Wildner     }
7287bcb6cafSSascha Wildner }
7297bcb6cafSSascha Wildner 
7307bcb6cafSSascha Wildner 
7317bcb6cafSSascha Wildner /*******************************************************************************
7327bcb6cafSSascha Wildner  *
7337bcb6cafSSascha Wildner  * FUNCTION:    AePrintSubError
7347bcb6cafSSascha Wildner  *
7357bcb6cafSSascha Wildner  * PARAMETERS:  OutputFile      - Output file
7367bcb6cafSSascha Wildner  *              Enode           - Error node to print
7377bcb6cafSSascha Wildner  *
7387bcb6cafSSascha Wildner  * RETURN:      None
7397bcb6cafSSascha Wildner  *
740e5412f1eSSascha Wildner  * DESCRIPTION: Print the contents of an error node. This function is tailored
7417bcb6cafSSascha Wildner  *              to print error nodes that are SubErrors within ASL_ERROR_MSG
7427bcb6cafSSascha Wildner  *
7437bcb6cafSSascha Wildner  ******************************************************************************/
7447bcb6cafSSascha Wildner 
7457bcb6cafSSascha Wildner static void
AePrintSubError(FILE * OutputFile,ASL_ERROR_MSG * Enode)7467bcb6cafSSascha Wildner AePrintSubError (
7477bcb6cafSSascha Wildner     FILE                    *OutputFile,
7487bcb6cafSSascha Wildner     ASL_ERROR_MSG           *Enode)
7497bcb6cafSSascha Wildner {
7507bcb6cafSSascha Wildner     UINT32                  Total = 0;
7517bcb6cafSSascha Wildner     BOOLEAN                 PrematureEOF = FALSE;
7527bcb6cafSSascha Wildner     const char              *MainMessage;
7537bcb6cafSSascha Wildner 
7547bcb6cafSSascha Wildner 
7557bcb6cafSSascha Wildner     MainMessage = AeDecodeMessageId (Enode->MessageId);
7567bcb6cafSSascha Wildner 
757e5412f1eSSascha Wildner     fprintf (OutputFile, "    %s", MainMessage);
758e5412f1eSSascha Wildner 
759e5412f1eSSascha Wildner     if (Enode->Message)
760e5412f1eSSascha Wildner     {
761e5412f1eSSascha Wildner         fprintf (OutputFile, "(%s)", Enode->Message);
762e5412f1eSSascha Wildner     }
763e5412f1eSSascha Wildner 
764e5412f1eSSascha Wildner     fprintf (OutputFile, "\n    ");
7657bcb6cafSSascha Wildner     (void) AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
7667bcb6cafSSascha Wildner     fprintf (OutputFile, "\n");
7677bcb6cafSSascha Wildner }
7687bcb6cafSSascha Wildner 
7697bcb6cafSSascha Wildner 
7707bcb6cafSSascha Wildner /*******************************************************************************
7717bcb6cafSSascha Wildner  *
7720d02842fSSascha Wildner  * FUNCTION:    AePrintErrorLog
7730d02842fSSascha Wildner  *
7740d02842fSSascha Wildner  * PARAMETERS:  FileId           - Where to output the error log
7750d02842fSSascha Wildner  *
7760d02842fSSascha Wildner  * RETURN:      None
7770d02842fSSascha Wildner  *
7780d02842fSSascha Wildner  * DESCRIPTION: Print the entire contents of the error log
7790d02842fSSascha Wildner  *
7800d02842fSSascha Wildner  ******************************************************************************/
7810d02842fSSascha Wildner 
7820d02842fSSascha Wildner void
AePrintErrorLog(UINT32 FileId)7830d02842fSSascha Wildner AePrintErrorLog (
7840d02842fSSascha Wildner     UINT32                  FileId)
7850d02842fSSascha Wildner {
786806343b9SSascha Wildner     ASL_ERROR_MSG           *Enode = AslGbl_ErrorLog;
7870d02842fSSascha Wildner 
7880d02842fSSascha Wildner 
7890d02842fSSascha Wildner     /* Walk the error node list */
7900d02842fSSascha Wildner 
7910d02842fSSascha Wildner     while (Enode)
7920d02842fSSascha Wildner     {
7930d02842fSSascha Wildner         AePrintException (FileId, Enode, NULL);
7940d02842fSSascha Wildner         Enode = Enode->Next;
7950d02842fSSascha Wildner     }
7960d02842fSSascha Wildner }
7970d02842fSSascha Wildner 
7980d02842fSSascha Wildner 
7990d02842fSSascha Wildner /*******************************************************************************
8000d02842fSSascha Wildner  *
8017bcb6cafSSascha Wildner  * FUNCTION:    AslInitEnode
8027bcb6cafSSascha Wildner  *
8037bcb6cafSSascha Wildner  * PARAMETERS:  InputEnode          - Input Error node to initialize
8047bcb6cafSSascha Wildner  *              Level               - Seriousness (Warning/error, etc.)
8057bcb6cafSSascha Wildner  *              MessageId           - Index into global message buffer
8067bcb6cafSSascha Wildner  *              CurrentLineNumber   - Actual file line number
8077bcb6cafSSascha Wildner  *              LogicalLineNumber   - Cumulative line number
8087bcb6cafSSascha Wildner  *              LogicalByteOffset   - Byte offset in source file
8097bcb6cafSSascha Wildner  *              Column              - Column in current line
810e5412f1eSSascha Wildner  *              Filename            - Source filename
811e5412f1eSSascha Wildner  *              ExtraMessage        - Additional error message
8127bcb6cafSSascha Wildner  *              SourceLine          - Line of error source code
8137bcb6cafSSascha Wildner  *              SubError            - SubError of this InputEnode
8147bcb6cafSSascha Wildner  *
8157bcb6cafSSascha Wildner  * RETURN:      None
8167bcb6cafSSascha Wildner  *
8177bcb6cafSSascha Wildner  * DESCRIPTION: Initialize an Error node
8187bcb6cafSSascha Wildner  *
8197bcb6cafSSascha Wildner  ******************************************************************************/
8207bcb6cafSSascha Wildner 
AslInitEnode(ASL_ERROR_MSG ** InputEnode,UINT8 Level,UINT16 MessageId,UINT32 LineNumber,UINT32 LogicalLineNumber,UINT32 LogicalByteOffset,UINT32 Column,char * Filename,char * ExtraMessage,char * SourceLine,ASL_ERROR_MSG * SubError)8217bcb6cafSSascha Wildner static void AslInitEnode (
8227bcb6cafSSascha Wildner     ASL_ERROR_MSG           **InputEnode,
8237bcb6cafSSascha Wildner     UINT8                   Level,
8247bcb6cafSSascha Wildner     UINT16                  MessageId,
8257bcb6cafSSascha Wildner     UINT32                  LineNumber,
8267bcb6cafSSascha Wildner     UINT32                  LogicalLineNumber,
8277bcb6cafSSascha Wildner     UINT32                  LogicalByteOffset,
8287bcb6cafSSascha Wildner     UINT32                  Column,
8297bcb6cafSSascha Wildner     char                    *Filename,
8307bcb6cafSSascha Wildner     char                    *ExtraMessage,
8317bcb6cafSSascha Wildner     char                    *SourceLine,
8327bcb6cafSSascha Wildner     ASL_ERROR_MSG           *SubError)
8337bcb6cafSSascha Wildner {
8347bcb6cafSSascha Wildner     ASL_ERROR_MSG           *Enode;
835a4b9c0c9SSascha Wildner     ASL_GLOBAL_FILE_NODE    *FileNode;
8367bcb6cafSSascha Wildner 
8377bcb6cafSSascha Wildner 
8387bcb6cafSSascha Wildner     *InputEnode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
8397bcb6cafSSascha Wildner     Enode = *InputEnode;
8407bcb6cafSSascha Wildner     Enode->Level                = Level;
8417bcb6cafSSascha Wildner     Enode->MessageId            = MessageId;
8427bcb6cafSSascha Wildner     Enode->LineNumber           = LineNumber;
8437bcb6cafSSascha Wildner     Enode->LogicalLineNumber    = LogicalLineNumber;
8447bcb6cafSSascha Wildner     Enode->LogicalByteOffset    = LogicalByteOffset;
8457bcb6cafSSascha Wildner     Enode->Column               = Column;
8467bcb6cafSSascha Wildner     Enode->SubError             = SubError;
8477bcb6cafSSascha Wildner     Enode->Message              = NULL;
8487bcb6cafSSascha Wildner     Enode->SourceLine           = NULL;
8497bcb6cafSSascha Wildner     Enode->Filename             = NULL;
8507bcb6cafSSascha Wildner 
8517bcb6cafSSascha Wildner     if (ExtraMessage)
8527bcb6cafSSascha Wildner     {
8537bcb6cafSSascha Wildner         /* Allocate a buffer for the message and a new error node */
8547bcb6cafSSascha Wildner 
8557bcb6cafSSascha Wildner         Enode->Message = UtLocalCacheCalloc (strlen (ExtraMessage) + 1);
8567bcb6cafSSascha Wildner 
8577bcb6cafSSascha Wildner         /* Keep a copy of the extra message */
8587bcb6cafSSascha Wildner 
8597bcb6cafSSascha Wildner         strcpy (Enode->Message, ExtraMessage);
8607bcb6cafSSascha Wildner     }
8617bcb6cafSSascha Wildner 
8627bcb6cafSSascha Wildner     if (SourceLine)
8637bcb6cafSSascha Wildner     {
8647bcb6cafSSascha Wildner         Enode->SourceLine = UtLocalCalloc (strlen (SourceLine) + 1);
8657bcb6cafSSascha Wildner         strcpy (Enode->SourceLine, SourceLine);
8667bcb6cafSSascha Wildner     }
8677bcb6cafSSascha Wildner 
8687bcb6cafSSascha Wildner 
8697bcb6cafSSascha Wildner     if (Filename)
8707bcb6cafSSascha Wildner     {
8717bcb6cafSSascha Wildner         Enode->Filename = Filename;
8727bcb6cafSSascha Wildner         Enode->FilenameLength = strlen (Filename);
8737bcb6cafSSascha Wildner         if (Enode->FilenameLength < 6)
8747bcb6cafSSascha Wildner         {
8757bcb6cafSSascha Wildner             Enode->FilenameLength = 6;
8767bcb6cafSSascha Wildner         }
877a4b9c0c9SSascha Wildner 
878e5412f1eSSascha Wildner         /*
879e5412f1eSSascha Wildner          * Attempt to get the file node of the filename listed in the parse
880e5412f1eSSascha Wildner          * node. If the name doesn't exist in the global file node, it is
881e5412f1eSSascha Wildner          * because the file is included by #include or ASL include. In this
882e5412f1eSSascha Wildner          * case, get the current file node. The source output of the current
883e5412f1eSSascha Wildner          * file will contain the contents of the file listed in the parse node.
884e5412f1eSSascha Wildner          */
885e5412f1eSSascha Wildner         FileNode = FlGetFileNode (ASL_FILE_INPUT, Filename);
886a4b9c0c9SSascha Wildner         if (!FileNode)
887a4b9c0c9SSascha Wildner         {
888e5412f1eSSascha Wildner             FileNode = FlGetCurrentFileNode ();
889a4b9c0c9SSascha Wildner         }
890a4b9c0c9SSascha Wildner 
891a4b9c0c9SSascha Wildner         Enode->SourceFilename =
892a4b9c0c9SSascha Wildner             FileNode->Files[ASL_FILE_SOURCE_OUTPUT].Filename;
893a4b9c0c9SSascha Wildner     }
8947bcb6cafSSascha Wildner }
8957bcb6cafSSascha Wildner 
8967bcb6cafSSascha Wildner 
8977bcb6cafSSascha Wildner /*******************************************************************************
8987bcb6cafSSascha Wildner  *
8990d02842fSSascha Wildner  * FUNCTION:    AslCommonError2
9000d02842fSSascha Wildner  *
9010d02842fSSascha Wildner  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
9020d02842fSSascha Wildner  *              MessageId           - Index into global message buffer
9030d02842fSSascha Wildner  *              LineNumber          - Actual file line number
9040d02842fSSascha Wildner  *              Column              - Column in current line
9050d02842fSSascha Wildner  *              SourceLine          - Actual source code line
906e5412f1eSSascha Wildner  *              Filename            - Source filename
907e5412f1eSSascha Wildner  *              ExtraMessage        - Additional error message
9080d02842fSSascha Wildner  *
9090d02842fSSascha Wildner  * RETURN:      None
9100d02842fSSascha Wildner  *
9110d02842fSSascha Wildner  * DESCRIPTION: Create a new error node and add it to the error log
9120d02842fSSascha Wildner  *
9130d02842fSSascha Wildner  ******************************************************************************/
9140d02842fSSascha Wildner 
9150d02842fSSascha Wildner void
AslCommonError2(UINT8 Level,UINT16 MessageId,UINT32 LineNumber,UINT32 Column,char * SourceLine,char * Filename,char * ExtraMessage)9160d02842fSSascha Wildner AslCommonError2 (
9170d02842fSSascha Wildner     UINT8                   Level,
9189e1c0880SSascha Wildner     UINT16                  MessageId,
9190d02842fSSascha Wildner     UINT32                  LineNumber,
9200d02842fSSascha Wildner     UINT32                  Column,
9210d02842fSSascha Wildner     char                    *SourceLine,
9220d02842fSSascha Wildner     char                    *Filename,
9230d02842fSSascha Wildner     char                    *ExtraMessage)
9240d02842fSSascha Wildner {
9257bcb6cafSSascha Wildner     AslLogNewError (Level, MessageId, LineNumber, LineNumber, 0, Column,
9267bcb6cafSSascha Wildner         Filename, ExtraMessage, SourceLine, NULL);
9270d02842fSSascha Wildner }
9280d02842fSSascha Wildner 
9290d02842fSSascha Wildner 
9300d02842fSSascha Wildner /*******************************************************************************
9310d02842fSSascha Wildner  *
9320d02842fSSascha Wildner  * FUNCTION:    AslCommonError
9330d02842fSSascha Wildner  *
9340d02842fSSascha Wildner  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
9350d02842fSSascha Wildner  *              MessageId           - Index into global message buffer
9360d02842fSSascha Wildner  *              CurrentLineNumber   - Actual file line number
9370d02842fSSascha Wildner  *              LogicalLineNumber   - Cumulative line number
9380d02842fSSascha Wildner  *              LogicalByteOffset   - Byte offset in source file
9390d02842fSSascha Wildner  *              Column              - Column in current line
940e5412f1eSSascha Wildner  *              Filename            - Source filename
941e5412f1eSSascha Wildner  *              ExtraMessage        - Additional error message
9420d02842fSSascha Wildner  *
9430d02842fSSascha Wildner  * RETURN:      None
9440d02842fSSascha Wildner  *
9450d02842fSSascha Wildner  * DESCRIPTION: Create a new error node and add it to the error log
9460d02842fSSascha Wildner  *
9470d02842fSSascha Wildner  ******************************************************************************/
9480d02842fSSascha Wildner 
9490d02842fSSascha Wildner void
AslCommonError(UINT8 Level,UINT16 MessageId,UINT32 CurrentLineNumber,UINT32 LogicalLineNumber,UINT32 LogicalByteOffset,UINT32 Column,char * Filename,char * ExtraMessage)9500d02842fSSascha Wildner AslCommonError (
9510d02842fSSascha Wildner     UINT8                   Level,
9529e1c0880SSascha Wildner     UINT16                  MessageId,
9530d02842fSSascha Wildner     UINT32                  CurrentLineNumber,
9540d02842fSSascha Wildner     UINT32                  LogicalLineNumber,
9550d02842fSSascha Wildner     UINT32                  LogicalByteOffset,
9560d02842fSSascha Wildner     UINT32                  Column,
9570d02842fSSascha Wildner     char                    *Filename,
9580d02842fSSascha Wildner     char                    *ExtraMessage)
9590d02842fSSascha Wildner {
9607bcb6cafSSascha Wildner     /* Check if user wants to ignore this exception */
9610d02842fSSascha Wildner 
96271c97a3cSSascha Wildner     if (AslIsExceptionIgnored (Filename, LogicalLineNumber, Level, MessageId))
963cf6b3eb1SSascha Wildner     {
964cf6b3eb1SSascha Wildner         return;
965cf6b3eb1SSascha Wildner     }
966cf6b3eb1SSascha Wildner 
9677bcb6cafSSascha Wildner     AslLogNewError (Level, MessageId, CurrentLineNumber, LogicalLineNumber,
9687bcb6cafSSascha Wildner         LogicalByteOffset, Column, Filename, ExtraMessage,
9697bcb6cafSSascha Wildner         NULL, NULL);
9700d02842fSSascha Wildner }
9710d02842fSSascha Wildner 
9720d02842fSSascha Wildner 
9737bcb6cafSSascha Wildner /*******************************************************************************
9747bcb6cafSSascha Wildner  *
9757bcb6cafSSascha Wildner  * FUNCTION:    AslLogNewError
9767bcb6cafSSascha Wildner  *
9777bcb6cafSSascha Wildner  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
9787bcb6cafSSascha Wildner  *              MessageId           - Index into global message buffer
9797bcb6cafSSascha Wildner  *              CurrentLineNumber   - Actual file line number
9807bcb6cafSSascha Wildner  *              LogicalLineNumber   - Cumulative line number
9817bcb6cafSSascha Wildner  *              LogicalByteOffset   - Byte offset in source file
9827bcb6cafSSascha Wildner  *              Column              - Column in current line
983e5412f1eSSascha Wildner  *              Filename            - Source filename
984e5412f1eSSascha Wildner  *              Message             - Additional error message
9857bcb6cafSSascha Wildner  *              SourceLine          - Actual line of source code
9867bcb6cafSSascha Wildner  *              SubError            - Sub-error associated with this error
9877bcb6cafSSascha Wildner  *
9887bcb6cafSSascha Wildner  * RETURN:      None
9897bcb6cafSSascha Wildner  *
9907bcb6cafSSascha Wildner  * DESCRIPTION: Create a new error node and add it to the error log
9917bcb6cafSSascha Wildner  *
9927bcb6cafSSascha Wildner  ******************************************************************************/
9937bcb6cafSSascha Wildner static void
AslLogNewError(UINT8 Level,UINT16 MessageId,UINT32 LineNumber,UINT32 LogicalLineNumber,UINT32 LogicalByteOffset,UINT32 Column,char * Filename,char * Message,char * SourceLine,ASL_ERROR_MSG * SubError)9947bcb6cafSSascha Wildner AslLogNewError (
9957bcb6cafSSascha Wildner     UINT8                   Level,
9967bcb6cafSSascha Wildner     UINT16                  MessageId,
9977bcb6cafSSascha Wildner     UINT32                  LineNumber,
9987bcb6cafSSascha Wildner     UINT32                  LogicalLineNumber,
9997bcb6cafSSascha Wildner     UINT32                  LogicalByteOffset,
10007bcb6cafSSascha Wildner     UINT32                  Column,
10017bcb6cafSSascha Wildner     char                    *Filename,
10027bcb6cafSSascha Wildner     char                    *Message,
10037bcb6cafSSascha Wildner     char                    *SourceLine,
10047bcb6cafSSascha Wildner     ASL_ERROR_MSG           *SubError)
10050d02842fSSascha Wildner {
10067bcb6cafSSascha Wildner     ASL_ERROR_MSG           *Enode = NULL;
1007ef944814SSascha Wildner     UINT8                   ModifiedLevel = GetModifiedLevel (Level, MessageId);
10080d02842fSSascha Wildner 
10097bcb6cafSSascha Wildner 
1010ef944814SSascha Wildner     AslInitEnode (&Enode, ModifiedLevel, MessageId, LineNumber,
1011ef944814SSascha Wildner         LogicalLineNumber, LogicalByteOffset, Column, Filename, Message,
1012ef944814SSascha Wildner         SourceLine, SubError);
10130d02842fSSascha Wildner 
10140d02842fSSascha Wildner     /* Add the new node to the error node list */
10150d02842fSSascha Wildner 
10160d02842fSSascha Wildner     AeAddToErrorLog (Enode);
10170d02842fSSascha Wildner 
1018806343b9SSascha Wildner     if (AslGbl_DebugFlag)
10190d02842fSSascha Wildner     {
10200d02842fSSascha Wildner         /* stderr is a file, send error to it immediately */
10210d02842fSSascha Wildner 
10220d02842fSSascha Wildner         AePrintException (ASL_FILE_STDERR, Enode, NULL);
10230d02842fSSascha Wildner     }
10240d02842fSSascha Wildner 
1025ef944814SSascha Wildner     AslGbl_ExceptionCount[ModifiedLevel]++;
1026a4b9c0c9SSascha Wildner     if (!AslGbl_IgnoreErrors && AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
10270d02842fSSascha Wildner     {
10280d02842fSSascha Wildner         printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
10290d02842fSSascha Wildner 
1030806343b9SSascha Wildner         AslGbl_SourceLine = 0;
1031806343b9SSascha Wildner         AslGbl_NextError = AslGbl_ErrorLog;
10320d02842fSSascha Wildner         CmCleanupAndExit ();
10330d02842fSSascha Wildner         exit(1);
10340d02842fSSascha Wildner     }
10350d02842fSSascha Wildner 
10360d02842fSSascha Wildner     return;
10370d02842fSSascha Wildner }
10380d02842fSSascha Wildner 
1039ef944814SSascha Wildner 
1040ef944814SSascha Wildner /*******************************************************************************
1041ef944814SSascha Wildner  *
1042ef944814SSascha Wildner  * FUNCTION:    GetModifiedLevel
1043ef944814SSascha Wildner  *
1044ef944814SSascha Wildner  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
1045ef944814SSascha Wildner  *              MessageId       - Index into global message buffer
1046ef944814SSascha Wildner  *
1047e5412f1eSSascha Wildner  * RETURN:      UINT8           - Modified level
1048ef944814SSascha Wildner  *
1049ef944814SSascha Wildner  * DESCRIPTION: Get the modified level of exception codes that are reported as
1050ef944814SSascha Wildner  *              errors from the -ww option.
1051ef944814SSascha Wildner  *
1052ef944814SSascha Wildner  ******************************************************************************/
1053ef944814SSascha Wildner 
1054ef944814SSascha Wildner static UINT8
GetModifiedLevel(UINT8 Level,UINT16 MessageId)1055ef944814SSascha Wildner GetModifiedLevel (
1056ef944814SSascha Wildner     UINT8                   Level,
1057ef944814SSascha Wildner     UINT16                  MessageId)
1058ef944814SSascha Wildner {
10594758d649SSascha Wildner     UINT32                  i;
1060ef944814SSascha Wildner     UINT16                  ExceptionCode;
1061ef944814SSascha Wildner 
1062ef944814SSascha Wildner 
1063ef944814SSascha Wildner     ExceptionCode = AeBuildFullExceptionCode (Level, MessageId);
1064ef944814SSascha Wildner 
1065ef944814SSascha Wildner     for (i = 0; i < AslGbl_ElevatedMessagesIndex; i++)
1066ef944814SSascha Wildner     {
1067ef944814SSascha Wildner         if (ExceptionCode == AslGbl_ElevatedMessages[i])
1068ef944814SSascha Wildner         {
1069ef944814SSascha Wildner             return (ASL_ERROR);
1070ef944814SSascha Wildner         }
1071ef944814SSascha Wildner     }
1072ef944814SSascha Wildner 
1073ef944814SSascha Wildner     return (Level);
1074ef944814SSascha Wildner }
1075ef944814SSascha Wildner 
1076ef944814SSascha Wildner 
10773c639e0cSSascha Wildner /*******************************************************************************
10783c639e0cSSascha Wildner  *
10793c639e0cSSascha Wildner  * FUNCTION:    AslIsExceptionIgnored
10803c639e0cSSascha Wildner  *
10813c639e0cSSascha Wildner  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
10823c639e0cSSascha Wildner  *              MessageId       - Index into global message buffer
10833c639e0cSSascha Wildner  *
10843c639e0cSSascha Wildner  * RETURN:      BOOLEAN
10853c639e0cSSascha Wildner  *
10863c639e0cSSascha Wildner  * DESCRIPTION: Check if a particular exception is ignored. In this case it
10873c639e0cSSascha Wildner  *              means that the exception is (expected or disabled.
10883c639e0cSSascha Wildner  *
10893c639e0cSSascha Wildner  ******************************************************************************/
10903c639e0cSSascha Wildner 
10913c639e0cSSascha Wildner BOOLEAN
AslIsExceptionIgnored(char * Filename,UINT32 LineNumber,UINT8 Level,UINT16 MessageId)10923c639e0cSSascha Wildner AslIsExceptionIgnored (
109371c97a3cSSascha Wildner     char                    *Filename,
109471c97a3cSSascha Wildner     UINT32                  LineNumber,
10953c639e0cSSascha Wildner     UINT8                   Level,
10963c639e0cSSascha Wildner     UINT16                  MessageId)
10973c639e0cSSascha Wildner {
10983c639e0cSSascha Wildner     BOOLEAN                 ExceptionIgnored;
10993c639e0cSSascha Wildner 
11003c639e0cSSascha Wildner 
11013c639e0cSSascha Wildner     /* Note: this allows exception to be disabled and expected */
11023c639e0cSSascha Wildner 
11033c639e0cSSascha Wildner     ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
110471c97a3cSSascha Wildner     ExceptionIgnored |=
110571c97a3cSSascha Wildner         AslIsExceptionExpected (Filename, LineNumber, Level, MessageId);
11063c639e0cSSascha Wildner 
1107806343b9SSascha Wildner     return (AslGbl_AllExceptionsDisabled || ExceptionIgnored);
11083c639e0cSSascha Wildner }
11093c639e0cSSascha Wildner 
11103c639e0cSSascha Wildner 
11113c639e0cSSascha Wildner /*******************************************************************************
11123c639e0cSSascha Wildner  *
111371c97a3cSSascha Wildner  * FUNCTION:    AslCheckExpectedException
11143c639e0cSSascha Wildner  *
11153c639e0cSSascha Wildner  * PARAMETERS:  none
11163c639e0cSSascha Wildner  *
11173c639e0cSSascha Wildner  * RETURN:      none
11183c639e0cSSascha Wildner  *
11193c639e0cSSascha Wildner  * DESCRIPTION: Check the global expected messages table and raise an error
11203c639e0cSSascha Wildner  *              for each message that has not been received.
11213c639e0cSSascha Wildner  *
11223c639e0cSSascha Wildner  ******************************************************************************/
11233c639e0cSSascha Wildner 
11243c639e0cSSascha Wildner void
AslCheckExpectedExceptions(void)11253c639e0cSSascha Wildner AslCheckExpectedExceptions (
11263c639e0cSSascha Wildner     void)
11273c639e0cSSascha Wildner {
1128*01d5d5dfSSascha Wildner     UINT32                  i;
112971c97a3cSSascha Wildner     ASL_EXPECTED_MSG_NODE   *Current = AslGbl_ExpectedErrorCodeList;
113071c97a3cSSascha Wildner     ASL_LOCATION_NODE       *LocationNode;
11313c639e0cSSascha Wildner 
11327bcb6cafSSascha Wildner 
1133806343b9SSascha Wildner     for (i = 0; i < AslGbl_ExpectedMessagesIndex; ++i)
11343c639e0cSSascha Wildner     {
1135806343b9SSascha Wildner         if (!AslGbl_ExpectedMessages[i].MessageReceived)
11363c639e0cSSascha Wildner         {
11373c639e0cSSascha Wildner             AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
1138806343b9SSascha Wildner                 AslGbl_ExpectedMessages[i].MessageIdStr);
11393c639e0cSSascha Wildner         }
11403c639e0cSSascha Wildner     }
114171c97a3cSSascha Wildner 
114271c97a3cSSascha Wildner     while (Current)
114371c97a3cSSascha Wildner     {
114471c97a3cSSascha Wildner         LocationNode = Current->LocationList;
114571c97a3cSSascha Wildner 
114671c97a3cSSascha Wildner         while (LocationNode)
114771c97a3cSSascha Wildner         {
114871c97a3cSSascha Wildner             if (!LocationNode->MessageReceived)
114971c97a3cSSascha Wildner             {
115071c97a3cSSascha Wildner                 AslCommonError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED,
115171c97a3cSSascha Wildner                     LocationNode->LineNumber, LocationNode->LineNumber,
115271c97a3cSSascha Wildner                     LocationNode->LogicalByteOffset, LocationNode->Column,
115371c97a3cSSascha Wildner                     LocationNode->Filename, Current->MessageIdStr);
115471c97a3cSSascha Wildner             }
115571c97a3cSSascha Wildner 
115671c97a3cSSascha Wildner             LocationNode = LocationNode->Next;
115771c97a3cSSascha Wildner         }
115871c97a3cSSascha Wildner 
115971c97a3cSSascha Wildner         Current = Current->Next;
116071c97a3cSSascha Wildner     }
11613c639e0cSSascha Wildner }
11623c639e0cSSascha Wildner 
11633c639e0cSSascha Wildner 
11643c639e0cSSascha Wildner /*******************************************************************************
11653c639e0cSSascha Wildner  *
116671c97a3cSSascha Wildner  * FUNCTION:    AslLogExpectedException
11673c639e0cSSascha Wildner  *
11683c639e0cSSascha Wildner  * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
11693c639e0cSSascha Wildner  *
11703c639e0cSSascha Wildner  * RETURN:      Status
11713c639e0cSSascha Wildner  *
11723c639e0cSSascha Wildner  * DESCRIPTION: Enter a message ID into the global expected messages table
11733c639e0cSSascha Wildner  *              If these messages are not raised during the compilation, throw
11743c639e0cSSascha Wildner  *              an error.
11753c639e0cSSascha Wildner  *
11763c639e0cSSascha Wildner  ******************************************************************************/
11773c639e0cSSascha Wildner 
11783c639e0cSSascha Wildner ACPI_STATUS
AslLogExpectedException(char * MessageIdString)117971c97a3cSSascha Wildner AslLogExpectedException (
11803c639e0cSSascha Wildner     char                    *MessageIdString)
11813c639e0cSSascha Wildner {
11823c639e0cSSascha Wildner     UINT32                  MessageId;
11833c639e0cSSascha Wildner 
11843c639e0cSSascha Wildner 
11853c639e0cSSascha Wildner     /* Convert argument to an integer and validate it */
11863c639e0cSSascha Wildner 
11873c639e0cSSascha Wildner     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
11883c639e0cSSascha Wildner 
11893c639e0cSSascha Wildner     if (MessageId > 6999)
11903c639e0cSSascha Wildner     {
1191*01d5d5dfSSascha Wildner         printf ("\"%s\" is not a valid warning/remark/error ID\n",
11923c639e0cSSascha Wildner             MessageIdString);
11933c639e0cSSascha Wildner         return (AE_BAD_PARAMETER);
11943c639e0cSSascha Wildner     }
11953c639e0cSSascha Wildner 
11963c639e0cSSascha Wildner     /* Insert value into the global expected message array */
11973c639e0cSSascha Wildner 
1198806343b9SSascha Wildner     if (AslGbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
11993c639e0cSSascha Wildner     {
12006721db86SSascha Wildner         printf ("Too many messages have been registered as expected (max %d)\n",
12013c639e0cSSascha Wildner             ASL_MAX_DISABLED_MESSAGES);
12023c639e0cSSascha Wildner         return (AE_LIMIT);
12033c639e0cSSascha Wildner     }
12043c639e0cSSascha Wildner 
1205806343b9SSascha Wildner     AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageId = MessageId;
1206806343b9SSascha Wildner     AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
1207806343b9SSascha Wildner     AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageReceived = FALSE;
1208806343b9SSascha Wildner     AslGbl_ExpectedMessagesIndex++;
12093c639e0cSSascha Wildner     return (AE_OK);
12103c639e0cSSascha Wildner }
12113c639e0cSSascha Wildner 
12120d02842fSSascha Wildner 
12130d02842fSSascha Wildner /*******************************************************************************
12140d02842fSSascha Wildner  *
121571c97a3cSSascha Wildner  * FUNCTION:    AslLogExpectedExceptionByLine
121671c97a3cSSascha Wildner  *
121771c97a3cSSascha Wildner  * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
121871c97a3cSSascha Wildner  *
121971c97a3cSSascha Wildner  * RETURN:      Status
122071c97a3cSSascha Wildner  *
122171c97a3cSSascha Wildner  * DESCRIPTION: Enter a message ID into the global expected messages table
122271c97a3cSSascha Wildner  *              based on file and line number. If these messages are not raised
122371c97a3cSSascha Wildner  *              during the compilation, throw an error.
122471c97a3cSSascha Wildner  *
122571c97a3cSSascha Wildner  ******************************************************************************/
122671c97a3cSSascha Wildner 
122771c97a3cSSascha Wildner void
AslLogExpectedExceptionByLine(char * MessageIdString)122871c97a3cSSascha Wildner AslLogExpectedExceptionByLine (
122971c97a3cSSascha Wildner     char                    *MessageIdString)
123071c97a3cSSascha Wildner {
123171c97a3cSSascha Wildner     ASL_LOCATION_NODE       *NewErrorLocationNode;
123271c97a3cSSascha Wildner     ASL_EXPECTED_MSG_NODE   *Current = AslGbl_ExpectedErrorCodeList;
123371c97a3cSSascha Wildner     UINT32                  MessageId;
123471c97a3cSSascha Wildner 
123571c97a3cSSascha Wildner 
123671c97a3cSSascha Wildner     NewErrorLocationNode = UtLocalCalloc (sizeof (ASL_LOCATION_NODE));
123771c97a3cSSascha Wildner 
123871c97a3cSSascha Wildner     NewErrorLocationNode->LineNumber = AslGbl_CurrentLineNumber;
123971c97a3cSSascha Wildner     NewErrorLocationNode->Filename = AslGbl_Files[ASL_FILE_INPUT].Filename;
124071c97a3cSSascha Wildner     NewErrorLocationNode->LogicalByteOffset = AslGbl_CurrentLineOffset;
124171c97a3cSSascha Wildner     NewErrorLocationNode->Column = AslGbl_CurrentColumn;
124271c97a3cSSascha Wildner 
124371c97a3cSSascha Wildner     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
124471c97a3cSSascha Wildner 
124571c97a3cSSascha Wildner     /* search the existing list for a matching message ID */
124671c97a3cSSascha Wildner 
124771c97a3cSSascha Wildner     while (Current && Current->MessageId != MessageId )
124871c97a3cSSascha Wildner     {
124971c97a3cSSascha Wildner         Current = Current->Next;
125071c97a3cSSascha Wildner     }
125171c97a3cSSascha Wildner     if (!Current)
125271c97a3cSSascha Wildner     {
125371c97a3cSSascha Wildner         /* ID was not found, create a new node for this message ID */
125471c97a3cSSascha Wildner 
125571c97a3cSSascha Wildner         Current = UtLocalCalloc (sizeof (ASL_EXPECTED_MSG_NODE));
125671c97a3cSSascha Wildner 
125771c97a3cSSascha Wildner         Current->Next = AslGbl_ExpectedErrorCodeList;
125871c97a3cSSascha Wildner         Current->MessageIdStr = MessageIdString;
125971c97a3cSSascha Wildner         Current->MessageId = MessageId;
126071c97a3cSSascha Wildner         AslGbl_ExpectedErrorCodeList = Current;
126171c97a3cSSascha Wildner     }
126271c97a3cSSascha Wildner 
126371c97a3cSSascha Wildner     NewErrorLocationNode->Next = Current->LocationList;
126471c97a3cSSascha Wildner     Current->LocationList = NewErrorLocationNode;
126571c97a3cSSascha Wildner }
126671c97a3cSSascha Wildner 
126771c97a3cSSascha Wildner 
126871c97a3cSSascha Wildner /*******************************************************************************
126971c97a3cSSascha Wildner  *
12700d02842fSSascha Wildner  * FUNCTION:    AslDisableException
12710d02842fSSascha Wildner  *
12720d02842fSSascha Wildner  * PARAMETERS:  MessageIdString     - ID to be disabled
12730d02842fSSascha Wildner  *
12740d02842fSSascha Wildner  * RETURN:      Status
12750d02842fSSascha Wildner  *
12760d02842fSSascha Wildner  * DESCRIPTION: Enter a message ID into the global disabled messages table
12770d02842fSSascha Wildner  *
12780d02842fSSascha Wildner  ******************************************************************************/
12790d02842fSSascha Wildner 
12800d02842fSSascha Wildner ACPI_STATUS
AslDisableException(char * MessageIdString)12810d02842fSSascha Wildner AslDisableException (
12820d02842fSSascha Wildner     char                    *MessageIdString)
12830d02842fSSascha Wildner {
12840d02842fSSascha Wildner     UINT32                  MessageId;
12850d02842fSSascha Wildner 
12860d02842fSSascha Wildner 
12870d02842fSSascha Wildner     /* Convert argument to an integer and validate it */
12880d02842fSSascha Wildner 
12890d02842fSSascha Wildner     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
12900d02842fSSascha Wildner 
1291cf6b3eb1SSascha Wildner     if ((MessageId < 2000) || (MessageId > 6999))
12920d02842fSSascha Wildner     {
1293cf6b3eb1SSascha Wildner         printf ("\"%s\" is not a valid warning/remark/error ID\n",
12940d02842fSSascha Wildner             MessageIdString);
12950d02842fSSascha Wildner         return (AE_BAD_PARAMETER);
12960d02842fSSascha Wildner     }
12970d02842fSSascha Wildner 
12980d02842fSSascha Wildner     /* Insert value into the global disabled message array */
12990d02842fSSascha Wildner 
1300806343b9SSascha Wildner     if (AslGbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES)
13010d02842fSSascha Wildner     {
13026721db86SSascha Wildner         printf ("Too many messages have been disabled (max %d)\n",
13030d02842fSSascha Wildner             ASL_MAX_DISABLED_MESSAGES);
13040d02842fSSascha Wildner         return (AE_LIMIT);
13050d02842fSSascha Wildner     }
13060d02842fSSascha Wildner 
1307806343b9SSascha Wildner     AslGbl_DisabledMessages[AslGbl_DisabledMessagesIndex] = MessageId;
1308806343b9SSascha Wildner     AslGbl_DisabledMessagesIndex++;
13090d02842fSSascha Wildner     return (AE_OK);
13100d02842fSSascha Wildner }
13110d02842fSSascha Wildner 
13120d02842fSSascha Wildner 
13130d02842fSSascha Wildner /*******************************************************************************
13140d02842fSSascha Wildner  *
1315ef944814SSascha Wildner  * FUNCTION:    AslElevateException
1316ef944814SSascha Wildner  *
1317ef944814SSascha Wildner  * PARAMETERS:  MessageIdString     - ID of excepted exception during compile
1318ef944814SSascha Wildner  *
1319ef944814SSascha Wildner  * RETURN:      Status
1320ef944814SSascha Wildner  *
1321ef944814SSascha Wildner  * DESCRIPTION: Enter a message ID into the global elevated exceptions table.
1322ef944814SSascha Wildner  *              These messages will be considered as compilation errors.
1323ef944814SSascha Wildner  *
1324ef944814SSascha Wildner  ******************************************************************************/
1325ef944814SSascha Wildner 
1326ef944814SSascha Wildner ACPI_STATUS
AslElevateException(char * MessageIdString)1327ef944814SSascha Wildner AslElevateException (
1328ef944814SSascha Wildner     char                    *MessageIdString)
1329ef944814SSascha Wildner {
1330ef944814SSascha Wildner     UINT32                  MessageId;
1331ef944814SSascha Wildner 
1332ef944814SSascha Wildner 
1333ef944814SSascha Wildner     /* Convert argument to an integer and validate it */
1334ef944814SSascha Wildner 
1335ef944814SSascha Wildner     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1336ef944814SSascha Wildner 
1337ef944814SSascha Wildner     if (MessageId > 6999)
1338ef944814SSascha Wildner     {
1339*01d5d5dfSSascha Wildner         printf ("\"%s\" is not a valid warning/remark/error ID\n",
1340ef944814SSascha Wildner             MessageIdString);
1341ef944814SSascha Wildner         return (AE_BAD_PARAMETER);
1342ef944814SSascha Wildner     }
1343ef944814SSascha Wildner 
1344ef944814SSascha Wildner     /* Insert value into the global expected message array */
1345ef944814SSascha Wildner 
1346ef944814SSascha Wildner     if (AslGbl_ElevatedMessagesIndex >= ASL_MAX_ELEVATED_MESSAGES)
1347ef944814SSascha Wildner     {
1348ef944814SSascha Wildner         printf ("Too many messages have been registered as elevated (max %d)\n",
1349ef944814SSascha Wildner             ASL_MAX_DISABLED_MESSAGES);
1350ef944814SSascha Wildner         return (AE_LIMIT);
1351ef944814SSascha Wildner     }
1352ef944814SSascha Wildner 
1353c1776041SSascha Wildner     AslGbl_ElevatedMessages[AslGbl_ElevatedMessagesIndex] = MessageId;
1354ef944814SSascha Wildner     AslGbl_ElevatedMessagesIndex++;
1355ef944814SSascha Wildner     return (AE_OK);
1356ef944814SSascha Wildner }
1357ef944814SSascha Wildner 
135871c97a3cSSascha Wildner 
1359ef944814SSascha Wildner /*******************************************************************************
1360ef944814SSascha Wildner  *
13610d02842fSSascha Wildner  * FUNCTION:    AslIsExceptionDisabled
13620d02842fSSascha Wildner  *
13630d02842fSSascha Wildner  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
13640d02842fSSascha Wildner  *              MessageId       - Index into global message buffer
13650d02842fSSascha Wildner  *
13660d02842fSSascha Wildner  * RETURN:      TRUE if exception/message should be ignored
13670d02842fSSascha Wildner  *
13680d02842fSSascha Wildner  * DESCRIPTION: Check if the user has specified options such that this
13690d02842fSSascha Wildner  *              exception should be ignored
13700d02842fSSascha Wildner  *
13710d02842fSSascha Wildner  ******************************************************************************/
13720d02842fSSascha Wildner 
13733c639e0cSSascha Wildner static BOOLEAN
AslIsExceptionExpected(char * Filename,UINT32 LineNumber,UINT8 Level,UINT16 MessageId)13743c639e0cSSascha Wildner AslIsExceptionExpected (
137571c97a3cSSascha Wildner     char                    *Filename,
137671c97a3cSSascha Wildner     UINT32                  LineNumber,
13773c639e0cSSascha Wildner     UINT8                   Level,
13783c639e0cSSascha Wildner     UINT16                  MessageId)
13793c639e0cSSascha Wildner {
138071c97a3cSSascha Wildner     ASL_EXPECTED_MSG_NODE   *Current = AslGbl_ExpectedErrorCodeList;
138171c97a3cSSascha Wildner     ASL_LOCATION_NODE       *CurrentErrorLocation;
13823c639e0cSSascha Wildner     UINT32                  EncodedMessageId;
13833c639e0cSSascha Wildner     UINT32                  i;
13843c639e0cSSascha Wildner 
13853c639e0cSSascha Wildner 
13867bcb6cafSSascha Wildner     /* Mark this exception as received */
13877bcb6cafSSascha Wildner 
13883c639e0cSSascha Wildner     EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
1389806343b9SSascha Wildner     for (i = 0; i < AslGbl_ExpectedMessagesIndex; i++)
13903c639e0cSSascha Wildner     {
13913c639e0cSSascha Wildner         /* Simple implementation via fixed array */
13923c639e0cSSascha Wildner 
1393806343b9SSascha Wildner         if (EncodedMessageId == AslGbl_ExpectedMessages[i].MessageId)
13943c639e0cSSascha Wildner         {
1395806343b9SSascha Wildner             return (AslGbl_ExpectedMessages[i].MessageReceived = TRUE);
13963c639e0cSSascha Wildner         }
13973c639e0cSSascha Wildner     }
13983c639e0cSSascha Wildner 
139971c97a3cSSascha Wildner     while (Current && Current->MessageId != EncodedMessageId)
140071c97a3cSSascha Wildner     {
140171c97a3cSSascha Wildner         Current = Current->Next;
140271c97a3cSSascha Wildner     }
140371c97a3cSSascha Wildner     if (!Current)
140471c97a3cSSascha Wildner     {
140571c97a3cSSascha Wildner         return (FALSE);
140671c97a3cSSascha Wildner     }
140771c97a3cSSascha Wildner 
140871c97a3cSSascha Wildner     CurrentErrorLocation = Current->LocationList;
140971c97a3cSSascha Wildner 
141071c97a3cSSascha Wildner     while (CurrentErrorLocation)
141171c97a3cSSascha Wildner     {
141271c97a3cSSascha Wildner         if (!strcmp (CurrentErrorLocation->Filename, Filename) &&
141371c97a3cSSascha Wildner             CurrentErrorLocation->LineNumber == LineNumber)
141471c97a3cSSascha Wildner         {
141571c97a3cSSascha Wildner             return (CurrentErrorLocation->MessageReceived = TRUE);
141671c97a3cSSascha Wildner         }
141771c97a3cSSascha Wildner 
141871c97a3cSSascha Wildner         CurrentErrorLocation = CurrentErrorLocation->Next;
141971c97a3cSSascha Wildner     }
142071c97a3cSSascha Wildner 
14213c639e0cSSascha Wildner     return (FALSE);
14223c639e0cSSascha Wildner }
14233c639e0cSSascha Wildner 
14243c639e0cSSascha Wildner 
14253c639e0cSSascha Wildner /*******************************************************************************
14263c639e0cSSascha Wildner  *
14273c639e0cSSascha Wildner  * FUNCTION:    AslIsExceptionDisabled
14283c639e0cSSascha Wildner  *
14293c639e0cSSascha Wildner  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
14303c639e0cSSascha Wildner  *              MessageId           - Index into global message buffer
14313c639e0cSSascha Wildner  *
14323c639e0cSSascha Wildner  * RETURN:      TRUE if exception/message should be ignored
14333c639e0cSSascha Wildner  *
14343c639e0cSSascha Wildner  * DESCRIPTION: Check if the user has specified options such that this
14353c639e0cSSascha Wildner  *              exception should be ignored
14363c639e0cSSascha Wildner  *
14373c639e0cSSascha Wildner  ******************************************************************************/
14383c639e0cSSascha Wildner 
14393c639e0cSSascha Wildner static BOOLEAN
AslIsExceptionDisabled(UINT8 Level,UINT16 MessageId)14400d02842fSSascha Wildner AslIsExceptionDisabled (
14410d02842fSSascha Wildner     UINT8                   Level,
14429e1c0880SSascha Wildner     UINT16                  MessageId)
14430d02842fSSascha Wildner {
14440d02842fSSascha Wildner     UINT32                  EncodedMessageId;
14450d02842fSSascha Wildner     UINT32                  i;
14460d02842fSSascha Wildner 
14470d02842fSSascha Wildner 
14480d02842fSSascha Wildner     switch (Level)
14490d02842fSSascha Wildner     {
14500d02842fSSascha Wildner     case ASL_WARNING2:
14510d02842fSSascha Wildner     case ASL_WARNING3:
14520d02842fSSascha Wildner 
14530d02842fSSascha Wildner         /* Check for global disable via -w1/-w2/-w3 options */
14540d02842fSSascha Wildner 
1455806343b9SSascha Wildner         if (Level > AslGbl_WarningLevel)
14560d02842fSSascha Wildner         {
14570d02842fSSascha Wildner             return (TRUE);
14580d02842fSSascha Wildner         }
145908343eafSSascha Wildner         ACPI_FALLTHROUGH;
14600d02842fSSascha Wildner 
14610d02842fSSascha Wildner     case ASL_WARNING:
14620d02842fSSascha Wildner     case ASL_REMARK:
1463cf6b3eb1SSascha Wildner     case ASL_ERROR:
14640d02842fSSascha Wildner         /*
1465cf6b3eb1SSascha Wildner          * Ignore this error/warning/remark if it has been disabled by
14660d02842fSSascha Wildner          * the user (-vw option)
14670d02842fSSascha Wildner          */
14689e1c0880SSascha Wildner         EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
1469806343b9SSascha Wildner         for (i = 0; i < AslGbl_DisabledMessagesIndex; i++)
14700d02842fSSascha Wildner         {
14710d02842fSSascha Wildner             /* Simple implementation via fixed array */
14720d02842fSSascha Wildner 
1473806343b9SSascha Wildner             if (EncodedMessageId == AslGbl_DisabledMessages[i])
14740d02842fSSascha Wildner             {
14750d02842fSSascha Wildner                 return (TRUE);
14760d02842fSSascha Wildner             }
14770d02842fSSascha Wildner         }
14780d02842fSSascha Wildner         break;
14790d02842fSSascha Wildner 
14800d02842fSSascha Wildner     default:
14810d02842fSSascha Wildner         break;
14820d02842fSSascha Wildner     }
14830d02842fSSascha Wildner 
14840d02842fSSascha Wildner     return (FALSE);
14850d02842fSSascha Wildner }
14860d02842fSSascha Wildner 
14870d02842fSSascha Wildner 
14880d02842fSSascha Wildner /*******************************************************************************
14890d02842fSSascha Wildner  *
14907bcb6cafSSascha Wildner  * FUNCTION:    AslDualParseOpError
14917bcb6cafSSascha Wildner  *
14927bcb6cafSSascha Wildner  * PARAMETERS:  Level           - Seriousness (Warning/error, etc.)
14937bcb6cafSSascha Wildner  *              MainMsgId       - Index into global message buffer
14947bcb6cafSSascha Wildner  *              MainOp          - Parse node where error happened
14957bcb6cafSSascha Wildner  *              MainMsg         - Message pertaining to the MainOp
14967bcb6cafSSascha Wildner  *              SubMsgId        - Index into global message buffer
14977bcb6cafSSascha Wildner  *              SubOp           - Additional parse node for better message
1498e5412f1eSSascha Wildner  *              SubMsg          - Message pertaining to SubOp
14997bcb6cafSSascha Wildner  *
15007bcb6cafSSascha Wildner  *
15017bcb6cafSSascha Wildner  * RETURN:      None
15027bcb6cafSSascha Wildner  *
15037bcb6cafSSascha Wildner  * DESCRIPTION: Main error reporting routine for the ASL compiler for error
15047bcb6cafSSascha Wildner  *              messages that point to multiple parse objects.
15057bcb6cafSSascha Wildner  *
15067bcb6cafSSascha Wildner  ******************************************************************************/
15077bcb6cafSSascha Wildner 
15087bcb6cafSSascha Wildner void
AslDualParseOpError(UINT8 Level,UINT16 MainMsgId,ACPI_PARSE_OBJECT * MainOp,char * MainMsg,UINT16 SubMsgId,ACPI_PARSE_OBJECT * SubOp,char * SubMsg)15097bcb6cafSSascha Wildner AslDualParseOpError (
15107bcb6cafSSascha Wildner     UINT8                   Level,
15117bcb6cafSSascha Wildner     UINT16                  MainMsgId,
15127bcb6cafSSascha Wildner     ACPI_PARSE_OBJECT       *MainOp,
15137bcb6cafSSascha Wildner     char                    *MainMsg,
15147bcb6cafSSascha Wildner     UINT16                  SubMsgId,
15157bcb6cafSSascha Wildner     ACPI_PARSE_OBJECT       *SubOp,
15167bcb6cafSSascha Wildner     char                    *SubMsg)
15177bcb6cafSSascha Wildner {
15187bcb6cafSSascha Wildner     ASL_ERROR_MSG           *SubEnode = NULL;
15197bcb6cafSSascha Wildner 
15207bcb6cafSSascha Wildner 
15217bcb6cafSSascha Wildner     /* Check if user wants to ignore this exception */
15227bcb6cafSSascha Wildner 
152371c97a3cSSascha Wildner     if (!MainOp || AslIsExceptionIgnored (MainOp->Asl.Filename,
152471c97a3cSSascha Wildner         MainOp->Asl.LogicalLineNumber, Level, MainMsgId))
15257bcb6cafSSascha Wildner     {
15267bcb6cafSSascha Wildner         return;
15277bcb6cafSSascha Wildner     }
15287bcb6cafSSascha Wildner 
15297bcb6cafSSascha Wildner     if (SubOp)
15307bcb6cafSSascha Wildner     {
15317bcb6cafSSascha Wildner         AslInitEnode (&SubEnode, Level, SubMsgId, SubOp->Asl.LineNumber,
15327bcb6cafSSascha Wildner             SubOp->Asl.LogicalLineNumber, SubOp->Asl.LogicalByteOffset,
15337bcb6cafSSascha Wildner             SubOp->Asl.Column, SubOp->Asl.Filename, SubMsg,
15347bcb6cafSSascha Wildner             NULL, NULL);
15357bcb6cafSSascha Wildner     }
15367bcb6cafSSascha Wildner 
15377bcb6cafSSascha Wildner     AslLogNewError (Level, MainMsgId, MainOp->Asl.LineNumber,
15387bcb6cafSSascha Wildner         MainOp->Asl.LogicalLineNumber, MainOp->Asl.LogicalByteOffset,
15397bcb6cafSSascha Wildner         MainOp->Asl.Column, MainOp->Asl.Filename, MainMsg,
15407bcb6cafSSascha Wildner         NULL, SubEnode);
15417bcb6cafSSascha Wildner }
15427bcb6cafSSascha Wildner 
15437bcb6cafSSascha Wildner 
15447bcb6cafSSascha Wildner /*******************************************************************************
15457bcb6cafSSascha Wildner  *
15460d02842fSSascha Wildner  * FUNCTION:    AslError
15470d02842fSSascha Wildner  *
15480d02842fSSascha Wildner  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
15490d02842fSSascha Wildner  *              MessageId           - Index into global message buffer
15500d02842fSSascha Wildner  *              Op                  - Parse node where error happened
1551e5412f1eSSascha Wildner  *              ExtraMessage        - Additional error message
15520d02842fSSascha Wildner  *
15530d02842fSSascha Wildner  * RETURN:      None
15540d02842fSSascha Wildner  *
15550d02842fSSascha Wildner  * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
15560d02842fSSascha Wildner  *              except the parser.)
15570d02842fSSascha Wildner  *
15580d02842fSSascha Wildner  ******************************************************************************/
15590d02842fSSascha Wildner 
15600d02842fSSascha Wildner void
AslError(UINT8 Level,UINT16 MessageId,ACPI_PARSE_OBJECT * Op,char * ExtraMessage)15610d02842fSSascha Wildner AslError (
15620d02842fSSascha Wildner     UINT8                   Level,
15639e1c0880SSascha Wildner     UINT16                  MessageId,
15640d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *Op,
15650d02842fSSascha Wildner     char                    *ExtraMessage)
15660d02842fSSascha Wildner {
15670d02842fSSascha Wildner     if (Op)
15680d02842fSSascha Wildner     {
15690d02842fSSascha Wildner         AslCommonError (Level, MessageId, Op->Asl.LineNumber,
15700d02842fSSascha Wildner             Op->Asl.LogicalLineNumber,
15710d02842fSSascha Wildner             Op->Asl.LogicalByteOffset,
15720d02842fSSascha Wildner             Op->Asl.Column,
15730d02842fSSascha Wildner             Op->Asl.Filename, ExtraMessage);
15740d02842fSSascha Wildner     }
15750d02842fSSascha Wildner     else
15760d02842fSSascha Wildner     {
15770d02842fSSascha Wildner         AslCommonError (Level, MessageId, 0,
15780d02842fSSascha Wildner             0, 0, 0, NULL, ExtraMessage);
15790d02842fSSascha Wildner     }
15800d02842fSSascha Wildner }
15810d02842fSSascha Wildner 
15820d02842fSSascha Wildner 
15830d02842fSSascha Wildner /*******************************************************************************
15840d02842fSSascha Wildner  *
15850d02842fSSascha Wildner  * FUNCTION:    AslCoreSubsystemError
15860d02842fSSascha Wildner  *
15870d02842fSSascha Wildner  * PARAMETERS:  Op                  - Parse node where error happened
15880d02842fSSascha Wildner  *              Status              - The ACPICA Exception
1589e5412f1eSSascha Wildner  *              ExtraMessage        - Additional error message
15900d02842fSSascha Wildner  *              Abort               - TRUE -> Abort compilation
15910d02842fSSascha Wildner  *
15920d02842fSSascha Wildner  * RETURN:      None
15930d02842fSSascha Wildner  *
1594d4972a9cSSascha Wildner  * DESCRIPTION: Error reporting routine for exceptions returned by the ACPICA
1595d4972a9cSSascha Wildner  *              core subsystem.
15960d02842fSSascha Wildner  *
15970d02842fSSascha Wildner  ******************************************************************************/
15980d02842fSSascha Wildner 
15990d02842fSSascha Wildner void
AslCoreSubsystemError(ACPI_PARSE_OBJECT * Op,ACPI_STATUS Status,char * ExtraMessage,BOOLEAN Abort)16000d02842fSSascha Wildner AslCoreSubsystemError (
16010d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *Op,
16020d02842fSSascha Wildner     ACPI_STATUS             Status,
16030d02842fSSascha Wildner     char                    *ExtraMessage,
16040d02842fSSascha Wildner     BOOLEAN                 Abort)
16050d02842fSSascha Wildner {
16060d02842fSSascha Wildner 
1607806343b9SSascha Wildner     sprintf (AslGbl_MsgBuffer, "%s %s", AcpiFormatException (Status), ExtraMessage);
16080d02842fSSascha Wildner 
16090d02842fSSascha Wildner     if (Op)
16100d02842fSSascha Wildner     {
1611820c5b08SSascha Wildner         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
1612820c5b08SSascha Wildner             Op->Asl.LineNumber,
16130d02842fSSascha Wildner             Op->Asl.LogicalLineNumber,
16140d02842fSSascha Wildner             Op->Asl.LogicalByteOffset,
16150d02842fSSascha Wildner             Op->Asl.Column,
1616806343b9SSascha Wildner             Op->Asl.Filename, AslGbl_MsgBuffer);
16170d02842fSSascha Wildner     }
16180d02842fSSascha Wildner     else
16190d02842fSSascha Wildner     {
1620820c5b08SSascha Wildner         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
1621806343b9SSascha Wildner             0, 0, 0, 0, NULL, AslGbl_MsgBuffer);
16220d02842fSSascha Wildner     }
16230d02842fSSascha Wildner 
16240d02842fSSascha Wildner     if (Abort)
16250d02842fSSascha Wildner     {
16260d02842fSSascha Wildner         AslAbort ();
16270d02842fSSascha Wildner     }
16280d02842fSSascha Wildner }
16290d02842fSSascha Wildner 
16300d02842fSSascha Wildner 
16310d02842fSSascha Wildner /*******************************************************************************
16320d02842fSSascha Wildner  *
16330d02842fSSascha Wildner  * FUNCTION:    AslCompilererror
16340d02842fSSascha Wildner  *
16350d02842fSSascha Wildner  * PARAMETERS:  CompilerMessage         - Error message from the parser
16360d02842fSSascha Wildner  *
16370d02842fSSascha Wildner  * RETURN:      Status (0 for now)
16380d02842fSSascha Wildner  *
16390d02842fSSascha Wildner  * DESCRIPTION: Report an error situation discovered in a production
16400d02842fSSascha Wildner  *              NOTE: don't change the name of this function, it is called
16410d02842fSSascha Wildner  *              from the auto-generated parser.
16420d02842fSSascha Wildner  *
16430d02842fSSascha Wildner  ******************************************************************************/
16440d02842fSSascha Wildner 
16450d02842fSSascha Wildner int
AslCompilererror(const char * CompilerMessage)16460d02842fSSascha Wildner AslCompilererror (
16470d02842fSSascha Wildner     const char              *CompilerMessage)
16480d02842fSSascha Wildner {
16490d02842fSSascha Wildner 
1650806343b9SSascha Wildner     AslGbl_SyntaxError++;
1651fe7b5cb4SSascha Wildner 
1652806343b9SSascha Wildner     AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber,
1653806343b9SSascha Wildner         AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset,
1654806343b9SSascha Wildner         AslGbl_CurrentColumn, AslGbl_Files[ASL_FILE_INPUT].Filename,
16550d02842fSSascha Wildner         ACPI_CAST_PTR (char, CompilerMessage));
16560d02842fSSascha Wildner 
16570d02842fSSascha Wildner     return (0);
16580d02842fSSascha Wildner }
1659