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