aslerror.c revision 1.1.1.3.12.2 1 1.1 jruoho /******************************************************************************
2 1.1 jruoho *
3 1.1 jruoho * Module Name: aslerror - Error handling and statistics
4 1.1 jruoho *
5 1.1 jruoho *****************************************************************************/
6 1.1 jruoho
7 1.1.1.2 jruoho /*
8 1.1.1.3.12.2 jdolecek * Copyright (C) 2000 - 2017, Intel Corp.
9 1.1 jruoho * All rights reserved.
10 1.1 jruoho *
11 1.1.1.2 jruoho * Redistribution and use in source and binary forms, with or without
12 1.1.1.2 jruoho * modification, are permitted provided that the following conditions
13 1.1.1.2 jruoho * are met:
14 1.1.1.2 jruoho * 1. Redistributions of source code must retain the above copyright
15 1.1.1.2 jruoho * notice, this list of conditions, and the following disclaimer,
16 1.1.1.2 jruoho * without modification.
17 1.1.1.2 jruoho * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 1.1.1.2 jruoho * substantially similar to the "NO WARRANTY" disclaimer below
19 1.1.1.2 jruoho * ("Disclaimer") and any redistribution must be conditioned upon
20 1.1.1.2 jruoho * including a substantially similar Disclaimer requirement for further
21 1.1.1.2 jruoho * binary redistribution.
22 1.1.1.2 jruoho * 3. Neither the names of the above-listed copyright holders nor the names
23 1.1.1.2 jruoho * of any contributors may be used to endorse or promote products derived
24 1.1.1.2 jruoho * from this software without specific prior written permission.
25 1.1.1.2 jruoho *
26 1.1.1.2 jruoho * Alternatively, this software may be distributed under the terms of the
27 1.1.1.2 jruoho * GNU General Public License ("GPL") version 2 as published by the Free
28 1.1.1.2 jruoho * Software Foundation.
29 1.1.1.2 jruoho *
30 1.1.1.2 jruoho * NO WARRANTY
31 1.1.1.2 jruoho * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 1.1.1.2 jruoho * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 1.1.1.2 jruoho * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 1.1.1.2 jruoho * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 1.1.1.2 jruoho * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 1.1.1.2 jruoho * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 1.1.1.2 jruoho * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 1.1.1.2 jruoho * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 1.1.1.2 jruoho * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 1.1.1.2 jruoho * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 1.1.1.2 jruoho * POSSIBILITY OF SUCH DAMAGES.
42 1.1.1.2 jruoho */
43 1.1 jruoho
44 1.1 jruoho #include "aslcompiler.h"
45 1.1 jruoho
46 1.1 jruoho #define _COMPONENT ACPI_COMPILER
47 1.1 jruoho ACPI_MODULE_NAME ("aslerror")
48 1.1 jruoho
49 1.1 jruoho /* Local prototypes */
50 1.1 jruoho
51 1.1 jruoho static void
52 1.1 jruoho AeAddToErrorLog (
53 1.1 jruoho ASL_ERROR_MSG *Enode);
54 1.1 jruoho
55 1.1.1.3.12.2 jdolecek static BOOLEAN
56 1.1.1.3.12.2 jdolecek AslIsExceptionExpected (
57 1.1.1.3.12.2 jdolecek UINT8 Level,
58 1.1.1.3.12.2 jdolecek UINT16 MessageId);
59 1.1.1.3.12.2 jdolecek
60 1.1.1.3.12.2 jdolecek static BOOLEAN
61 1.1.1.3.12.2 jdolecek AslIsExceptionDisabled (
62 1.1.1.3.12.2 jdolecek UINT8 Level,
63 1.1.1.3.12.2 jdolecek UINT16 MessageId);
64 1.1.1.3.12.2 jdolecek
65 1.1.1.3.12.2 jdolecek static void AslInitEnode (
66 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG **Enode,
67 1.1.1.3.12.2 jdolecek UINT8 Level,
68 1.1.1.3.12.2 jdolecek UINT16 MessageId,
69 1.1.1.3.12.2 jdolecek UINT32 LineNumber,
70 1.1.1.3.12.2 jdolecek UINT32 LogicalLineNumber,
71 1.1.1.3.12.2 jdolecek UINT32 LogicalByteOffset,
72 1.1.1.3.12.2 jdolecek UINT32 Column,
73 1.1.1.3.12.2 jdolecek char *Filename,
74 1.1.1.3.12.2 jdolecek char *Message,
75 1.1.1.3.12.2 jdolecek char *SourceLine,
76 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG *SubError);
77 1.1.1.3.12.2 jdolecek
78 1.1.1.3.12.2 jdolecek static void
79 1.1.1.3.12.2 jdolecek AslLogNewError (
80 1.1.1.3.12.2 jdolecek UINT8 Level,
81 1.1.1.3.12.2 jdolecek UINT16 MessageId,
82 1.1.1.3.12.2 jdolecek UINT32 LineNumber,
83 1.1.1.3.12.2 jdolecek UINT32 LogicalLineNumber,
84 1.1.1.3.12.2 jdolecek UINT32 LogicalByteOffset,
85 1.1.1.3.12.2 jdolecek UINT32 Column,
86 1.1.1.3.12.2 jdolecek char *Filename,
87 1.1.1.3.12.2 jdolecek char *Message,
88 1.1.1.3.12.2 jdolecek char *SourceLine,
89 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG *SubError);
90 1.1.1.3.12.2 jdolecek
91 1.1.1.3.12.2 jdolecek static void
92 1.1.1.3.12.2 jdolecek AePrintSubError (
93 1.1.1.3.12.2 jdolecek FILE *OutputFile,
94 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG *Enode);
95 1.1.1.3.12.2 jdolecek
96 1.1.1.3.12.2 jdolecek
97 1.1.1.3.12.2 jdolecek /*******************************************************************************
98 1.1.1.3.12.2 jdolecek *
99 1.1.1.3.12.2 jdolecek * FUNCTION: AslAbort
100 1.1.1.3.12.2 jdolecek *
101 1.1.1.3.12.2 jdolecek * PARAMETERS: None
102 1.1.1.3.12.2 jdolecek *
103 1.1.1.3.12.2 jdolecek * RETURN: None
104 1.1.1.3.12.2 jdolecek *
105 1.1.1.3.12.2 jdolecek * DESCRIPTION: Dump the error log and abort the compiler. Used for serious
106 1.1.1.3.12.2 jdolecek * I/O errors.
107 1.1.1.3.12.2 jdolecek *
108 1.1.1.3.12.2 jdolecek ******************************************************************************/
109 1.1.1.3.12.2 jdolecek
110 1.1.1.3.12.2 jdolecek void
111 1.1.1.3.12.2 jdolecek AslAbort (
112 1.1.1.3.12.2 jdolecek void)
113 1.1.1.3.12.2 jdolecek {
114 1.1.1.3.12.2 jdolecek
115 1.1.1.3.12.2 jdolecek AePrintErrorLog (ASL_FILE_STDERR);
116 1.1.1.3.12.2 jdolecek if (Gbl_DebugFlag)
117 1.1.1.3.12.2 jdolecek {
118 1.1.1.3.12.2 jdolecek /* Print error summary to stdout also */
119 1.1.1.3.12.2 jdolecek
120 1.1.1.3.12.2 jdolecek AePrintErrorLog (ASL_FILE_STDOUT);
121 1.1.1.3.12.2 jdolecek }
122 1.1.1.3.12.2 jdolecek
123 1.1.1.3.12.2 jdolecek exit (1);
124 1.1.1.3.12.2 jdolecek }
125 1.1.1.3.12.2 jdolecek
126 1.1 jruoho
127 1.1.1.3.12.1 tls /*******************************************************************************
128 1.1.1.3.12.1 tls *
129 1.1.1.3.12.1 tls * FUNCTION: AeClearErrorLog
130 1.1.1.3.12.1 tls *
131 1.1.1.3.12.1 tls * PARAMETERS: None
132 1.1.1.3.12.1 tls *
133 1.1.1.3.12.1 tls * RETURN: None
134 1.1.1.3.12.1 tls *
135 1.1.1.3.12.1 tls * DESCRIPTION: Empty the error list
136 1.1.1.3.12.1 tls *
137 1.1.1.3.12.1 tls ******************************************************************************/
138 1.1.1.3.12.1 tls
139 1.1 jruoho void
140 1.1 jruoho AeClearErrorLog (
141 1.1 jruoho void)
142 1.1 jruoho {
143 1.1 jruoho ASL_ERROR_MSG *Enode = Gbl_ErrorLog;
144 1.1 jruoho ASL_ERROR_MSG *Next;
145 1.1 jruoho
146 1.1.1.3.12.2 jdolecek
147 1.1 jruoho /* Walk the error node list */
148 1.1 jruoho
149 1.1 jruoho while (Enode)
150 1.1 jruoho {
151 1.1 jruoho Next = Enode->Next;
152 1.1 jruoho ACPI_FREE (Enode);
153 1.1 jruoho Enode = Next;
154 1.1 jruoho }
155 1.1 jruoho
156 1.1 jruoho Gbl_ErrorLog = NULL;
157 1.1 jruoho }
158 1.1 jruoho
159 1.1 jruoho
160 1.1 jruoho /*******************************************************************************
161 1.1 jruoho *
162 1.1 jruoho * FUNCTION: AeAddToErrorLog
163 1.1 jruoho *
164 1.1 jruoho * PARAMETERS: Enode - An error node to add to the log
165 1.1 jruoho *
166 1.1 jruoho * RETURN: None
167 1.1 jruoho *
168 1.1.1.3.12.1 tls * DESCRIPTION: Add a new error node to the error log. The error log is
169 1.1 jruoho * ordered by the "logical" line number (cumulative line number
170 1.1 jruoho * including all include files.)
171 1.1 jruoho *
172 1.1 jruoho ******************************************************************************/
173 1.1 jruoho
174 1.1 jruoho static void
175 1.1 jruoho AeAddToErrorLog (
176 1.1 jruoho ASL_ERROR_MSG *Enode)
177 1.1 jruoho {
178 1.1 jruoho ASL_ERROR_MSG *Next;
179 1.1 jruoho ASL_ERROR_MSG *Prev;
180 1.1 jruoho
181 1.1 jruoho
182 1.1 jruoho /* If Gbl_ErrorLog is null, this is the first error node */
183 1.1 jruoho
184 1.1 jruoho if (!Gbl_ErrorLog)
185 1.1 jruoho {
186 1.1 jruoho Gbl_ErrorLog = Enode;
187 1.1 jruoho return;
188 1.1 jruoho }
189 1.1 jruoho
190 1.1 jruoho /*
191 1.1 jruoho * Walk error list until we find a line number greater than ours.
192 1.1 jruoho * List is sorted according to line number.
193 1.1 jruoho */
194 1.1 jruoho Prev = NULL;
195 1.1 jruoho Next = Gbl_ErrorLog;
196 1.1 jruoho
197 1.1.1.3.12.2 jdolecek while ((Next) && (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
198 1.1 jruoho {
199 1.1 jruoho Prev = Next;
200 1.1 jruoho Next = Next->Next;
201 1.1 jruoho }
202 1.1 jruoho
203 1.1 jruoho /* Found our place in the list */
204 1.1 jruoho
205 1.1 jruoho Enode->Next = Next;
206 1.1 jruoho
207 1.1 jruoho if (Prev)
208 1.1 jruoho {
209 1.1 jruoho Prev->Next = Enode;
210 1.1 jruoho }
211 1.1 jruoho else
212 1.1 jruoho {
213 1.1 jruoho Gbl_ErrorLog = Enode;
214 1.1 jruoho }
215 1.1 jruoho }
216 1.1 jruoho
217 1.1 jruoho
218 1.1 jruoho /*******************************************************************************
219 1.1 jruoho *
220 1.1.1.3.12.2 jdolecek * FUNCTION: AeDecodeErrorMessageId
221 1.1.1.3.12.2 jdolecek *
222 1.1.1.3.12.2 jdolecek * PARAMETERS: OutputFile - Output file
223 1.1.1.3.12.2 jdolecek * Enode - Error node to print
224 1.1.1.3.12.2 jdolecek * PrematureEOF - True = PrematureEOF has been reached
225 1.1.1.3.12.2 jdolecek * Total - Total legth of line
226 1.1.1.3.12.2 jdolecek *
227 1.1.1.3.12.2 jdolecek * RETURN: None
228 1.1.1.3.12.2 jdolecek *
229 1.1.1.3.12.2 jdolecek * DESCRIPTION: Print the source line of an error.
230 1.1.1.3.12.2 jdolecek *
231 1.1.1.3.12.2 jdolecek ******************************************************************************/
232 1.1.1.3.12.2 jdolecek
233 1.1.1.3.12.2 jdolecek static void
234 1.1.1.3.12.2 jdolecek AeDecodeErrorMessageId (
235 1.1.1.3.12.2 jdolecek FILE *OutputFile,
236 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG *Enode,
237 1.1.1.3.12.2 jdolecek BOOLEAN PrematureEOF,
238 1.1.1.3.12.2 jdolecek UINT32 Total)
239 1.1.1.3.12.2 jdolecek {
240 1.1.1.3.12.2 jdolecek UINT32 MsgLength;
241 1.1.1.3.12.2 jdolecek const char *MainMessage;
242 1.1.1.3.12.2 jdolecek char *ExtraMessage;
243 1.1.1.3.12.2 jdolecek UINT32 SourceColumn;
244 1.1.1.3.12.2 jdolecek UINT32 ErrorColumn;
245 1.1.1.3.12.2 jdolecek
246 1.1.1.3.12.2 jdolecek
247 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "%s %4.4d -",
248 1.1.1.3.12.2 jdolecek AeDecodeExceptionLevel (Enode->Level),
249 1.1.1.3.12.2 jdolecek AeBuildFullExceptionCode (Enode->Level, Enode->MessageId));
250 1.1.1.3.12.2 jdolecek
251 1.1.1.3.12.2 jdolecek MainMessage = AeDecodeMessageId (Enode->MessageId);
252 1.1.1.3.12.2 jdolecek ExtraMessage = Enode->Message;
253 1.1.1.3.12.2 jdolecek
254 1.1.1.3.12.2 jdolecek /* If a NULL line number, just print the decoded message */
255 1.1.1.3.12.2 jdolecek
256 1.1.1.3.12.2 jdolecek if (!Enode->LineNumber)
257 1.1.1.3.12.2 jdolecek {
258 1.1.1.3.12.2 jdolecek fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
259 1.1.1.3.12.2 jdolecek return;
260 1.1.1.3.12.2 jdolecek }
261 1.1.1.3.12.2 jdolecek
262 1.1.1.3.12.2 jdolecek MsgLength = strlen (MainMessage);
263 1.1.1.3.12.2 jdolecek if (MsgLength == 0)
264 1.1.1.3.12.2 jdolecek {
265 1.1.1.3.12.2 jdolecek /* Use the secondary/extra message as main message */
266 1.1.1.3.12.2 jdolecek
267 1.1.1.3.12.2 jdolecek MainMessage = Enode->Message;
268 1.1.1.3.12.2 jdolecek if (!MainMessage)
269 1.1.1.3.12.2 jdolecek {
270 1.1.1.3.12.2 jdolecek MainMessage = "";
271 1.1.1.3.12.2 jdolecek }
272 1.1.1.3.12.2 jdolecek
273 1.1.1.3.12.2 jdolecek MsgLength = strlen (MainMessage);
274 1.1.1.3.12.2 jdolecek ExtraMessage = NULL;
275 1.1.1.3.12.2 jdolecek }
276 1.1.1.3.12.2 jdolecek
277 1.1.1.3.12.2 jdolecek if (Gbl_VerboseErrors && !PrematureEOF)
278 1.1.1.3.12.2 jdolecek {
279 1.1.1.3.12.2 jdolecek if (Total >= 256)
280 1.1.1.3.12.2 jdolecek {
281 1.1.1.3.12.2 jdolecek fprintf (OutputFile, " %s",
282 1.1.1.3.12.2 jdolecek MainMessage);
283 1.1.1.3.12.2 jdolecek }
284 1.1.1.3.12.2 jdolecek else
285 1.1.1.3.12.2 jdolecek {
286 1.1.1.3.12.2 jdolecek SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
287 1.1.1.3.12.2 jdolecek ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
288 1.1.1.3.12.2 jdolecek
289 1.1.1.3.12.2 jdolecek if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
290 1.1.1.3.12.2 jdolecek {
291 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "%*s%s",
292 1.1.1.3.12.2 jdolecek (int) ((SourceColumn - 1) - ErrorColumn),
293 1.1.1.3.12.2 jdolecek MainMessage, " ^ ");
294 1.1.1.3.12.2 jdolecek }
295 1.1.1.3.12.2 jdolecek else
296 1.1.1.3.12.2 jdolecek {
297 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "%*s %s",
298 1.1.1.3.12.2 jdolecek (int) ((SourceColumn - ErrorColumn) + 1), "^",
299 1.1.1.3.12.2 jdolecek MainMessage);
300 1.1.1.3.12.2 jdolecek }
301 1.1.1.3.12.2 jdolecek }
302 1.1.1.3.12.2 jdolecek }
303 1.1.1.3.12.2 jdolecek else
304 1.1.1.3.12.2 jdolecek {
305 1.1.1.3.12.2 jdolecek fprintf (OutputFile, " %s", MainMessage);
306 1.1.1.3.12.2 jdolecek }
307 1.1.1.3.12.2 jdolecek
308 1.1.1.3.12.2 jdolecek /* Print the extra info message if present */
309 1.1.1.3.12.2 jdolecek
310 1.1.1.3.12.2 jdolecek if (ExtraMessage)
311 1.1.1.3.12.2 jdolecek {
312 1.1.1.3.12.2 jdolecek fprintf (OutputFile, " (%s)", ExtraMessage);
313 1.1.1.3.12.2 jdolecek }
314 1.1.1.3.12.2 jdolecek
315 1.1.1.3.12.2 jdolecek if (PrematureEOF)
316 1.1.1.3.12.2 jdolecek {
317 1.1.1.3.12.2 jdolecek fprintf (OutputFile, " and premature End-Of-File");
318 1.1.1.3.12.2 jdolecek }
319 1.1.1.3.12.2 jdolecek
320 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "\n");
321 1.1.1.3.12.2 jdolecek if (Gbl_VerboseErrors && !Enode->SubError)
322 1.1.1.3.12.2 jdolecek {
323 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "\n");
324 1.1.1.3.12.2 jdolecek }
325 1.1.1.3.12.2 jdolecek }
326 1.1.1.3.12.2 jdolecek
327 1.1.1.3.12.2 jdolecek
328 1.1.1.3.12.2 jdolecek /*******************************************************************************
329 1.1.1.3.12.2 jdolecek *
330 1.1.1.3.12.2 jdolecek * FUNCTION: AePrintErrorSourceLine
331 1.1.1.3.12.2 jdolecek *
332 1.1.1.3.12.2 jdolecek * PARAMETERS: OutputFile - Output file
333 1.1.1.3.12.2 jdolecek * Enode - Error node to print
334 1.1.1.3.12.2 jdolecek * PrematureEOF - True = PrematureEOF has been reached
335 1.1.1.3.12.2 jdolecek * Total - amount of characters printed so far
336 1.1.1.3.12.2 jdolecek *
337 1.1.1.3.12.2 jdolecek *
338 1.1.1.3.12.2 jdolecek * RETURN: Status
339 1.1.1.3.12.2 jdolecek *
340 1.1.1.3.12.2 jdolecek * DESCRIPTION: Print the source line of an error.
341 1.1.1.3.12.2 jdolecek *
342 1.1.1.3.12.2 jdolecek ******************************************************************************/
343 1.1.1.3.12.2 jdolecek
344 1.1.1.3.12.2 jdolecek static ACPI_STATUS
345 1.1.1.3.12.2 jdolecek AePrintErrorSourceLine (
346 1.1.1.3.12.2 jdolecek FILE *OutputFile,
347 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG *Enode,
348 1.1.1.3.12.2 jdolecek BOOLEAN *PrematureEOF,
349 1.1.1.3.12.2 jdolecek UINT32 *Total)
350 1.1.1.3.12.2 jdolecek {
351 1.1.1.3.12.2 jdolecek UINT8 SourceByte;
352 1.1.1.3.12.2 jdolecek int Actual;
353 1.1.1.3.12.2 jdolecek size_t RActual;
354 1.1.1.3.12.2 jdolecek FILE *SourceFile = NULL;
355 1.1.1.3.12.2 jdolecek long FileSize;
356 1.1.1.3.12.2 jdolecek
357 1.1.1.3.12.2 jdolecek
358 1.1.1.3.12.2 jdolecek if (!Enode->SourceLine)
359 1.1.1.3.12.2 jdolecek {
360 1.1.1.3.12.2 jdolecek /*
361 1.1.1.3.12.2 jdolecek * Use the merged header/source file if present, otherwise
362 1.1.1.3.12.2 jdolecek * use input file
363 1.1.1.3.12.2 jdolecek */
364 1.1.1.3.12.2 jdolecek SourceFile = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
365 1.1.1.3.12.2 jdolecek if (!SourceFile)
366 1.1.1.3.12.2 jdolecek {
367 1.1.1.3.12.2 jdolecek SourceFile = Gbl_Files[ASL_FILE_INPUT].Handle;
368 1.1.1.3.12.2 jdolecek }
369 1.1.1.3.12.2 jdolecek
370 1.1.1.3.12.2 jdolecek if (SourceFile)
371 1.1.1.3.12.2 jdolecek {
372 1.1.1.3.12.2 jdolecek /* Determine if the error occurred at source file EOF */
373 1.1.1.3.12.2 jdolecek
374 1.1.1.3.12.2 jdolecek fseek (SourceFile, 0, SEEK_END);
375 1.1.1.3.12.2 jdolecek FileSize = ftell (SourceFile);
376 1.1.1.3.12.2 jdolecek
377 1.1.1.3.12.2 jdolecek if ((long) Enode->LogicalByteOffset >= FileSize)
378 1.1.1.3.12.2 jdolecek {
379 1.1.1.3.12.2 jdolecek *PrematureEOF = TRUE;
380 1.1.1.3.12.2 jdolecek }
381 1.1.1.3.12.2 jdolecek }
382 1.1.1.3.12.2 jdolecek else
383 1.1.1.3.12.2 jdolecek {
384 1.1.1.3.12.2 jdolecek fprintf (OutputFile,
385 1.1.1.3.12.2 jdolecek "[*** iASL: Source File Does not exist ***]\n");
386 1.1.1.3.12.2 jdolecek return AE_IO_ERROR;
387 1.1.1.3.12.2 jdolecek }
388 1.1.1.3.12.2 jdolecek }
389 1.1.1.3.12.2 jdolecek
390 1.1.1.3.12.2 jdolecek /* Print filename and line number if present and valid */
391 1.1.1.3.12.2 jdolecek
392 1.1.1.3.12.2 jdolecek if (Gbl_VerboseErrors)
393 1.1.1.3.12.2 jdolecek {
394 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "%-8s", Enode->Filename);
395 1.1.1.3.12.2 jdolecek
396 1.1.1.3.12.2 jdolecek if (Enode->SourceLine && Enode->LineNumber)
397 1.1.1.3.12.2 jdolecek {
398 1.1.1.3.12.2 jdolecek fprintf (OutputFile, " %6u: %s",
399 1.1.1.3.12.2 jdolecek Enode->LineNumber, Enode->SourceLine);
400 1.1.1.3.12.2 jdolecek }
401 1.1.1.3.12.2 jdolecek else if (Enode->LineNumber)
402 1.1.1.3.12.2 jdolecek {
403 1.1.1.3.12.2 jdolecek fprintf (OutputFile, " %6u: ", Enode->LineNumber);
404 1.1.1.3.12.2 jdolecek
405 1.1.1.3.12.2 jdolecek /*
406 1.1.1.3.12.2 jdolecek * If not at EOF, get the corresponding source code line
407 1.1.1.3.12.2 jdolecek * and display it. Don't attempt this if we have a
408 1.1.1.3.12.2 jdolecek * premature EOF condition.
409 1.1.1.3.12.2 jdolecek */
410 1.1.1.3.12.2 jdolecek if (*PrematureEOF)
411 1.1.1.3.12.2 jdolecek {
412 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "\n");
413 1.1.1.3.12.2 jdolecek return AE_OK;
414 1.1.1.3.12.2 jdolecek }
415 1.1.1.3.12.2 jdolecek /*
416 1.1.1.3.12.2 jdolecek * Seek to the offset in the combined source file,
417 1.1.1.3.12.2 jdolecek * read the source line, and write it to the output.
418 1.1.1.3.12.2 jdolecek */
419 1.1.1.3.12.2 jdolecek Actual = fseek (SourceFile,
420 1.1.1.3.12.2 jdolecek (long) Enode->LogicalByteOffset, (int) SEEK_SET);
421 1.1.1.3.12.2 jdolecek if (Actual)
422 1.1.1.3.12.2 jdolecek {
423 1.1.1.3.12.2 jdolecek fprintf (OutputFile,
424 1.1.1.3.12.2 jdolecek "[*** iASL: Seek error on source code temp file %s ***]",
425 1.1.1.3.12.2 jdolecek Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
426 1.1.1.3.12.2 jdolecek
427 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "\n");
428 1.1.1.3.12.2 jdolecek return AE_OK;
429 1.1.1.3.12.2 jdolecek }
430 1.1.1.3.12.2 jdolecek RActual = fread (&SourceByte, 1, 1, SourceFile);
431 1.1.1.3.12.2 jdolecek if (RActual != 1)
432 1.1.1.3.12.2 jdolecek {
433 1.1.1.3.12.2 jdolecek fprintf (OutputFile,
434 1.1.1.3.12.2 jdolecek "[*** iASL: Read error on source code temp file %s ***]",
435 1.1.1.3.12.2 jdolecek Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
436 1.1.1.3.12.2 jdolecek return AE_IO_ERROR;
437 1.1.1.3.12.2 jdolecek }
438 1.1.1.3.12.2 jdolecek /* Read/write the source line, up to the maximum line length */
439 1.1.1.3.12.2 jdolecek
440 1.1.1.3.12.2 jdolecek while (RActual && SourceByte && (SourceByte != '\n'))
441 1.1.1.3.12.2 jdolecek {
442 1.1.1.3.12.2 jdolecek if (*Total < 256)
443 1.1.1.3.12.2 jdolecek {
444 1.1.1.3.12.2 jdolecek /* After the max line length, we will just read the line, no write */
445 1.1.1.3.12.2 jdolecek
446 1.1.1.3.12.2 jdolecek if (fwrite (&SourceByte, 1, 1, OutputFile) != 1)
447 1.1.1.3.12.2 jdolecek {
448 1.1.1.3.12.2 jdolecek printf ("[*** iASL: Write error on output file ***]\n");
449 1.1.1.3.12.2 jdolecek return AE_IO_ERROR;
450 1.1.1.3.12.2 jdolecek }
451 1.1.1.3.12.2 jdolecek }
452 1.1.1.3.12.2 jdolecek else if (*Total == 256)
453 1.1.1.3.12.2 jdolecek {
454 1.1.1.3.12.2 jdolecek fprintf (OutputFile,
455 1.1.1.3.12.2 jdolecek "\n[*** iASL: Very long input line, message below refers to column %u ***]",
456 1.1.1.3.12.2 jdolecek Enode->Column);
457 1.1.1.3.12.2 jdolecek }
458 1.1.1.3.12.2 jdolecek
459 1.1.1.3.12.2 jdolecek RActual = fread (&SourceByte, 1, 1, SourceFile);
460 1.1.1.3.12.2 jdolecek if (RActual != 1)
461 1.1.1.3.12.2 jdolecek {
462 1.1.1.3.12.2 jdolecek fprintf (OutputFile,
463 1.1.1.3.12.2 jdolecek "[*** iASL: Read error on source code temp file %s ***]",
464 1.1.1.3.12.2 jdolecek Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
465 1.1.1.3.12.2 jdolecek
466 1.1.1.3.12.2 jdolecek return AE_IO_ERROR;
467 1.1.1.3.12.2 jdolecek }
468 1.1.1.3.12.2 jdolecek *Total += 1;
469 1.1.1.3.12.2 jdolecek }
470 1.1.1.3.12.2 jdolecek
471 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "\n");
472 1.1.1.3.12.2 jdolecek }
473 1.1.1.3.12.2 jdolecek }
474 1.1.1.3.12.2 jdolecek else
475 1.1.1.3.12.2 jdolecek {
476 1.1.1.3.12.2 jdolecek /*
477 1.1.1.3.12.2 jdolecek * Less verbose version of the error message, enabled via the
478 1.1.1.3.12.2 jdolecek * -vi switch. The format is compatible with MS Visual Studio.
479 1.1.1.3.12.2 jdolecek */
480 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "%s", Enode->Filename);
481 1.1.1.3.12.2 jdolecek
482 1.1.1.3.12.2 jdolecek if (Enode->LineNumber)
483 1.1.1.3.12.2 jdolecek {
484 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "(%u) : ",
485 1.1.1.3.12.2 jdolecek Enode->LineNumber);
486 1.1.1.3.12.2 jdolecek }
487 1.1.1.3.12.2 jdolecek }
488 1.1.1.3.12.2 jdolecek
489 1.1.1.3.12.2 jdolecek return AE_OK;
490 1.1.1.3.12.2 jdolecek }
491 1.1.1.3.12.2 jdolecek
492 1.1.1.3.12.2 jdolecek /*******************************************************************************
493 1.1.1.3.12.2 jdolecek *
494 1.1 jruoho * FUNCTION: AePrintException
495 1.1 jruoho *
496 1.1 jruoho * PARAMETERS: FileId - ID of output file
497 1.1 jruoho * Enode - Error node to print
498 1.1 jruoho * Header - Additional text before each message
499 1.1 jruoho *
500 1.1 jruoho * RETURN: None
501 1.1 jruoho *
502 1.1 jruoho * DESCRIPTION: Print the contents of an error node.
503 1.1 jruoho *
504 1.1 jruoho * NOTE: We don't use the FlxxxFile I/O functions here because on error
505 1.1 jruoho * they abort the compiler and call this function! Since we
506 1.1 jruoho * are reporting errors here, we ignore most output errors and
507 1.1 jruoho * just try to get out as much as we can.
508 1.1 jruoho *
509 1.1 jruoho ******************************************************************************/
510 1.1 jruoho
511 1.1 jruoho void
512 1.1 jruoho AePrintException (
513 1.1 jruoho UINT32 FileId,
514 1.1 jruoho ASL_ERROR_MSG *Enode,
515 1.1 jruoho char *Header)
516 1.1 jruoho {
517 1.1 jruoho FILE *OutputFile;
518 1.1.1.2 jruoho BOOLEAN PrematureEOF = FALSE;
519 1.1.1.3.12.1 tls UINT32 Total = 0;
520 1.1.1.3.12.2 jdolecek ACPI_STATUS Status;
521 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG *Child = Enode->SubError;
522 1.1 jruoho
523 1.1 jruoho
524 1.1 jruoho if (Gbl_NoErrors)
525 1.1 jruoho {
526 1.1 jruoho return;
527 1.1 jruoho }
528 1.1 jruoho
529 1.1 jruoho /*
530 1.1 jruoho * Only listing files have a header, and remarks/optimizations
531 1.1 jruoho * are always output
532 1.1 jruoho */
533 1.1 jruoho if (!Header)
534 1.1 jruoho {
535 1.1 jruoho /* Ignore remarks if requested */
536 1.1 jruoho
537 1.1 jruoho switch (Enode->Level)
538 1.1 jruoho {
539 1.1.1.3.12.1 tls case ASL_WARNING:
540 1.1.1.3.12.1 tls case ASL_WARNING2:
541 1.1.1.3.12.1 tls case ASL_WARNING3:
542 1.1.1.3.12.1 tls
543 1.1.1.3.12.1 tls if (!Gbl_DisplayWarnings)
544 1.1.1.3.12.1 tls {
545 1.1.1.3.12.1 tls return;
546 1.1.1.3.12.1 tls }
547 1.1.1.3.12.1 tls break;
548 1.1.1.3.12.1 tls
549 1.1 jruoho case ASL_REMARK:
550 1.1.1.3.12.1 tls
551 1.1 jruoho if (!Gbl_DisplayRemarks)
552 1.1 jruoho {
553 1.1 jruoho return;
554 1.1 jruoho }
555 1.1 jruoho break;
556 1.1 jruoho
557 1.1 jruoho case ASL_OPTIMIZATION:
558 1.1.1.3.12.1 tls
559 1.1 jruoho if (!Gbl_DisplayOptimizations)
560 1.1 jruoho {
561 1.1 jruoho return;
562 1.1 jruoho }
563 1.1 jruoho break;
564 1.1 jruoho
565 1.1 jruoho default:
566 1.1.1.3.12.1 tls
567 1.1 jruoho break;
568 1.1 jruoho }
569 1.1 jruoho }
570 1.1 jruoho
571 1.1.1.3.12.1 tls /* Get the various required file handles */
572 1.1 jruoho
573 1.1 jruoho OutputFile = Gbl_Files[FileId].Handle;
574 1.1.1.2 jruoho
575 1.1 jruoho if (Header)
576 1.1 jruoho {
577 1.1 jruoho fprintf (OutputFile, "%s", Header);
578 1.1 jruoho }
579 1.1 jruoho
580 1.1.1.3.12.2 jdolecek if (!Enode->Filename)
581 1.1 jruoho {
582 1.1.1.3.12.2 jdolecek AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
583 1.1.1.3.12.2 jdolecek return;
584 1.1.1.3.12.2 jdolecek }
585 1.1 jruoho
586 1.1.1.3.12.2 jdolecek Status = AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
587 1.1.1.3.12.2 jdolecek if (ACPI_FAILURE (Status))
588 1.1.1.3.12.2 jdolecek {
589 1.1.1.3.12.2 jdolecek return;
590 1.1 jruoho }
591 1.1 jruoho
592 1.1.1.3.12.2 jdolecek /* If a NULL message ID, just print the raw message */
593 1.1 jruoho
594 1.1 jruoho if (Enode->MessageId == 0)
595 1.1 jruoho {
596 1.1 jruoho fprintf (OutputFile, "%s\n", Enode->Message);
597 1.1.1.3.12.2 jdolecek return;
598 1.1 jruoho }
599 1.1 jruoho
600 1.1.1.3.12.2 jdolecek AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
601 1.1 jruoho
602 1.1.1.3.12.2 jdolecek while (Child)
603 1.1.1.3.12.2 jdolecek {
604 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "\n");
605 1.1.1.3.12.2 jdolecek AePrintSubError (OutputFile, Child);
606 1.1.1.3.12.2 jdolecek Child = Child->SubError;
607 1.1.1.3.12.2 jdolecek }
608 1.1.1.3.12.2 jdolecek }
609 1.1 jruoho
610 1.1.1.3.12.1 tls
611 1.1.1.3.12.2 jdolecek /*******************************************************************************
612 1.1.1.3.12.2 jdolecek *
613 1.1.1.3.12.2 jdolecek * FUNCTION: AePrintSubError
614 1.1.1.3.12.2 jdolecek *
615 1.1.1.3.12.2 jdolecek * PARAMETERS: OutputFile - Output file
616 1.1.1.3.12.2 jdolecek * Enode - Error node to print
617 1.1.1.3.12.2 jdolecek *
618 1.1.1.3.12.2 jdolecek * RETURN: None
619 1.1.1.3.12.2 jdolecek *
620 1.1.1.3.12.2 jdolecek * DESCRIPTION: Print the contents of an error nodes. This function is tailored
621 1.1.1.3.12.2 jdolecek * to print error nodes that are SubErrors within ASL_ERROR_MSG
622 1.1.1.3.12.2 jdolecek *
623 1.1.1.3.12.2 jdolecek ******************************************************************************/
624 1.1 jruoho
625 1.1.1.3.12.2 jdolecek static void
626 1.1.1.3.12.2 jdolecek AePrintSubError (
627 1.1.1.3.12.2 jdolecek FILE *OutputFile,
628 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG *Enode)
629 1.1.1.3.12.2 jdolecek {
630 1.1.1.3.12.2 jdolecek UINT32 Total = 0;
631 1.1.1.3.12.2 jdolecek BOOLEAN PrematureEOF = FALSE;
632 1.1.1.3.12.2 jdolecek const char *MainMessage;
633 1.1 jruoho
634 1.1 jruoho
635 1.1.1.3.12.2 jdolecek MainMessage = AeDecodeMessageId (Enode->MessageId);
636 1.1.1.2 jruoho
637 1.1.1.3.12.2 jdolecek fprintf (OutputFile, " %s%s", MainMessage, "\n ");
638 1.1.1.3.12.2 jdolecek (void) AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
639 1.1.1.3.12.2 jdolecek fprintf (OutputFile, "\n");
640 1.1 jruoho }
641 1.1 jruoho
642 1.1 jruoho
643 1.1 jruoho /*******************************************************************************
644 1.1 jruoho *
645 1.1 jruoho * FUNCTION: AePrintErrorLog
646 1.1 jruoho *
647 1.1 jruoho * PARAMETERS: FileId - Where to output the error log
648 1.1 jruoho *
649 1.1 jruoho * RETURN: None
650 1.1 jruoho *
651 1.1 jruoho * DESCRIPTION: Print the entire contents of the error log
652 1.1 jruoho *
653 1.1 jruoho ******************************************************************************/
654 1.1 jruoho
655 1.1 jruoho void
656 1.1 jruoho AePrintErrorLog (
657 1.1 jruoho UINT32 FileId)
658 1.1 jruoho {
659 1.1 jruoho ASL_ERROR_MSG *Enode = Gbl_ErrorLog;
660 1.1 jruoho
661 1.1 jruoho
662 1.1 jruoho /* Walk the error node list */
663 1.1 jruoho
664 1.1 jruoho while (Enode)
665 1.1 jruoho {
666 1.1 jruoho AePrintException (FileId, Enode, NULL);
667 1.1 jruoho Enode = Enode->Next;
668 1.1 jruoho }
669 1.1 jruoho }
670 1.1 jruoho
671 1.1 jruoho
672 1.1 jruoho /*******************************************************************************
673 1.1 jruoho *
674 1.1.1.3.12.2 jdolecek * FUNCTION: AslInitEnode
675 1.1.1.3.12.1 tls *
676 1.1.1.3.12.2 jdolecek * PARAMETERS: InputEnode - Input Error node to initialize
677 1.1.1.3.12.2 jdolecek * Level - Seriousness (Warning/error, etc.)
678 1.1.1.3.12.1 tls * MessageId - Index into global message buffer
679 1.1.1.3.12.2 jdolecek * CurrentLineNumber - Actual file line number
680 1.1.1.3.12.2 jdolecek * LogicalLineNumber - Cumulative line number
681 1.1.1.3.12.2 jdolecek * LogicalByteOffset - Byte offset in source file
682 1.1.1.3.12.1 tls * Column - Column in current line
683 1.1.1.3.12.1 tls * Filename - source filename
684 1.1.1.3.12.1 tls * ExtraMessage - additional error message
685 1.1.1.3.12.2 jdolecek * SourceLine - Line of error source code
686 1.1.1.3.12.2 jdolecek * SubError - SubError of this InputEnode
687 1.1.1.3.12.1 tls *
688 1.1.1.3.12.1 tls * RETURN: None
689 1.1.1.3.12.1 tls *
690 1.1.1.3.12.2 jdolecek * DESCRIPTION: Initialize an Error node
691 1.1.1.3.12.1 tls *
692 1.1.1.3.12.1 tls ******************************************************************************/
693 1.1.1.3.12.1 tls
694 1.1.1.3.12.2 jdolecek static void AslInitEnode (
695 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG **InputEnode,
696 1.1.1.3.12.1 tls UINT8 Level,
697 1.1.1.3.12.2 jdolecek UINT16 MessageId,
698 1.1.1.3.12.1 tls UINT32 LineNumber,
699 1.1.1.3.12.2 jdolecek UINT32 LogicalLineNumber,
700 1.1.1.3.12.2 jdolecek UINT32 LogicalByteOffset,
701 1.1.1.3.12.1 tls UINT32 Column,
702 1.1.1.3.12.1 tls char *Filename,
703 1.1.1.3.12.2 jdolecek char *ExtraMessage,
704 1.1.1.3.12.2 jdolecek char *SourceLine,
705 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG *SubError)
706 1.1.1.3.12.1 tls {
707 1.1.1.3.12.1 tls ASL_ERROR_MSG *Enode;
708 1.1.1.3.12.1 tls
709 1.1.1.3.12.1 tls
710 1.1.1.3.12.2 jdolecek *InputEnode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
711 1.1.1.3.12.2 jdolecek Enode = *InputEnode;
712 1.1.1.3.12.2 jdolecek Enode->Level = Level;
713 1.1.1.3.12.2 jdolecek Enode->MessageId = MessageId;
714 1.1.1.3.12.2 jdolecek Enode->LineNumber = LineNumber;
715 1.1.1.3.12.2 jdolecek Enode->LogicalLineNumber = LogicalLineNumber;
716 1.1.1.3.12.2 jdolecek Enode->LogicalByteOffset = LogicalByteOffset;
717 1.1.1.3.12.2 jdolecek Enode->Column = Column;
718 1.1.1.3.12.2 jdolecek Enode->SubError = SubError;
719 1.1.1.3.12.2 jdolecek Enode->Message = NULL;
720 1.1.1.3.12.2 jdolecek Enode->SourceLine = NULL;
721 1.1.1.3.12.2 jdolecek Enode->Filename = NULL;
722 1.1.1.3.12.1 tls
723 1.1.1.3.12.1 tls if (ExtraMessage)
724 1.1.1.3.12.1 tls {
725 1.1.1.3.12.1 tls /* Allocate a buffer for the message and a new error node */
726 1.1.1.3.12.1 tls
727 1.1.1.3.12.2 jdolecek Enode->Message = UtLocalCacheCalloc (strlen (ExtraMessage) + 1);
728 1.1.1.3.12.1 tls
729 1.1.1.3.12.1 tls /* Keep a copy of the extra message */
730 1.1.1.3.12.1 tls
731 1.1.1.3.12.2 jdolecek strcpy (Enode->Message, ExtraMessage);
732 1.1.1.3.12.1 tls }
733 1.1.1.3.12.1 tls
734 1.1.1.3.12.2 jdolecek if (SourceLine)
735 1.1.1.3.12.2 jdolecek {
736 1.1.1.3.12.2 jdolecek Enode->SourceLine = UtLocalCalloc (strlen (SourceLine) + 1);
737 1.1.1.3.12.2 jdolecek strcpy (Enode->SourceLine, SourceLine);
738 1.1.1.3.12.2 jdolecek }
739 1.1.1.3.12.1 tls
740 1.1.1.3.12.1 tls
741 1.1.1.3.12.1 tls if (Filename)
742 1.1.1.3.12.1 tls {
743 1.1.1.3.12.2 jdolecek Enode->Filename = Filename;
744 1.1.1.3.12.1 tls Enode->FilenameLength = strlen (Filename);
745 1.1.1.3.12.1 tls if (Enode->FilenameLength < 6)
746 1.1.1.3.12.1 tls {
747 1.1.1.3.12.1 tls Enode->FilenameLength = 6;
748 1.1.1.3.12.1 tls }
749 1.1.1.3.12.1 tls }
750 1.1.1.3.12.2 jdolecek }
751 1.1.1.3.12.1 tls
752 1.1.1.3.12.1 tls
753 1.1.1.3.12.2 jdolecek /*******************************************************************************
754 1.1.1.3.12.2 jdolecek *
755 1.1.1.3.12.2 jdolecek * FUNCTION: AslCommonError2
756 1.1.1.3.12.2 jdolecek *
757 1.1.1.3.12.2 jdolecek * PARAMETERS: Level - Seriousness (Warning/error, etc.)
758 1.1.1.3.12.2 jdolecek * MessageId - Index into global message buffer
759 1.1.1.3.12.2 jdolecek * LineNumber - Actual file line number
760 1.1.1.3.12.2 jdolecek * Column - Column in current line
761 1.1.1.3.12.2 jdolecek * SourceLine - Actual source code line
762 1.1.1.3.12.2 jdolecek * Filename - source filename
763 1.1.1.3.12.2 jdolecek * ExtraMessage - additional error message
764 1.1.1.3.12.2 jdolecek *
765 1.1.1.3.12.2 jdolecek * RETURN: None
766 1.1.1.3.12.2 jdolecek *
767 1.1.1.3.12.2 jdolecek * DESCRIPTION: Create a new error node and add it to the error log
768 1.1.1.3.12.2 jdolecek *
769 1.1.1.3.12.2 jdolecek ******************************************************************************/
770 1.1.1.3.12.1 tls
771 1.1.1.3.12.2 jdolecek void
772 1.1.1.3.12.2 jdolecek AslCommonError2 (
773 1.1.1.3.12.2 jdolecek UINT8 Level,
774 1.1.1.3.12.2 jdolecek UINT16 MessageId,
775 1.1.1.3.12.2 jdolecek UINT32 LineNumber,
776 1.1.1.3.12.2 jdolecek UINT32 Column,
777 1.1.1.3.12.2 jdolecek char *SourceLine,
778 1.1.1.3.12.2 jdolecek char *Filename,
779 1.1.1.3.12.2 jdolecek char *ExtraMessage)
780 1.1.1.3.12.2 jdolecek {
781 1.1.1.3.12.2 jdolecek AslLogNewError (Level, MessageId, LineNumber, LineNumber, 0, Column,
782 1.1.1.3.12.2 jdolecek Filename, ExtraMessage, SourceLine, NULL);
783 1.1.1.3.12.1 tls }
784 1.1.1.3.12.1 tls
785 1.1.1.3.12.1 tls
786 1.1.1.3.12.1 tls /*******************************************************************************
787 1.1.1.3.12.1 tls *
788 1.1 jruoho * FUNCTION: AslCommonError
789 1.1 jruoho *
790 1.1 jruoho * PARAMETERS: Level - Seriousness (Warning/error, etc.)
791 1.1 jruoho * MessageId - Index into global message buffer
792 1.1 jruoho * CurrentLineNumber - Actual file line number
793 1.1 jruoho * LogicalLineNumber - Cumulative line number
794 1.1 jruoho * LogicalByteOffset - Byte offset in source file
795 1.1 jruoho * Column - Column in current line
796 1.1 jruoho * Filename - source filename
797 1.1 jruoho * ExtraMessage - additional error message
798 1.1 jruoho *
799 1.1 jruoho * RETURN: None
800 1.1 jruoho *
801 1.1 jruoho * DESCRIPTION: Create a new error node and add it to the error log
802 1.1 jruoho *
803 1.1 jruoho ******************************************************************************/
804 1.1 jruoho
805 1.1 jruoho void
806 1.1 jruoho AslCommonError (
807 1.1 jruoho UINT8 Level,
808 1.1.1.3.12.2 jdolecek UINT16 MessageId,
809 1.1 jruoho UINT32 CurrentLineNumber,
810 1.1 jruoho UINT32 LogicalLineNumber,
811 1.1 jruoho UINT32 LogicalByteOffset,
812 1.1 jruoho UINT32 Column,
813 1.1 jruoho char *Filename,
814 1.1 jruoho char *ExtraMessage)
815 1.1 jruoho {
816 1.1.1.3.12.2 jdolecek AslLogNewError (Level, MessageId, CurrentLineNumber, LogicalLineNumber,
817 1.1.1.3.12.2 jdolecek LogicalByteOffset, Column, Filename, ExtraMessage,
818 1.1.1.3.12.2 jdolecek NULL, NULL);
819 1.1.1.3.12.2 jdolecek }
820 1.1 jruoho
821 1.1 jruoho
822 1.1.1.3.12.2 jdolecek /*******************************************************************************
823 1.1.1.3.12.2 jdolecek *
824 1.1.1.3.12.2 jdolecek * FUNCTION: AslLogNewError
825 1.1.1.3.12.2 jdolecek *
826 1.1.1.3.12.2 jdolecek * PARAMETERS: Level - Seriousness (Warning/error, etc.)
827 1.1.1.3.12.2 jdolecek * MessageId - Index into global message buffer
828 1.1.1.3.12.2 jdolecek * CurrentLineNumber - Actual file line number
829 1.1.1.3.12.2 jdolecek * LogicalLineNumber - Cumulative line number
830 1.1.1.3.12.2 jdolecek * LogicalByteOffset - Byte offset in source file
831 1.1.1.3.12.2 jdolecek * Column - Column in current line
832 1.1.1.3.12.2 jdolecek * Filename - source filename
833 1.1.1.3.12.2 jdolecek * Message - additional error message
834 1.1.1.3.12.2 jdolecek * SourceLine - Actual line of source code
835 1.1.1.3.12.2 jdolecek * SubError - Sub-error associated with this error
836 1.1.1.3.12.2 jdolecek *
837 1.1.1.3.12.2 jdolecek * RETURN: None
838 1.1.1.3.12.2 jdolecek *
839 1.1.1.3.12.2 jdolecek * DESCRIPTION: Create a new error node and add it to the error log
840 1.1.1.3.12.2 jdolecek *
841 1.1.1.3.12.2 jdolecek ******************************************************************************/
842 1.1.1.3.12.2 jdolecek static void
843 1.1.1.3.12.2 jdolecek AslLogNewError (
844 1.1.1.3.12.2 jdolecek UINT8 Level,
845 1.1.1.3.12.2 jdolecek UINT16 MessageId,
846 1.1.1.3.12.2 jdolecek UINT32 LineNumber,
847 1.1.1.3.12.2 jdolecek UINT32 LogicalLineNumber,
848 1.1.1.3.12.2 jdolecek UINT32 LogicalByteOffset,
849 1.1.1.3.12.2 jdolecek UINT32 Column,
850 1.1.1.3.12.2 jdolecek char *Filename,
851 1.1.1.3.12.2 jdolecek char *Message,
852 1.1.1.3.12.2 jdolecek char *SourceLine,
853 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG *SubError)
854 1.1.1.3.12.2 jdolecek {
855 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG *Enode = NULL;
856 1.1 jruoho
857 1.1 jruoho
858 1.1.1.3.12.2 jdolecek AslInitEnode (&Enode, Level, MessageId, LineNumber, LogicalLineNumber,
859 1.1.1.3.12.2 jdolecek LogicalByteOffset, Column, Filename, Message, SourceLine,
860 1.1.1.3.12.2 jdolecek SubError);
861 1.1 jruoho
862 1.1 jruoho /* Add the new node to the error node list */
863 1.1 jruoho
864 1.1 jruoho AeAddToErrorLog (Enode);
865 1.1 jruoho
866 1.1 jruoho if (Gbl_DebugFlag)
867 1.1 jruoho {
868 1.1 jruoho /* stderr is a file, send error to it immediately */
869 1.1 jruoho
870 1.1 jruoho AePrintException (ASL_FILE_STDERR, Enode, NULL);
871 1.1 jruoho }
872 1.1 jruoho
873 1.1 jruoho Gbl_ExceptionCount[Level]++;
874 1.1 jruoho if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
875 1.1 jruoho {
876 1.1 jruoho printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
877 1.1 jruoho
878 1.1 jruoho Gbl_SourceLine = 0;
879 1.1 jruoho Gbl_NextError = Gbl_ErrorLog;
880 1.1 jruoho CmCleanupAndExit ();
881 1.1 jruoho exit(1);
882 1.1 jruoho }
883 1.1 jruoho
884 1.1 jruoho return;
885 1.1 jruoho }
886 1.1 jruoho
887 1.1.1.3.12.2 jdolecek /*******************************************************************************
888 1.1.1.3.12.2 jdolecek *
889 1.1.1.3.12.2 jdolecek * FUNCTION: AslIsExceptionIgnored
890 1.1.1.3.12.2 jdolecek *
891 1.1.1.3.12.2 jdolecek * PARAMETERS: Level - Seriousness (Warning/error, etc.)
892 1.1.1.3.12.2 jdolecek * MessageId - Index into global message buffer
893 1.1.1.3.12.2 jdolecek *
894 1.1.1.3.12.2 jdolecek * RETURN: BOOLEAN
895 1.1.1.3.12.2 jdolecek *
896 1.1.1.3.12.2 jdolecek * DESCRIPTION: Check if a particular exception is ignored. In this case it
897 1.1.1.3.12.2 jdolecek * means that the exception is (expected or disabled.
898 1.1.1.3.12.2 jdolecek *
899 1.1.1.3.12.2 jdolecek ******************************************************************************/
900 1.1.1.3.12.2 jdolecek
901 1.1.1.3.12.2 jdolecek BOOLEAN
902 1.1.1.3.12.2 jdolecek AslIsExceptionIgnored (
903 1.1.1.3.12.2 jdolecek UINT8 Level,
904 1.1.1.3.12.2 jdolecek UINT16 MessageId)
905 1.1.1.3.12.2 jdolecek {
906 1.1.1.3.12.2 jdolecek BOOLEAN ExceptionIgnored;
907 1.1.1.3.12.2 jdolecek
908 1.1.1.3.12.2 jdolecek
909 1.1.1.3.12.2 jdolecek /* Note: this allows exception to be disabled and expected */
910 1.1.1.3.12.2 jdolecek
911 1.1.1.3.12.2 jdolecek ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
912 1.1.1.3.12.2 jdolecek ExceptionIgnored |= AslIsExceptionExpected (Level, MessageId);
913 1.1.1.3.12.2 jdolecek
914 1.1.1.3.12.2 jdolecek return (Gbl_AllExceptionsDisabled || ExceptionIgnored);
915 1.1.1.3.12.2 jdolecek }
916 1.1.1.3.12.2 jdolecek
917 1.1.1.3.12.2 jdolecek
918 1.1.1.3.12.2 jdolecek /*******************************************************************************
919 1.1.1.3.12.2 jdolecek *
920 1.1.1.3.12.2 jdolecek * FUNCTION: AslCheckExpectException
921 1.1.1.3.12.2 jdolecek *
922 1.1.1.3.12.2 jdolecek * PARAMETERS: none
923 1.1.1.3.12.2 jdolecek *
924 1.1.1.3.12.2 jdolecek * RETURN: none
925 1.1.1.3.12.2 jdolecek *
926 1.1.1.3.12.2 jdolecek * DESCRIPTION: Check the global expected messages table and raise an error
927 1.1.1.3.12.2 jdolecek * for each message that has not been received.
928 1.1.1.3.12.2 jdolecek *
929 1.1.1.3.12.2 jdolecek ******************************************************************************/
930 1.1.1.3.12.2 jdolecek
931 1.1.1.3.12.2 jdolecek void
932 1.1.1.3.12.2 jdolecek AslCheckExpectedExceptions (
933 1.1.1.3.12.2 jdolecek void)
934 1.1.1.3.12.2 jdolecek {
935 1.1.1.3.12.2 jdolecek UINT8 i;
936 1.1.1.3.12.2 jdolecek
937 1.1.1.3.12.2 jdolecek
938 1.1.1.3.12.2 jdolecek for (i = 0; i < Gbl_ExpectedMessagesIndex; ++i)
939 1.1.1.3.12.2 jdolecek {
940 1.1.1.3.12.2 jdolecek if (!Gbl_ExpectedMessages[i].MessageReceived)
941 1.1.1.3.12.2 jdolecek {
942 1.1.1.3.12.2 jdolecek AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
943 1.1.1.3.12.2 jdolecek Gbl_ExpectedMessages[i].MessageIdStr);
944 1.1.1.3.12.2 jdolecek }
945 1.1.1.3.12.2 jdolecek }
946 1.1.1.3.12.2 jdolecek }
947 1.1.1.3.12.2 jdolecek
948 1.1.1.3.12.2 jdolecek
949 1.1.1.3.12.2 jdolecek /*******************************************************************************
950 1.1.1.3.12.2 jdolecek *
951 1.1.1.3.12.2 jdolecek * FUNCTION: AslExpectException
952 1.1.1.3.12.2 jdolecek *
953 1.1.1.3.12.2 jdolecek * PARAMETERS: MessageIdString - ID of excepted exception during compile
954 1.1.1.3.12.2 jdolecek *
955 1.1.1.3.12.2 jdolecek * RETURN: Status
956 1.1.1.3.12.2 jdolecek *
957 1.1.1.3.12.2 jdolecek * DESCRIPTION: Enter a message ID into the global expected messages table
958 1.1.1.3.12.2 jdolecek * If these messages are not raised during the compilation, throw
959 1.1.1.3.12.2 jdolecek * an error.
960 1.1.1.3.12.2 jdolecek *
961 1.1.1.3.12.2 jdolecek ******************************************************************************/
962 1.1.1.3.12.2 jdolecek
963 1.1.1.3.12.2 jdolecek ACPI_STATUS
964 1.1.1.3.12.2 jdolecek AslExpectException (
965 1.1.1.3.12.2 jdolecek char *MessageIdString)
966 1.1.1.3.12.2 jdolecek {
967 1.1.1.3.12.2 jdolecek UINT32 MessageId;
968 1.1.1.3.12.2 jdolecek
969 1.1.1.3.12.2 jdolecek
970 1.1.1.3.12.2 jdolecek /* Convert argument to an integer and validate it */
971 1.1.1.3.12.2 jdolecek
972 1.1.1.3.12.2 jdolecek MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
973 1.1.1.3.12.2 jdolecek
974 1.1.1.3.12.2 jdolecek if (MessageId > 6999)
975 1.1.1.3.12.2 jdolecek {
976 1.1.1.3.12.2 jdolecek printf ("\"%s\" is not a valid warning/remark/erro ID\n",
977 1.1.1.3.12.2 jdolecek MessageIdString);
978 1.1.1.3.12.2 jdolecek return (AE_BAD_PARAMETER);
979 1.1.1.3.12.2 jdolecek }
980 1.1.1.3.12.2 jdolecek
981 1.1.1.3.12.2 jdolecek /* Insert value into the global expected message array */
982 1.1.1.3.12.2 jdolecek
983 1.1.1.3.12.2 jdolecek if (Gbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
984 1.1.1.3.12.2 jdolecek {
985 1.1.1.3.12.2 jdolecek printf ("Too many messages have been registered as expected (max %u)\n",
986 1.1.1.3.12.2 jdolecek ASL_MAX_DISABLED_MESSAGES);
987 1.1.1.3.12.2 jdolecek return (AE_LIMIT);
988 1.1.1.3.12.2 jdolecek }
989 1.1.1.3.12.2 jdolecek
990 1.1.1.3.12.2 jdolecek Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageId = MessageId;
991 1.1.1.3.12.2 jdolecek Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
992 1.1.1.3.12.2 jdolecek Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageReceived = FALSE;
993 1.1.1.3.12.2 jdolecek Gbl_ExpectedMessagesIndex++;
994 1.1.1.3.12.2 jdolecek return (AE_OK);
995 1.1.1.3.12.2 jdolecek }
996 1.1.1.3.12.2 jdolecek
997 1.1 jruoho
998 1.1 jruoho /*******************************************************************************
999 1.1 jruoho *
1000 1.1.1.3.12.1 tls * FUNCTION: AslDisableException
1001 1.1.1.3.12.1 tls *
1002 1.1.1.3.12.1 tls * PARAMETERS: MessageIdString - ID to be disabled
1003 1.1.1.3.12.1 tls *
1004 1.1.1.3.12.1 tls * RETURN: Status
1005 1.1.1.3.12.1 tls *
1006 1.1.1.3.12.1 tls * DESCRIPTION: Enter a message ID into the global disabled messages table
1007 1.1.1.3.12.1 tls *
1008 1.1.1.3.12.1 tls ******************************************************************************/
1009 1.1.1.3.12.1 tls
1010 1.1.1.3.12.1 tls ACPI_STATUS
1011 1.1.1.3.12.1 tls AslDisableException (
1012 1.1.1.3.12.1 tls char *MessageIdString)
1013 1.1.1.3.12.1 tls {
1014 1.1.1.3.12.1 tls UINT32 MessageId;
1015 1.1.1.3.12.1 tls
1016 1.1.1.3.12.1 tls
1017 1.1.1.3.12.1 tls /* Convert argument to an integer and validate it */
1018 1.1.1.3.12.1 tls
1019 1.1.1.3.12.1 tls MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1020 1.1.1.3.12.1 tls
1021 1.1.1.3.12.2 jdolecek if ((MessageId < 2000) || (MessageId > 6999))
1022 1.1.1.3.12.1 tls {
1023 1.1.1.3.12.2 jdolecek printf ("\"%s\" is not a valid warning/remark/error ID\n",
1024 1.1.1.3.12.1 tls MessageIdString);
1025 1.1.1.3.12.1 tls return (AE_BAD_PARAMETER);
1026 1.1.1.3.12.1 tls }
1027 1.1.1.3.12.1 tls
1028 1.1.1.3.12.1 tls /* Insert value into the global disabled message array */
1029 1.1.1.3.12.1 tls
1030 1.1.1.3.12.1 tls if (Gbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES)
1031 1.1.1.3.12.1 tls {
1032 1.1.1.3.12.1 tls printf ("Too many messages have been disabled (max %u)\n",
1033 1.1.1.3.12.1 tls ASL_MAX_DISABLED_MESSAGES);
1034 1.1.1.3.12.1 tls return (AE_LIMIT);
1035 1.1.1.3.12.1 tls }
1036 1.1.1.3.12.1 tls
1037 1.1.1.3.12.1 tls Gbl_DisabledMessages[Gbl_DisabledMessagesIndex] = MessageId;
1038 1.1.1.3.12.1 tls Gbl_DisabledMessagesIndex++;
1039 1.1.1.3.12.1 tls return (AE_OK);
1040 1.1.1.3.12.1 tls }
1041 1.1.1.3.12.1 tls
1042 1.1.1.3.12.1 tls
1043 1.1.1.3.12.1 tls /*******************************************************************************
1044 1.1.1.3.12.1 tls *
1045 1.1.1.3.12.1 tls * FUNCTION: AslIsExceptionDisabled
1046 1.1.1.3.12.1 tls *
1047 1.1.1.3.12.2 jdolecek * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1048 1.1.1.3.12.2 jdolecek * MessageId - Index into global message buffer
1049 1.1.1.3.12.2 jdolecek *
1050 1.1.1.3.12.2 jdolecek * RETURN: TRUE if exception/message should be ignored
1051 1.1.1.3.12.2 jdolecek *
1052 1.1.1.3.12.2 jdolecek * DESCRIPTION: Check if the user has specified options such that this
1053 1.1.1.3.12.2 jdolecek * exception should be ignored
1054 1.1.1.3.12.2 jdolecek *
1055 1.1.1.3.12.2 jdolecek ******************************************************************************/
1056 1.1.1.3.12.2 jdolecek
1057 1.1.1.3.12.2 jdolecek static BOOLEAN
1058 1.1.1.3.12.2 jdolecek AslIsExceptionExpected (
1059 1.1.1.3.12.2 jdolecek UINT8 Level,
1060 1.1.1.3.12.2 jdolecek UINT16 MessageId)
1061 1.1.1.3.12.2 jdolecek {
1062 1.1.1.3.12.2 jdolecek UINT32 EncodedMessageId;
1063 1.1.1.3.12.2 jdolecek UINT32 i;
1064 1.1.1.3.12.2 jdolecek
1065 1.1.1.3.12.2 jdolecek
1066 1.1.1.3.12.2 jdolecek /* Mark this exception as received */
1067 1.1.1.3.12.2 jdolecek
1068 1.1.1.3.12.2 jdolecek EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
1069 1.1.1.3.12.2 jdolecek for (i = 0; i < Gbl_ExpectedMessagesIndex; i++)
1070 1.1.1.3.12.2 jdolecek {
1071 1.1.1.3.12.2 jdolecek /* Simple implementation via fixed array */
1072 1.1.1.3.12.2 jdolecek
1073 1.1.1.3.12.2 jdolecek if (EncodedMessageId == Gbl_ExpectedMessages[i].MessageId)
1074 1.1.1.3.12.2 jdolecek {
1075 1.1.1.3.12.2 jdolecek return (Gbl_ExpectedMessages[i].MessageReceived = TRUE);
1076 1.1.1.3.12.2 jdolecek }
1077 1.1.1.3.12.2 jdolecek }
1078 1.1.1.3.12.2 jdolecek
1079 1.1.1.3.12.2 jdolecek return (FALSE);
1080 1.1.1.3.12.2 jdolecek }
1081 1.1.1.3.12.2 jdolecek
1082 1.1.1.3.12.2 jdolecek
1083 1.1.1.3.12.2 jdolecek /*******************************************************************************
1084 1.1.1.3.12.2 jdolecek *
1085 1.1.1.3.12.2 jdolecek * FUNCTION: AslIsExceptionDisabled
1086 1.1.1.3.12.2 jdolecek *
1087 1.1.1.3.12.1 tls * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1088 1.1.1.3.12.1 tls * MessageId - Index into global message buffer
1089 1.1.1.3.12.1 tls *
1090 1.1.1.3.12.1 tls * RETURN: TRUE if exception/message should be ignored
1091 1.1.1.3.12.1 tls *
1092 1.1.1.3.12.1 tls * DESCRIPTION: Check if the user has specified options such that this
1093 1.1.1.3.12.1 tls * exception should be ignored
1094 1.1.1.3.12.1 tls *
1095 1.1.1.3.12.1 tls ******************************************************************************/
1096 1.1.1.3.12.1 tls
1097 1.1.1.3.12.2 jdolecek static BOOLEAN
1098 1.1.1.3.12.1 tls AslIsExceptionDisabled (
1099 1.1.1.3.12.1 tls UINT8 Level,
1100 1.1.1.3.12.2 jdolecek UINT16 MessageId)
1101 1.1.1.3.12.1 tls {
1102 1.1.1.3.12.1 tls UINT32 EncodedMessageId;
1103 1.1.1.3.12.1 tls UINT32 i;
1104 1.1.1.3.12.1 tls
1105 1.1.1.3.12.1 tls
1106 1.1.1.3.12.1 tls switch (Level)
1107 1.1.1.3.12.1 tls {
1108 1.1.1.3.12.1 tls case ASL_WARNING2:
1109 1.1.1.3.12.1 tls case ASL_WARNING3:
1110 1.1.1.3.12.1 tls
1111 1.1.1.3.12.1 tls /* Check for global disable via -w1/-w2/-w3 options */
1112 1.1.1.3.12.1 tls
1113 1.1.1.3.12.1 tls if (Level > Gbl_WarningLevel)
1114 1.1.1.3.12.1 tls {
1115 1.1.1.3.12.1 tls return (TRUE);
1116 1.1.1.3.12.1 tls }
1117 1.1.1.3.12.1 tls /* Fall through */
1118 1.1.1.3.12.1 tls
1119 1.1.1.3.12.1 tls case ASL_WARNING:
1120 1.1.1.3.12.1 tls case ASL_REMARK:
1121 1.1.1.3.12.2 jdolecek case ASL_ERROR:
1122 1.1.1.3.12.1 tls /*
1123 1.1.1.3.12.2 jdolecek * Ignore this error/warning/remark if it has been disabled by
1124 1.1.1.3.12.1 tls * the user (-vw option)
1125 1.1.1.3.12.1 tls */
1126 1.1.1.3.12.2 jdolecek EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
1127 1.1.1.3.12.1 tls for (i = 0; i < Gbl_DisabledMessagesIndex; i++)
1128 1.1.1.3.12.1 tls {
1129 1.1.1.3.12.1 tls /* Simple implementation via fixed array */
1130 1.1.1.3.12.1 tls
1131 1.1.1.3.12.1 tls if (EncodedMessageId == Gbl_DisabledMessages[i])
1132 1.1.1.3.12.1 tls {
1133 1.1.1.3.12.1 tls return (TRUE);
1134 1.1.1.3.12.1 tls }
1135 1.1.1.3.12.1 tls }
1136 1.1.1.3.12.1 tls break;
1137 1.1.1.3.12.1 tls
1138 1.1.1.3.12.1 tls default:
1139 1.1.1.3.12.1 tls break;
1140 1.1.1.3.12.1 tls }
1141 1.1.1.3.12.1 tls
1142 1.1.1.3.12.1 tls return (FALSE);
1143 1.1.1.3.12.1 tls }
1144 1.1.1.3.12.1 tls
1145 1.1.1.3.12.1 tls
1146 1.1.1.3.12.1 tls /*******************************************************************************
1147 1.1.1.3.12.1 tls *
1148 1.1.1.3.12.2 jdolecek * FUNCTION: AslDualParseOpError
1149 1.1.1.3.12.2 jdolecek *
1150 1.1.1.3.12.2 jdolecek * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1151 1.1.1.3.12.2 jdolecek * MainMsgId - Index into global message buffer
1152 1.1.1.3.12.2 jdolecek * MainOp - Parse node where error happened
1153 1.1.1.3.12.2 jdolecek * MainMsg - Message pertaining to the MainOp
1154 1.1.1.3.12.2 jdolecek * SubMsgId - Index into global message buffer
1155 1.1.1.3.12.2 jdolecek * SubOp - Additional parse node for better message
1156 1.1.1.3.12.2 jdolecek * SubMsg - Message pertainint to SubOp
1157 1.1.1.3.12.2 jdolecek *
1158 1.1.1.3.12.2 jdolecek *
1159 1.1.1.3.12.2 jdolecek * RETURN: None
1160 1.1.1.3.12.2 jdolecek *
1161 1.1.1.3.12.2 jdolecek * DESCRIPTION: Main error reporting routine for the ASL compiler for error
1162 1.1.1.3.12.2 jdolecek * messages that point to multiple parse objects.
1163 1.1.1.3.12.2 jdolecek *
1164 1.1.1.3.12.2 jdolecek ******************************************************************************/
1165 1.1.1.3.12.2 jdolecek
1166 1.1.1.3.12.2 jdolecek void
1167 1.1.1.3.12.2 jdolecek AslDualParseOpError (
1168 1.1.1.3.12.2 jdolecek UINT8 Level,
1169 1.1.1.3.12.2 jdolecek UINT16 MainMsgId,
1170 1.1.1.3.12.2 jdolecek ACPI_PARSE_OBJECT *MainOp,
1171 1.1.1.3.12.2 jdolecek char *MainMsg,
1172 1.1.1.3.12.2 jdolecek UINT16 SubMsgId,
1173 1.1.1.3.12.2 jdolecek ACPI_PARSE_OBJECT *SubOp,
1174 1.1.1.3.12.2 jdolecek char *SubMsg)
1175 1.1.1.3.12.2 jdolecek {
1176 1.1.1.3.12.2 jdolecek ASL_ERROR_MSG *SubEnode = NULL;
1177 1.1.1.3.12.2 jdolecek
1178 1.1.1.3.12.2 jdolecek
1179 1.1.1.3.12.2 jdolecek /* Check if user wants to ignore this exception */
1180 1.1.1.3.12.2 jdolecek
1181 1.1.1.3.12.2 jdolecek if (AslIsExceptionIgnored (Level, MainMsgId) || !MainOp)
1182 1.1.1.3.12.2 jdolecek {
1183 1.1.1.3.12.2 jdolecek return;
1184 1.1.1.3.12.2 jdolecek }
1185 1.1.1.3.12.2 jdolecek
1186 1.1.1.3.12.2 jdolecek if (SubOp)
1187 1.1.1.3.12.2 jdolecek {
1188 1.1.1.3.12.2 jdolecek AslInitEnode (&SubEnode, Level, SubMsgId, SubOp->Asl.LineNumber,
1189 1.1.1.3.12.2 jdolecek SubOp->Asl.LogicalLineNumber, SubOp->Asl.LogicalByteOffset,
1190 1.1.1.3.12.2 jdolecek SubOp->Asl.Column, SubOp->Asl.Filename, SubMsg,
1191 1.1.1.3.12.2 jdolecek NULL, NULL);
1192 1.1.1.3.12.2 jdolecek }
1193 1.1.1.3.12.2 jdolecek
1194 1.1.1.3.12.2 jdolecek AslLogNewError (Level, MainMsgId, MainOp->Asl.LineNumber,
1195 1.1.1.3.12.2 jdolecek MainOp->Asl.LogicalLineNumber, MainOp->Asl.LogicalByteOffset,
1196 1.1.1.3.12.2 jdolecek MainOp->Asl.Column, MainOp->Asl.Filename, MainMsg,
1197 1.1.1.3.12.2 jdolecek NULL, SubEnode);
1198 1.1.1.3.12.2 jdolecek }
1199 1.1.1.3.12.2 jdolecek
1200 1.1.1.3.12.2 jdolecek
1201 1.1.1.3.12.2 jdolecek /*******************************************************************************
1202 1.1.1.3.12.2 jdolecek *
1203 1.1 jruoho * FUNCTION: AslError
1204 1.1 jruoho *
1205 1.1 jruoho * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1206 1.1 jruoho * MessageId - Index into global message buffer
1207 1.1 jruoho * Op - Parse node where error happened
1208 1.1 jruoho * ExtraMessage - additional error message
1209 1.1 jruoho *
1210 1.1 jruoho * RETURN: None
1211 1.1 jruoho *
1212 1.1 jruoho * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
1213 1.1 jruoho * except the parser.)
1214 1.1 jruoho *
1215 1.1 jruoho ******************************************************************************/
1216 1.1 jruoho
1217 1.1 jruoho void
1218 1.1 jruoho AslError (
1219 1.1 jruoho UINT8 Level,
1220 1.1.1.3.12.2 jdolecek UINT16 MessageId,
1221 1.1 jruoho ACPI_PARSE_OBJECT *Op,
1222 1.1 jruoho char *ExtraMessage)
1223 1.1 jruoho {
1224 1.1 jruoho if (Op)
1225 1.1 jruoho {
1226 1.1 jruoho AslCommonError (Level, MessageId, Op->Asl.LineNumber,
1227 1.1.1.3.12.1 tls Op->Asl.LogicalLineNumber,
1228 1.1.1.3.12.1 tls Op->Asl.LogicalByteOffset,
1229 1.1.1.3.12.1 tls Op->Asl.Column,
1230 1.1.1.3.12.1 tls Op->Asl.Filename, ExtraMessage);
1231 1.1 jruoho }
1232 1.1 jruoho else
1233 1.1 jruoho {
1234 1.1 jruoho AslCommonError (Level, MessageId, 0,
1235 1.1.1.3.12.1 tls 0, 0, 0, NULL, ExtraMessage);
1236 1.1 jruoho }
1237 1.1 jruoho }
1238 1.1 jruoho
1239 1.1 jruoho
1240 1.1 jruoho /*******************************************************************************
1241 1.1 jruoho *
1242 1.1 jruoho * FUNCTION: AslCoreSubsystemError
1243 1.1 jruoho *
1244 1.1 jruoho * PARAMETERS: Op - Parse node where error happened
1245 1.1.1.3.12.2 jdolecek * Status - The ACPICA Exception
1246 1.1 jruoho * ExtraMessage - additional error message
1247 1.1 jruoho * Abort - TRUE -> Abort compilation
1248 1.1 jruoho *
1249 1.1 jruoho * RETURN: None
1250 1.1 jruoho *
1251 1.1.1.3.12.2 jdolecek * DESCRIPTION: Error reporting routine for exceptions returned by the ACPICA
1252 1.1.1.3.12.2 jdolecek * core subsystem.
1253 1.1 jruoho *
1254 1.1 jruoho ******************************************************************************/
1255 1.1 jruoho
1256 1.1 jruoho void
1257 1.1 jruoho AslCoreSubsystemError (
1258 1.1 jruoho ACPI_PARSE_OBJECT *Op,
1259 1.1 jruoho ACPI_STATUS Status,
1260 1.1 jruoho char *ExtraMessage,
1261 1.1 jruoho BOOLEAN Abort)
1262 1.1 jruoho {
1263 1.1 jruoho
1264 1.1.1.3.12.1 tls snprintf (MsgBuffer, sizeof(MsgBuffer), "%s %s", AcpiFormatException (Status), ExtraMessage);
1265 1.1 jruoho
1266 1.1 jruoho if (Op)
1267 1.1 jruoho {
1268 1.1.1.3.12.2 jdolecek AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
1269 1.1.1.3.12.2 jdolecek Op->Asl.LineNumber,
1270 1.1.1.3.12.2 jdolecek Op->Asl.LogicalLineNumber,
1271 1.1.1.3.12.2 jdolecek Op->Asl.LogicalByteOffset,
1272 1.1.1.3.12.2 jdolecek Op->Asl.Column,
1273 1.1.1.3.12.2 jdolecek Op->Asl.Filename, MsgBuffer);
1274 1.1 jruoho }
1275 1.1 jruoho else
1276 1.1 jruoho {
1277 1.1.1.3.12.2 jdolecek AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
1278 1.1.1.3.12.2 jdolecek 0, 0, 0, 0, NULL, MsgBuffer);
1279 1.1 jruoho }
1280 1.1 jruoho
1281 1.1 jruoho if (Abort)
1282 1.1 jruoho {
1283 1.1 jruoho AslAbort ();
1284 1.1 jruoho }
1285 1.1 jruoho }
1286 1.1 jruoho
1287 1.1 jruoho
1288 1.1 jruoho /*******************************************************************************
1289 1.1 jruoho *
1290 1.1 jruoho * FUNCTION: AslCompilererror
1291 1.1 jruoho *
1292 1.1 jruoho * PARAMETERS: CompilerMessage - Error message from the parser
1293 1.1 jruoho *
1294 1.1 jruoho * RETURN: Status (0 for now)
1295 1.1 jruoho *
1296 1.1 jruoho * DESCRIPTION: Report an error situation discovered in a production
1297 1.1 jruoho * NOTE: don't change the name of this function, it is called
1298 1.1 jruoho * from the auto-generated parser.
1299 1.1 jruoho *
1300 1.1 jruoho ******************************************************************************/
1301 1.1 jruoho
1302 1.1 jruoho int
1303 1.1 jruoho AslCompilererror (
1304 1.1.1.3 jruoho const char *CompilerMessage)
1305 1.1 jruoho {
1306 1.1 jruoho
1307 1.1.1.3.12.2 jdolecek Gbl_SyntaxError++;
1308 1.1.1.3.12.2 jdolecek
1309 1.1 jruoho AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber,
1310 1.1.1.3 jruoho Gbl_LogicalLineNumber, Gbl_CurrentLineOffset,
1311 1.1.1.3 jruoho Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename,
1312 1.1.1.3 jruoho ACPI_CAST_PTR (char, CompilerMessage));
1313 1.1 jruoho
1314 1.1.1.3.12.1 tls return (0);
1315 1.1 jruoho }
1316