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