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