aslerror.c revision 1.1.1.2.2.2 1 1.1.1.2.2.2 bouyer
2 1.1.1.2.2.2 bouyer /******************************************************************************
3 1.1.1.2.2.2 bouyer *
4 1.1.1.2.2.2 bouyer * Module Name: aslerror - Error handling and statistics
5 1.1.1.2.2.2 bouyer *
6 1.1.1.2.2.2 bouyer *****************************************************************************/
7 1.1.1.2.2.2 bouyer
8 1.1.1.2.2.2 bouyer /*
9 1.1.1.2.2.2 bouyer * Copyright (C) 2000 - 2011, Intel Corp.
10 1.1.1.2.2.2 bouyer * All rights reserved.
11 1.1.1.2.2.2 bouyer *
12 1.1.1.2.2.2 bouyer * Redistribution and use in source and binary forms, with or without
13 1.1.1.2.2.2 bouyer * modification, are permitted provided that the following conditions
14 1.1.1.2.2.2 bouyer * are met:
15 1.1.1.2.2.2 bouyer * 1. Redistributions of source code must retain the above copyright
16 1.1.1.2.2.2 bouyer * notice, this list of conditions, and the following disclaimer,
17 1.1.1.2.2.2 bouyer * without modification.
18 1.1.1.2.2.2 bouyer * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19 1.1.1.2.2.2 bouyer * substantially similar to the "NO WARRANTY" disclaimer below
20 1.1.1.2.2.2 bouyer * ("Disclaimer") and any redistribution must be conditioned upon
21 1.1.1.2.2.2 bouyer * including a substantially similar Disclaimer requirement for further
22 1.1.1.2.2.2 bouyer * binary redistribution.
23 1.1.1.2.2.2 bouyer * 3. Neither the names of the above-listed copyright holders nor the names
24 1.1.1.2.2.2 bouyer * of any contributors may be used to endorse or promote products derived
25 1.1.1.2.2.2 bouyer * from this software without specific prior written permission.
26 1.1.1.2.2.2 bouyer *
27 1.1.1.2.2.2 bouyer * Alternatively, this software may be distributed under the terms of the
28 1.1.1.2.2.2 bouyer * GNU General Public License ("GPL") version 2 as published by the Free
29 1.1.1.2.2.2 bouyer * Software Foundation.
30 1.1.1.2.2.2 bouyer *
31 1.1.1.2.2.2 bouyer * NO WARRANTY
32 1.1.1.2.2.2 bouyer * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33 1.1.1.2.2.2 bouyer * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34 1.1.1.2.2.2 bouyer * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35 1.1.1.2.2.2 bouyer * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36 1.1.1.2.2.2 bouyer * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37 1.1.1.2.2.2 bouyer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38 1.1.1.2.2.2 bouyer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39 1.1.1.2.2.2 bouyer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40 1.1.1.2.2.2 bouyer * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41 1.1.1.2.2.2 bouyer * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42 1.1.1.2.2.2 bouyer * POSSIBILITY OF SUCH DAMAGES.
43 1.1.1.2.2.2 bouyer */
44 1.1.1.2.2.2 bouyer
45 1.1.1.2.2.2 bouyer #define ASL_EXCEPTIONS
46 1.1.1.2.2.2 bouyer #include "aslcompiler.h"
47 1.1.1.2.2.2 bouyer
48 1.1.1.2.2.2 bouyer #define _COMPONENT ACPI_COMPILER
49 1.1.1.2.2.2 bouyer ACPI_MODULE_NAME ("aslerror")
50 1.1.1.2.2.2 bouyer
51 1.1.1.2.2.2 bouyer /* Local prototypes */
52 1.1.1.2.2.2 bouyer
53 1.1.1.2.2.2 bouyer static void
54 1.1.1.2.2.2 bouyer AeAddToErrorLog (
55 1.1.1.2.2.2 bouyer ASL_ERROR_MSG *Enode);
56 1.1.1.2.2.2 bouyer
57 1.1.1.2.2.2 bouyer
58 1.1.1.2.2.2 bouyer void
59 1.1.1.2.2.2 bouyer AeClearErrorLog (
60 1.1.1.2.2.2 bouyer void)
61 1.1.1.2.2.2 bouyer {
62 1.1.1.2.2.2 bouyer ASL_ERROR_MSG *Enode = Gbl_ErrorLog;
63 1.1.1.2.2.2 bouyer ASL_ERROR_MSG *Next;
64 1.1.1.2.2.2 bouyer
65 1.1.1.2.2.2 bouyer /* Walk the error node list */
66 1.1.1.2.2.2 bouyer
67 1.1.1.2.2.2 bouyer while (Enode)
68 1.1.1.2.2.2 bouyer {
69 1.1.1.2.2.2 bouyer Next = Enode->Next;
70 1.1.1.2.2.2 bouyer ACPI_FREE (Enode);
71 1.1.1.2.2.2 bouyer Enode = Next;
72 1.1.1.2.2.2 bouyer }
73 1.1.1.2.2.2 bouyer
74 1.1.1.2.2.2 bouyer Gbl_ErrorLog = NULL;
75 1.1.1.2.2.2 bouyer }
76 1.1.1.2.2.2 bouyer
77 1.1.1.2.2.2 bouyer
78 1.1.1.2.2.2 bouyer /*******************************************************************************
79 1.1.1.2.2.2 bouyer *
80 1.1.1.2.2.2 bouyer * FUNCTION: AeAddToErrorLog
81 1.1.1.2.2.2 bouyer *
82 1.1.1.2.2.2 bouyer * PARAMETERS: Enode - An error node to add to the log
83 1.1.1.2.2.2 bouyer *
84 1.1.1.2.2.2 bouyer * RETURN: None
85 1.1.1.2.2.2 bouyer *
86 1.1.1.2.2.2 bouyer * DESCRIPTION: Add a new error node to the error log. The error log is
87 1.1.1.2.2.2 bouyer * ordered by the "logical" line number (cumulative line number
88 1.1.1.2.2.2 bouyer * including all include files.)
89 1.1.1.2.2.2 bouyer *
90 1.1.1.2.2.2 bouyer ******************************************************************************/
91 1.1.1.2.2.2 bouyer
92 1.1.1.2.2.2 bouyer static void
93 1.1.1.2.2.2 bouyer AeAddToErrorLog (
94 1.1.1.2.2.2 bouyer ASL_ERROR_MSG *Enode)
95 1.1.1.2.2.2 bouyer {
96 1.1.1.2.2.2 bouyer ASL_ERROR_MSG *Next;
97 1.1.1.2.2.2 bouyer ASL_ERROR_MSG *Prev;
98 1.1.1.2.2.2 bouyer
99 1.1.1.2.2.2 bouyer
100 1.1.1.2.2.2 bouyer /* If Gbl_ErrorLog is null, this is the first error node */
101 1.1.1.2.2.2 bouyer
102 1.1.1.2.2.2 bouyer if (!Gbl_ErrorLog)
103 1.1.1.2.2.2 bouyer {
104 1.1.1.2.2.2 bouyer Gbl_ErrorLog = Enode;
105 1.1.1.2.2.2 bouyer return;
106 1.1.1.2.2.2 bouyer }
107 1.1.1.2.2.2 bouyer
108 1.1.1.2.2.2 bouyer /*
109 1.1.1.2.2.2 bouyer * Walk error list until we find a line number greater than ours.
110 1.1.1.2.2.2 bouyer * List is sorted according to line number.
111 1.1.1.2.2.2 bouyer */
112 1.1.1.2.2.2 bouyer Prev = NULL;
113 1.1.1.2.2.2 bouyer Next = Gbl_ErrorLog;
114 1.1.1.2.2.2 bouyer
115 1.1.1.2.2.2 bouyer while ((Next) &&
116 1.1.1.2.2.2 bouyer (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
117 1.1.1.2.2.2 bouyer {
118 1.1.1.2.2.2 bouyer Prev = Next;
119 1.1.1.2.2.2 bouyer Next = Next->Next;
120 1.1.1.2.2.2 bouyer }
121 1.1.1.2.2.2 bouyer
122 1.1.1.2.2.2 bouyer /* Found our place in the list */
123 1.1.1.2.2.2 bouyer
124 1.1.1.2.2.2 bouyer Enode->Next = Next;
125 1.1.1.2.2.2 bouyer
126 1.1.1.2.2.2 bouyer if (Prev)
127 1.1.1.2.2.2 bouyer {
128 1.1.1.2.2.2 bouyer Prev->Next = Enode;
129 1.1.1.2.2.2 bouyer }
130 1.1.1.2.2.2 bouyer else
131 1.1.1.2.2.2 bouyer {
132 1.1.1.2.2.2 bouyer Gbl_ErrorLog = Enode;
133 1.1.1.2.2.2 bouyer }
134 1.1.1.2.2.2 bouyer }
135 1.1.1.2.2.2 bouyer
136 1.1.1.2.2.2 bouyer
137 1.1.1.2.2.2 bouyer /*******************************************************************************
138 1.1.1.2.2.2 bouyer *
139 1.1.1.2.2.2 bouyer * FUNCTION: AePrintException
140 1.1.1.2.2.2 bouyer *
141 1.1.1.2.2.2 bouyer * PARAMETERS: FileId - ID of output file
142 1.1.1.2.2.2 bouyer * Enode - Error node to print
143 1.1.1.2.2.2 bouyer * Header - Additional text before each message
144 1.1.1.2.2.2 bouyer *
145 1.1.1.2.2.2 bouyer * RETURN: None
146 1.1.1.2.2.2 bouyer *
147 1.1.1.2.2.2 bouyer * DESCRIPTION: Print the contents of an error node.
148 1.1.1.2.2.2 bouyer *
149 1.1.1.2.2.2 bouyer * NOTE: We don't use the FlxxxFile I/O functions here because on error
150 1.1.1.2.2.2 bouyer * they abort the compiler and call this function! Since we
151 1.1.1.2.2.2 bouyer * are reporting errors here, we ignore most output errors and
152 1.1.1.2.2.2 bouyer * just try to get out as much as we can.
153 1.1.1.2.2.2 bouyer *
154 1.1.1.2.2.2 bouyer ******************************************************************************/
155 1.1.1.2.2.2 bouyer
156 1.1.1.2.2.2 bouyer void
157 1.1.1.2.2.2 bouyer AePrintException (
158 1.1.1.2.2.2 bouyer UINT32 FileId,
159 1.1.1.2.2.2 bouyer ASL_ERROR_MSG *Enode,
160 1.1.1.2.2.2 bouyer char *Header)
161 1.1.1.2.2.2 bouyer {
162 1.1.1.2.2.2 bouyer UINT8 SourceByte;
163 1.1.1.2.2.2 bouyer int Actual;
164 1.1.1.2.2.2 bouyer size_t RActual;
165 1.1.1.2.2.2 bouyer UINT32 MsgLength;
166 1.1.1.2.2.2 bouyer char *MainMessage;
167 1.1.1.2.2.2 bouyer char *ExtraMessage;
168 1.1.1.2.2.2 bouyer UINT32 SourceColumn;
169 1.1.1.2.2.2 bouyer UINT32 ErrorColumn;
170 1.1.1.2.2.2 bouyer FILE *OutputFile;
171 1.1.1.2.2.2 bouyer FILE *SourceFile;
172 1.1.1.2.2.2 bouyer long FileSize;
173 1.1.1.2.2.2 bouyer BOOLEAN PrematureEOF = FALSE;
174 1.1.1.2.2.2 bouyer
175 1.1.1.2.2.2 bouyer
176 1.1.1.2.2.2 bouyer if (Gbl_NoErrors)
177 1.1.1.2.2.2 bouyer {
178 1.1.1.2.2.2 bouyer return;
179 1.1.1.2.2.2 bouyer }
180 1.1.1.2.2.2 bouyer
181 1.1.1.2.2.2 bouyer /*
182 1.1.1.2.2.2 bouyer * Only listing files have a header, and remarks/optimizations
183 1.1.1.2.2.2 bouyer * are always output
184 1.1.1.2.2.2 bouyer */
185 1.1.1.2.2.2 bouyer if (!Header)
186 1.1.1.2.2.2 bouyer {
187 1.1.1.2.2.2 bouyer /* Ignore remarks if requested */
188 1.1.1.2.2.2 bouyer
189 1.1.1.2.2.2 bouyer switch (Enode->Level)
190 1.1.1.2.2.2 bouyer {
191 1.1.1.2.2.2 bouyer case ASL_REMARK:
192 1.1.1.2.2.2 bouyer if (!Gbl_DisplayRemarks)
193 1.1.1.2.2.2 bouyer {
194 1.1.1.2.2.2 bouyer return;
195 1.1.1.2.2.2 bouyer }
196 1.1.1.2.2.2 bouyer break;
197 1.1.1.2.2.2 bouyer
198 1.1.1.2.2.2 bouyer case ASL_OPTIMIZATION:
199 1.1.1.2.2.2 bouyer if (!Gbl_DisplayOptimizations)
200 1.1.1.2.2.2 bouyer {
201 1.1.1.2.2.2 bouyer return;
202 1.1.1.2.2.2 bouyer }
203 1.1.1.2.2.2 bouyer break;
204 1.1.1.2.2.2 bouyer
205 1.1.1.2.2.2 bouyer default:
206 1.1.1.2.2.2 bouyer break;
207 1.1.1.2.2.2 bouyer }
208 1.1.1.2.2.2 bouyer }
209 1.1.1.2.2.2 bouyer
210 1.1.1.2.2.2 bouyer /* Get the file handles */
211 1.1.1.2.2.2 bouyer
212 1.1.1.2.2.2 bouyer OutputFile = Gbl_Files[FileId].Handle;
213 1.1.1.2.2.2 bouyer
214 1.1.1.2.2.2 bouyer /* Use the merged header/source file if present, otherwise use input file */
215 1.1.1.2.2.2 bouyer
216 1.1.1.2.2.2 bouyer SourceFile = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
217 1.1.1.2.2.2 bouyer if (!SourceFile)
218 1.1.1.2.2.2 bouyer {
219 1.1.1.2.2.2 bouyer SourceFile = Gbl_Files[ASL_FILE_INPUT].Handle;
220 1.1.1.2.2.2 bouyer }
221 1.1.1.2.2.2 bouyer
222 1.1.1.2.2.2 bouyer if (SourceFile)
223 1.1.1.2.2.2 bouyer {
224 1.1.1.2.2.2 bouyer /* Determine if the error occurred at source file EOF */
225 1.1.1.2.2.2 bouyer
226 1.1.1.2.2.2 bouyer fseek (SourceFile, 0, SEEK_END);
227 1.1.1.2.2.2 bouyer FileSize = ftell (SourceFile);
228 1.1.1.2.2.2 bouyer
229 1.1.1.2.2.2 bouyer if ((long) Enode->LogicalByteOffset >= FileSize)
230 1.1.1.2.2.2 bouyer {
231 1.1.1.2.2.2 bouyer PrematureEOF = TRUE;
232 1.1.1.2.2.2 bouyer }
233 1.1.1.2.2.2 bouyer }
234 1.1.1.2.2.2 bouyer
235 1.1.1.2.2.2 bouyer if (Header)
236 1.1.1.2.2.2 bouyer {
237 1.1.1.2.2.2 bouyer fprintf (OutputFile, "%s", Header);
238 1.1.1.2.2.2 bouyer }
239 1.1.1.2.2.2 bouyer
240 1.1.1.2.2.2 bouyer /* Print filename and line number if present and valid */
241 1.1.1.2.2.2 bouyer
242 1.1.1.2.2.2 bouyer if (Enode->Filename)
243 1.1.1.2.2.2 bouyer {
244 1.1.1.2.2.2 bouyer if (Gbl_VerboseErrors)
245 1.1.1.2.2.2 bouyer {
246 1.1.1.2.2.2 bouyer fprintf (OutputFile, "%6s", Enode->Filename);
247 1.1.1.2.2.2 bouyer
248 1.1.1.2.2.2 bouyer if (Enode->LineNumber)
249 1.1.1.2.2.2 bouyer {
250 1.1.1.2.2.2 bouyer fprintf (OutputFile, " %6u: ", Enode->LineNumber);
251 1.1.1.2.2.2 bouyer
252 1.1.1.2.2.2 bouyer /*
253 1.1.1.2.2.2 bouyer * If not at EOF, get the corresponding source code line and
254 1.1.1.2.2.2 bouyer * display it. Don't attempt this if we have a premature EOF
255 1.1.1.2.2.2 bouyer * condition.
256 1.1.1.2.2.2 bouyer */
257 1.1.1.2.2.2 bouyer if (!PrematureEOF)
258 1.1.1.2.2.2 bouyer {
259 1.1.1.2.2.2 bouyer /*
260 1.1.1.2.2.2 bouyer * Seek to the offset in the combined source file, read
261 1.1.1.2.2.2 bouyer * the source line, and write it to the output.
262 1.1.1.2.2.2 bouyer */
263 1.1.1.2.2.2 bouyer Actual = fseek (SourceFile, (long) Enode->LogicalByteOffset,
264 1.1.1.2.2.2 bouyer (int) SEEK_SET);
265 1.1.1.2.2.2 bouyer if (Actual)
266 1.1.1.2.2.2 bouyer {
267 1.1.1.2.2.2 bouyer fprintf (OutputFile,
268 1.1.1.2.2.2 bouyer "[*** iASL: Seek error on source code temp file %s ***]",
269 1.1.1.2.2.2 bouyer Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
270 1.1.1.2.2.2 bouyer }
271 1.1.1.2.2.2 bouyer else
272 1.1.1.2.2.2 bouyer {
273 1.1.1.2.2.2 bouyer RActual = fread (&SourceByte, 1, 1, SourceFile);
274 1.1.1.2.2.2 bouyer if (!RActual)
275 1.1.1.2.2.2 bouyer {
276 1.1.1.2.2.2 bouyer fprintf (OutputFile,
277 1.1.1.2.2.2 bouyer "[*** iASL: Read error on source code temp file %s ***]",
278 1.1.1.2.2.2 bouyer Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
279 1.1.1.2.2.2 bouyer }
280 1.1.1.2.2.2 bouyer
281 1.1.1.2.2.2 bouyer else while (RActual && SourceByte && (SourceByte != '\n'))
282 1.1.1.2.2.2 bouyer {
283 1.1.1.2.2.2 bouyer fwrite (&SourceByte, 1, 1, OutputFile);
284 1.1.1.2.2.2 bouyer RActual = fread (&SourceByte, 1, 1, SourceFile);
285 1.1.1.2.2.2 bouyer }
286 1.1.1.2.2.2 bouyer }
287 1.1.1.2.2.2 bouyer }
288 1.1.1.2.2.2 bouyer
289 1.1.1.2.2.2 bouyer fprintf (OutputFile, "\n");
290 1.1.1.2.2.2 bouyer }
291 1.1.1.2.2.2 bouyer }
292 1.1.1.2.2.2 bouyer else
293 1.1.1.2.2.2 bouyer {
294 1.1.1.2.2.2 bouyer fprintf (OutputFile, "%s", Enode->Filename);
295 1.1.1.2.2.2 bouyer
296 1.1.1.2.2.2 bouyer if (Enode->LineNumber)
297 1.1.1.2.2.2 bouyer {
298 1.1.1.2.2.2 bouyer fprintf (OutputFile, "(%u) : ", Enode->LineNumber);
299 1.1.1.2.2.2 bouyer }
300 1.1.1.2.2.2 bouyer }
301 1.1.1.2.2.2 bouyer }
302 1.1.1.2.2.2 bouyer
303 1.1.1.2.2.2 bouyer /* NULL message ID, just print the raw message */
304 1.1.1.2.2.2 bouyer
305 1.1.1.2.2.2 bouyer if (Enode->MessageId == 0)
306 1.1.1.2.2.2 bouyer {
307 1.1.1.2.2.2 bouyer fprintf (OutputFile, "%s\n", Enode->Message);
308 1.1.1.2.2.2 bouyer }
309 1.1.1.2.2.2 bouyer else
310 1.1.1.2.2.2 bouyer {
311 1.1.1.2.2.2 bouyer /* Decode the message ID */
312 1.1.1.2.2.2 bouyer
313 1.1.1.2.2.2 bouyer fprintf (OutputFile, "%s %4.4d - ",
314 1.1.1.2.2.2 bouyer AslErrorLevel[Enode->Level],
315 1.1.1.2.2.2 bouyer Enode->MessageId + ((Enode->Level+1) * 1000));
316 1.1.1.2.2.2 bouyer
317 1.1.1.2.2.2 bouyer MainMessage = AslMessages[Enode->MessageId];
318 1.1.1.2.2.2 bouyer ExtraMessage = Enode->Message;
319 1.1.1.2.2.2 bouyer
320 1.1.1.2.2.2 bouyer if (Enode->LineNumber)
321 1.1.1.2.2.2 bouyer {
322 1.1.1.2.2.2 bouyer MsgLength = strlen (MainMessage);
323 1.1.1.2.2.2 bouyer if (MsgLength == 0)
324 1.1.1.2.2.2 bouyer {
325 1.1.1.2.2.2 bouyer MainMessage = Enode->Message;
326 1.1.1.2.2.2 bouyer
327 1.1.1.2.2.2 bouyer MsgLength = strlen (MainMessage);
328 1.1.1.2.2.2 bouyer ExtraMessage = NULL;
329 1.1.1.2.2.2 bouyer }
330 1.1.1.2.2.2 bouyer
331 1.1.1.2.2.2 bouyer if (Gbl_VerboseErrors && !PrematureEOF)
332 1.1.1.2.2.2 bouyer {
333 1.1.1.2.2.2 bouyer SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
334 1.1.1.2.2.2 bouyer ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
335 1.1.1.2.2.2 bouyer
336 1.1.1.2.2.2 bouyer if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
337 1.1.1.2.2.2 bouyer {
338 1.1.1.2.2.2 bouyer fprintf (OutputFile, "%*s%s",
339 1.1.1.2.2.2 bouyer (int) ((SourceColumn - 1) - ErrorColumn),
340 1.1.1.2.2.2 bouyer MainMessage, " ^ ");
341 1.1.1.2.2.2 bouyer }
342 1.1.1.2.2.2 bouyer else
343 1.1.1.2.2.2 bouyer {
344 1.1.1.2.2.2 bouyer fprintf (OutputFile, "%*s %s",
345 1.1.1.2.2.2 bouyer (int) ((SourceColumn - ErrorColumn) + 1), "^",
346 1.1.1.2.2.2 bouyer MainMessage);
347 1.1.1.2.2.2 bouyer }
348 1.1.1.2.2.2 bouyer }
349 1.1.1.2.2.2 bouyer else
350 1.1.1.2.2.2 bouyer {
351 1.1.1.2.2.2 bouyer fprintf (OutputFile, " %s", MainMessage);
352 1.1.1.2.2.2 bouyer }
353 1.1.1.2.2.2 bouyer
354 1.1.1.2.2.2 bouyer /* Print the extra info message if present */
355 1.1.1.2.2.2 bouyer
356 1.1.1.2.2.2 bouyer if (ExtraMessage)
357 1.1.1.2.2.2 bouyer {
358 1.1.1.2.2.2 bouyer fprintf (OutputFile, " (%s)", ExtraMessage);
359 1.1.1.2.2.2 bouyer }
360 1.1.1.2.2.2 bouyer
361 1.1.1.2.2.2 bouyer if (PrematureEOF)
362 1.1.1.2.2.2 bouyer {
363 1.1.1.2.2.2 bouyer fprintf (OutputFile, " and premature End-Of-File");
364 1.1.1.2.2.2 bouyer }
365 1.1.1.2.2.2 bouyer
366 1.1.1.2.2.2 bouyer fprintf (OutputFile, "\n");
367 1.1.1.2.2.2 bouyer if (Gbl_VerboseErrors)
368 1.1.1.2.2.2 bouyer {
369 1.1.1.2.2.2 bouyer fprintf (OutputFile, "\n");
370 1.1.1.2.2.2 bouyer }
371 1.1.1.2.2.2 bouyer }
372 1.1.1.2.2.2 bouyer else
373 1.1.1.2.2.2 bouyer {
374 1.1.1.2.2.2 bouyer fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
375 1.1.1.2.2.2 bouyer }
376 1.1.1.2.2.2 bouyer }
377 1.1.1.2.2.2 bouyer }
378 1.1.1.2.2.2 bouyer
379 1.1.1.2.2.2 bouyer
380 1.1.1.2.2.2 bouyer /*******************************************************************************
381 1.1.1.2.2.2 bouyer *
382 1.1.1.2.2.2 bouyer * FUNCTION: AePrintErrorLog
383 1.1.1.2.2.2 bouyer *
384 1.1.1.2.2.2 bouyer * PARAMETERS: FileId - Where to output the error log
385 1.1.1.2.2.2 bouyer *
386 1.1.1.2.2.2 bouyer * RETURN: None
387 1.1.1.2.2.2 bouyer *
388 1.1.1.2.2.2 bouyer * DESCRIPTION: Print the entire contents of the error log
389 1.1.1.2.2.2 bouyer *
390 1.1.1.2.2.2 bouyer ******************************************************************************/
391 1.1.1.2.2.2 bouyer
392 1.1.1.2.2.2 bouyer void
393 1.1.1.2.2.2 bouyer AePrintErrorLog (
394 1.1.1.2.2.2 bouyer UINT32 FileId)
395 1.1.1.2.2.2 bouyer {
396 1.1.1.2.2.2 bouyer ASL_ERROR_MSG *Enode = Gbl_ErrorLog;
397 1.1.1.2.2.2 bouyer
398 1.1.1.2.2.2 bouyer
399 1.1.1.2.2.2 bouyer /* Walk the error node list */
400 1.1.1.2.2.2 bouyer
401 1.1.1.2.2.2 bouyer while (Enode)
402 1.1.1.2.2.2 bouyer {
403 1.1.1.2.2.2 bouyer AePrintException (FileId, Enode, NULL);
404 1.1.1.2.2.2 bouyer Enode = Enode->Next;
405 1.1.1.2.2.2 bouyer }
406 1.1.1.2.2.2 bouyer }
407 1.1.1.2.2.2 bouyer
408 1.1.1.2.2.2 bouyer
409 1.1.1.2.2.2 bouyer /*******************************************************************************
410 1.1.1.2.2.2 bouyer *
411 1.1.1.2.2.2 bouyer * FUNCTION: AslCommonError
412 1.1.1.2.2.2 bouyer *
413 1.1.1.2.2.2 bouyer * PARAMETERS: Level - Seriousness (Warning/error, etc.)
414 1.1.1.2.2.2 bouyer * MessageId - Index into global message buffer
415 1.1.1.2.2.2 bouyer * CurrentLineNumber - Actual file line number
416 1.1.1.2.2.2 bouyer * LogicalLineNumber - Cumulative line number
417 1.1.1.2.2.2 bouyer * LogicalByteOffset - Byte offset in source file
418 1.1.1.2.2.2 bouyer * Column - Column in current line
419 1.1.1.2.2.2 bouyer * Filename - source filename
420 1.1.1.2.2.2 bouyer * ExtraMessage - additional error message
421 1.1.1.2.2.2 bouyer *
422 1.1.1.2.2.2 bouyer * RETURN: None
423 1.1.1.2.2.2 bouyer *
424 1.1.1.2.2.2 bouyer * DESCRIPTION: Create a new error node and add it to the error log
425 1.1.1.2.2.2 bouyer *
426 1.1.1.2.2.2 bouyer ******************************************************************************/
427 1.1.1.2.2.2 bouyer
428 1.1.1.2.2.2 bouyer void
429 1.1.1.2.2.2 bouyer AslCommonError (
430 1.1.1.2.2.2 bouyer UINT8 Level,
431 1.1.1.2.2.2 bouyer UINT8 MessageId,
432 1.1.1.2.2.2 bouyer UINT32 CurrentLineNumber,
433 1.1.1.2.2.2 bouyer UINT32 LogicalLineNumber,
434 1.1.1.2.2.2 bouyer UINT32 LogicalByteOffset,
435 1.1.1.2.2.2 bouyer UINT32 Column,
436 1.1.1.2.2.2 bouyer char *Filename,
437 1.1.1.2.2.2 bouyer char *ExtraMessage)
438 1.1.1.2.2.2 bouyer {
439 1.1.1.2.2.2 bouyer UINT32 MessageSize;
440 1.1.1.2.2.2 bouyer char *MessageBuffer = NULL;
441 1.1.1.2.2.2 bouyer ASL_ERROR_MSG *Enode;
442 1.1.1.2.2.2 bouyer
443 1.1.1.2.2.2 bouyer
444 1.1.1.2.2.2 bouyer Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
445 1.1.1.2.2.2 bouyer
446 1.1.1.2.2.2 bouyer if (ExtraMessage)
447 1.1.1.2.2.2 bouyer {
448 1.1.1.2.2.2 bouyer /* Allocate a buffer for the message and a new error node */
449 1.1.1.2.2.2 bouyer
450 1.1.1.2.2.2 bouyer MessageSize = strlen (ExtraMessage) + 1;
451 1.1.1.2.2.2 bouyer MessageBuffer = UtLocalCalloc (MessageSize);
452 1.1.1.2.2.2 bouyer
453 1.1.1.2.2.2 bouyer /* Keep a copy of the extra message */
454 1.1.1.2.2.2 bouyer
455 1.1.1.2.2.2 bouyer ACPI_STRCPY (MessageBuffer, ExtraMessage);
456 1.1.1.2.2.2 bouyer }
457 1.1.1.2.2.2 bouyer
458 1.1.1.2.2.2 bouyer /* Initialize the error node */
459 1.1.1.2.2.2 bouyer
460 1.1.1.2.2.2 bouyer if (Filename)
461 1.1.1.2.2.2 bouyer {
462 1.1.1.2.2.2 bouyer Enode->Filename = Filename;
463 1.1.1.2.2.2 bouyer Enode->FilenameLength = strlen (Filename);
464 1.1.1.2.2.2 bouyer if (Enode->FilenameLength < 6)
465 1.1.1.2.2.2 bouyer {
466 1.1.1.2.2.2 bouyer Enode->FilenameLength = 6;
467 1.1.1.2.2.2 bouyer }
468 1.1.1.2.2.2 bouyer }
469 1.1.1.2.2.2 bouyer
470 1.1.1.2.2.2 bouyer Enode->MessageId = MessageId;
471 1.1.1.2.2.2 bouyer Enode->Level = Level;
472 1.1.1.2.2.2 bouyer Enode->LineNumber = CurrentLineNumber;
473 1.1.1.2.2.2 bouyer Enode->LogicalLineNumber = LogicalLineNumber;
474 1.1.1.2.2.2 bouyer Enode->LogicalByteOffset = LogicalByteOffset;
475 1.1.1.2.2.2 bouyer Enode->Column = Column;
476 1.1.1.2.2.2 bouyer Enode->Message = MessageBuffer;
477 1.1.1.2.2.2 bouyer
478 1.1.1.2.2.2 bouyer /* Add the new node to the error node list */
479 1.1.1.2.2.2 bouyer
480 1.1.1.2.2.2 bouyer AeAddToErrorLog (Enode);
481 1.1.1.2.2.2 bouyer
482 1.1.1.2.2.2 bouyer if (Gbl_DebugFlag)
483 1.1.1.2.2.2 bouyer {
484 1.1.1.2.2.2 bouyer /* stderr is a file, send error to it immediately */
485 1.1.1.2.2.2 bouyer
486 1.1.1.2.2.2 bouyer AePrintException (ASL_FILE_STDERR, Enode, NULL);
487 1.1.1.2.2.2 bouyer }
488 1.1.1.2.2.2 bouyer
489 1.1.1.2.2.2 bouyer Gbl_ExceptionCount[Level]++;
490 1.1.1.2.2.2 bouyer if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
491 1.1.1.2.2.2 bouyer {
492 1.1.1.2.2.2 bouyer printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
493 1.1.1.2.2.2 bouyer
494 1.1.1.2.2.2 bouyer Gbl_SourceLine = 0;
495 1.1.1.2.2.2 bouyer Gbl_NextError = Gbl_ErrorLog;
496 1.1.1.2.2.2 bouyer CmDoOutputFiles ();
497 1.1.1.2.2.2 bouyer CmCleanupAndExit ();
498 1.1.1.2.2.2 bouyer exit(1);
499 1.1.1.2.2.2 bouyer }
500 1.1.1.2.2.2 bouyer
501 1.1.1.2.2.2 bouyer return;
502 1.1.1.2.2.2 bouyer }
503 1.1.1.2.2.2 bouyer
504 1.1.1.2.2.2 bouyer
505 1.1.1.2.2.2 bouyer /*******************************************************************************
506 1.1.1.2.2.2 bouyer *
507 1.1.1.2.2.2 bouyer * FUNCTION: AslError
508 1.1.1.2.2.2 bouyer *
509 1.1.1.2.2.2 bouyer * PARAMETERS: Level - Seriousness (Warning/error, etc.)
510 1.1.1.2.2.2 bouyer * MessageId - Index into global message buffer
511 1.1.1.2.2.2 bouyer * Op - Parse node where error happened
512 1.1.1.2.2.2 bouyer * ExtraMessage - additional error message
513 1.1.1.2.2.2 bouyer *
514 1.1.1.2.2.2 bouyer * RETURN: None
515 1.1.1.2.2.2 bouyer *
516 1.1.1.2.2.2 bouyer * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
517 1.1.1.2.2.2 bouyer * except the parser.)
518 1.1.1.2.2.2 bouyer *
519 1.1.1.2.2.2 bouyer ******************************************************************************/
520 1.1.1.2.2.2 bouyer
521 1.1.1.2.2.2 bouyer void
522 1.1.1.2.2.2 bouyer AslError (
523 1.1.1.2.2.2 bouyer UINT8 Level,
524 1.1.1.2.2.2 bouyer UINT8 MessageId,
525 1.1.1.2.2.2 bouyer ACPI_PARSE_OBJECT *Op,
526 1.1.1.2.2.2 bouyer char *ExtraMessage)
527 1.1.1.2.2.2 bouyer {
528 1.1.1.2.2.2 bouyer
529 1.1.1.2.2.2 bouyer switch (Level)
530 1.1.1.2.2.2 bouyer {
531 1.1.1.2.2.2 bouyer case ASL_WARNING2:
532 1.1.1.2.2.2 bouyer case ASL_WARNING3:
533 1.1.1.2.2.2 bouyer if (Gbl_WarningLevel < Level)
534 1.1.1.2.2.2 bouyer {
535 1.1.1.2.2.2 bouyer return;
536 1.1.1.2.2.2 bouyer }
537 1.1.1.2.2.2 bouyer break;
538 1.1.1.2.2.2 bouyer
539 1.1.1.2.2.2 bouyer default:
540 1.1.1.2.2.2 bouyer break;
541 1.1.1.2.2.2 bouyer }
542 1.1.1.2.2.2 bouyer
543 1.1.1.2.2.2 bouyer
544 1.1.1.2.2.2 bouyer if (Op)
545 1.1.1.2.2.2 bouyer {
546 1.1.1.2.2.2 bouyer AslCommonError (Level, MessageId, Op->Asl.LineNumber,
547 1.1.1.2.2.2 bouyer Op->Asl.LogicalLineNumber,
548 1.1.1.2.2.2 bouyer Op->Asl.LogicalByteOffset,
549 1.1.1.2.2.2 bouyer Op->Asl.Column,
550 1.1.1.2.2.2 bouyer Op->Asl.Filename, ExtraMessage);
551 1.1.1.2.2.2 bouyer }
552 1.1.1.2.2.2 bouyer else
553 1.1.1.2.2.2 bouyer {
554 1.1.1.2.2.2 bouyer AslCommonError (Level, MessageId, 0,
555 1.1.1.2.2.2 bouyer 0, 0, 0, NULL, ExtraMessage);
556 1.1.1.2.2.2 bouyer }
557 1.1.1.2.2.2 bouyer }
558 1.1.1.2.2.2 bouyer
559 1.1.1.2.2.2 bouyer
560 1.1.1.2.2.2 bouyer /*******************************************************************************
561 1.1.1.2.2.2 bouyer *
562 1.1.1.2.2.2 bouyer * FUNCTION: AslCoreSubsystemError
563 1.1.1.2.2.2 bouyer *
564 1.1.1.2.2.2 bouyer * PARAMETERS: Op - Parse node where error happened
565 1.1.1.2.2.2 bouyer * Status - The ACPI CA Exception
566 1.1.1.2.2.2 bouyer * ExtraMessage - additional error message
567 1.1.1.2.2.2 bouyer * Abort - TRUE -> Abort compilation
568 1.1.1.2.2.2 bouyer *
569 1.1.1.2.2.2 bouyer * RETURN: None
570 1.1.1.2.2.2 bouyer *
571 1.1.1.2.2.2 bouyer * DESCRIPTION: Error reporting routine for exceptions returned by the ACPI
572 1.1.1.2.2.2 bouyer * CA core subsystem.
573 1.1.1.2.2.2 bouyer *
574 1.1.1.2.2.2 bouyer ******************************************************************************/
575 1.1.1.2.2.2 bouyer
576 1.1.1.2.2.2 bouyer void
577 1.1.1.2.2.2 bouyer AslCoreSubsystemError (
578 1.1.1.2.2.2 bouyer ACPI_PARSE_OBJECT *Op,
579 1.1.1.2.2.2 bouyer ACPI_STATUS Status,
580 1.1.1.2.2.2 bouyer char *ExtraMessage,
581 1.1.1.2.2.2 bouyer BOOLEAN Abort)
582 1.1.1.2.2.2 bouyer {
583 1.1.1.2.2.2 bouyer
584 1.1.1.2.2.2 bouyer sprintf (MsgBuffer, "%s %s", AcpiFormatException (Status), ExtraMessage);
585 1.1.1.2.2.2 bouyer
586 1.1.1.2.2.2 bouyer if (Op)
587 1.1.1.2.2.2 bouyer {
588 1.1.1.2.2.2 bouyer AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Op->Asl.LineNumber,
589 1.1.1.2.2.2 bouyer Op->Asl.LogicalLineNumber,
590 1.1.1.2.2.2 bouyer Op->Asl.LogicalByteOffset,
591 1.1.1.2.2.2 bouyer Op->Asl.Column,
592 1.1.1.2.2.2 bouyer Op->Asl.Filename, MsgBuffer);
593 1.1.1.2.2.2 bouyer }
594 1.1.1.2.2.2 bouyer else
595 1.1.1.2.2.2 bouyer {
596 1.1.1.2.2.2 bouyer AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, 0,
597 1.1.1.2.2.2 bouyer 0, 0, 0, NULL, MsgBuffer);
598 1.1.1.2.2.2 bouyer }
599 1.1.1.2.2.2 bouyer
600 1.1.1.2.2.2 bouyer if (Abort)
601 1.1.1.2.2.2 bouyer {
602 1.1.1.2.2.2 bouyer AslAbort ();
603 1.1.1.2.2.2 bouyer }
604 1.1.1.2.2.2 bouyer }
605 1.1.1.2.2.2 bouyer
606 1.1.1.2.2.2 bouyer
607 1.1.1.2.2.2 bouyer /*******************************************************************************
608 1.1.1.2.2.2 bouyer *
609 1.1.1.2.2.2 bouyer * FUNCTION: AslCompilererror
610 1.1.1.2.2.2 bouyer *
611 1.1.1.2.2.2 bouyer * PARAMETERS: CompilerMessage - Error message from the parser
612 1.1.1.2.2.2 bouyer *
613 1.1.1.2.2.2 bouyer * RETURN: Status (0 for now)
614 1.1.1.2.2.2 bouyer *
615 1.1.1.2.2.2 bouyer * DESCRIPTION: Report an error situation discovered in a production
616 1.1.1.2.2.2 bouyer * NOTE: don't change the name of this function, it is called
617 1.1.1.2.2.2 bouyer * from the auto-generated parser.
618 1.1.1.2.2.2 bouyer *
619 1.1.1.2.2.2 bouyer ******************************************************************************/
620 1.1.1.2.2.2 bouyer
621 1.1.1.2.2.2 bouyer int
622 1.1.1.2.2.2 bouyer AslCompilererror (
623 1.1.1.2.2.2 bouyer char *CompilerMessage)
624 1.1.1.2.2.2 bouyer {
625 1.1.1.2.2.2 bouyer
626 1.1.1.2.2.2 bouyer AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber,
627 1.1.1.2.2.2 bouyer Gbl_LogicalLineNumber, Gbl_CurrentLineOffset,
628 1.1.1.2.2.2 bouyer Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename,
629 1.1.1.2.2.2 bouyer CompilerMessage);
630 1.1.1.2.2.2 bouyer
631 1.1.1.2.2.2 bouyer return 0;
632 1.1.1.2.2.2 bouyer }
633 1.1.1.2.2.2 bouyer
634 1.1.1.2.2.2 bouyer
635