aslerror.c revision 1.12 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.12 christos if (!FlInputFileExists (Filename))
765 1.12 christos {
766 1.12 christos /*
767 1.12 christos * This means that this file is an include file. Record the .src
768 1.12 christos * file as the error message source because this file is not in
769 1.12 christos * the global file list.
770 1.12 christos */
771 1.12 christos Enode->SourceFilename =
772 1.12 christos FileNode->Files[ASL_FILE_SOURCE_OUTPUT].Filename;
773 1.12 christos }
774 1.2 christos }
775 1.9 christos }
776 1.2 christos
777 1.2 christos
778 1.9 christos /*******************************************************************************
779 1.9 christos *
780 1.9 christos * FUNCTION: AslCommonError2
781 1.9 christos *
782 1.9 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
783 1.9 christos * MessageId - Index into global message buffer
784 1.9 christos * LineNumber - Actual file line number
785 1.9 christos * Column - Column in current line
786 1.9 christos * SourceLine - Actual source code line
787 1.9 christos * Filename - source filename
788 1.9 christos * ExtraMessage - additional error message
789 1.9 christos *
790 1.9 christos * RETURN: None
791 1.9 christos *
792 1.9 christos * DESCRIPTION: Create a new error node and add it to the error log
793 1.9 christos *
794 1.9 christos ******************************************************************************/
795 1.2 christos
796 1.9 christos void
797 1.9 christos AslCommonError2 (
798 1.9 christos UINT8 Level,
799 1.9 christos UINT16 MessageId,
800 1.9 christos UINT32 LineNumber,
801 1.9 christos UINT32 Column,
802 1.9 christos char *SourceLine,
803 1.9 christos char *Filename,
804 1.9 christos char *ExtraMessage)
805 1.9 christos {
806 1.9 christos AslLogNewError (Level, MessageId, LineNumber, LineNumber, 0, Column,
807 1.9 christos Filename, ExtraMessage, SourceLine, NULL);
808 1.2 christos }
809 1.2 christos
810 1.2 christos
811 1.2 christos /*******************************************************************************
812 1.2 christos *
813 1.1 jruoho * FUNCTION: AslCommonError
814 1.1 jruoho *
815 1.1 jruoho * PARAMETERS: Level - Seriousness (Warning/error, etc.)
816 1.1 jruoho * MessageId - Index into global message buffer
817 1.1 jruoho * CurrentLineNumber - Actual file line number
818 1.1 jruoho * LogicalLineNumber - Cumulative line number
819 1.1 jruoho * LogicalByteOffset - Byte offset in source file
820 1.1 jruoho * Column - Column in current line
821 1.1 jruoho * Filename - source filename
822 1.1 jruoho * ExtraMessage - additional error message
823 1.1 jruoho *
824 1.1 jruoho * RETURN: None
825 1.1 jruoho *
826 1.1 jruoho * DESCRIPTION: Create a new error node and add it to the error log
827 1.1 jruoho *
828 1.1 jruoho ******************************************************************************/
829 1.1 jruoho
830 1.1 jruoho void
831 1.1 jruoho AslCommonError (
832 1.1 jruoho UINT8 Level,
833 1.3 christos UINT16 MessageId,
834 1.1 jruoho UINT32 CurrentLineNumber,
835 1.1 jruoho UINT32 LogicalLineNumber,
836 1.1 jruoho UINT32 LogicalByteOffset,
837 1.1 jruoho UINT32 Column,
838 1.1 jruoho char *Filename,
839 1.1 jruoho char *ExtraMessage)
840 1.1 jruoho {
841 1.10 christos /* Check if user wants to ignore this exception */
842 1.10 christos
843 1.10 christos if (AslIsExceptionIgnored (Level, MessageId))
844 1.10 christos {
845 1.10 christos return;
846 1.10 christos }
847 1.10 christos
848 1.9 christos AslLogNewError (Level, MessageId, CurrentLineNumber, LogicalLineNumber,
849 1.9 christos LogicalByteOffset, Column, Filename, ExtraMessage,
850 1.9 christos NULL, NULL);
851 1.9 christos }
852 1.1 jruoho
853 1.1 jruoho
854 1.9 christos /*******************************************************************************
855 1.9 christos *
856 1.9 christos * FUNCTION: AslLogNewError
857 1.9 christos *
858 1.9 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
859 1.9 christos * MessageId - Index into global message buffer
860 1.9 christos * CurrentLineNumber - Actual file line number
861 1.9 christos * LogicalLineNumber - Cumulative line number
862 1.9 christos * LogicalByteOffset - Byte offset in source file
863 1.9 christos * Column - Column in current line
864 1.9 christos * Filename - source filename
865 1.9 christos * Message - additional error message
866 1.9 christos * SourceLine - Actual line of source code
867 1.9 christos * SubError - Sub-error associated with this error
868 1.9 christos *
869 1.9 christos * RETURN: None
870 1.9 christos *
871 1.9 christos * DESCRIPTION: Create a new error node and add it to the error log
872 1.9 christos *
873 1.9 christos ******************************************************************************/
874 1.9 christos static void
875 1.9 christos AslLogNewError (
876 1.9 christos UINT8 Level,
877 1.9 christos UINT16 MessageId,
878 1.9 christos UINT32 LineNumber,
879 1.9 christos UINT32 LogicalLineNumber,
880 1.9 christos UINT32 LogicalByteOffset,
881 1.9 christos UINT32 Column,
882 1.9 christos char *Filename,
883 1.9 christos char *Message,
884 1.9 christos char *SourceLine,
885 1.9 christos ASL_ERROR_MSG *SubError)
886 1.9 christos {
887 1.9 christos ASL_ERROR_MSG *Enode = NULL;
888 1.11 christos UINT8 ModifiedLevel = GetModifiedLevel (Level, MessageId);
889 1.1 jruoho
890 1.1 jruoho
891 1.11 christos AslInitEnode (&Enode, ModifiedLevel, MessageId, LineNumber,
892 1.11 christos LogicalLineNumber, LogicalByteOffset, Column, Filename, Message,
893 1.11 christos SourceLine, SubError);
894 1.1 jruoho
895 1.1 jruoho /* Add the new node to the error node list */
896 1.1 jruoho
897 1.1 jruoho AeAddToErrorLog (Enode);
898 1.1 jruoho
899 1.11 christos if (AslGbl_DebugFlag)
900 1.1 jruoho {
901 1.1 jruoho /* stderr is a file, send error to it immediately */
902 1.1 jruoho
903 1.1 jruoho AePrintException (ASL_FILE_STDERR, Enode, NULL);
904 1.1 jruoho }
905 1.1 jruoho
906 1.11 christos AslGbl_ExceptionCount[ModifiedLevel]++;
907 1.12 christos if (!AslGbl_IgnoreErrors && AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
908 1.1 jruoho {
909 1.1 jruoho printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
910 1.1 jruoho
911 1.11 christos AslGbl_SourceLine = 0;
912 1.11 christos AslGbl_NextError = AslGbl_ErrorLog;
913 1.1 jruoho CmCleanupAndExit ();
914 1.1 jruoho exit(1);
915 1.1 jruoho }
916 1.1 jruoho
917 1.1 jruoho return;
918 1.1 jruoho }
919 1.1 jruoho
920 1.11 christos
921 1.11 christos /*******************************************************************************
922 1.11 christos *
923 1.11 christos * FUNCTION: GetModifiedLevel
924 1.11 christos *
925 1.11 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
926 1.11 christos * MessageId - Index into global message buffer
927 1.11 christos *
928 1.11 christos * RETURN: UINT8 - modified level
929 1.11 christos *
930 1.11 christos * DESCRIPTION: Get the modified level of exception codes that are reported as
931 1.11 christos * errors from the -ww option.
932 1.11 christos *
933 1.11 christos ******************************************************************************/
934 1.11 christos
935 1.11 christos static UINT8
936 1.11 christos GetModifiedLevel (
937 1.11 christos UINT8 Level,
938 1.11 christos UINT16 MessageId)
939 1.11 christos {
940 1.11 christos UINT16 i;
941 1.11 christos UINT16 ExceptionCode;
942 1.11 christos
943 1.11 christos
944 1.11 christos ExceptionCode = AeBuildFullExceptionCode (Level, MessageId);
945 1.11 christos
946 1.11 christos for (i = 0; i < AslGbl_ElevatedMessagesIndex; i++)
947 1.11 christos {
948 1.11 christos if (ExceptionCode == AslGbl_ElevatedMessages[i])
949 1.11 christos {
950 1.11 christos return (ASL_ERROR);
951 1.11 christos }
952 1.11 christos }
953 1.11 christos
954 1.11 christos return (Level);
955 1.11 christos }
956 1.11 christos
957 1.11 christos
958 1.8 christos /*******************************************************************************
959 1.8 christos *
960 1.8 christos * FUNCTION: AslIsExceptionIgnored
961 1.8 christos *
962 1.9 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
963 1.9 christos * MessageId - Index into global message buffer
964 1.8 christos *
965 1.8 christos * RETURN: BOOLEAN
966 1.8 christos *
967 1.8 christos * DESCRIPTION: Check if a particular exception is ignored. In this case it
968 1.8 christos * means that the exception is (expected or disabled.
969 1.8 christos *
970 1.8 christos ******************************************************************************/
971 1.8 christos
972 1.8 christos BOOLEAN
973 1.8 christos AslIsExceptionIgnored (
974 1.8 christos UINT8 Level,
975 1.8 christos UINT16 MessageId)
976 1.8 christos {
977 1.9 christos BOOLEAN ExceptionIgnored;
978 1.8 christos
979 1.8 christos
980 1.8 christos /* Note: this allows exception to be disabled and expected */
981 1.8 christos
982 1.8 christos ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
983 1.8 christos ExceptionIgnored |= AslIsExceptionExpected (Level, MessageId);
984 1.8 christos
985 1.11 christos return (AslGbl_AllExceptionsDisabled || ExceptionIgnored);
986 1.8 christos }
987 1.8 christos
988 1.8 christos
989 1.8 christos /*******************************************************************************
990 1.8 christos *
991 1.8 christos * FUNCTION: AslCheckExpectException
992 1.8 christos *
993 1.8 christos * PARAMETERS: none
994 1.8 christos *
995 1.8 christos * RETURN: none
996 1.8 christos *
997 1.8 christos * DESCRIPTION: Check the global expected messages table and raise an error
998 1.8 christos * for each message that has not been received.
999 1.8 christos *
1000 1.8 christos ******************************************************************************/
1001 1.8 christos
1002 1.8 christos void
1003 1.8 christos AslCheckExpectedExceptions (
1004 1.8 christos void)
1005 1.8 christos {
1006 1.9 christos UINT8 i;
1007 1.9 christos
1008 1.8 christos
1009 1.11 christos for (i = 0; i < AslGbl_ExpectedMessagesIndex; ++i)
1010 1.8 christos {
1011 1.11 christos if (!AslGbl_ExpectedMessages[i].MessageReceived)
1012 1.8 christos {
1013 1.8 christos AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
1014 1.11 christos AslGbl_ExpectedMessages[i].MessageIdStr);
1015 1.8 christos }
1016 1.8 christos }
1017 1.8 christos }
1018 1.8 christos
1019 1.8 christos
1020 1.8 christos /*******************************************************************************
1021 1.8 christos *
1022 1.8 christos * FUNCTION: AslExpectException
1023 1.8 christos *
1024 1.8 christos * PARAMETERS: MessageIdString - ID of excepted exception during compile
1025 1.8 christos *
1026 1.8 christos * RETURN: Status
1027 1.8 christos *
1028 1.8 christos * DESCRIPTION: Enter a message ID into the global expected messages table
1029 1.8 christos * If these messages are not raised during the compilation, throw
1030 1.8 christos * an error.
1031 1.8 christos *
1032 1.8 christos ******************************************************************************/
1033 1.8 christos
1034 1.8 christos ACPI_STATUS
1035 1.8 christos AslExpectException (
1036 1.8 christos char *MessageIdString)
1037 1.8 christos {
1038 1.8 christos UINT32 MessageId;
1039 1.8 christos
1040 1.8 christos
1041 1.8 christos /* Convert argument to an integer and validate it */
1042 1.8 christos
1043 1.8 christos MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1044 1.8 christos
1045 1.8 christos if (MessageId > 6999)
1046 1.8 christos {
1047 1.8 christos printf ("\"%s\" is not a valid warning/remark/erro ID\n",
1048 1.8 christos MessageIdString);
1049 1.8 christos return (AE_BAD_PARAMETER);
1050 1.8 christos }
1051 1.8 christos
1052 1.8 christos /* Insert value into the global expected message array */
1053 1.8 christos
1054 1.11 christos if (AslGbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
1055 1.8 christos {
1056 1.11 christos printf ("Too many messages have been registered as expected (max %d)\n",
1057 1.8 christos ASL_MAX_DISABLED_MESSAGES);
1058 1.8 christos return (AE_LIMIT);
1059 1.8 christos }
1060 1.8 christos
1061 1.11 christos AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageId = MessageId;
1062 1.11 christos AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
1063 1.11 christos AslGbl_ExpectedMessages[AslGbl_ExpectedMessagesIndex].MessageReceived = FALSE;
1064 1.11 christos AslGbl_ExpectedMessagesIndex++;
1065 1.8 christos return (AE_OK);
1066 1.8 christos }
1067 1.8 christos
1068 1.1 jruoho
1069 1.1 jruoho /*******************************************************************************
1070 1.1 jruoho *
1071 1.2 christos * FUNCTION: AslDisableException
1072 1.2 christos *
1073 1.2 christos * PARAMETERS: MessageIdString - ID to be disabled
1074 1.2 christos *
1075 1.2 christos * RETURN: Status
1076 1.2 christos *
1077 1.2 christos * DESCRIPTION: Enter a message ID into the global disabled messages table
1078 1.2 christos *
1079 1.2 christos ******************************************************************************/
1080 1.2 christos
1081 1.2 christos ACPI_STATUS
1082 1.2 christos AslDisableException (
1083 1.2 christos char *MessageIdString)
1084 1.2 christos {
1085 1.2 christos UINT32 MessageId;
1086 1.2 christos
1087 1.2 christos
1088 1.2 christos /* Convert argument to an integer and validate it */
1089 1.2 christos
1090 1.2 christos MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1091 1.2 christos
1092 1.8 christos if ((MessageId < 2000) || (MessageId > 6999))
1093 1.2 christos {
1094 1.8 christos printf ("\"%s\" is not a valid warning/remark/error ID\n",
1095 1.2 christos MessageIdString);
1096 1.2 christos return (AE_BAD_PARAMETER);
1097 1.2 christos }
1098 1.2 christos
1099 1.2 christos /* Insert value into the global disabled message array */
1100 1.2 christos
1101 1.11 christos if (AslGbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES)
1102 1.2 christos {
1103 1.11 christos printf ("Too many messages have been disabled (max %d)\n",
1104 1.2 christos ASL_MAX_DISABLED_MESSAGES);
1105 1.2 christos return (AE_LIMIT);
1106 1.2 christos }
1107 1.2 christos
1108 1.11 christos AslGbl_DisabledMessages[AslGbl_DisabledMessagesIndex] = MessageId;
1109 1.11 christos AslGbl_DisabledMessagesIndex++;
1110 1.2 christos return (AE_OK);
1111 1.2 christos }
1112 1.2 christos
1113 1.2 christos
1114 1.2 christos /*******************************************************************************
1115 1.2 christos *
1116 1.11 christos * FUNCTION: AslElevateException
1117 1.11 christos *
1118 1.11 christos * PARAMETERS: MessageIdString - ID of excepted exception during compile
1119 1.11 christos *
1120 1.11 christos * RETURN: Status
1121 1.11 christos *
1122 1.11 christos * DESCRIPTION: Enter a message ID into the global elevated exceptions table.
1123 1.11 christos * These messages will be considered as compilation errors.
1124 1.11 christos *
1125 1.11 christos ******************************************************************************/
1126 1.11 christos
1127 1.11 christos ACPI_STATUS
1128 1.11 christos AslElevateException (
1129 1.11 christos char *MessageIdString)
1130 1.11 christos {
1131 1.11 christos UINT32 MessageId;
1132 1.11 christos
1133 1.11 christos
1134 1.11 christos /* Convert argument to an integer and validate it */
1135 1.11 christos
1136 1.11 christos MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
1137 1.11 christos
1138 1.11 christos if (MessageId > 6999)
1139 1.11 christos {
1140 1.11 christos printf ("\"%s\" is not a valid warning/remark/erro ID\n",
1141 1.11 christos MessageIdString);
1142 1.11 christos return (AE_BAD_PARAMETER);
1143 1.11 christos }
1144 1.11 christos
1145 1.11 christos /* Insert value into the global expected message array */
1146 1.11 christos
1147 1.11 christos if (AslGbl_ElevatedMessagesIndex >= ASL_MAX_ELEVATED_MESSAGES)
1148 1.11 christos {
1149 1.11 christos printf ("Too many messages have been registered as elevated (max %d)\n",
1150 1.11 christos ASL_MAX_DISABLED_MESSAGES);
1151 1.11 christos return (AE_LIMIT);
1152 1.11 christos }
1153 1.11 christos
1154 1.12 christos AslGbl_ElevatedMessages[AslGbl_ElevatedMessagesIndex] = MessageId;
1155 1.11 christos AslGbl_ElevatedMessagesIndex++;
1156 1.11 christos return (AE_OK);
1157 1.11 christos }
1158 1.11 christos
1159 1.11 christos /*******************************************************************************
1160 1.11 christos *
1161 1.2 christos * FUNCTION: AslIsExceptionDisabled
1162 1.2 christos *
1163 1.9 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1164 1.9 christos * MessageId - Index into global message buffer
1165 1.2 christos *
1166 1.2 christos * RETURN: TRUE if exception/message should be ignored
1167 1.2 christos *
1168 1.2 christos * DESCRIPTION: Check if the user has specified options such that this
1169 1.2 christos * exception should be ignored
1170 1.2 christos *
1171 1.2 christos ******************************************************************************/
1172 1.2 christos
1173 1.8 christos static BOOLEAN
1174 1.8 christos AslIsExceptionExpected (
1175 1.8 christos UINT8 Level,
1176 1.8 christos UINT16 MessageId)
1177 1.8 christos {
1178 1.8 christos UINT32 EncodedMessageId;
1179 1.8 christos UINT32 i;
1180 1.8 christos
1181 1.8 christos
1182 1.9 christos /* Mark this exception as received */
1183 1.9 christos
1184 1.8 christos EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
1185 1.11 christos for (i = 0; i < AslGbl_ExpectedMessagesIndex; i++)
1186 1.8 christos {
1187 1.8 christos /* Simple implementation via fixed array */
1188 1.8 christos
1189 1.11 christos if (EncodedMessageId == AslGbl_ExpectedMessages[i].MessageId)
1190 1.8 christos {
1191 1.11 christos return (AslGbl_ExpectedMessages[i].MessageReceived = TRUE);
1192 1.8 christos }
1193 1.8 christos }
1194 1.8 christos
1195 1.8 christos return (FALSE);
1196 1.8 christos }
1197 1.8 christos
1198 1.8 christos
1199 1.8 christos /*******************************************************************************
1200 1.8 christos *
1201 1.8 christos * FUNCTION: AslIsExceptionDisabled
1202 1.8 christos *
1203 1.8 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1204 1.8 christos * MessageId - Index into global message buffer
1205 1.8 christos *
1206 1.8 christos * RETURN: TRUE if exception/message should be ignored
1207 1.8 christos *
1208 1.8 christos * DESCRIPTION: Check if the user has specified options such that this
1209 1.8 christos * exception should be ignored
1210 1.8 christos *
1211 1.8 christos ******************************************************************************/
1212 1.8 christos
1213 1.8 christos static BOOLEAN
1214 1.2 christos AslIsExceptionDisabled (
1215 1.2 christos UINT8 Level,
1216 1.3 christos UINT16 MessageId)
1217 1.2 christos {
1218 1.2 christos UINT32 EncodedMessageId;
1219 1.2 christos UINT32 i;
1220 1.2 christos
1221 1.2 christos
1222 1.2 christos switch (Level)
1223 1.2 christos {
1224 1.2 christos case ASL_WARNING2:
1225 1.2 christos case ASL_WARNING3:
1226 1.2 christos
1227 1.2 christos /* Check for global disable via -w1/-w2/-w3 options */
1228 1.2 christos
1229 1.11 christos if (Level > AslGbl_WarningLevel)
1230 1.2 christos {
1231 1.2 christos return (TRUE);
1232 1.2 christos }
1233 1.2 christos /* Fall through */
1234 1.2 christos
1235 1.2 christos case ASL_WARNING:
1236 1.2 christos case ASL_REMARK:
1237 1.8 christos case ASL_ERROR:
1238 1.2 christos /*
1239 1.8 christos * Ignore this error/warning/remark if it has been disabled by
1240 1.2 christos * the user (-vw option)
1241 1.2 christos */
1242 1.3 christos EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
1243 1.11 christos for (i = 0; i < AslGbl_DisabledMessagesIndex; i++)
1244 1.2 christos {
1245 1.2 christos /* Simple implementation via fixed array */
1246 1.2 christos
1247 1.11 christos if (EncodedMessageId == AslGbl_DisabledMessages[i])
1248 1.2 christos {
1249 1.2 christos return (TRUE);
1250 1.2 christos }
1251 1.2 christos }
1252 1.2 christos break;
1253 1.2 christos
1254 1.2 christos default:
1255 1.2 christos break;
1256 1.2 christos }
1257 1.2 christos
1258 1.2 christos return (FALSE);
1259 1.2 christos }
1260 1.2 christos
1261 1.2 christos
1262 1.2 christos /*******************************************************************************
1263 1.2 christos *
1264 1.9 christos * FUNCTION: AslDualParseOpError
1265 1.9 christos *
1266 1.9 christos * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1267 1.9 christos * MainMsgId - Index into global message buffer
1268 1.9 christos * MainOp - Parse node where error happened
1269 1.9 christos * MainMsg - Message pertaining to the MainOp
1270 1.9 christos * SubMsgId - Index into global message buffer
1271 1.9 christos * SubOp - Additional parse node for better message
1272 1.9 christos * SubMsg - Message pertainint to SubOp
1273 1.9 christos *
1274 1.9 christos *
1275 1.9 christos * RETURN: None
1276 1.9 christos *
1277 1.9 christos * DESCRIPTION: Main error reporting routine for the ASL compiler for error
1278 1.9 christos * messages that point to multiple parse objects.
1279 1.9 christos *
1280 1.9 christos ******************************************************************************/
1281 1.9 christos
1282 1.9 christos void
1283 1.9 christos AslDualParseOpError (
1284 1.9 christos UINT8 Level,
1285 1.9 christos UINT16 MainMsgId,
1286 1.9 christos ACPI_PARSE_OBJECT *MainOp,
1287 1.9 christos char *MainMsg,
1288 1.9 christos UINT16 SubMsgId,
1289 1.9 christos ACPI_PARSE_OBJECT *SubOp,
1290 1.9 christos char *SubMsg)
1291 1.9 christos {
1292 1.9 christos ASL_ERROR_MSG *SubEnode = NULL;
1293 1.9 christos
1294 1.9 christos
1295 1.9 christos /* Check if user wants to ignore this exception */
1296 1.9 christos
1297 1.9 christos if (AslIsExceptionIgnored (Level, MainMsgId) || !MainOp)
1298 1.9 christos {
1299 1.9 christos return;
1300 1.9 christos }
1301 1.9 christos
1302 1.9 christos if (SubOp)
1303 1.9 christos {
1304 1.9 christos AslInitEnode (&SubEnode, Level, SubMsgId, SubOp->Asl.LineNumber,
1305 1.9 christos SubOp->Asl.LogicalLineNumber, SubOp->Asl.LogicalByteOffset,
1306 1.9 christos SubOp->Asl.Column, SubOp->Asl.Filename, SubMsg,
1307 1.9 christos NULL, NULL);
1308 1.9 christos }
1309 1.9 christos
1310 1.9 christos AslLogNewError (Level, MainMsgId, MainOp->Asl.LineNumber,
1311 1.9 christos MainOp->Asl.LogicalLineNumber, MainOp->Asl.LogicalByteOffset,
1312 1.9 christos MainOp->Asl.Column, MainOp->Asl.Filename, MainMsg,
1313 1.9 christos NULL, SubEnode);
1314 1.9 christos }
1315 1.9 christos
1316 1.9 christos
1317 1.9 christos /*******************************************************************************
1318 1.9 christos *
1319 1.1 jruoho * FUNCTION: AslError
1320 1.1 jruoho *
1321 1.1 jruoho * PARAMETERS: Level - Seriousness (Warning/error, etc.)
1322 1.1 jruoho * MessageId - Index into global message buffer
1323 1.1 jruoho * Op - Parse node where error happened
1324 1.1 jruoho * ExtraMessage - additional error message
1325 1.1 jruoho *
1326 1.1 jruoho * RETURN: None
1327 1.1 jruoho *
1328 1.1 jruoho * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
1329 1.1 jruoho * except the parser.)
1330 1.1 jruoho *
1331 1.1 jruoho ******************************************************************************/
1332 1.1 jruoho
1333 1.1 jruoho void
1334 1.1 jruoho AslError (
1335 1.1 jruoho UINT8 Level,
1336 1.3 christos UINT16 MessageId,
1337 1.1 jruoho ACPI_PARSE_OBJECT *Op,
1338 1.1 jruoho char *ExtraMessage)
1339 1.1 jruoho {
1340 1.1 jruoho if (Op)
1341 1.1 jruoho {
1342 1.1 jruoho AslCommonError (Level, MessageId, Op->Asl.LineNumber,
1343 1.2 christos Op->Asl.LogicalLineNumber,
1344 1.2 christos Op->Asl.LogicalByteOffset,
1345 1.2 christos Op->Asl.Column,
1346 1.2 christos Op->Asl.Filename, ExtraMessage);
1347 1.1 jruoho }
1348 1.1 jruoho else
1349 1.1 jruoho {
1350 1.1 jruoho AslCommonError (Level, MessageId, 0,
1351 1.2 christos 0, 0, 0, NULL, ExtraMessage);
1352 1.1 jruoho }
1353 1.1 jruoho }
1354 1.1 jruoho
1355 1.1 jruoho
1356 1.1 jruoho /*******************************************************************************
1357 1.1 jruoho *
1358 1.1 jruoho * FUNCTION: AslCoreSubsystemError
1359 1.1 jruoho *
1360 1.1 jruoho * PARAMETERS: Op - Parse node where error happened
1361 1.3 christos * Status - The ACPICA Exception
1362 1.1 jruoho * ExtraMessage - additional error message
1363 1.1 jruoho * Abort - TRUE -> Abort compilation
1364 1.1 jruoho *
1365 1.1 jruoho * RETURN: None
1366 1.1 jruoho *
1367 1.3 christos * DESCRIPTION: Error reporting routine for exceptions returned by the ACPICA
1368 1.3 christos * core subsystem.
1369 1.1 jruoho *
1370 1.1 jruoho ******************************************************************************/
1371 1.1 jruoho
1372 1.1 jruoho void
1373 1.1 jruoho AslCoreSubsystemError (
1374 1.1 jruoho ACPI_PARSE_OBJECT *Op,
1375 1.1 jruoho ACPI_STATUS Status,
1376 1.1 jruoho char *ExtraMessage,
1377 1.1 jruoho BOOLEAN Abort)
1378 1.1 jruoho {
1379 1.1 jruoho
1380 1.11 christos snprintf (AslGbl_MsgBuffer, sizeof(AslGbl_MsgBuffer), "%s %s", AcpiFormatException (Status), ExtraMessage);
1381 1.1 jruoho
1382 1.1 jruoho if (Op)
1383 1.1 jruoho {
1384 1.6 christos AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
1385 1.6 christos Op->Asl.LineNumber,
1386 1.6 christos Op->Asl.LogicalLineNumber,
1387 1.6 christos Op->Asl.LogicalByteOffset,
1388 1.6 christos Op->Asl.Column,
1389 1.11 christos Op->Asl.Filename, AslGbl_MsgBuffer);
1390 1.1 jruoho }
1391 1.1 jruoho else
1392 1.1 jruoho {
1393 1.6 christos AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
1394 1.11 christos 0, 0, 0, 0, NULL, AslGbl_MsgBuffer);
1395 1.1 jruoho }
1396 1.1 jruoho
1397 1.1 jruoho if (Abort)
1398 1.1 jruoho {
1399 1.1 jruoho AslAbort ();
1400 1.1 jruoho }
1401 1.1 jruoho }
1402 1.1 jruoho
1403 1.1 jruoho
1404 1.1 jruoho /*******************************************************************************
1405 1.1 jruoho *
1406 1.1 jruoho * FUNCTION: AslCompilererror
1407 1.1 jruoho *
1408 1.1 jruoho * PARAMETERS: CompilerMessage - Error message from the parser
1409 1.1 jruoho *
1410 1.1 jruoho * RETURN: Status (0 for now)
1411 1.1 jruoho *
1412 1.1 jruoho * DESCRIPTION: Report an error situation discovered in a production
1413 1.1 jruoho * NOTE: don't change the name of this function, it is called
1414 1.1 jruoho * from the auto-generated parser.
1415 1.1 jruoho *
1416 1.1 jruoho ******************************************************************************/
1417 1.1 jruoho
1418 1.1 jruoho int
1419 1.1 jruoho AslCompilererror (
1420 1.2 christos const char *CompilerMessage)
1421 1.1 jruoho {
1422 1.1 jruoho
1423 1.11 christos AslGbl_SyntaxError++;
1424 1.4 christos
1425 1.11 christos AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber,
1426 1.11 christos AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset,
1427 1.11 christos AslGbl_CurrentColumn, AslGbl_Files[ASL_FILE_INPUT].Filename,
1428 1.2 christos ACPI_CAST_PTR (char, CompilerMessage));
1429 1.1 jruoho
1430 1.2 christos return (0);
1431 1.1 jruoho }
1432