aslerror.c revision 1.11 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.10 christos * Copyright (C) 2000 - 2018, 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.11 christos SourceFile = AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
370 1.2 christos if (!SourceFile)
371 1.2 christos {
372 1.11 christos SourceFile = AslGbl_Files[ASL_FILE_INPUT].Handle;
373 1.2 christos }
374 1.2 christos
375 1.2 christos if (SourceFile)
376 1.2 christos {
377 1.2 christos /* Determine if the error occurred at source file EOF */
378 1.2 christos
379 1.2 christos fseek (SourceFile, 0, SEEK_END);
380 1.2 christos FileSize = ftell (SourceFile);
381 1.2 christos
382 1.2 christos if ((long) Enode->LogicalByteOffset >= FileSize)
383 1.2 christos {
384 1.9 christos *PrematureEOF = TRUE;
385 1.2 christos }
386 1.2 christos }
387 1.9 christos else
388 1.9 christos {
389 1.9 christos fprintf (OutputFile,
390 1.9 christos "[*** iASL: Source File Does not exist ***]\n");
391 1.9 christos return AE_IO_ERROR;
392 1.9 christos }
393 1.1 jruoho }
394 1.1 jruoho
395 1.1 jruoho /* Print filename and line number if present and valid */
396 1.1 jruoho
397 1.11 christos if (AslGbl_VerboseErrors)
398 1.1 jruoho {
399 1.9 christos fprintf (OutputFile, "%-8s", Enode->Filename);
400 1.9 christos
401 1.9 christos if (Enode->SourceLine && Enode->LineNumber)
402 1.9 christos {
403 1.9 christos fprintf (OutputFile, " %6u: %s",
404 1.9 christos Enode->LineNumber, Enode->SourceLine);
405 1.9 christos }
406 1.9 christos else if (Enode->LineNumber)
407 1.1 jruoho {
408 1.9 christos fprintf (OutputFile, " %6u: ", Enode->LineNumber);
409 1.9 christos
410 1.9 christos /*
411 1.9 christos * If not at EOF, get the corresponding source code line
412 1.9 christos * and display it. Don't attempt this if we have a
413 1.9 christos * premature EOF condition.
414 1.9 christos */
415 1.9 christos if (*PrematureEOF)
416 1.9 christos {
417 1.9 christos fprintf (OutputFile, "\n");
418 1.9 christos return AE_OK;
419 1.9 christos }
420 1.9 christos /*
421 1.9 christos * Seek to the offset in the combined source file,
422 1.9 christos * read the source line, and write it to the output.
423 1.9 christos */
424 1.9 christos Actual = fseek (SourceFile,
425 1.9 christos (long) Enode->LogicalByteOffset, (int) SEEK_SET);
426 1.9 christos if (Actual)
427 1.9 christos {
428 1.9 christos fprintf (OutputFile,
429 1.9 christos "[*** iASL: Seek error on source code temp file %s ***]",
430 1.11 christos AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
431 1.9 christos
432 1.9 christos fprintf (OutputFile, "\n");
433 1.9 christos return AE_OK;
434 1.9 christos }
435 1.9 christos RActual = fread (&SourceByte, 1, 1, SourceFile);
436 1.9 christos if (RActual != 1)
437 1.9 christos {
438 1.9 christos fprintf (OutputFile,
439 1.9 christos "[*** iASL: Read error on source code temp file %s ***]",
440 1.11 christos AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
441 1.9 christos return AE_IO_ERROR;
442 1.9 christos }
443 1.9 christos /* Read/write the source line, up to the maximum line length */
444 1.1 jruoho
445 1.9 christos while (RActual && SourceByte && (SourceByte != '\n'))
446 1.1 jruoho {
447 1.9 christos if (*Total < 256)
448 1.1 jruoho {
449 1.9 christos /* After the max line length, we will just read the line, no write */
450 1.9 christos
451 1.9 christos if (fwrite (&SourceByte, 1, 1, OutputFile) != 1)
452 1.9 christos {
453 1.9 christos printf ("[*** iASL: Write error on output file ***]\n");
454 1.9 christos return AE_IO_ERROR;
455 1.9 christos }
456 1.1 jruoho }
457 1.9 christos else if (*Total == 256)
458 1.1 jruoho {
459 1.9 christos fprintf (OutputFile,
460 1.9 christos "\n[*** iASL: Very long input line, message below refers to column %u ***]",
461 1.9 christos Enode->Column);
462 1.9 christos }
463 1.2 christos
464 1.9 christos RActual = fread (&SourceByte, 1, 1, SourceFile);
465 1.9 christos if (RActual != 1)
466 1.9 christos {
467 1.9 christos fprintf (OutputFile,
468 1.9 christos "[*** iASL: Read error on source code temp file %s ***]",
469 1.11 christos AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
470 1.1 jruoho
471 1.9 christos return AE_IO_ERROR;
472 1.1 jruoho }
473 1.9 christos *Total += 1;
474 1.1 jruoho }
475 1.1 jruoho
476 1.9 christos fprintf (OutputFile, "\n");
477 1.1 jruoho }
478 1.1 jruoho }
479 1.9 christos else
480 1.9 christos {
481 1.9 christos /*
482 1.9 christos * Less verbose version of the error message, enabled via the
483 1.9 christos * -vi switch. The format is compatible with MS Visual Studio.
484 1.9 christos */
485 1.9 christos fprintf (OutputFile, "%s", Enode->Filename);
486 1.1 jruoho
487 1.9 christos if (Enode->LineNumber)
488 1.9 christos {
489 1.9 christos fprintf (OutputFile, "(%u) : ",
490 1.9 christos Enode->LineNumber);
491 1.9 christos }
492 1.3 christos }
493 1.3 christos
494 1.9 christos return AE_OK;
495 1.9 christos }
496 1.3 christos
497 1.9 christos /*******************************************************************************
498 1.9 christos *
499 1.9 christos * FUNCTION: AePrintException
500 1.9 christos *
501 1.9 christos * PARAMETERS: FileId - ID of output file
502 1.9 christos * Enode - Error node to print
503 1.9 christos * Header - Additional text before each message
504 1.9 christos *
505 1.9 christos * RETURN: None
506 1.9 christos *
507 1.9 christos * DESCRIPTION: Print the contents of an error node.
508 1.9 christos *
509 1.9 christos * NOTE: We don't use the FlxxxFile I/O functions here because on error
510 1.9 christos * they abort the compiler and call this function! Since we
511 1.9 christos * are reporting errors here, we ignore most output errors and
512 1.9 christos * just try to get out as much as we can.
513 1.9 christos *
514 1.9 christos ******************************************************************************/
515 1.3 christos
516 1.9 christos void
517 1.9 christos AePrintException (
518 1.9 christos UINT32 FileId,
519 1.9 christos ASL_ERROR_MSG *Enode,
520 1.9 christos char *Header)
521 1.9 christos {
522 1.9 christos FILE *OutputFile;
523 1.9 christos BOOLEAN PrematureEOF = FALSE;
524 1.9 christos UINT32 Total = 0;
525 1.9 christos ACPI_STATUS Status;
526 1.9 christos ASL_ERROR_MSG *Child = Enode->SubError;
527 1.3 christos
528 1.3 christos
529 1.11 christos if (AslGbl_NoErrors)
530 1.3 christos {
531 1.3 christos return;
532 1.1 jruoho }
533 1.3 christos
534 1.9 christos /*
535 1.9 christos * Only listing files have a header, and remarks/optimizations
536 1.9 christos * are always output
537 1.9 christos */
538 1.9 christos if (!Header)
539 1.1 jruoho {
540 1.9 christos /* Ignore remarks if requested */
541 1.1 jruoho
542 1.9 christos switch (Enode->Level)
543 1.2 christos {
544 1.9 christos case ASL_WARNING:
545 1.9 christos case ASL_WARNING2:
546 1.9 christos case ASL_WARNING3:
547 1.3 christos
548 1.11 christos if (!AslGbl_DisplayWarnings)
549 1.9 christos {
550 1.9 christos return;
551 1.9 christos }
552 1.9 christos break;
553 1.3 christos
554 1.9 christos case ASL_REMARK:
555 1.2 christos
556 1.11 christos if (!AslGbl_DisplayRemarks)
557 1.2 christos {
558 1.9 christos return;
559 1.1 jruoho }
560 1.9 christos break;
561 1.9 christos
562 1.9 christos case ASL_OPTIMIZATION:
563 1.9 christos
564 1.11 christos if (!AslGbl_DisplayOptimizations)
565 1.1 jruoho {
566 1.9 christos return;
567 1.1 jruoho }
568 1.9 christos break;
569 1.9 christos
570 1.9 christos default:
571 1.9 christos
572 1.9 christos break;
573 1.3 christos }
574 1.3 christos }
575 1.9 christos
576 1.9 christos /* Get the various required file handles */
577 1.9 christos
578 1.11 christos OutputFile = AslGbl_Files[FileId].Handle;
579 1.9 christos
580 1.9 christos if (Header)
581 1.3 christos {
582 1.9 christos fprintf (OutputFile, "%s", Header);
583 1.3 christos }
584 1.1 jruoho
585 1.9 christos if (!Enode->Filename)
586 1.9 christos {
587 1.9 christos AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
588 1.9 christos return;
589 1.9 christos }
590 1.1 jruoho
591 1.9 christos Status = AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
592 1.9 christos if (ACPI_FAILURE (Status))
593 1.3 christos {
594 1.9 christos return;
595 1.3 christos }
596 1.1 jruoho
597 1.9 christos /* If a NULL message ID, just print the raw message */
598 1.9 christos
599 1.9 christos if (Enode->MessageId == 0)
600 1.3 christos {
601 1.9 christos fprintf (OutputFile, "%s\n", Enode->Message);
602 1.9 christos return;
603 1.3 christos }
604 1.2 christos
605 1.9 christos AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total);
606 1.9 christos
607 1.9 christos while (Child)
608 1.3 christos {
609 1.3 christos fprintf (OutputFile, "\n");
610 1.9 christos AePrintSubError (OutputFile, Child);
611 1.9 christos Child = Child->SubError;
612 1.1 jruoho }
613 1.1 jruoho }
614 1.1 jruoho
615 1.1 jruoho
616 1.1 jruoho /*******************************************************************************
617 1.1 jruoho *
618 1.9 christos * FUNCTION: AePrintSubError
619 1.9 christos *
620 1.9 christos * PARAMETERS: OutputFile - Output file
621 1.9 christos * Enode - Error node to print
622 1.9 christos *
623 1.9 christos * RETURN: None
624 1.9 christos *
625 1.9 christos * DESCRIPTION: Print the contents of an error nodes. This function is tailored
626 1.9 christos * to print error nodes that are SubErrors within ASL_ERROR_MSG
627 1.9 christos *
628 1.9 christos ******************************************************************************/
629 1.9 christos
630 1.9 christos static void
631 1.9 christos AePrintSubError (
632 1.9 christos FILE *OutputFile,
633 1.9 christos ASL_ERROR_MSG *Enode)
634 1.9 christos {
635 1.9 christos UINT32 Total = 0;
636 1.9 christos BOOLEAN PrematureEOF = FALSE;
637 1.9 christos const char *MainMessage;
638 1.9 christos
639 1.9 christos
640 1.9 christos MainMessage = AeDecodeMessageId (Enode->MessageId);
641 1.9 christos
642 1.9 christos fprintf (OutputFile, " %s%s", MainMessage, "\n ");
643 1.9 christos (void) AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total);
644 1.9 christos fprintf (OutputFile, "\n");
645 1.9 christos }
646 1.9 christos
647 1.9 christos
648 1.9 christos /*******************************************************************************
649 1.9 christos *
650 1.1 jruoho * FUNCTION: AePrintErrorLog
651 1.1 jruoho *
652 1.1 jruoho * PARAMETERS: FileId - Where to output the error log
653 1.1 jruoho *
654 1.1 jruoho * RETURN: None
655 1.1 jruoho *
656 1.1 jruoho * DESCRIPTION: Print the entire contents of the error log
657 1.1 jruoho *
658 1.1 jruoho ******************************************************************************/
659 1.1 jruoho
660 1.1 jruoho void
661 1.1 jruoho AePrintErrorLog (
662 1.1 jruoho UINT32 FileId)
663 1.1 jruoho {
664 1.11 christos ASL_ERROR_MSG *Enode = AslGbl_ErrorLog;
665 1.1 jruoho
666 1.1 jruoho
667 1.1 jruoho /* Walk the error node list */
668 1.1 jruoho
669 1.1 jruoho while (Enode)
670 1.1 jruoho {
671 1.1 jruoho AePrintException (FileId, Enode, NULL);
672 1.1 jruoho Enode = Enode->Next;
673 1.1 jruoho }
674 1.1 jruoho }
675 1.1 jruoho
676 1.1 jruoho
677 1.1 jruoho /*******************************************************************************
678 1.1 jruoho *
679 1.9 christos * FUNCTION: AslInitEnode
680 1.2 christos *
681 1.9 christos * PARAMETERS: InputEnode - Input Error node to initialize
682 1.9 christos * Level - Seriousness (Warning/error, etc.)
683 1.2 christos * MessageId - Index into global message buffer
684 1.9 christos * CurrentLineNumber - Actual file line number
685 1.9 christos * LogicalLineNumber - Cumulative line number
686 1.9 christos * LogicalByteOffset - Byte offset in source file
687 1.2 christos * Column - Column in current line
688 1.2 christos * Filename - source filename
689 1.2 christos * ExtraMessage - additional error message
690 1.9 christos * SourceLine - Line of error source code
691 1.9 christos * SubError - SubError of this InputEnode
692 1.2 christos *
693 1.2 christos * RETURN: None
694 1.2 christos *
695 1.9 christos * DESCRIPTION: Initialize an Error node
696 1.2 christos *
697 1.2 christos ******************************************************************************/
698 1.2 christos
699 1.9 christos static void AslInitEnode (
700 1.9 christos ASL_ERROR_MSG **InputEnode,
701 1.2 christos UINT8 Level,
702 1.3 christos UINT16 MessageId,
703 1.2 christos UINT32 LineNumber,
704 1.9 christos UINT32 LogicalLineNumber,
705 1.9 christos UINT32 LogicalByteOffset,
706 1.2 christos UINT32 Column,
707 1.9 christos char *Filename,
708 1.9 christos char *ExtraMessage,
709 1.2 christos char *SourceLine,
710 1.9 christos ASL_ERROR_MSG *SubError)
711 1.2 christos {
712 1.2 christos ASL_ERROR_MSG *Enode;
713 1.2 christos
714 1.2 christos
715 1.9 christos *InputEnode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
716 1.9 christos Enode = *InputEnode;
717 1.9 christos Enode->Level = Level;
718 1.9 christos Enode->MessageId = MessageId;
719 1.9 christos Enode->LineNumber = LineNumber;
720 1.9 christos Enode->LogicalLineNumber = LogicalLineNumber;
721 1.9 christos Enode->LogicalByteOffset = LogicalByteOffset;
722 1.9 christos Enode->Column = Column;
723 1.9 christos Enode->SubError = SubError;
724 1.9 christos Enode->Message = NULL;
725 1.9 christos Enode->SourceLine = NULL;
726 1.9 christos Enode->Filename = NULL;
727 1.2 christos
728 1.2 christos if (ExtraMessage)
729 1.2 christos {
730 1.2 christos /* Allocate a buffer for the message and a new error node */
731 1.2 christos
732 1.9 christos Enode->Message = UtLocalCacheCalloc (strlen (ExtraMessage) + 1);
733 1.2 christos
734 1.2 christos /* Keep a copy of the extra message */
735 1.2 christos
736 1.9 christos strcpy (Enode->Message, ExtraMessage);
737 1.2 christos }
738 1.2 christos
739 1.9 christos if (SourceLine)
740 1.9 christos {
741 1.9 christos Enode->SourceLine = UtLocalCalloc (strlen (SourceLine) + 1);
742 1.9 christos strcpy (Enode->SourceLine, SourceLine);
743 1.9 christos }
744 1.2 christos
745 1.2 christos
746 1.2 christos if (Filename)
747 1.2 christos {
748 1.3 christos Enode->Filename = Filename;
749 1.2 christos Enode->FilenameLength = strlen (Filename);
750 1.2 christos if (Enode->FilenameLength < 6)
751 1.2 christos {
752 1.2 christos Enode->FilenameLength = 6;
753 1.2 christos }
754 1.2 christos }
755 1.9 christos }
756 1.2 christos
757 1.2 christos
758 1.9 christos /*******************************************************************************
759 1.9 christos *
760 1.9 christos * FUNCTION: AslCommonError2
761 1.9 christos *
762 1.9 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
763 1.9 christos * MessageId - Index into global message buffer
764 1.9 christos * LineNumber - Actual file line number
765 1.9 christos * Column - Column in current line
766 1.9 christos * SourceLine - Actual source code line
767 1.9 christos * Filename - source filename
768 1.9 christos * ExtraMessage - additional error message
769 1.9 christos *
770 1.9 christos * RETURN: None
771 1.9 christos *
772 1.9 christos * DESCRIPTION: Create a new error node and add it to the error log
773 1.9 christos *
774 1.9 christos ******************************************************************************/
775 1.2 christos
776 1.9 christos void
777 1.9 christos AslCommonError2 (
778 1.9 christos UINT8 Level,
779 1.9 christos UINT16 MessageId,
780 1.9 christos UINT32 LineNumber,
781 1.9 christos UINT32 Column,
782 1.9 christos char *SourceLine,
783 1.9 christos char *Filename,
784 1.9 christos char *ExtraMessage)
785 1.9 christos {
786 1.9 christos AslLogNewError (Level, MessageId, LineNumber, LineNumber, 0, Column,
787 1.9 christos Filename, ExtraMessage, SourceLine, NULL);
788 1.2 christos }
789 1.2 christos
790 1.2 christos
791 1.2 christos /*******************************************************************************
792 1.2 christos *
793 1.1 jruoho * FUNCTION: AslCommonError
794 1.1 jruoho *
795 1.1 jruoho * PARAMETERS: Level - Seriousness (Warning/error, etc.)
796 1.1 jruoho * MessageId - Index into global message buffer
797 1.1 jruoho * CurrentLineNumber - Actual file line number
798 1.1 jruoho * LogicalLineNumber - Cumulative line number
799 1.1 jruoho * LogicalByteOffset - Byte offset in source file
800 1.1 jruoho * Column - Column in current line
801 1.1 jruoho * Filename - source filename
802 1.1 jruoho * ExtraMessage - additional error message
803 1.1 jruoho *
804 1.1 jruoho * RETURN: None
805 1.1 jruoho *
806 1.1 jruoho * DESCRIPTION: Create a new error node and add it to the error log
807 1.1 jruoho *
808 1.1 jruoho ******************************************************************************/
809 1.1 jruoho
810 1.1 jruoho void
811 1.1 jruoho AslCommonError (
812 1.1 jruoho UINT8 Level,
813 1.3 christos UINT16 MessageId,
814 1.1 jruoho UINT32 CurrentLineNumber,
815 1.1 jruoho UINT32 LogicalLineNumber,
816 1.1 jruoho UINT32 LogicalByteOffset,
817 1.1 jruoho UINT32 Column,
818 1.1 jruoho char *Filename,
819 1.1 jruoho char *ExtraMessage)
820 1.1 jruoho {
821 1.10 christos /* Check if user wants to ignore this exception */
822 1.10 christos
823 1.10 christos if (AslIsExceptionIgnored (Level, MessageId))
824 1.10 christos {
825 1.10 christos return;
826 1.10 christos }
827 1.10 christos
828 1.9 christos AslLogNewError (Level, MessageId, CurrentLineNumber, LogicalLineNumber,
829 1.9 christos LogicalByteOffset, Column, Filename, ExtraMessage,
830 1.9 christos NULL, NULL);
831 1.9 christos }
832 1.1 jruoho
833 1.1 jruoho
834 1.9 christos /*******************************************************************************
835 1.9 christos *
836 1.9 christos * FUNCTION: AslLogNewError
837 1.9 christos *
838 1.9 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
839 1.9 christos * MessageId - Index into global message buffer
840 1.9 christos * CurrentLineNumber - Actual file line number
841 1.9 christos * LogicalLineNumber - Cumulative line number
842 1.9 christos * LogicalByteOffset - Byte offset in source file
843 1.9 christos * Column - Column in current line
844 1.9 christos * Filename - source filename
845 1.9 christos * Message - additional error message
846 1.9 christos * SourceLine - Actual line of source code
847 1.9 christos * SubError - Sub-error associated with this error
848 1.9 christos *
849 1.9 christos * RETURN: None
850 1.9 christos *
851 1.9 christos * DESCRIPTION: Create a new error node and add it to the error log
852 1.9 christos *
853 1.9 christos ******************************************************************************/
854 1.9 christos static void
855 1.9 christos AslLogNewError (
856 1.9 christos UINT8 Level,
857 1.9 christos UINT16 MessageId,
858 1.9 christos UINT32 LineNumber,
859 1.9 christos UINT32 LogicalLineNumber,
860 1.9 christos UINT32 LogicalByteOffset,
861 1.9 christos UINT32 Column,
862 1.9 christos char *Filename,
863 1.9 christos char *Message,
864 1.9 christos char *SourceLine,
865 1.9 christos ASL_ERROR_MSG *SubError)
866 1.9 christos {
867 1.9 christos ASL_ERROR_MSG *Enode = NULL;
868 1.11 christos UINT8 ModifiedLevel = GetModifiedLevel (Level, MessageId);
869 1.1 jruoho
870 1.1 jruoho
871 1.11 christos AslInitEnode (&Enode, ModifiedLevel, MessageId, LineNumber,
872 1.11 christos LogicalLineNumber, LogicalByteOffset, Column, Filename, Message,
873 1.11 christos SourceLine, SubError);
874 1.1 jruoho
875 1.1 jruoho /* Add the new node to the error node list */
876 1.1 jruoho
877 1.1 jruoho AeAddToErrorLog (Enode);
878 1.1 jruoho
879 1.11 christos if (AslGbl_DebugFlag)
880 1.1 jruoho {
881 1.1 jruoho /* stderr is a file, send error to it immediately */
882 1.1 jruoho
883 1.1 jruoho AePrintException (ASL_FILE_STDERR, Enode, NULL);
884 1.1 jruoho }
885 1.1 jruoho
886 1.11 christos AslGbl_ExceptionCount[ModifiedLevel]++;
887 1.11 christos if (AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
888 1.1 jruoho {
889 1.1 jruoho printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
890 1.1 jruoho
891 1.11 christos AslGbl_SourceLine = 0;
892 1.11 christos AslGbl_NextError = AslGbl_ErrorLog;
893 1.1 jruoho CmCleanupAndExit ();
894 1.1 jruoho exit(1);
895 1.1 jruoho }
896 1.1 jruoho
897 1.1 jruoho return;
898 1.1 jruoho }
899 1.1 jruoho
900 1.11 christos
901 1.11 christos /*******************************************************************************
902 1.11 christos *
903 1.11 christos * FUNCTION: GetModifiedLevel
904 1.11 christos *
905 1.11 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
906 1.11 christos * MessageId - Index into global message buffer
907 1.11 christos *
908 1.11 christos * RETURN: UINT8 - modified level
909 1.11 christos *
910 1.11 christos * DESCRIPTION: Get the modified level of exception codes that are reported as
911 1.11 christos * errors from the -ww option.
912 1.11 christos *
913 1.11 christos ******************************************************************************/
914 1.11 christos
915 1.11 christos static UINT8
916 1.11 christos GetModifiedLevel (
917 1.11 christos UINT8 Level,
918 1.11 christos UINT16 MessageId)
919 1.11 christos {
920 1.11 christos UINT16 i;
921 1.11 christos UINT16 ExceptionCode;
922 1.11 christos
923 1.11 christos
924 1.11 christos ExceptionCode = AeBuildFullExceptionCode (Level, MessageId);
925 1.11 christos
926 1.11 christos for (i = 0; i < AslGbl_ElevatedMessagesIndex; i++)
927 1.11 christos {
928 1.11 christos if (ExceptionCode == AslGbl_ElevatedMessages[i])
929 1.11 christos {
930 1.11 christos return (ASL_ERROR);
931 1.11 christos }
932 1.11 christos }
933 1.11 christos
934 1.11 christos return (Level);
935 1.11 christos }
936 1.11 christos
937 1.11 christos
938 1.8 christos /*******************************************************************************
939 1.8 christos *
940 1.8 christos * FUNCTION: AslIsExceptionIgnored
941 1.8 christos *
942 1.9 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
943 1.9 christos * MessageId - Index into global message buffer
944 1.8 christos *
945 1.8 christos * RETURN: BOOLEAN
946 1.8 christos *
947 1.8 christos * DESCRIPTION: Check if a particular exception is ignored. In this case it
948 1.8 christos * means that the exception is (expected or disabled.
949 1.8 christos *
950 1.8 christos ******************************************************************************/
951 1.8 christos
952 1.8 christos BOOLEAN
953 1.8 christos AslIsExceptionIgnored (
954 1.8 christos UINT8 Level,
955 1.8 christos UINT16 MessageId)
956 1.8 christos {
957 1.9 christos BOOLEAN ExceptionIgnored;
958 1.8 christos
959 1.8 christos
960 1.8 christos /* Note: this allows exception to be disabled and expected */
961 1.8 christos
962 1.8 christos ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
963 1.8 christos ExceptionIgnored |= AslIsExceptionExpected (Level, MessageId);
964 1.8 christos
965 1.11 christos return (AslGbl_AllExceptionsDisabled || ExceptionIgnored);
966 1.8 christos }
967 1.8 christos
968 1.8 christos
969 1.8 christos /*******************************************************************************
970 1.8 christos *
971 1.8 christos * FUNCTION: AslCheckExpectException
972 1.8 christos *
973 1.8 christos * PARAMETERS: none
974 1.8 christos *
975 1.8 christos * RETURN: none
976 1.8 christos *
977 1.8 christos * DESCRIPTION: Check the global expected messages table and raise an error
978 1.8 christos * for each message that has not been received.
979 1.8 christos *
980 1.8 christos ******************************************************************************/
981 1.8 christos
982 1.8 christos void
983 1.8 christos AslCheckExpectedExceptions (
984 1.8 christos void)
985 1.8 christos {
986 1.9 christos UINT8 i;
987 1.9 christos
988 1.8 christos
989 1.11 christos for (i = 0; i < AslGbl_ExpectedMessagesIndex; ++i)
990 1.8 christos {
991 1.11 christos if (!AslGbl_ExpectedMessages[i].MessageReceived)
992 1.8 christos {
993 1.8 christos AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
994 1.11 christos AslGbl_ExpectedMessages[i].MessageIdStr);
995 1.8 christos }
996 1.8 christos }
997 1.8 christos }
998 1.8 christos
999 1.8 christos
1000 1.8 christos /*******************************************************************************
1001 1.8 christos *
1002 1.8 christos * FUNCTION: AslExpectException
1003 1.8 christos *
1004 1.8 christos * PARAMETERS: MessageIdString - ID of excepted exception during compile
1005 1.8 christos *
1006 1.8 christos * RETURN: Status
1007 1.8 christos *
1008 1.8 christos * DESCRIPTION: Enter a message ID into the global expected messages table
1009 1.8 christos * If these messages are not raised during the compilation, throw
1010 1.8 christos * an error.
1011 1.8 christos *
1012 1.8 christos ******************************************************************************/
1013 1.8 christos
1014 1.8 christos ACPI_STATUS
1015 1.8 christos AslExpectException (
1016 1.8 christos char *MessageIdString)
1017 1.8 christos {
1018 1.8 christos UINT32 MessageId;
1019 1.8 christos
1020 1.8 christos
1021 1.8 christos /* Convert argument to an integer and validate it */
1022 1.8 christos
1023 1.8 christos MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1024 1.8 christos
1025 1.8 christos if (MessageId > 6999)
1026 1.8 christos {
1027 1.8 christos printf ("\"%s\" is not a valid warning/remark/erro ID\n",
1028 1.8 christos MessageIdString);
1029 1.8 christos return (AE_BAD_PARAMETER);
1030 1.8 christos }
1031 1.8 christos
1032 1.8 christos /* Insert value into the global expected message array */
1033 1.8 christos
1034 1.11 christos if (AslGbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
1035 1.8 christos {
1036 1.11 christos printf ("Too many messages have been registered as expected (max %d)\n",
1037 1.8 christos ASL_MAX_DISABLED_MESSAGES);
1038 1.8 christos return (AE_LIMIT);
1039 1.8 christos }
1040 1.8 christos
1041 1.11 christos AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageId = MessageId;
1042 1.11 christos AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
1043 1.11 christos AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageReceived = FALSE;
1044 1.11 christos AslGbl_ExpectedMessagesIndex++;
1045 1.8 christos return (AE_OK);
1046 1.8 christos }
1047 1.8 christos
1048 1.1 jruoho
1049 1.1 jruoho /*******************************************************************************
1050 1.1 jruoho *
1051 1.2 christos * FUNCTION: AslDisableException
1052 1.2 christos *
1053 1.2 christos * PARAMETERS: MessageIdString - ID to be disabled
1054 1.2 christos *
1055 1.2 christos * RETURN: Status
1056 1.2 christos *
1057 1.2 christos * DESCRIPTION: Enter a message ID into the global disabled messages table
1058 1.2 christos *
1059 1.2 christos ******************************************************************************/
1060 1.2 christos
1061 1.2 christos ACPI_STATUS
1062 1.2 christos AslDisableException (
1063 1.2 christos char *MessageIdString)
1064 1.2 christos {
1065 1.2 christos UINT32 MessageId;
1066 1.2 christos
1067 1.2 christos
1068 1.2 christos /* Convert argument to an integer and validate it */
1069 1.2 christos
1070 1.2 christos MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1071 1.2 christos
1072 1.8 christos if ((MessageId < 2000) || (MessageId > 6999))
1073 1.2 christos {
1074 1.8 christos printf ("\"%s\" is not a valid warning/remark/error ID\n",
1075 1.2 christos MessageIdString);
1076 1.2 christos return (AE_BAD_PARAMETER);
1077 1.2 christos }
1078 1.2 christos
1079 1.2 christos /* Insert value into the global disabled message array */
1080 1.2 christos
1081 1.11 christos if (AslGbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES)
1082 1.2 christos {
1083 1.11 christos printf ("Too many messages have been disabled (max %d)\n",
1084 1.2 christos ASL_MAX_DISABLED_MESSAGES);
1085 1.2 christos return (AE_LIMIT);
1086 1.2 christos }
1087 1.2 christos
1088 1.11 christos AslGbl_DisabledMessages[AslGbl_DisabledMessagesIndex] = MessageId;
1089 1.11 christos AslGbl_DisabledMessagesIndex++;
1090 1.2 christos return (AE_OK);
1091 1.2 christos }
1092 1.2 christos
1093 1.2 christos
1094 1.2 christos /*******************************************************************************
1095 1.2 christos *
1096 1.11 christos * FUNCTION: AslElevateException
1097 1.11 christos *
1098 1.11 christos * PARAMETERS: MessageIdString - ID of excepted exception during compile
1099 1.11 christos *
1100 1.11 christos * RETURN: Status
1101 1.11 christos *
1102 1.11 christos * DESCRIPTION: Enter a message ID into the global elevated exceptions table.
1103 1.11 christos * These messages will be considered as compilation errors.
1104 1.11 christos *
1105 1.11 christos ******************************************************************************/
1106 1.11 christos
1107 1.11 christos ACPI_STATUS
1108 1.11 christos AslElevateException (
1109 1.11 christos char *MessageIdString)
1110 1.11 christos {
1111 1.11 christos UINT32 MessageId;
1112 1.11 christos
1113 1.11 christos
1114 1.11 christos /* Convert argument to an integer and validate it */
1115 1.11 christos
1116 1.11 christos MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1117 1.11 christos
1118 1.11 christos if (MessageId > 6999)
1119 1.11 christos {
1120 1.11 christos printf ("\"%s\" is not a valid warning/remark/erro ID\n",
1121 1.11 christos MessageIdString);
1122 1.11 christos return (AE_BAD_PARAMETER);
1123 1.11 christos }
1124 1.11 christos
1125 1.11 christos /* Insert value into the global expected message array */
1126 1.11 christos
1127 1.11 christos if (AslGbl_ElevatedMessagesIndex >= ASL_MAX_ELEVATED_MESSAGES)
1128 1.11 christos {
1129 1.11 christos printf ("Too many messages have been registered as elevated (max %d)\n",
1130 1.11 christos ASL_MAX_DISABLED_MESSAGES);
1131 1.11 christos return (AE_LIMIT);
1132 1.11 christos }
1133 1.11 christos
1134 1.11 christos AslGbl_ElevatedMessages[AslGbl_ExpectedMessagesIndex] = MessageId;
1135 1.11 christos AslGbl_ElevatedMessagesIndex++;
1136 1.11 christos return (AE_OK);
1137 1.11 christos }
1138 1.11 christos
1139 1.11 christos /*******************************************************************************
1140 1.11 christos *
1141 1.2 christos * FUNCTION: AslIsExceptionDisabled
1142 1.2 christos *
1143 1.9 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1144 1.9 christos * MessageId - Index into global message buffer
1145 1.2 christos *
1146 1.2 christos * RETURN: TRUE if exception/message should be ignored
1147 1.2 christos *
1148 1.2 christos * DESCRIPTION: Check if the user has specified options such that this
1149 1.2 christos * exception should be ignored
1150 1.2 christos *
1151 1.2 christos ******************************************************************************/
1152 1.2 christos
1153 1.8 christos static BOOLEAN
1154 1.8 christos AslIsExceptionExpected (
1155 1.8 christos UINT8 Level,
1156 1.8 christos UINT16 MessageId)
1157 1.8 christos {
1158 1.8 christos UINT32 EncodedMessageId;
1159 1.8 christos UINT32 i;
1160 1.8 christos
1161 1.8 christos
1162 1.9 christos /* Mark this exception as received */
1163 1.9 christos
1164 1.8 christos EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
1165 1.11 christos for (i = 0; i < AslGbl_ExpectedMessagesIndex; i++)
1166 1.8 christos {
1167 1.8 christos /* Simple implementation via fixed array */
1168 1.8 christos
1169 1.11 christos if (EncodedMessageId == AslGbl_ExpectedMessages[i].MessageId)
1170 1.8 christos {
1171 1.11 christos return (AslGbl_ExpectedMessages[i].MessageReceived = TRUE);
1172 1.8 christos }
1173 1.8 christos }
1174 1.8 christos
1175 1.8 christos return (FALSE);
1176 1.8 christos }
1177 1.8 christos
1178 1.8 christos
1179 1.8 christos /*******************************************************************************
1180 1.8 christos *
1181 1.8 christos * FUNCTION: AslIsExceptionDisabled
1182 1.8 christos *
1183 1.8 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1184 1.8 christos * MessageId - Index into global message buffer
1185 1.8 christos *
1186 1.8 christos * RETURN: TRUE if exception/message should be ignored
1187 1.8 christos *
1188 1.8 christos * DESCRIPTION: Check if the user has specified options such that this
1189 1.8 christos * exception should be ignored
1190 1.8 christos *
1191 1.8 christos ******************************************************************************/
1192 1.8 christos
1193 1.8 christos static BOOLEAN
1194 1.2 christos AslIsExceptionDisabled (
1195 1.2 christos UINT8 Level,
1196 1.3 christos UINT16 MessageId)
1197 1.2 christos {
1198 1.2 christos UINT32 EncodedMessageId;
1199 1.2 christos UINT32 i;
1200 1.2 christos
1201 1.2 christos
1202 1.2 christos switch (Level)
1203 1.2 christos {
1204 1.2 christos case ASL_WARNING2:
1205 1.2 christos case ASL_WARNING3:
1206 1.2 christos
1207 1.2 christos /* Check for global disable via -w1/-w2/-w3 options */
1208 1.2 christos
1209 1.11 christos if (Level > AslGbl_WarningLevel)
1210 1.2 christos {
1211 1.2 christos return (TRUE);
1212 1.2 christos }
1213 1.2 christos /* Fall through */
1214 1.2 christos
1215 1.2 christos case ASL_WARNING:
1216 1.2 christos case ASL_REMARK:
1217 1.8 christos case ASL_ERROR:
1218 1.2 christos /*
1219 1.8 christos * Ignore this error/warning/remark if it has been disabled by
1220 1.2 christos * the user (-vw option)
1221 1.2 christos */
1222 1.3 christos EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
1223 1.11 christos for (i = 0; i < AslGbl_DisabledMessagesIndex; i++)
1224 1.2 christos {
1225 1.2 christos /* Simple implementation via fixed array */
1226 1.2 christos
1227 1.11 christos if (EncodedMessageId == AslGbl_DisabledMessages[i])
1228 1.2 christos {
1229 1.2 christos return (TRUE);
1230 1.2 christos }
1231 1.2 christos }
1232 1.2 christos break;
1233 1.2 christos
1234 1.2 christos default:
1235 1.2 christos break;
1236 1.2 christos }
1237 1.2 christos
1238 1.2 christos return (FALSE);
1239 1.2 christos }
1240 1.2 christos
1241 1.2 christos
1242 1.2 christos /*******************************************************************************
1243 1.2 christos *
1244 1.9 christos * FUNCTION: AslDualParseOpError
1245 1.9 christos *
1246 1.9 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1247 1.9 christos * MainMsgId - Index into global message buffer
1248 1.9 christos * MainOp - Parse node where error happened
1249 1.9 christos * MainMsg - Message pertaining to the MainOp
1250 1.9 christos * SubMsgId - Index into global message buffer
1251 1.9 christos * SubOp - Additional parse node for better message
1252 1.9 christos * SubMsg - Message pertainint to SubOp
1253 1.9 christos *
1254 1.9 christos *
1255 1.9 christos * RETURN: None
1256 1.9 christos *
1257 1.9 christos * DESCRIPTION: Main error reporting routine for the ASL compiler for error
1258 1.9 christos * messages that point to multiple parse objects.
1259 1.9 christos *
1260 1.9 christos ******************************************************************************/
1261 1.9 christos
1262 1.9 christos void
1263 1.9 christos AslDualParseOpError (
1264 1.9 christos UINT8 Level,
1265 1.9 christos UINT16 MainMsgId,
1266 1.9 christos ACPI_PARSE_OBJECT *MainOp,
1267 1.9 christos char *MainMsg,
1268 1.9 christos UINT16 SubMsgId,
1269 1.9 christos ACPI_PARSE_OBJECT *SubOp,
1270 1.9 christos char *SubMsg)
1271 1.9 christos {
1272 1.9 christos ASL_ERROR_MSG *SubEnode = NULL;
1273 1.9 christos
1274 1.9 christos
1275 1.9 christos /* Check if user wants to ignore this exception */
1276 1.9 christos
1277 1.9 christos if (AslIsExceptionIgnored (Level, MainMsgId) || !MainOp)
1278 1.9 christos {
1279 1.9 christos return;
1280 1.9 christos }
1281 1.9 christos
1282 1.9 christos if (SubOp)
1283 1.9 christos {
1284 1.9 christos AslInitEnode (&SubEnode, Level, SubMsgId, SubOp->Asl.LineNumber,
1285 1.9 christos SubOp->Asl.LogicalLineNumber, SubOp->Asl.LogicalByteOffset,
1286 1.9 christos SubOp->Asl.Column, SubOp->Asl.Filename, SubMsg,
1287 1.9 christos NULL, NULL);
1288 1.9 christos }
1289 1.9 christos
1290 1.9 christos AslLogNewError (Level, MainMsgId, MainOp->Asl.LineNumber,
1291 1.9 christos MainOp->Asl.LogicalLineNumber, MainOp->Asl.LogicalByteOffset,
1292 1.9 christos MainOp->Asl.Column, MainOp->Asl.Filename, MainMsg,
1293 1.9 christos NULL, SubEnode);
1294 1.9 christos }
1295 1.9 christos
1296 1.9 christos
1297 1.9 christos /*******************************************************************************
1298 1.9 christos *
1299 1.1 jruoho * FUNCTION: AslError
1300 1.1 jruoho *
1301 1.1 jruoho * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1302 1.1 jruoho * MessageId - Index into global message buffer
1303 1.1 jruoho * Op - Parse node where error happened
1304 1.1 jruoho * ExtraMessage - additional error message
1305 1.1 jruoho *
1306 1.1 jruoho * RETURN: None
1307 1.1 jruoho *
1308 1.1 jruoho * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
1309 1.1 jruoho * except the parser.)
1310 1.1 jruoho *
1311 1.1 jruoho ******************************************************************************/
1312 1.1 jruoho
1313 1.1 jruoho void
1314 1.1 jruoho AslError (
1315 1.1 jruoho UINT8 Level,
1316 1.3 christos UINT16 MessageId,
1317 1.1 jruoho ACPI_PARSE_OBJECT *Op,
1318 1.1 jruoho char *ExtraMessage)
1319 1.1 jruoho {
1320 1.1 jruoho if (Op)
1321 1.1 jruoho {
1322 1.1 jruoho AslCommonError (Level, MessageId, Op->Asl.LineNumber,
1323 1.2 christos Op->Asl.LogicalLineNumber,
1324 1.2 christos Op->Asl.LogicalByteOffset,
1325 1.2 christos Op->Asl.Column,
1326 1.2 christos Op->Asl.Filename, ExtraMessage);
1327 1.1 jruoho }
1328 1.1 jruoho else
1329 1.1 jruoho {
1330 1.1 jruoho AslCommonError (Level, MessageId, 0,
1331 1.2 christos 0, 0, 0, NULL, ExtraMessage);
1332 1.1 jruoho }
1333 1.1 jruoho }
1334 1.1 jruoho
1335 1.1 jruoho
1336 1.1 jruoho /*******************************************************************************
1337 1.1 jruoho *
1338 1.1 jruoho * FUNCTION: AslCoreSubsystemError
1339 1.1 jruoho *
1340 1.1 jruoho * PARAMETERS: Op - Parse node where error happened
1341 1.3 christos * Status - The ACPICA Exception
1342 1.1 jruoho * ExtraMessage - additional error message
1343 1.1 jruoho * Abort - TRUE -> Abort compilation
1344 1.1 jruoho *
1345 1.1 jruoho * RETURN: None
1346 1.1 jruoho *
1347 1.3 christos * DESCRIPTION: Error reporting routine for exceptions returned by the ACPICA
1348 1.3 christos * core subsystem.
1349 1.1 jruoho *
1350 1.1 jruoho ******************************************************************************/
1351 1.1 jruoho
1352 1.1 jruoho void
1353 1.1 jruoho AslCoreSubsystemError (
1354 1.1 jruoho ACPI_PARSE_OBJECT *Op,
1355 1.1 jruoho ACPI_STATUS Status,
1356 1.1 jruoho char *ExtraMessage,
1357 1.1 jruoho BOOLEAN Abort)
1358 1.1 jruoho {
1359 1.1 jruoho
1360 1.11 christos snprintf (AslGbl_MsgBuffer, sizeof(AslGbl_MsgBuffer), "%s %s", AcpiFormatException (Status), ExtraMessage);
1361 1.1 jruoho
1362 1.1 jruoho if (Op)
1363 1.1 jruoho {
1364 1.6 christos AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
1365 1.6 christos Op->Asl.LineNumber,
1366 1.6 christos Op->Asl.LogicalLineNumber,
1367 1.6 christos Op->Asl.LogicalByteOffset,
1368 1.6 christos Op->Asl.Column,
1369 1.11 christos Op->Asl.Filename, AslGbl_MsgBuffer);
1370 1.1 jruoho }
1371 1.1 jruoho else
1372 1.1 jruoho {
1373 1.6 christos AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
1374 1.11 christos 0, 0, 0, 0, NULL, AslGbl_MsgBuffer);
1375 1.1 jruoho }
1376 1.1 jruoho
1377 1.1 jruoho if (Abort)
1378 1.1 jruoho {
1379 1.1 jruoho AslAbort ();
1380 1.1 jruoho }
1381 1.1 jruoho }
1382 1.1 jruoho
1383 1.1 jruoho
1384 1.1 jruoho /*******************************************************************************
1385 1.1 jruoho *
1386 1.1 jruoho * FUNCTION: AslCompilererror
1387 1.1 jruoho *
1388 1.1 jruoho * PARAMETERS: CompilerMessage - Error message from the parser
1389 1.1 jruoho *
1390 1.1 jruoho * RETURN: Status (0 for now)
1391 1.1 jruoho *
1392 1.1 jruoho * DESCRIPTION: Report an error situation discovered in a production
1393 1.1 jruoho * NOTE: don't change the name of this function, it is called
1394 1.1 jruoho * from the auto-generated parser.
1395 1.1 jruoho *
1396 1.1 jruoho ******************************************************************************/
1397 1.1 jruoho
1398 1.1 jruoho int
1399 1.1 jruoho AslCompilererror (
1400 1.2 christos const char *CompilerMessage)
1401 1.1 jruoho {
1402 1.1 jruoho
1403 1.11 christos AslGbl_SyntaxError++;
1404 1.4 christos
1405 1.11 christos AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber,
1406 1.11 christos AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset,
1407 1.11 christos AslGbl_CurrentColumn, AslGbl_Files[ASL_FILE_INPUT].Filename,
1408 1.2 christos ACPI_CAST_PTR (char, CompilerMessage));
1409 1.1 jruoho
1410 1.2 christos return (0);
1411 1.1 jruoho }
1412