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