cvparser.c revision 1.1.1.12 1 1.1 christos /******************************************************************************
2 1.1 christos *
3 1.1 christos * Module Name: cvparser - Converter functions that are called from the AML
4 1.1 christos * parser.
5 1.1 christos *
6 1.1 christos *****************************************************************************/
7 1.1 christos
8 1.1.1.12 christos /******************************************************************************
9 1.1.1.12 christos *
10 1.1.1.12 christos * 1. Copyright Notice
11 1.1.1.12 christos *
12 1.1.1.12 christos * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp.
13 1.1 christos * All rights reserved.
14 1.1 christos *
15 1.1.1.12 christos * 2. License
16 1.1.1.12 christos *
17 1.1.1.12 christos * 2.1. This is your license from Intel Corp. under its intellectual property
18 1.1.1.12 christos * rights. You may have additional license terms from the party that provided
19 1.1.1.12 christos * you this software, covering your right to use that party's intellectual
20 1.1.1.12 christos * property rights.
21 1.1.1.12 christos *
22 1.1.1.12 christos * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23 1.1.1.12 christos * copy of the source code appearing in this file ("Covered Code") an
24 1.1.1.12 christos * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25 1.1.1.12 christos * base code distributed originally by Intel ("Original Intel Code") to copy,
26 1.1.1.12 christos * make derivatives, distribute, use and display any portion of the Covered
27 1.1.1.12 christos * Code in any form, with the right to sublicense such rights; and
28 1.1.1.12 christos *
29 1.1.1.12 christos * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30 1.1.1.12 christos * license (with the right to sublicense), under only those claims of Intel
31 1.1.1.12 christos * patents that are infringed by the Original Intel Code, to make, use, sell,
32 1.1.1.12 christos * offer to sell, and import the Covered Code and derivative works thereof
33 1.1.1.12 christos * solely to the minimum extent necessary to exercise the above copyright
34 1.1.1.12 christos * license, and in no event shall the patent license extend to any additions
35 1.1.1.12 christos * to or modifications of the Original Intel Code. No other license or right
36 1.1.1.12 christos * is granted directly or by implication, estoppel or otherwise;
37 1.1.1.12 christos *
38 1.1.1.12 christos * The above copyright and patent license is granted only if the following
39 1.1.1.12 christos * conditions are met:
40 1.1.1.12 christos *
41 1.1.1.12 christos * 3. Conditions
42 1.1.1.12 christos *
43 1.1.1.12 christos * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44 1.1.1.12 christos * Redistribution of source code of any substantial portion of the Covered
45 1.1.1.12 christos * Code or modification with rights to further distribute source must include
46 1.1.1.12 christos * the above Copyright Notice, the above License, this list of Conditions,
47 1.1.1.12 christos * and the following Disclaimer and Export Compliance provision. In addition,
48 1.1.1.12 christos * Licensee must cause all Covered Code to which Licensee contributes to
49 1.1.1.12 christos * contain a file documenting the changes Licensee made to create that Covered
50 1.1.1.12 christos * Code and the date of any change. Licensee must include in that file the
51 1.1.1.12 christos * documentation of any changes made by any predecessor Licensee. Licensee
52 1.1.1.12 christos * must include a prominent statement that the modification is derived,
53 1.1.1.12 christos * directly or indirectly, from Original Intel Code.
54 1.1.1.12 christos *
55 1.1.1.12 christos * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56 1.1.1.12 christos * Redistribution of source code of any substantial portion of the Covered
57 1.1.1.12 christos * Code or modification without rights to further distribute source must
58 1.1.1.12 christos * include the following Disclaimer and Export Compliance provision in the
59 1.1.1.12 christos * documentation and/or other materials provided with distribution. In
60 1.1.1.12 christos * addition, Licensee may not authorize further sublicense of source of any
61 1.1.1.12 christos * portion of the Covered Code, and must include terms to the effect that the
62 1.1.1.12 christos * license from Licensee to its licensee is limited to the intellectual
63 1.1.1.12 christos * property embodied in the software Licensee provides to its licensee, and
64 1.1.1.12 christos * not to intellectual property embodied in modifications its licensee may
65 1.1.1.12 christos * make.
66 1.1.1.12 christos *
67 1.1.1.12 christos * 3.3. Redistribution of Executable. Redistribution in executable form of any
68 1.1.1.12 christos * substantial portion of the Covered Code or modification must reproduce the
69 1.1.1.12 christos * above Copyright Notice, and the following Disclaimer and Export Compliance
70 1.1.1.12 christos * provision in the documentation and/or other materials provided with the
71 1.1.1.12 christos * distribution.
72 1.1.1.12 christos *
73 1.1.1.12 christos * 3.4. Intel retains all right, title, and interest in and to the Original
74 1.1.1.12 christos * Intel Code.
75 1.1.1.12 christos *
76 1.1.1.12 christos * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77 1.1.1.12 christos * Intel shall be used in advertising or otherwise to promote the sale, use or
78 1.1.1.12 christos * other dealings in products derived from or relating to the Covered Code
79 1.1.1.12 christos * without prior written authorization from Intel.
80 1.1.1.12 christos *
81 1.1.1.12 christos * 4. Disclaimer and Export Compliance
82 1.1.1.12 christos *
83 1.1.1.12 christos * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84 1.1.1.12 christos * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85 1.1.1.12 christos * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
86 1.1.1.12 christos * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
87 1.1.1.12 christos * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
88 1.1.1.12 christos * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89 1.1.1.12 christos * PARTICULAR PURPOSE.
90 1.1.1.12 christos *
91 1.1.1.12 christos * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92 1.1.1.12 christos * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93 1.1.1.12 christos * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94 1.1.1.12 christos * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95 1.1.1.12 christos * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96 1.1.1.12 christos * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
97 1.1.1.12 christos * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98 1.1.1.12 christos * LIMITED REMEDY.
99 1.1.1.12 christos *
100 1.1.1.12 christos * 4.3. Licensee shall not export, either directly or indirectly, any of this
101 1.1.1.12 christos * software or system incorporating such software without first obtaining any
102 1.1.1.12 christos * required license or other approval from the U. S. Department of Commerce or
103 1.1.1.12 christos * any other agency or department of the United States Government. In the
104 1.1.1.12 christos * event Licensee exports any such software from the United States or
105 1.1.1.12 christos * re-exports any such software from a foreign destination, Licensee shall
106 1.1.1.12 christos * ensure that the distribution and export/re-export of the software is in
107 1.1.1.12 christos * compliance with all laws, regulations, orders, or other restrictions of the
108 1.1.1.12 christos * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109 1.1.1.12 christos * any of its subsidiaries will export/re-export any technical data, process,
110 1.1.1.12 christos * software, or service, directly or indirectly, to any country for which the
111 1.1.1.12 christos * United States government or any agency thereof requires an export license,
112 1.1.1.12 christos * other governmental approval, or letter of assurance, without first obtaining
113 1.1.1.12 christos * such license, approval or letter.
114 1.1.1.12 christos *
115 1.1.1.12 christos *****************************************************************************
116 1.1.1.12 christos *
117 1.1.1.12 christos * Alternatively, you may choose to be licensed under the terms of the
118 1.1.1.12 christos * following license:
119 1.1.1.12 christos *
120 1.1 christos * Redistribution and use in source and binary forms, with or without
121 1.1 christos * modification, are permitted provided that the following conditions
122 1.1 christos * are met:
123 1.1 christos * 1. Redistributions of source code must retain the above copyright
124 1.1 christos * notice, this list of conditions, and the following disclaimer,
125 1.1 christos * without modification.
126 1.1 christos * 2. Redistributions in binary form must reproduce at minimum a disclaimer
127 1.1 christos * substantially similar to the "NO WARRANTY" disclaimer below
128 1.1 christos * ("Disclaimer") and any redistribution must be conditioned upon
129 1.1 christos * including a substantially similar Disclaimer requirement for further
130 1.1 christos * binary redistribution.
131 1.1 christos * 3. Neither the names of the above-listed copyright holders nor the names
132 1.1 christos * of any contributors may be used to endorse or promote products derived
133 1.1 christos * from this software without specific prior written permission.
134 1.1 christos *
135 1.1 christos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
136 1.1 christos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
137 1.1.1.9 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
138 1.1 christos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
139 1.1.1.12 christos * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
140 1.1.1.12 christos * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
141 1.1.1.12 christos * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
142 1.1.1.12 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
143 1.1.1.12 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
144 1.1.1.12 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
145 1.1.1.12 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
146 1.1.1.12 christos *
147 1.1.1.12 christos * Alternatively, you may choose to be licensed under the terms of the
148 1.1.1.12 christos * GNU General Public License ("GPL") version 2 as published by the Free
149 1.1.1.12 christos * Software Foundation.
150 1.1.1.12 christos *
151 1.1.1.12 christos *****************************************************************************/
152 1.1 christos
153 1.1 christos #include "aslcompiler.h"
154 1.1 christos #include "acparser.h"
155 1.1 christos #include "acdispat.h"
156 1.1 christos #include "amlcode.h"
157 1.1 christos #include "acinterp.h"
158 1.1 christos #include "acdisasm.h"
159 1.1 christos #include "acconvert.h"
160 1.1 christos
161 1.1 christos
162 1.1 christos /* local prototypes */
163 1.1 christos
164 1.1 christos static BOOLEAN
165 1.1 christos CvCommentExists (
166 1.1 christos UINT8 *Address);
167 1.1 christos
168 1.1 christos static BOOLEAN
169 1.1 christos CvIsFilename (
170 1.1 christos char *Filename);
171 1.1 christos
172 1.1 christos static ACPI_FILE_NODE*
173 1.1 christos CvFileAddressLookup(
174 1.1 christos char *Address,
175 1.1 christos ACPI_FILE_NODE *Head);
176 1.1 christos
177 1.1 christos static void
178 1.1 christos CvAddToFileTree (
179 1.1 christos char *Filename,
180 1.1 christos char *PreviousFilename);
181 1.1 christos
182 1.1 christos static void
183 1.1 christos CvSetFileParent (
184 1.1 christos char *ChildFile,
185 1.1 christos char *ParentFile);
186 1.1 christos
187 1.1 christos
188 1.1 christos /*******************************************************************************
189 1.1 christos *
190 1.1 christos * FUNCTION: CvIsFilename
191 1.1 christos *
192 1.1 christos * PARAMETERS: filename - input filename
193 1.1 christos *
194 1.1 christos * RETURN: BOOLEAN - TRUE if all characters are between 0x20 and 0x7f
195 1.1 christos *
196 1.1 christos * DESCRIPTION: Take a given char * and see if it contains all printable
197 1.1 christos * characters. If all characters have hexvalues 20-7f and ends with
198 1.1 christos * .dsl, we will assume that it is a proper filename.
199 1.1 christos *
200 1.1 christos ******************************************************************************/
201 1.1 christos
202 1.1 christos static BOOLEAN
203 1.1 christos CvIsFilename (
204 1.1 christos char *Filename)
205 1.1 christos {
206 1.1 christos UINT64 Length = strlen(Filename);
207 1.1 christos char *FileExt = Filename + Length - 4;
208 1.1.1.2 christos UINT64 i;
209 1.1 christos
210 1.1 christos
211 1.1 christos if ((Length > 4) && AcpiUtStricmp (FileExt, ".dsl"))
212 1.1 christos {
213 1.1.1.2 christos return (FALSE);
214 1.1 christos }
215 1.1 christos
216 1.1 christos for(i = 0; i<Length; ++i)
217 1.1 christos {
218 1.1.1.2 christos if (!isprint ((int) Filename[i]))
219 1.1 christos {
220 1.1.1.2 christos return (FALSE);
221 1.1 christos }
222 1.1 christos }
223 1.1.1.2 christos
224 1.1.1.2 christos return (TRUE);
225 1.1 christos }
226 1.1 christos
227 1.1 christos
228 1.1 christos /*******************************************************************************
229 1.1 christos *
230 1.1 christos * FUNCTION: CvInitFileTree
231 1.1 christos *
232 1.1 christos * PARAMETERS: Table - input table
233 1.1.1.8 christos * RootFile - Output file that defines the DefinitionBlock
234 1.1 christos *
235 1.1.1.2 christos * RETURN: None
236 1.1 christos *
237 1.1 christos * DESCRIPTION: Initialize the file dependency tree by scanning the AML.
238 1.1 christos * This is referred as ASL_CV_INIT_FILETREE.
239 1.1 christos *
240 1.1 christos ******************************************************************************/
241 1.1 christos
242 1.1 christos void
243 1.1 christos CvInitFileTree (
244 1.1 christos ACPI_TABLE_HEADER *Table,
245 1.1.1.8 christos FILE *RootFile)
246 1.1 christos {
247 1.1 christos UINT8 *TreeAml;
248 1.1 christos UINT8 *FileEnd;
249 1.1 christos char *Filename = NULL;
250 1.1 christos char *PreviousFilename = NULL;
251 1.1 christos char *ParentFilename = NULL;
252 1.1 christos char *ChildFilename = NULL;
253 1.1.1.8 christos UINT8 *AmlStart;
254 1.1.1.8 christos UINT32 AmlLength;
255 1.1 christos
256 1.1 christos
257 1.1.1.4 christos if (!AcpiGbl_CaptureComments)
258 1.1 christos {
259 1.1 christos return;
260 1.1 christos }
261 1.1 christos
262 1.1.1.8 christos
263 1.1.1.8 christos AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
264 1.1.1.8 christos AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
265 1.1.1.8 christos
266 1.1 christos CvDbgPrint ("AmlLength: %x\n", AmlLength);
267 1.1 christos CvDbgPrint ("AmlStart: %p\n", AmlStart);
268 1.1.1.8 christos CvDbgPrint ("AmlEnd: %p\n", AmlStart+AmlLength);
269 1.1 christos
270 1.1 christos AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache);
271 1.1.1.2 christos
272 1.1 christos AcpiGbl_FileTreeRoot->FileStart = (char *)(AmlStart);
273 1.1 christos AcpiGbl_FileTreeRoot->FileEnd = (char *)(AmlStart + Table->Length);
274 1.1 christos AcpiGbl_FileTreeRoot->Next = NULL;
275 1.1 christos AcpiGbl_FileTreeRoot->Parent = NULL;
276 1.1 christos AcpiGbl_FileTreeRoot->Filename = (char *)(AmlStart+2);
277 1.1 christos
278 1.1 christos /* Set the root file to the current open file */
279 1.1 christos
280 1.1.1.8 christos AcpiGbl_FileTreeRoot->File = RootFile;
281 1.1 christos
282 1.1 christos /*
283 1.1.1.6 christos * Set this to true because we don't need to output
284 1.1 christos * an include statement for the topmost file
285 1.1 christos */
286 1.1 christos AcpiGbl_FileTreeRoot->IncludeWritten = TRUE;
287 1.1 christos Filename = NULL;
288 1.1 christos AcpiGbl_CurrentFilename = (char *)(AmlStart+2);
289 1.1 christos AcpiGbl_RootFilename = (char *)(AmlStart+2);
290 1.1 christos
291 1.1 christos TreeAml = AmlStart;
292 1.1 christos FileEnd = AmlStart + AmlLength;
293 1.1 christos
294 1.1 christos while (TreeAml <= FileEnd)
295 1.1 christos {
296 1.1 christos /*
297 1.1 christos * Make sure that this filename contains all printable characters
298 1.1 christos * and a .dsl extension at the end. If not, then it must be some
299 1.1 christos * raw data that doesn't outline a filename.
300 1.1 christos */
301 1.1 christos if ((*TreeAml == AML_COMMENT_OP) &&
302 1.1.1.2 christos (*(TreeAml +1) == FILENAME_COMMENT) &&
303 1.1.1.2 christos (CvIsFilename ((char *)(TreeAml +2))))
304 1.1 christos {
305 1.1 christos CvDbgPrint ("A9 and a 08 file\n");
306 1.1 christos PreviousFilename = Filename;
307 1.1.1.2 christos Filename = (char *) (TreeAml +2);
308 1.1.1.2 christos
309 1.1 christos CvAddToFileTree (Filename, PreviousFilename);
310 1.1 christos ChildFilename = Filename;
311 1.1 christos CvDbgPrint ("%s\n", Filename);
312 1.1 christos }
313 1.1 christos else if ((*TreeAml == AML_COMMENT_OP) &&
314 1.1.1.2 christos (*(TreeAml +1) == PARENTFILENAME_COMMENT) &&
315 1.1.1.2 christos (CvIsFilename ((char *)(TreeAml +2))))
316 1.1 christos {
317 1.1 christos CvDbgPrint ("A9 and a 09 file\n");
318 1.1.1.2 christos ParentFilename = (char *)(TreeAml +2);
319 1.1 christos CvSetFileParent (ChildFilename, ParentFilename);
320 1.1 christos CvDbgPrint ("%s\n", ParentFilename);
321 1.1 christos }
322 1.1.1.2 christos
323 1.1 christos ++TreeAml;
324 1.1 christos }
325 1.1 christos }
326 1.1 christos
327 1.1 christos
328 1.1 christos /*******************************************************************************
329 1.1 christos *
330 1.1 christos * FUNCTION: CvClearOpComments
331 1.1 christos *
332 1.1 christos * PARAMETERS: Op -- clear all comments within this Op
333 1.1 christos *
334 1.1.1.2 christos * RETURN: None
335 1.1 christos *
336 1.1 christos * DESCRIPTION: Clear all converter-related fields of the given Op.
337 1.1 christos * This is referred as ASL_CV_CLEAR_OP_COMMENTS.
338 1.1 christos *
339 1.1 christos ******************************************************************************/
340 1.1 christos
341 1.1 christos void
342 1.1 christos CvClearOpComments (
343 1.1 christos ACPI_PARSE_OBJECT *Op)
344 1.1 christos {
345 1.1.1.2 christos
346 1.1 christos Op->Common.InlineComment = NULL;
347 1.1 christos Op->Common.EndNodeComment = NULL;
348 1.1 christos Op->Common.NameComment = NULL;
349 1.1 christos Op->Common.CommentList = NULL;
350 1.1 christos Op->Common.EndBlkComment = NULL;
351 1.1 christos Op->Common.CloseBraceComment = NULL;
352 1.1 christos Op->Common.CvFilename = NULL;
353 1.1 christos Op->Common.CvParentFilename = NULL;
354 1.1 christos }
355 1.1 christos
356 1.1 christos
357 1.1 christos /*******************************************************************************
358 1.1 christos *
359 1.1 christos * FUNCTION: CvCommentExists
360 1.1 christos *
361 1.1.1.2 christos * PARAMETERS: Address - check if this address appears in the list
362 1.1 christos *
363 1.1 christos * RETURN: BOOLEAN - TRUE if the address exists.
364 1.1 christos *
365 1.1.1.2 christos * DESCRIPTION: Look at the pointer address and check if this appears in the
366 1.1.1.2 christos * list of all addresses. If it exists in the list, return TRUE
367 1.1 christos * if it exists. Otherwise add to the list and return FALSE.
368 1.1 christos *
369 1.1 christos ******************************************************************************/
370 1.1 christos
371 1.1 christos static BOOLEAN
372 1.1 christos CvCommentExists (
373 1.1 christos UINT8 *Address)
374 1.1 christos {
375 1.1 christos ACPI_COMMENT_ADDR_NODE *Current = AcpiGbl_CommentAddrListHead;
376 1.1 christos UINT8 Option;
377 1.1 christos
378 1.1 christos
379 1.1 christos if (!Address)
380 1.1 christos {
381 1.1 christos return (FALSE);
382 1.1 christos }
383 1.1.1.2 christos
384 1.1 christos Option = *(Address + 1);
385 1.1 christos
386 1.1 christos /*
387 1.1.1.2 christos * FILENAME_COMMENT and PARENTFILENAME_COMMENT are not treated as
388 1.1.1.2 christos * comments. They serve as markers for where the file starts and ends.
389 1.1 christos */
390 1.1.1.2 christos if ((Option == FILENAME_COMMENT) ||
391 1.1.1.2 christos (Option == PARENTFILENAME_COMMENT))
392 1.1 christos {
393 1.1 christos return (FALSE);
394 1.1 christos }
395 1.1 christos
396 1.1 christos if (!Current)
397 1.1 christos {
398 1.1 christos AcpiGbl_CommentAddrListHead =
399 1.1 christos AcpiOsAcquireObject (AcpiGbl_RegCommentCache);
400 1.1 christos AcpiGbl_CommentAddrListHead->Addr = Address;
401 1.1 christos AcpiGbl_CommentAddrListHead->Next = NULL;
402 1.1 christos return (FALSE);
403 1.1 christos }
404 1.1 christos else
405 1.1 christos {
406 1.1 christos while (Current)
407 1.1 christos {
408 1.1 christos if (Current->Addr != Address)
409 1.1 christos {
410 1.1 christos Current = Current->Next;
411 1.1 christos }
412 1.1 christos else
413 1.1 christos {
414 1.1 christos return (TRUE);
415 1.1 christos }
416 1.1 christos }
417 1.1 christos
418 1.1 christos /*
419 1.1.1.2 christos * If the execution gets to this point, it means that this
420 1.1.1.2 christos * address does not exists in the list. Add this address to the
421 1.1 christos * beginning of the list.
422 1.1 christos */
423 1.1 christos Current = AcpiGbl_CommentAddrListHead;
424 1.1 christos AcpiGbl_CommentAddrListHead =
425 1.1 christos AcpiOsAcquireObject (AcpiGbl_RegCommentCache);
426 1.1.1.2 christos
427 1.1 christos AcpiGbl_CommentAddrListHead->Addr = Address;
428 1.1 christos AcpiGbl_CommentAddrListHead->Next = Current;
429 1.1 christos return (FALSE);
430 1.1 christos }
431 1.1 christos }
432 1.1 christos
433 1.1 christos
434 1.1 christos /*******************************************************************************
435 1.1 christos *
436 1.1 christos * FUNCTION: CvFilenameExists
437 1.1 christos *
438 1.1 christos * PARAMETERS: Filename - filename to search
439 1.1 christos *
440 1.1 christos * RETURN: ACPI_FILE_NODE - a pointer to a file node
441 1.1 christos *
442 1.1 christos * DESCRIPTION: Look for the given filename in the file dependency tree.
443 1.1 christos * Returns the file node if it exists, returns NULL if it does not.
444 1.1 christos *
445 1.1 christos ******************************************************************************/
446 1.1 christos
447 1.1 christos ACPI_FILE_NODE*
448 1.1 christos CvFilenameExists(
449 1.1 christos char *Filename,
450 1.1 christos ACPI_FILE_NODE *Head)
451 1.1 christos {
452 1.1 christos ACPI_FILE_NODE *Current = Head;
453 1.1 christos
454 1.1 christos
455 1.1.1.2 christos if (!Filename)
456 1.1.1.2 christos {
457 1.1.1.2 christos return (NULL);
458 1.1.1.2 christos }
459 1.1.1.2 christos
460 1.1 christos while (Current)
461 1.1 christos {
462 1.1 christos if (!AcpiUtStricmp (Current->Filename, Filename))
463 1.1 christos {
464 1.1 christos return (Current);
465 1.1 christos }
466 1.1.1.2 christos
467 1.1 christos Current = Current->Next;
468 1.1 christos }
469 1.1 christos return (NULL);
470 1.1 christos }
471 1.1 christos
472 1.1 christos
473 1.1 christos /*******************************************************************************
474 1.1 christos *
475 1.1 christos * FUNCTION: CvFileAddressLookup
476 1.1 christos *
477 1.1 christos * PARAMETERS: Address - address to look up
478 1.1 christos * Head - file dependency tree
479 1.1 christos *
480 1.1.1.2 christos * RETURN: ACPI_FILE_NODE - pointer to a file node containing the address
481 1.1 christos *
482 1.1 christos * DESCRIPTION: Look for the given address in the file dependency tree.
483 1.1 christos * Returns the first file node where the given address is within
484 1.1 christos * the file node's starting and ending address.
485 1.1 christos *
486 1.1 christos ******************************************************************************/
487 1.1 christos
488 1.1.1.2 christos static ACPI_FILE_NODE *
489 1.1 christos CvFileAddressLookup(
490 1.1 christos char *Address,
491 1.1 christos ACPI_FILE_NODE *Head)
492 1.1 christos {
493 1.1 christos ACPI_FILE_NODE *Current = Head;
494 1.1 christos
495 1.1 christos
496 1.1 christos while (Current)
497 1.1 christos {
498 1.1 christos if ((Address >= Current->FileStart) &&
499 1.1 christos (Address < Current->FileEnd ||
500 1.1 christos !Current->FileEnd))
501 1.1 christos {
502 1.1 christos return (Current);
503 1.1 christos }
504 1.1.1.2 christos
505 1.1 christos Current = Current->Next;
506 1.1 christos }
507 1.1 christos
508 1.1 christos return (NULL);
509 1.1 christos }
510 1.1 christos
511 1.1 christos
512 1.1 christos /*******************************************************************************
513 1.1 christos *
514 1.1 christos * FUNCTION: CvLabelFileNode
515 1.1 christos *
516 1.1 christos * PARAMETERS: Op
517 1.1 christos *
518 1.1 christos * RETURN: None
519 1.1 christos *
520 1.1 christos * DESCRIPTION: Takes a given parse op, looks up its Op->Common.Aml field
521 1.1.1.6 christos * within the file tree and fills in appropriate file information
522 1.1 christos * from a matching node within the tree.
523 1.1 christos * This is referred as ASL_CV_LABEL_FILENODE.
524 1.1 christos *
525 1.1 christos ******************************************************************************/
526 1.1 christos
527 1.1 christos void
528 1.1 christos CvLabelFileNode(
529 1.1 christos ACPI_PARSE_OBJECT *Op)
530 1.1 christos {
531 1.1 christos ACPI_FILE_NODE *Node;
532 1.1 christos
533 1.1 christos
534 1.1 christos if (!Op)
535 1.1 christos {
536 1.1 christos return;
537 1.1 christos }
538 1.1 christos
539 1.1.1.2 christos Node = CvFileAddressLookup ((char *)
540 1.1.1.2 christos Op->Common.Aml, AcpiGbl_FileTreeRoot);
541 1.1 christos if (!Node)
542 1.1 christos {
543 1.1 christos return;
544 1.1 christos }
545 1.1 christos
546 1.1 christos Op->Common.CvFilename = Node->Filename;
547 1.1 christos if (Node->Parent)
548 1.1 christos {
549 1.1 christos Op->Common.CvParentFilename = Node->Parent->Filename;
550 1.1 christos }
551 1.1 christos else
552 1.1 christos {
553 1.1 christos Op->Common.CvParentFilename = Node->Filename;
554 1.1 christos }
555 1.1 christos }
556 1.1 christos
557 1.1 christos
558 1.1 christos /*******************************************************************************
559 1.1 christos *
560 1.1 christos * FUNCTION: CvAddToFileTree
561 1.1 christos *
562 1.1 christos * PARAMETERS: Filename - Address containing the name of the current
563 1.1 christos * filename
564 1.1 christos * PreviousFilename - Address containing the name of the previous
565 1.1 christos * filename
566 1.1 christos *
567 1.1.1.2 christos * RETURN: None
568 1.1 christos *
569 1.1 christos * DESCRIPTION: Add this filename to the AcpiGbl_FileTree if it does not exist.
570 1.1 christos *
571 1.1 christos ******************************************************************************/
572 1.1 christos
573 1.1 christos static void
574 1.1 christos CvAddToFileTree (
575 1.1 christos char *Filename,
576 1.1 christos char *PreviousFilename)
577 1.1 christos {
578 1.1 christos ACPI_FILE_NODE *Node;
579 1.1 christos
580 1.1 christos
581 1.1 christos if (!AcpiUtStricmp(Filename, AcpiGbl_RootFilename) &&
582 1.1 christos PreviousFilename)
583 1.1 christos {
584 1.1 christos Node = CvFilenameExists (PreviousFilename, AcpiGbl_FileTreeRoot);
585 1.1 christos if (Node)
586 1.1 christos {
587 1.1 christos /*
588 1.1 christos * Set the end point of the PreviousFilename to the address
589 1.1 christos * of Filename.
590 1.1 christos */
591 1.1 christos Node->FileEnd = Filename;
592 1.1 christos }
593 1.1 christos }
594 1.1 christos else if (!AcpiUtStricmp(Filename, AcpiGbl_RootFilename) &&
595 1.1 christos !PreviousFilename)
596 1.1 christos {
597 1.1 christos return;
598 1.1 christos }
599 1.1 christos
600 1.1 christos Node = CvFilenameExists (Filename, AcpiGbl_FileTreeRoot);
601 1.1 christos if (Node && PreviousFilename)
602 1.1 christos {
603 1.1 christos /*
604 1.1.1.2 christos * Update the end of the previous file and all of their parents'
605 1.1.1.2 christos * ending addresses. This is done to ensure that parent file
606 1.1.1.2 christos * ranges extend to the end of their childrens' files.
607 1.1 christos */
608 1.1 christos Node = CvFilenameExists (PreviousFilename, AcpiGbl_FileTreeRoot);
609 1.1 christos if (Node && (Node->FileEnd < Filename))
610 1.1 christos {
611 1.1 christos Node->FileEnd = Filename;
612 1.1 christos Node = Node->Parent;
613 1.1 christos while (Node)
614 1.1 christos {
615 1.1 christos if (Node->FileEnd < Filename)
616 1.1 christos {
617 1.1 christos Node->FileEnd = Filename;
618 1.1 christos }
619 1.1.1.2 christos
620 1.1 christos Node = Node->Parent;
621 1.1 christos }
622 1.1 christos }
623 1.1 christos }
624 1.1 christos else
625 1.1 christos {
626 1.1 christos Node = AcpiGbl_FileTreeRoot;
627 1.1 christos AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache);
628 1.1.1.2 christos
629 1.1 christos AcpiGbl_FileTreeRoot->Next = Node;
630 1.1 christos AcpiGbl_FileTreeRoot->Parent = NULL;
631 1.1 christos AcpiGbl_FileTreeRoot->Filename = Filename;
632 1.1 christos AcpiGbl_FileTreeRoot->FileStart = Filename;
633 1.1 christos AcpiGbl_FileTreeRoot->IncludeWritten = FALSE;
634 1.1 christos AcpiGbl_FileTreeRoot->File = fopen(Filename, "w+");
635 1.1 christos
636 1.1 christos /*
637 1.1 christos * If we can't open the file, we need to abort here before we
638 1.1 christos * accidentally write to a NULL file.
639 1.1 christos */
640 1.1 christos if (!AcpiGbl_FileTreeRoot->File)
641 1.1 christos {
642 1.1 christos /* delete the .xxx file */
643 1.1 christos
644 1.1 christos FlDeleteFile (ASL_FILE_AML_OUTPUT);
645 1.1.1.5 christos sprintf (AslGbl_MsgBuffer, "\"%s\" - %s", Filename, strerror (errno));
646 1.1.1.2 christos AslCommonError (ASL_ERROR, ASL_MSG_OPEN, 0, 0, 0, 0,
647 1.1.1.5 christos NULL, AslGbl_MsgBuffer);
648 1.1 christos AslAbort ();
649 1.1 christos }
650 1.1 christos }
651 1.1 christos }
652 1.1 christos
653 1.1 christos
654 1.1 christos /*******************************************************************************
655 1.1 christos *
656 1.1 christos * FUNCTION: CvSetFileParent
657 1.1 christos *
658 1.1 christos * PARAMETERS: ChildFile - contains the filename of the child file
659 1.1 christos * ParentFile - contains the filename of the parent file.
660 1.1 christos *
661 1.1.1.2 christos * RETURN: None
662 1.1 christos *
663 1.1.1.2 christos * DESCRIPTION: Point the parent pointer of the Child to the node that
664 1.1 christos * corresponds with the parent file node.
665 1.1 christos *
666 1.1 christos ******************************************************************************/
667 1.1 christos
668 1.1 christos static void
669 1.1 christos CvSetFileParent (
670 1.1 christos char *ChildFile,
671 1.1 christos char *ParentFile)
672 1.1 christos {
673 1.1 christos ACPI_FILE_NODE *Child;
674 1.1 christos ACPI_FILE_NODE *Parent;
675 1.1 christos
676 1.1 christos
677 1.1 christos Child = CvFilenameExists (ChildFile, AcpiGbl_FileTreeRoot);
678 1.1 christos Parent = CvFilenameExists (ParentFile, AcpiGbl_FileTreeRoot);
679 1.1.1.2 christos
680 1.1 christos if (Child && Parent)
681 1.1 christos {
682 1.1 christos Child->Parent = Parent;
683 1.1 christos
684 1.1 christos while (Child->Parent)
685 1.1 christos {
686 1.1 christos if (Child->Parent->FileEnd < Child->FileStart)
687 1.1 christos {
688 1.1 christos Child->Parent->FileEnd = Child->FileStart;
689 1.1 christos }
690 1.1.1.2 christos
691 1.1 christos Child = Child->Parent;
692 1.1 christos }
693 1.1 christos }
694 1.1 christos }
695 1.1 christos
696 1.1 christos
697 1.1 christos /*******************************************************************************
698 1.1 christos *
699 1.1 christos * FUNCTION: CvCaptureCommentsOnly
700 1.1 christos *
701 1.1 christos * PARAMETERS: ParserState - A parser state object
702 1.1 christos *
703 1.1.1.2 christos * RETURN: None
704 1.1 christos *
705 1.1.1.2 christos * DESCRIPTION: Look at the aml that the parser state is pointing to,
706 1.1 christos * capture any AML_COMMENT_OP and it's arguments and increment the
707 1.1 christos * aml pointer past the comment. Comments are transferred to parse
708 1.1 christos * nodes through CvTransferComments() as well as
709 1.1 christos * AcpiPsBuildNamedOp().
710 1.1 christos * This is referred as ASL_CV_CAPTURE_COMMENTS_ONLY.
711 1.1 christos *
712 1.1 christos ******************************************************************************/
713 1.1 christos
714 1.1 christos void
715 1.1 christos CvCaptureCommentsOnly (
716 1.1 christos ACPI_PARSE_STATE *ParserState)
717 1.1 christos {
718 1.1 christos UINT8 *Aml = ParserState->Aml;
719 1.1 christos UINT16 Opcode = (UINT16) ACPI_GET8 (Aml);
720 1.1 christos UINT32 Length = 0;
721 1.1.1.3 christos UINT8 CommentOption;
722 1.1 christos BOOLEAN StdDefBlockFlag = FALSE;
723 1.1 christos ACPI_COMMENT_NODE *CommentNode;
724 1.1 christos ACPI_FILE_NODE *FileNode;
725 1.1 christos
726 1.1 christos
727 1.1.1.4 christos if (!AcpiGbl_CaptureComments ||
728 1.1 christos Opcode != AML_COMMENT_OP)
729 1.1 christos {
730 1.1 christos return;
731 1.1 christos }
732 1.1 christos
733 1.1 christos while (Opcode == AML_COMMENT_OP)
734 1.1 christos {
735 1.1 christos CvDbgPrint ("comment aml address: %p\n", Aml);
736 1.1 christos
737 1.1 christos if (CvCommentExists(ParserState->Aml))
738 1.1 christos {
739 1.1 christos CvDbgPrint ("Avoiding capturing an existing comment.\n");
740 1.1 christos }
741 1.1 christos else
742 1.1 christos {
743 1.1.1.2 christos CommentOption = *(Aml +1);
744 1.1 christos
745 1.1.1.2 christos /*
746 1.1.1.2 christos * Increment past the comment option and point the
747 1.1.1.2 christos * appropriate char pointers
748 1.1.1.2 christos */
749 1.1 christos Aml += 2;
750 1.1 christos
751 1.1.1.2 christos /* Found a comment. Now, set pointers to these comments. */
752 1.1 christos
753 1.1 christos switch (CommentOption)
754 1.1 christos {
755 1.1 christos case STD_DEFBLK_COMMENT:
756 1.1 christos
757 1.1 christos StdDefBlockFlag = TRUE;
758 1.1 christos
759 1.1.1.2 christos /*
760 1.1.1.2 christos * Add to a linked list of nodes. This list will be
761 1.1.1.2 christos * taken by the parse node created next.
762 1.1.1.2 christos */
763 1.1.1.2 christos CommentNode = AcpiOsAcquireObject (
764 1.1.1.2 christos AcpiGbl_RegCommentCache);
765 1.1 christos CommentNode->Comment = ACPI_CAST_PTR (char, Aml);
766 1.1 christos CommentNode->Next = NULL;
767 1.1 christos
768 1.1 christos if (!AcpiGbl_DefBlkCommentListHead)
769 1.1 christos {
770 1.1 christos AcpiGbl_DefBlkCommentListHead = CommentNode;
771 1.1 christos AcpiGbl_DefBlkCommentListTail = CommentNode;
772 1.1 christos }
773 1.1 christos else
774 1.1 christos {
775 1.1 christos AcpiGbl_DefBlkCommentListTail->Next = CommentNode;
776 1.1.1.2 christos AcpiGbl_DefBlkCommentListTail =
777 1.1.1.2 christos AcpiGbl_DefBlkCommentListTail->Next;
778 1.1 christos }
779 1.1 christos break;
780 1.1 christos
781 1.1 christos case STANDARD_COMMENT:
782 1.1 christos
783 1.1 christos CvDbgPrint ("found regular comment.\n");
784 1.1 christos
785 1.1.1.2 christos /*
786 1.1.1.2 christos * Add to a linked list of nodes. This list will be
787 1.1.1.2 christos * taken by the parse node created next.
788 1.1.1.2 christos */
789 1.1.1.2 christos CommentNode = AcpiOsAcquireObject (
790 1.1.1.2 christos AcpiGbl_RegCommentCache);
791 1.1 christos CommentNode->Comment = ACPI_CAST_PTR (char, Aml);
792 1.1 christos CommentNode->Next = NULL;
793 1.1 christos
794 1.1 christos if (!AcpiGbl_RegCommentListHead)
795 1.1 christos {
796 1.1 christos AcpiGbl_RegCommentListHead = CommentNode;
797 1.1 christos AcpiGbl_RegCommentListTail = CommentNode;
798 1.1 christos }
799 1.1 christos else
800 1.1 christos {
801 1.1 christos AcpiGbl_RegCommentListTail->Next = CommentNode;
802 1.1.1.2 christos AcpiGbl_RegCommentListTail =
803 1.1.1.2 christos AcpiGbl_RegCommentListTail->Next;
804 1.1 christos }
805 1.1 christos break;
806 1.1 christos
807 1.1 christos case ENDBLK_COMMENT:
808 1.1 christos
809 1.1 christos CvDbgPrint ("found endblk comment.\n");
810 1.1 christos
811 1.1.1.2 christos /* Add to a linked list of nodes. This will be
812 1.1.1.2 christos * taken by the next created parse node.
813 1.1.1.2 christos */
814 1.1.1.2 christos CommentNode = AcpiOsAcquireObject (
815 1.1.1.2 christos AcpiGbl_RegCommentCache);
816 1.1 christos CommentNode->Comment = ACPI_CAST_PTR (char, Aml);
817 1.1 christos CommentNode->Next = NULL;
818 1.1 christos
819 1.1 christos if (!AcpiGbl_EndBlkCommentListHead)
820 1.1 christos {
821 1.1 christos AcpiGbl_EndBlkCommentListHead = CommentNode;
822 1.1 christos AcpiGbl_EndBlkCommentListTail = CommentNode;
823 1.1 christos }
824 1.1 christos else
825 1.1 christos {
826 1.1 christos AcpiGbl_EndBlkCommentListTail->Next = CommentNode;
827 1.1.1.2 christos AcpiGbl_EndBlkCommentListTail =
828 1.1.1.2 christos AcpiGbl_EndBlkCommentListTail->Next;
829 1.1 christos }
830 1.1 christos break;
831 1.1 christos
832 1.1 christos case INLINE_COMMENT:
833 1.1 christos
834 1.1 christos CvDbgPrint ("found inline comment.\n");
835 1.1.1.2 christos AcpiGbl_CurrentInlineComment =
836 1.1.1.2 christos ACPI_CAST_PTR (char, Aml);
837 1.1 christos break;
838 1.1 christos
839 1.1 christos case ENDNODE_COMMENT:
840 1.1 christos
841 1.1 christos CvDbgPrint ("found EndNode comment.\n");
842 1.1.1.2 christos AcpiGbl_CurrentEndNodeComment =
843 1.1.1.2 christos ACPI_CAST_PTR (char, Aml);
844 1.1 christos break;
845 1.1 christos
846 1.1 christos case CLOSE_BRACE_COMMENT:
847 1.1 christos
848 1.1 christos CvDbgPrint ("found close brace comment.\n");
849 1.1.1.2 christos AcpiGbl_CurrentCloseBraceComment =
850 1.1.1.2 christos ACPI_CAST_PTR (char, Aml);
851 1.1 christos break;
852 1.1 christos
853 1.1 christos case END_DEFBLK_COMMENT:
854 1.1 christos
855 1.1.1.2 christos CvDbgPrint ("Found comment that belongs after"
856 1.1.1.2 christos " the } for a definition block.\n");
857 1.1.1.2 christos AcpiGbl_CurrentScope->Common.CloseBraceComment =
858 1.1.1.2 christos ACPI_CAST_PTR (char, Aml);
859 1.1 christos break;
860 1.1 christos
861 1.1 christos case FILENAME_COMMENT:
862 1.1 christos
863 1.1.1.2 christos CvDbgPrint ("Found a filename: %s\n",
864 1.1.1.2 christos ACPI_CAST_PTR (char, Aml));
865 1.1.1.2 christos FileNode = CvFilenameExists (
866 1.1.1.2 christos ACPI_CAST_PTR (char, Aml), AcpiGbl_FileTreeRoot);
867 1.1 christos
868 1.1 christos /*
869 1.1 christos * If there is an INCLUDE_COMMENT followed by a
870 1.1 christos * FILENAME_COMMENT, then the INCLUDE_COMMENT is a comment
871 1.1 christos * that is emitted before the #include for the file.
872 1.1 christos * We will save the IncludeComment within the FileNode
873 1.1 christos * associated with this FILENAME_COMMENT.
874 1.1 christos */
875 1.1 christos if (FileNode && AcpiGbl_IncCommentListHead)
876 1.1 christos {
877 1.1 christos FileNode->IncludeComment = AcpiGbl_IncCommentListHead;
878 1.1 christos AcpiGbl_IncCommentListHead = NULL;
879 1.1 christos AcpiGbl_IncCommentListTail = NULL;
880 1.1 christos }
881 1.1 christos break;
882 1.1 christos
883 1.1 christos case PARENTFILENAME_COMMENT:
884 1.1 christos CvDbgPrint (" Found a parent filename.\n");
885 1.1 christos break;
886 1.1 christos
887 1.1 christos case INCLUDE_COMMENT:
888 1.1 christos
889 1.1 christos /*
890 1.1 christos * Add to a linked list. This list will be taken by the
891 1.1 christos * parse node created next. See the FILENAME_COMMENT case
892 1.1 christos * for more details
893 1.1 christos */
894 1.1.1.2 christos CommentNode = AcpiOsAcquireObject (
895 1.1.1.2 christos AcpiGbl_RegCommentCache);
896 1.1 christos CommentNode->Comment = ACPI_CAST_PTR (char, Aml);
897 1.1 christos CommentNode->Next = NULL;
898 1.1 christos
899 1.1 christos if (!AcpiGbl_IncCommentListHead)
900 1.1 christos {
901 1.1 christos AcpiGbl_IncCommentListHead = CommentNode;
902 1.1 christos AcpiGbl_IncCommentListTail = CommentNode;
903 1.1 christos }
904 1.1 christos else
905 1.1 christos {
906 1.1 christos AcpiGbl_IncCommentListTail->Next = CommentNode;
907 1.1.1.2 christos AcpiGbl_IncCommentListTail =
908 1.1.1.2 christos AcpiGbl_IncCommentListTail->Next;
909 1.1 christos }
910 1.1 christos
911 1.1.1.2 christos CvDbgPrint ("Found a include comment: %s\n",
912 1.1.1.2 christos CommentNode->Comment);
913 1.1 christos break;
914 1.1 christos
915 1.1 christos default:
916 1.1 christos
917 1.1 christos /* Not a valid comment option. Revert the AML */
918 1.1 christos
919 1.1 christos goto DefBlock;
920 1.1 christos
921 1.1.1.2 christos } /* End switch statement */
922 1.1 christos
923 1.1.1.2 christos } /* End else */
924 1.1 christos
925 1.1.1.2 christos /* Determine the length and move forward that amount */
926 1.1 christos
927 1.1 christos Length = 0;
928 1.1 christos while (ParserState->Aml[Length])
929 1.1 christos {
930 1.1 christos Length++;
931 1.1 christos }
932 1.1 christos
933 1.1 christos ParserState->Aml += Length + 1;
934 1.1 christos
935 1.1 christos /* Peek at the next Opcode. */
936 1.1 christos
937 1.1 christos Aml = ParserState->Aml;
938 1.1 christos Opcode = (UINT16) ACPI_GET8 (Aml);
939 1.1 christos }
940 1.1 christos
941 1.1 christos DefBlock:
942 1.1 christos if (StdDefBlockFlag)
943 1.1 christos {
944 1.1 christos /*
945 1.1 christos * Give all of its comments to the current scope, which is known as
946 1.1 christos * the definition block, since STD_DEFBLK_COMMENT only appears after
947 1.1 christos * definition block headers.
948 1.1 christos */
949 1.1 christos AcpiGbl_CurrentScope->Common.CommentList
950 1.1 christos = AcpiGbl_DefBlkCommentListHead;
951 1.1 christos AcpiGbl_DefBlkCommentListHead = NULL;
952 1.1 christos AcpiGbl_DefBlkCommentListTail = NULL;
953 1.1 christos }
954 1.1 christos }
955 1.1 christos
956 1.1 christos
957 1.1 christos /*******************************************************************************
958 1.1 christos *
959 1.1 christos * FUNCTION: CvCaptureComments
960 1.1 christos *
961 1.1 christos * PARAMETERS: ParserState - A parser state object
962 1.1 christos *
963 1.1.1.2 christos * RETURN: None
964 1.1 christos *
965 1.1 christos * DESCRIPTION: Wrapper function for CvCaptureCommentsOnly
966 1.1 christos * This is referred as ASL_CV_CAPTURE_COMMENTS.
967 1.1 christos *
968 1.1 christos ******************************************************************************/
969 1.1 christos
970 1.1 christos void
971 1.1 christos CvCaptureComments (
972 1.1 christos ACPI_WALK_STATE *WalkState)
973 1.1 christos {
974 1.1 christos UINT8 *Aml;
975 1.1 christos UINT16 Opcode;
976 1.1 christos const ACPI_OPCODE_INFO *OpInfo;
977 1.1 christos
978 1.1 christos
979 1.1.1.4 christos if (!AcpiGbl_CaptureComments)
980 1.1 christos {
981 1.1 christos return;
982 1.1 christos }
983 1.1 christos
984 1.1 christos /*
985 1.1.1.2 christos * Before parsing, check to see that comments that come directly
986 1.1.1.2 christos * after deferred opcodes aren't being processed.
987 1.1 christos */
988 1.1 christos Aml = WalkState->ParserState.Aml;
989 1.1 christos Opcode = (UINT16) ACPI_GET8 (Aml);
990 1.1 christos OpInfo = AcpiPsGetOpcodeInfo (Opcode);
991 1.1 christos
992 1.1 christos if (!(OpInfo->Flags & AML_DEFER) ||
993 1.1 christos ((OpInfo->Flags & AML_DEFER) &&
994 1.1 christos (WalkState->PassNumber != ACPI_IMODE_LOAD_PASS1)))
995 1.1 christos {
996 1.1 christos CvCaptureCommentsOnly (&WalkState->ParserState);
997 1.1 christos WalkState->Aml = WalkState->ParserState.Aml;
998 1.1 christos }
999 1.1 christos
1000 1.1 christos }
1001 1.1 christos
1002 1.1 christos
1003 1.1 christos /*******************************************************************************
1004 1.1 christos *
1005 1.1 christos * FUNCTION: CvTransferComments
1006 1.1 christos *
1007 1.1.1.2 christos * PARAMETERS: Op - Transfer comments to this Op
1008 1.1 christos *
1009 1.1.1.2 christos * RETURN: None
1010 1.1 christos *
1011 1.1.1.6 christos * DESCRIPTION: Transfer all of the comments stored in global containers to the
1012 1.1 christos * given Op. This will be invoked shortly after the parser creates
1013 1.1 christos * a ParseOp.
1014 1.1 christos * This is referred as ASL_CV_TRANSFER_COMMENTS.
1015 1.1 christos *
1016 1.1 christos ******************************************************************************/
1017 1.1 christos
1018 1.1 christos void
1019 1.1 christos CvTransferComments (
1020 1.1 christos ACPI_PARSE_OBJECT *Op)
1021 1.1 christos {
1022 1.1.1.2 christos
1023 1.1 christos Op->Common.InlineComment = AcpiGbl_CurrentInlineComment;
1024 1.1 christos AcpiGbl_CurrentInlineComment = NULL;
1025 1.1 christos
1026 1.1 christos Op->Common.EndNodeComment = AcpiGbl_CurrentEndNodeComment;
1027 1.1 christos AcpiGbl_CurrentEndNodeComment = NULL;
1028 1.1 christos
1029 1.1 christos Op->Common.CloseBraceComment = AcpiGbl_CurrentCloseBraceComment;
1030 1.1 christos AcpiGbl_CurrentCloseBraceComment = NULL;
1031 1.1 christos
1032 1.1 christos Op->Common.CommentList = AcpiGbl_RegCommentListHead;
1033 1.1 christos AcpiGbl_RegCommentListHead = NULL;
1034 1.1 christos AcpiGbl_RegCommentListTail = NULL;
1035 1.1 christos
1036 1.1 christos Op->Common.EndBlkComment = AcpiGbl_EndBlkCommentListHead;
1037 1.1 christos AcpiGbl_EndBlkCommentListHead = NULL;
1038 1.1 christos AcpiGbl_EndBlkCommentListTail = NULL;
1039 1.1 christos }
1040