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