cvparser.c revision 1.1.1.1.8.2 1 1.1.1.1.8.2 skrll /******************************************************************************
2 1.1.1.1.8.2 skrll *
3 1.1.1.1.8.2 skrll * Module Name: cvparser - Converter functions that are called from the AML
4 1.1.1.1.8.2 skrll * parser.
5 1.1.1.1.8.2 skrll *
6 1.1.1.1.8.2 skrll *****************************************************************************/
7 1.1.1.1.8.2 skrll
8 1.1.1.1.8.2 skrll /*
9 1.1.1.1.8.2 skrll * Copyright (C) 2000 - 2017, Intel Corp.
10 1.1.1.1.8.2 skrll * All rights reserved.
11 1.1.1.1.8.2 skrll *
12 1.1.1.1.8.2 skrll * Redistribution and use in source and binary forms, with or without
13 1.1.1.1.8.2 skrll * modification, are permitted provided that the following conditions
14 1.1.1.1.8.2 skrll * are met:
15 1.1.1.1.8.2 skrll * 1. Redistributions of source code must retain the above copyright
16 1.1.1.1.8.2 skrll * notice, this list of conditions, and the following disclaimer,
17 1.1.1.1.8.2 skrll * without modification.
18 1.1.1.1.8.2 skrll * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19 1.1.1.1.8.2 skrll * substantially similar to the "NO WARRANTY" disclaimer below
20 1.1.1.1.8.2 skrll * ("Disclaimer") and any redistribution must be conditioned upon
21 1.1.1.1.8.2 skrll * including a substantially similar Disclaimer requirement for further
22 1.1.1.1.8.2 skrll * binary redistribution.
23 1.1.1.1.8.2 skrll * 3. Neither the names of the above-listed copyright holders nor the names
24 1.1.1.1.8.2 skrll * of any contributors may be used to endorse or promote products derived
25 1.1.1.1.8.2 skrll * from this software without specific prior written permission.
26 1.1.1.1.8.2 skrll *
27 1.1.1.1.8.2 skrll * Alternatively, this software may be distributed under the terms of the
28 1.1.1.1.8.2 skrll * GNU General Public License ("GPL") version 2 as published by the Free
29 1.1.1.1.8.2 skrll * Software Foundation.
30 1.1.1.1.8.2 skrll *
31 1.1.1.1.8.2 skrll * NO WARRANTY
32 1.1.1.1.8.2 skrll * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33 1.1.1.1.8.2 skrll * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34 1.1.1.1.8.2 skrll * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35 1.1.1.1.8.2 skrll * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36 1.1.1.1.8.2 skrll * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37 1.1.1.1.8.2 skrll * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38 1.1.1.1.8.2 skrll * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39 1.1.1.1.8.2 skrll * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40 1.1.1.1.8.2 skrll * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41 1.1.1.1.8.2 skrll * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42 1.1.1.1.8.2 skrll * POSSIBILITY OF SUCH DAMAGES.
43 1.1.1.1.8.2 skrll */
44 1.1.1.1.8.2 skrll
45 1.1.1.1.8.2 skrll #include "aslcompiler.h"
46 1.1.1.1.8.2 skrll #include "acparser.h"
47 1.1.1.1.8.2 skrll #include "acdispat.h"
48 1.1.1.1.8.2 skrll #include "amlcode.h"
49 1.1.1.1.8.2 skrll #include "acinterp.h"
50 1.1.1.1.8.2 skrll #include "acdisasm.h"
51 1.1.1.1.8.2 skrll #include "acconvert.h"
52 1.1.1.1.8.2 skrll
53 1.1.1.1.8.2 skrll
54 1.1.1.1.8.2 skrll /* local prototypes */
55 1.1.1.1.8.2 skrll
56 1.1.1.1.8.2 skrll static BOOLEAN
57 1.1.1.1.8.2 skrll CvCommentExists (
58 1.1.1.1.8.2 skrll UINT8 *Address);
59 1.1.1.1.8.2 skrll
60 1.1.1.1.8.2 skrll static BOOLEAN
61 1.1.1.1.8.2 skrll CvIsFilename (
62 1.1.1.1.8.2 skrll char *Filename);
63 1.1.1.1.8.2 skrll
64 1.1.1.1.8.2 skrll static ACPI_FILE_NODE*
65 1.1.1.1.8.2 skrll CvFileAddressLookup(
66 1.1.1.1.8.2 skrll char *Address,
67 1.1.1.1.8.2 skrll ACPI_FILE_NODE *Head);
68 1.1.1.1.8.2 skrll
69 1.1.1.1.8.2 skrll static void
70 1.1.1.1.8.2 skrll CvAddToFileTree (
71 1.1.1.1.8.2 skrll char *Filename,
72 1.1.1.1.8.2 skrll char *PreviousFilename);
73 1.1.1.1.8.2 skrll
74 1.1.1.1.8.2 skrll static void
75 1.1.1.1.8.2 skrll CvSetFileParent (
76 1.1.1.1.8.2 skrll char *ChildFile,
77 1.1.1.1.8.2 skrll char *ParentFile);
78 1.1.1.1.8.2 skrll
79 1.1.1.1.8.2 skrll
80 1.1.1.1.8.2 skrll /*******************************************************************************
81 1.1.1.1.8.2 skrll *
82 1.1.1.1.8.2 skrll * FUNCTION: CvIsFilename
83 1.1.1.1.8.2 skrll *
84 1.1.1.1.8.2 skrll * PARAMETERS: filename - input filename
85 1.1.1.1.8.2 skrll *
86 1.1.1.1.8.2 skrll * RETURN: BOOLEAN - TRUE if all characters are between 0x20 and 0x7f
87 1.1.1.1.8.2 skrll *
88 1.1.1.1.8.2 skrll * DESCRIPTION: Take a given char * and see if it contains all printable
89 1.1.1.1.8.2 skrll * characters. If all characters have hexvalues 20-7f and ends with
90 1.1.1.1.8.2 skrll * .dsl, we will assume that it is a proper filename.
91 1.1.1.1.8.2 skrll *
92 1.1.1.1.8.2 skrll ******************************************************************************/
93 1.1.1.1.8.2 skrll
94 1.1.1.1.8.2 skrll static BOOLEAN
95 1.1.1.1.8.2 skrll CvIsFilename (
96 1.1.1.1.8.2 skrll char *Filename)
97 1.1.1.1.8.2 skrll {
98 1.1.1.1.8.2 skrll UINT64 Length = strlen(Filename);
99 1.1.1.1.8.2 skrll UINT64 i;
100 1.1.1.1.8.2 skrll char *FileExt = Filename + Length - 4;
101 1.1.1.1.8.2 skrll
102 1.1.1.1.8.2 skrll
103 1.1.1.1.8.2 skrll if ((Length > 4) && AcpiUtStricmp (FileExt, ".dsl"))
104 1.1.1.1.8.2 skrll {
105 1.1.1.1.8.2 skrll return FALSE;
106 1.1.1.1.8.2 skrll }
107 1.1.1.1.8.2 skrll
108 1.1.1.1.8.2 skrll for(i = 0; i<Length; ++i)
109 1.1.1.1.8.2 skrll {
110 1.1.1.1.8.2 skrll if (!isprint (Filename[i]))
111 1.1.1.1.8.2 skrll {
112 1.1.1.1.8.2 skrll return FALSE;
113 1.1.1.1.8.2 skrll }
114 1.1.1.1.8.2 skrll }
115 1.1.1.1.8.2 skrll return TRUE;
116 1.1.1.1.8.2 skrll }
117 1.1.1.1.8.2 skrll
118 1.1.1.1.8.2 skrll
119 1.1.1.1.8.2 skrll /*******************************************************************************
120 1.1.1.1.8.2 skrll *
121 1.1.1.1.8.2 skrll * FUNCTION: CvInitFileTree
122 1.1.1.1.8.2 skrll *
123 1.1.1.1.8.2 skrll * PARAMETERS: Table - input table
124 1.1.1.1.8.2 skrll * AmlStart - Address of the starting point of the AML.
125 1.1.1.1.8.2 skrll * AmlLength - Length of the AML file.
126 1.1.1.1.8.2 skrll *
127 1.1.1.1.8.2 skrll * RETURN: none
128 1.1.1.1.8.2 skrll *
129 1.1.1.1.8.2 skrll * DESCRIPTION: Initialize the file dependency tree by scanning the AML.
130 1.1.1.1.8.2 skrll * This is referred as ASL_CV_INIT_FILETREE.
131 1.1.1.1.8.2 skrll *
132 1.1.1.1.8.2 skrll ******************************************************************************/
133 1.1.1.1.8.2 skrll
134 1.1.1.1.8.2 skrll void
135 1.1.1.1.8.2 skrll CvInitFileTree (
136 1.1.1.1.8.2 skrll ACPI_TABLE_HEADER *Table,
137 1.1.1.1.8.2 skrll UINT8 *AmlStart,
138 1.1.1.1.8.2 skrll UINT32 AmlLength)
139 1.1.1.1.8.2 skrll {
140 1.1.1.1.8.2 skrll UINT8 *TreeAml;
141 1.1.1.1.8.2 skrll UINT8 *FileEnd;
142 1.1.1.1.8.2 skrll char *Filename = NULL;
143 1.1.1.1.8.2 skrll char *PreviousFilename = NULL;
144 1.1.1.1.8.2 skrll char *ParentFilename = NULL;
145 1.1.1.1.8.2 skrll char *ChildFilename = NULL;
146 1.1.1.1.8.2 skrll
147 1.1.1.1.8.2 skrll
148 1.1.1.1.8.2 skrll if (!Gbl_CaptureComments)
149 1.1.1.1.8.2 skrll {
150 1.1.1.1.8.2 skrll return;
151 1.1.1.1.8.2 skrll }
152 1.1.1.1.8.2 skrll
153 1.1.1.1.8.2 skrll CvDbgPrint ("AmlLength: %x\n", AmlLength);
154 1.1.1.1.8.2 skrll CvDbgPrint ("AmlStart: %p\n", AmlStart);
155 1.1.1.1.8.2 skrll CvDbgPrint ("AmlEnd?: %p\n", AmlStart+AmlLength);
156 1.1.1.1.8.2 skrll
157 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache);
158 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->FileStart = (char *)(AmlStart);
159 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->FileEnd = (char *)(AmlStart + Table->Length);
160 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->Next = NULL;
161 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->Parent = NULL;
162 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->Filename = (char *)(AmlStart+2);
163 1.1.1.1.8.2 skrll
164 1.1.1.1.8.2 skrll /* Set the root file to the current open file */
165 1.1.1.1.8.2 skrll
166 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->File = AcpiGbl_OutputFile;
167 1.1.1.1.8.2 skrll
168 1.1.1.1.8.2 skrll /*
169 1.1.1.1.8.2 skrll * Set this to true because we dont need to output
170 1.1.1.1.8.2 skrll * an include statement for the topmost file
171 1.1.1.1.8.2 skrll */
172 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->IncludeWritten = TRUE;
173 1.1.1.1.8.2 skrll Filename = NULL;
174 1.1.1.1.8.2 skrll AcpiGbl_CurrentFilename = (char *)(AmlStart+2);
175 1.1.1.1.8.2 skrll AcpiGbl_RootFilename = (char *)(AmlStart+2);
176 1.1.1.1.8.2 skrll
177 1.1.1.1.8.2 skrll TreeAml = AmlStart;
178 1.1.1.1.8.2 skrll FileEnd = AmlStart + AmlLength;
179 1.1.1.1.8.2 skrll
180 1.1.1.1.8.2 skrll while (TreeAml <= FileEnd)
181 1.1.1.1.8.2 skrll {
182 1.1.1.1.8.2 skrll /*
183 1.1.1.1.8.2 skrll * Make sure that this filename contains all printable characters
184 1.1.1.1.8.2 skrll * and a .dsl extension at the end. If not, then it must be some
185 1.1.1.1.8.2 skrll * raw data that doesn't outline a filename.
186 1.1.1.1.8.2 skrll */
187 1.1.1.1.8.2 skrll if ((*TreeAml == AML_COMMENT_OP) &&
188 1.1.1.1.8.2 skrll (*(TreeAml+1) == FILENAME_COMMENT) &&
189 1.1.1.1.8.2 skrll (CvIsFilename ((char *)(TreeAml+2))))
190 1.1.1.1.8.2 skrll {
191 1.1.1.1.8.2 skrll CvDbgPrint ("A9 and a 08 file\n");
192 1.1.1.1.8.2 skrll PreviousFilename = Filename;
193 1.1.1.1.8.2 skrll Filename = (char *) (TreeAml+2);
194 1.1.1.1.8.2 skrll CvAddToFileTree (Filename, PreviousFilename);
195 1.1.1.1.8.2 skrll ChildFilename = Filename;
196 1.1.1.1.8.2 skrll CvDbgPrint ("%s\n", Filename);
197 1.1.1.1.8.2 skrll }
198 1.1.1.1.8.2 skrll else if ((*TreeAml == AML_COMMENT_OP) &&
199 1.1.1.1.8.2 skrll (*(TreeAml+1) == PARENTFILENAME_COMMENT) &&
200 1.1.1.1.8.2 skrll (CvIsFilename ((char *)(TreeAml+2))))
201 1.1.1.1.8.2 skrll {
202 1.1.1.1.8.2 skrll CvDbgPrint ("A9 and a 09 file\n");
203 1.1.1.1.8.2 skrll ParentFilename = (char *)(TreeAml+2);
204 1.1.1.1.8.2 skrll CvSetFileParent (ChildFilename, ParentFilename);
205 1.1.1.1.8.2 skrll CvDbgPrint ("%s\n", ParentFilename);
206 1.1.1.1.8.2 skrll }
207 1.1.1.1.8.2 skrll ++TreeAml;
208 1.1.1.1.8.2 skrll }
209 1.1.1.1.8.2 skrll }
210 1.1.1.1.8.2 skrll
211 1.1.1.1.8.2 skrll
212 1.1.1.1.8.2 skrll /*******************************************************************************
213 1.1.1.1.8.2 skrll *
214 1.1.1.1.8.2 skrll * FUNCTION: CvClearOpComments
215 1.1.1.1.8.2 skrll *
216 1.1.1.1.8.2 skrll * PARAMETERS: Op -- clear all comments within this Op
217 1.1.1.1.8.2 skrll *
218 1.1.1.1.8.2 skrll * RETURN: none
219 1.1.1.1.8.2 skrll *
220 1.1.1.1.8.2 skrll * DESCRIPTION: Clear all converter-related fields of the given Op.
221 1.1.1.1.8.2 skrll * This is referred as ASL_CV_CLEAR_OP_COMMENTS.
222 1.1.1.1.8.2 skrll *
223 1.1.1.1.8.2 skrll ******************************************************************************/
224 1.1.1.1.8.2 skrll
225 1.1.1.1.8.2 skrll void
226 1.1.1.1.8.2 skrll CvClearOpComments (
227 1.1.1.1.8.2 skrll ACPI_PARSE_OBJECT *Op)
228 1.1.1.1.8.2 skrll {
229 1.1.1.1.8.2 skrll Op->Common.InlineComment = NULL;
230 1.1.1.1.8.2 skrll Op->Common.EndNodeComment = NULL;
231 1.1.1.1.8.2 skrll Op->Common.NameComment = NULL;
232 1.1.1.1.8.2 skrll Op->Common.CommentList = NULL;
233 1.1.1.1.8.2 skrll Op->Common.EndBlkComment = NULL;
234 1.1.1.1.8.2 skrll Op->Common.CloseBraceComment = NULL;
235 1.1.1.1.8.2 skrll Op->Common.CvFilename = NULL;
236 1.1.1.1.8.2 skrll Op->Common.CvParentFilename = NULL;
237 1.1.1.1.8.2 skrll }
238 1.1.1.1.8.2 skrll
239 1.1.1.1.8.2 skrll
240 1.1.1.1.8.2 skrll /*******************************************************************************
241 1.1.1.1.8.2 skrll *
242 1.1.1.1.8.2 skrll * FUNCTION: CvCommentExists
243 1.1.1.1.8.2 skrll *
244 1.1.1.1.8.2 skrll * PARAMETERS: address - check if this address appears in the list
245 1.1.1.1.8.2 skrll *
246 1.1.1.1.8.2 skrll * RETURN: BOOLEAN - TRUE if the address exists.
247 1.1.1.1.8.2 skrll *
248 1.1.1.1.8.2 skrll * DESCRIPTION: look at the pointer address and check if this appears in the
249 1.1.1.1.8.2 skrll * list of all addresses. If it exitsts in the list, return TRUE
250 1.1.1.1.8.2 skrll * if it exists. Otherwise add to the list and return FALSE.
251 1.1.1.1.8.2 skrll *
252 1.1.1.1.8.2 skrll ******************************************************************************/
253 1.1.1.1.8.2 skrll
254 1.1.1.1.8.2 skrll static BOOLEAN
255 1.1.1.1.8.2 skrll CvCommentExists (
256 1.1.1.1.8.2 skrll UINT8 *Address)
257 1.1.1.1.8.2 skrll {
258 1.1.1.1.8.2 skrll ACPI_COMMENT_ADDR_NODE *Current = AcpiGbl_CommentAddrListHead;
259 1.1.1.1.8.2 skrll UINT8 Option;
260 1.1.1.1.8.2 skrll
261 1.1.1.1.8.2 skrll
262 1.1.1.1.8.2 skrll if (!Address)
263 1.1.1.1.8.2 skrll {
264 1.1.1.1.8.2 skrll return (FALSE);
265 1.1.1.1.8.2 skrll }
266 1.1.1.1.8.2 skrll Option = *(Address + 1);
267 1.1.1.1.8.2 skrll
268 1.1.1.1.8.2 skrll /*
269 1.1.1.1.8.2 skrll * FILENAME_COMMENT and PARENTFILENAME_COMMENT are not treated as comments.
270 1.1.1.1.8.2 skrll * They serve as markers for where the file starts and ends.
271 1.1.1.1.8.2 skrll */
272 1.1.1.1.8.2 skrll if ((Option == FILENAME_COMMENT) || (Option == PARENTFILENAME_COMMENT))
273 1.1.1.1.8.2 skrll {
274 1.1.1.1.8.2 skrll return (FALSE);
275 1.1.1.1.8.2 skrll }
276 1.1.1.1.8.2 skrll
277 1.1.1.1.8.2 skrll if (!Current)
278 1.1.1.1.8.2 skrll {
279 1.1.1.1.8.2 skrll AcpiGbl_CommentAddrListHead =
280 1.1.1.1.8.2 skrll AcpiOsAcquireObject (AcpiGbl_RegCommentCache);
281 1.1.1.1.8.2 skrll AcpiGbl_CommentAddrListHead->Addr = Address;
282 1.1.1.1.8.2 skrll AcpiGbl_CommentAddrListHead->Next = NULL;
283 1.1.1.1.8.2 skrll return (FALSE);
284 1.1.1.1.8.2 skrll }
285 1.1.1.1.8.2 skrll else
286 1.1.1.1.8.2 skrll {
287 1.1.1.1.8.2 skrll while (Current)
288 1.1.1.1.8.2 skrll {
289 1.1.1.1.8.2 skrll if (Current->Addr != Address)
290 1.1.1.1.8.2 skrll {
291 1.1.1.1.8.2 skrll Current = Current->Next;
292 1.1.1.1.8.2 skrll }
293 1.1.1.1.8.2 skrll else
294 1.1.1.1.8.2 skrll {
295 1.1.1.1.8.2 skrll return (TRUE);
296 1.1.1.1.8.2 skrll }
297 1.1.1.1.8.2 skrll }
298 1.1.1.1.8.2 skrll
299 1.1.1.1.8.2 skrll /*
300 1.1.1.1.8.2 skrll * If the execution gets to this point, it means that this address
301 1.1.1.1.8.2 skrll * does not exists in the list. Add this address to the
302 1.1.1.1.8.2 skrll * beginning of the list.
303 1.1.1.1.8.2 skrll */
304 1.1.1.1.8.2 skrll Current = AcpiGbl_CommentAddrListHead;
305 1.1.1.1.8.2 skrll AcpiGbl_CommentAddrListHead =
306 1.1.1.1.8.2 skrll AcpiOsAcquireObject (AcpiGbl_RegCommentCache);
307 1.1.1.1.8.2 skrll AcpiGbl_CommentAddrListHead->Addr = Address;
308 1.1.1.1.8.2 skrll AcpiGbl_CommentAddrListHead->Next = Current;
309 1.1.1.1.8.2 skrll return (FALSE);
310 1.1.1.1.8.2 skrll }
311 1.1.1.1.8.2 skrll }
312 1.1.1.1.8.2 skrll
313 1.1.1.1.8.2 skrll
314 1.1.1.1.8.2 skrll /*******************************************************************************
315 1.1.1.1.8.2 skrll *
316 1.1.1.1.8.2 skrll * FUNCTION: CvFilenameExists
317 1.1.1.1.8.2 skrll *
318 1.1.1.1.8.2 skrll * PARAMETERS: Filename - filename to search
319 1.1.1.1.8.2 skrll *
320 1.1.1.1.8.2 skrll * RETURN: ACPI_FILE_NODE - a pointer to a file node
321 1.1.1.1.8.2 skrll *
322 1.1.1.1.8.2 skrll * DESCRIPTION: Look for the given filename in the file dependency tree.
323 1.1.1.1.8.2 skrll * Returns the file node if it exists, returns NULL if it does not.
324 1.1.1.1.8.2 skrll *
325 1.1.1.1.8.2 skrll ******************************************************************************/
326 1.1.1.1.8.2 skrll
327 1.1.1.1.8.2 skrll ACPI_FILE_NODE*
328 1.1.1.1.8.2 skrll CvFilenameExists(
329 1.1.1.1.8.2 skrll char *Filename,
330 1.1.1.1.8.2 skrll ACPI_FILE_NODE *Head)
331 1.1.1.1.8.2 skrll {
332 1.1.1.1.8.2 skrll ACPI_FILE_NODE *Current = Head;
333 1.1.1.1.8.2 skrll
334 1.1.1.1.8.2 skrll
335 1.1.1.1.8.2 skrll while (Current)
336 1.1.1.1.8.2 skrll {
337 1.1.1.1.8.2 skrll if (!AcpiUtStricmp (Current->Filename, Filename))
338 1.1.1.1.8.2 skrll {
339 1.1.1.1.8.2 skrll return (Current);
340 1.1.1.1.8.2 skrll }
341 1.1.1.1.8.2 skrll Current = Current->Next;
342 1.1.1.1.8.2 skrll }
343 1.1.1.1.8.2 skrll return (NULL);
344 1.1.1.1.8.2 skrll }
345 1.1.1.1.8.2 skrll
346 1.1.1.1.8.2 skrll
347 1.1.1.1.8.2 skrll /*******************************************************************************
348 1.1.1.1.8.2 skrll *
349 1.1.1.1.8.2 skrll * FUNCTION: CvFileAddressLookup
350 1.1.1.1.8.2 skrll *
351 1.1.1.1.8.2 skrll * PARAMETERS: Address - address to look up
352 1.1.1.1.8.2 skrll * Head - file dependency tree
353 1.1.1.1.8.2 skrll *
354 1.1.1.1.8.2 skrll * RETURN: ACPI_FLE_NODE - pointer to a file node containing the address
355 1.1.1.1.8.2 skrll *
356 1.1.1.1.8.2 skrll * DESCRIPTION: Look for the given address in the file dependency tree.
357 1.1.1.1.8.2 skrll * Returns the first file node where the given address is within
358 1.1.1.1.8.2 skrll * the file node's starting and ending address.
359 1.1.1.1.8.2 skrll *
360 1.1.1.1.8.2 skrll ******************************************************************************/
361 1.1.1.1.8.2 skrll
362 1.1.1.1.8.2 skrll static ACPI_FILE_NODE*
363 1.1.1.1.8.2 skrll CvFileAddressLookup(
364 1.1.1.1.8.2 skrll char *Address,
365 1.1.1.1.8.2 skrll ACPI_FILE_NODE *Head)
366 1.1.1.1.8.2 skrll {
367 1.1.1.1.8.2 skrll ACPI_FILE_NODE *Current = Head;
368 1.1.1.1.8.2 skrll
369 1.1.1.1.8.2 skrll
370 1.1.1.1.8.2 skrll while (Current)
371 1.1.1.1.8.2 skrll {
372 1.1.1.1.8.2 skrll if ((Address >= Current->FileStart) &&
373 1.1.1.1.8.2 skrll (Address < Current->FileEnd ||
374 1.1.1.1.8.2 skrll !Current->FileEnd))
375 1.1.1.1.8.2 skrll {
376 1.1.1.1.8.2 skrll return (Current);
377 1.1.1.1.8.2 skrll }
378 1.1.1.1.8.2 skrll Current = Current->Next;
379 1.1.1.1.8.2 skrll }
380 1.1.1.1.8.2 skrll
381 1.1.1.1.8.2 skrll return (NULL);
382 1.1.1.1.8.2 skrll }
383 1.1.1.1.8.2 skrll
384 1.1.1.1.8.2 skrll
385 1.1.1.1.8.2 skrll /*******************************************************************************
386 1.1.1.1.8.2 skrll *
387 1.1.1.1.8.2 skrll * FUNCTION: CvLabelFileNode
388 1.1.1.1.8.2 skrll *
389 1.1.1.1.8.2 skrll * PARAMETERS: Op
390 1.1.1.1.8.2 skrll *
391 1.1.1.1.8.2 skrll * RETURN: None
392 1.1.1.1.8.2 skrll *
393 1.1.1.1.8.2 skrll * DESCRIPTION: Takes a given parse op, looks up its Op->Common.Aml field
394 1.1.1.1.8.2 skrll * within the file tree and fills in approperiate file information
395 1.1.1.1.8.2 skrll * from a matching node within the tree.
396 1.1.1.1.8.2 skrll * This is referred as ASL_CV_LABEL_FILENODE.
397 1.1.1.1.8.2 skrll *
398 1.1.1.1.8.2 skrll ******************************************************************************/
399 1.1.1.1.8.2 skrll
400 1.1.1.1.8.2 skrll void
401 1.1.1.1.8.2 skrll CvLabelFileNode(
402 1.1.1.1.8.2 skrll ACPI_PARSE_OBJECT *Op)
403 1.1.1.1.8.2 skrll {
404 1.1.1.1.8.2 skrll ACPI_FILE_NODE *Node;
405 1.1.1.1.8.2 skrll
406 1.1.1.1.8.2 skrll
407 1.1.1.1.8.2 skrll if (!Op)
408 1.1.1.1.8.2 skrll {
409 1.1.1.1.8.2 skrll return;
410 1.1.1.1.8.2 skrll }
411 1.1.1.1.8.2 skrll
412 1.1.1.1.8.2 skrll Node = CvFileAddressLookup ((char *)Op->Common.Aml, AcpiGbl_FileTreeRoot);
413 1.1.1.1.8.2 skrll if (!Node)
414 1.1.1.1.8.2 skrll {
415 1.1.1.1.8.2 skrll return;
416 1.1.1.1.8.2 skrll }
417 1.1.1.1.8.2 skrll
418 1.1.1.1.8.2 skrll Op->Common.CvFilename = Node->Filename;
419 1.1.1.1.8.2 skrll if (Node->Parent)
420 1.1.1.1.8.2 skrll {
421 1.1.1.1.8.2 skrll Op->Common.CvParentFilename = Node->Parent->Filename;
422 1.1.1.1.8.2 skrll }
423 1.1.1.1.8.2 skrll else
424 1.1.1.1.8.2 skrll {
425 1.1.1.1.8.2 skrll Op->Common.CvParentFilename = Node->Filename;
426 1.1.1.1.8.2 skrll }
427 1.1.1.1.8.2 skrll }
428 1.1.1.1.8.2 skrll
429 1.1.1.1.8.2 skrll
430 1.1.1.1.8.2 skrll /*******************************************************************************
431 1.1.1.1.8.2 skrll *
432 1.1.1.1.8.2 skrll * FUNCTION: CvAddToFileTree
433 1.1.1.1.8.2 skrll *
434 1.1.1.1.8.2 skrll * PARAMETERS: Filename - Address containing the name of the current
435 1.1.1.1.8.2 skrll * filename
436 1.1.1.1.8.2 skrll * PreviousFilename - Address containing the name of the previous
437 1.1.1.1.8.2 skrll * filename
438 1.1.1.1.8.2 skrll *
439 1.1.1.1.8.2 skrll * RETURN: void
440 1.1.1.1.8.2 skrll *
441 1.1.1.1.8.2 skrll * DESCRIPTION: Add this filename to the AcpiGbl_FileTree if it does not exist.
442 1.1.1.1.8.2 skrll *
443 1.1.1.1.8.2 skrll ******************************************************************************/
444 1.1.1.1.8.2 skrll
445 1.1.1.1.8.2 skrll static void
446 1.1.1.1.8.2 skrll CvAddToFileTree (
447 1.1.1.1.8.2 skrll char *Filename,
448 1.1.1.1.8.2 skrll char *PreviousFilename)
449 1.1.1.1.8.2 skrll {
450 1.1.1.1.8.2 skrll ACPI_FILE_NODE *Node;
451 1.1.1.1.8.2 skrll
452 1.1.1.1.8.2 skrll
453 1.1.1.1.8.2 skrll if (!AcpiUtStricmp(Filename, AcpiGbl_RootFilename) &&
454 1.1.1.1.8.2 skrll PreviousFilename)
455 1.1.1.1.8.2 skrll {
456 1.1.1.1.8.2 skrll Node = CvFilenameExists (PreviousFilename, AcpiGbl_FileTreeRoot);
457 1.1.1.1.8.2 skrll if (Node)
458 1.1.1.1.8.2 skrll {
459 1.1.1.1.8.2 skrll /*
460 1.1.1.1.8.2 skrll * Set the end point of the PreviousFilename to the address
461 1.1.1.1.8.2 skrll * of Filename.
462 1.1.1.1.8.2 skrll */
463 1.1.1.1.8.2 skrll Node->FileEnd = Filename;
464 1.1.1.1.8.2 skrll }
465 1.1.1.1.8.2 skrll }
466 1.1.1.1.8.2 skrll else if (!AcpiUtStricmp(Filename, AcpiGbl_RootFilename) &&
467 1.1.1.1.8.2 skrll !PreviousFilename)
468 1.1.1.1.8.2 skrll {
469 1.1.1.1.8.2 skrll return;
470 1.1.1.1.8.2 skrll }
471 1.1.1.1.8.2 skrll
472 1.1.1.1.8.2 skrll Node = CvFilenameExists (Filename, AcpiGbl_FileTreeRoot);
473 1.1.1.1.8.2 skrll if (Node && PreviousFilename)
474 1.1.1.1.8.2 skrll {
475 1.1.1.1.8.2 skrll /*
476 1.1.1.1.8.2 skrll * Update the end of the previous file and all of their parents' ending
477 1.1.1.1.8.2 skrll * Addresses. This is done to ensure that parent file ranges extend to
478 1.1.1.1.8.2 skrll * the end of their childrens' files.
479 1.1.1.1.8.2 skrll */
480 1.1.1.1.8.2 skrll Node = CvFilenameExists (PreviousFilename, AcpiGbl_FileTreeRoot);
481 1.1.1.1.8.2 skrll if (Node && (Node->FileEnd < Filename))
482 1.1.1.1.8.2 skrll {
483 1.1.1.1.8.2 skrll Node->FileEnd = Filename;
484 1.1.1.1.8.2 skrll Node = Node->Parent;
485 1.1.1.1.8.2 skrll while (Node)
486 1.1.1.1.8.2 skrll {
487 1.1.1.1.8.2 skrll if (Node->FileEnd < Filename)
488 1.1.1.1.8.2 skrll {
489 1.1.1.1.8.2 skrll Node->FileEnd = Filename;
490 1.1.1.1.8.2 skrll }
491 1.1.1.1.8.2 skrll Node = Node->Parent;
492 1.1.1.1.8.2 skrll }
493 1.1.1.1.8.2 skrll }
494 1.1.1.1.8.2 skrll }
495 1.1.1.1.8.2 skrll else
496 1.1.1.1.8.2 skrll {
497 1.1.1.1.8.2 skrll Node = AcpiGbl_FileTreeRoot;
498 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot = AcpiOsAcquireObject (AcpiGbl_FileCache);
499 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->Next = Node;
500 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->Parent = NULL;
501 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->Filename = Filename;
502 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->FileStart = Filename;
503 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->IncludeWritten = FALSE;
504 1.1.1.1.8.2 skrll AcpiGbl_FileTreeRoot->File = fopen(Filename, "w+");
505 1.1.1.1.8.2 skrll
506 1.1.1.1.8.2 skrll /*
507 1.1.1.1.8.2 skrll * If we can't open the file, we need to abort here before we
508 1.1.1.1.8.2 skrll * accidentally write to a NULL file.
509 1.1.1.1.8.2 skrll */
510 1.1.1.1.8.2 skrll if (!AcpiGbl_FileTreeRoot->File)
511 1.1.1.1.8.2 skrll {
512 1.1.1.1.8.2 skrll /* delete the .xxx file */
513 1.1.1.1.8.2 skrll
514 1.1.1.1.8.2 skrll FlDeleteFile (ASL_FILE_AML_OUTPUT);
515 1.1.1.1.8.2 skrll sprintf (MsgBuffer, "\"%s\" - %s", Filename, strerror (errno));
516 1.1.1.1.8.2 skrll AslCommonError (ASL_ERROR, ASL_MSG_OPEN, 0, 0, 0, 0, NULL, MsgBuffer);
517 1.1.1.1.8.2 skrll AslAbort ();
518 1.1.1.1.8.2 skrll }
519 1.1.1.1.8.2 skrll }
520 1.1.1.1.8.2 skrll }
521 1.1.1.1.8.2 skrll
522 1.1.1.1.8.2 skrll
523 1.1.1.1.8.2 skrll /*******************************************************************************
524 1.1.1.1.8.2 skrll *
525 1.1.1.1.8.2 skrll * FUNCTION: CvSetFileParent
526 1.1.1.1.8.2 skrll *
527 1.1.1.1.8.2 skrll * PARAMETERS: ChildFile - contains the filename of the child file
528 1.1.1.1.8.2 skrll * ParentFile - contains the filename of the parent file.
529 1.1.1.1.8.2 skrll *
530 1.1.1.1.8.2 skrll * RETURN: none
531 1.1.1.1.8.2 skrll *
532 1.1.1.1.8.2 skrll * DESCRIPTION: point the parent pointer of the Child to the node that
533 1.1.1.1.8.2 skrll * corresponds with the parent file node.
534 1.1.1.1.8.2 skrll *
535 1.1.1.1.8.2 skrll ******************************************************************************/
536 1.1.1.1.8.2 skrll
537 1.1.1.1.8.2 skrll static void
538 1.1.1.1.8.2 skrll CvSetFileParent (
539 1.1.1.1.8.2 skrll char *ChildFile,
540 1.1.1.1.8.2 skrll char *ParentFile)
541 1.1.1.1.8.2 skrll {
542 1.1.1.1.8.2 skrll ACPI_FILE_NODE *Child;
543 1.1.1.1.8.2 skrll ACPI_FILE_NODE *Parent;
544 1.1.1.1.8.2 skrll
545 1.1.1.1.8.2 skrll
546 1.1.1.1.8.2 skrll Child = CvFilenameExists (ChildFile, AcpiGbl_FileTreeRoot);
547 1.1.1.1.8.2 skrll Parent = CvFilenameExists (ParentFile, AcpiGbl_FileTreeRoot);
548 1.1.1.1.8.2 skrll if (Child && Parent)
549 1.1.1.1.8.2 skrll {
550 1.1.1.1.8.2 skrll Child->Parent = Parent;
551 1.1.1.1.8.2 skrll
552 1.1.1.1.8.2 skrll while (Child->Parent)
553 1.1.1.1.8.2 skrll {
554 1.1.1.1.8.2 skrll if (Child->Parent->FileEnd < Child->FileStart)
555 1.1.1.1.8.2 skrll {
556 1.1.1.1.8.2 skrll Child->Parent->FileEnd = Child->FileStart;
557 1.1.1.1.8.2 skrll }
558 1.1.1.1.8.2 skrll Child = Child->Parent;
559 1.1.1.1.8.2 skrll }
560 1.1.1.1.8.2 skrll }
561 1.1.1.1.8.2 skrll }
562 1.1.1.1.8.2 skrll
563 1.1.1.1.8.2 skrll
564 1.1.1.1.8.2 skrll /*******************************************************************************
565 1.1.1.1.8.2 skrll *
566 1.1.1.1.8.2 skrll * FUNCTION: CvCaptureCommentsOnly
567 1.1.1.1.8.2 skrll *
568 1.1.1.1.8.2 skrll * PARAMETERS: ParserState - A parser state object
569 1.1.1.1.8.2 skrll *
570 1.1.1.1.8.2 skrll * RETURN: none
571 1.1.1.1.8.2 skrll *
572 1.1.1.1.8.2 skrll * DESCRIPTION: look at the aml that the parser state is pointing to,
573 1.1.1.1.8.2 skrll * capture any AML_COMMENT_OP and it's arguments and increment the
574 1.1.1.1.8.2 skrll * aml pointer past the comment. Comments are transferred to parse
575 1.1.1.1.8.2 skrll * nodes through CvTransferComments() as well as
576 1.1.1.1.8.2 skrll * AcpiPsBuildNamedOp().
577 1.1.1.1.8.2 skrll * This is referred as ASL_CV_CAPTURE_COMMENTS_ONLY.
578 1.1.1.1.8.2 skrll *
579 1.1.1.1.8.2 skrll ******************************************************************************/
580 1.1.1.1.8.2 skrll
581 1.1.1.1.8.2 skrll void
582 1.1.1.1.8.2 skrll CvCaptureCommentsOnly (
583 1.1.1.1.8.2 skrll ACPI_PARSE_STATE *ParserState)
584 1.1.1.1.8.2 skrll {
585 1.1.1.1.8.2 skrll UINT8 *Aml = ParserState->Aml;
586 1.1.1.1.8.2 skrll UINT16 Opcode = (UINT16) ACPI_GET8 (Aml);
587 1.1.1.1.8.2 skrll UINT32 Length = 0;
588 1.1.1.1.8.2 skrll UINT8 CommentOption = (UINT16) ACPI_GET8 (Aml+1);
589 1.1.1.1.8.2 skrll BOOLEAN StdDefBlockFlag = FALSE;
590 1.1.1.1.8.2 skrll ACPI_COMMENT_NODE *CommentNode;
591 1.1.1.1.8.2 skrll ACPI_FILE_NODE *FileNode;
592 1.1.1.1.8.2 skrll
593 1.1.1.1.8.2 skrll
594 1.1.1.1.8.2 skrll if (!Gbl_CaptureComments ||
595 1.1.1.1.8.2 skrll Opcode != AML_COMMENT_OP)
596 1.1.1.1.8.2 skrll {
597 1.1.1.1.8.2 skrll return;
598 1.1.1.1.8.2 skrll }
599 1.1.1.1.8.2 skrll
600 1.1.1.1.8.2 skrll while (Opcode == AML_COMMENT_OP)
601 1.1.1.1.8.2 skrll {
602 1.1.1.1.8.2 skrll CvDbgPrint ("comment aml address: %p\n", Aml);
603 1.1.1.1.8.2 skrll
604 1.1.1.1.8.2 skrll if (CvCommentExists(ParserState->Aml))
605 1.1.1.1.8.2 skrll {
606 1.1.1.1.8.2 skrll CvDbgPrint ("Avoiding capturing an existing comment.\n");
607 1.1.1.1.8.2 skrll }
608 1.1.1.1.8.2 skrll else
609 1.1.1.1.8.2 skrll {
610 1.1.1.1.8.2 skrll CommentOption = *(Aml+1);
611 1.1.1.1.8.2 skrll
612 1.1.1.1.8.2 skrll /* Increment past the comment option and point the approperiate char pointers.*/
613 1.1.1.1.8.2 skrll
614 1.1.1.1.8.2 skrll Aml += 2;
615 1.1.1.1.8.2 skrll
616 1.1.1.1.8.2 skrll /* found a comment. Now, set pointers to these comments. */
617 1.1.1.1.8.2 skrll
618 1.1.1.1.8.2 skrll switch (CommentOption)
619 1.1.1.1.8.2 skrll {
620 1.1.1.1.8.2 skrll case STD_DEFBLK_COMMENT:
621 1.1.1.1.8.2 skrll
622 1.1.1.1.8.2 skrll StdDefBlockFlag = TRUE;
623 1.1.1.1.8.2 skrll
624 1.1.1.1.8.2 skrll /* add to a linked list of nodes. This list will be taken by the parse node created next. */
625 1.1.1.1.8.2 skrll
626 1.1.1.1.8.2 skrll CommentNode = AcpiOsAcquireObject (AcpiGbl_RegCommentCache);
627 1.1.1.1.8.2 skrll CommentNode->Comment = ACPI_CAST_PTR (char, Aml);
628 1.1.1.1.8.2 skrll CommentNode->Next = NULL;
629 1.1.1.1.8.2 skrll
630 1.1.1.1.8.2 skrll if (!AcpiGbl_DefBlkCommentListHead)
631 1.1.1.1.8.2 skrll {
632 1.1.1.1.8.2 skrll AcpiGbl_DefBlkCommentListHead = CommentNode;
633 1.1.1.1.8.2 skrll AcpiGbl_DefBlkCommentListTail = CommentNode;
634 1.1.1.1.8.2 skrll }
635 1.1.1.1.8.2 skrll else
636 1.1.1.1.8.2 skrll {
637 1.1.1.1.8.2 skrll AcpiGbl_DefBlkCommentListTail->Next = CommentNode;
638 1.1.1.1.8.2 skrll AcpiGbl_DefBlkCommentListTail = AcpiGbl_DefBlkCommentListTail->Next;
639 1.1.1.1.8.2 skrll }
640 1.1.1.1.8.2 skrll break;
641 1.1.1.1.8.2 skrll
642 1.1.1.1.8.2 skrll case STANDARD_COMMENT:
643 1.1.1.1.8.2 skrll
644 1.1.1.1.8.2 skrll CvDbgPrint ("found regular comment.\n");
645 1.1.1.1.8.2 skrll
646 1.1.1.1.8.2 skrll /* add to a linked list of nodes. This list will be taken by the parse node created next. */
647 1.1.1.1.8.2 skrll
648 1.1.1.1.8.2 skrll CommentNode = AcpiOsAcquireObject (AcpiGbl_RegCommentCache);
649 1.1.1.1.8.2 skrll CommentNode->Comment = ACPI_CAST_PTR (char, Aml);
650 1.1.1.1.8.2 skrll CommentNode->Next = NULL;
651 1.1.1.1.8.2 skrll
652 1.1.1.1.8.2 skrll if (!AcpiGbl_RegCommentListHead)
653 1.1.1.1.8.2 skrll {
654 1.1.1.1.8.2 skrll AcpiGbl_RegCommentListHead = CommentNode;
655 1.1.1.1.8.2 skrll AcpiGbl_RegCommentListTail = CommentNode;
656 1.1.1.1.8.2 skrll }
657 1.1.1.1.8.2 skrll else
658 1.1.1.1.8.2 skrll {
659 1.1.1.1.8.2 skrll AcpiGbl_RegCommentListTail->Next = CommentNode;
660 1.1.1.1.8.2 skrll AcpiGbl_RegCommentListTail = AcpiGbl_RegCommentListTail->Next;
661 1.1.1.1.8.2 skrll }
662 1.1.1.1.8.2 skrll break;
663 1.1.1.1.8.2 skrll
664 1.1.1.1.8.2 skrll case ENDBLK_COMMENT:
665 1.1.1.1.8.2 skrll
666 1.1.1.1.8.2 skrll CvDbgPrint ("found endblk comment.\n");
667 1.1.1.1.8.2 skrll
668 1.1.1.1.8.2 skrll /* add to a linked list of nodes. This will be taken by the next created parse node. */
669 1.1.1.1.8.2 skrll
670 1.1.1.1.8.2 skrll CommentNode = AcpiOsAcquireObject (AcpiGbl_RegCommentCache);
671 1.1.1.1.8.2 skrll CommentNode->Comment = ACPI_CAST_PTR (char, Aml);
672 1.1.1.1.8.2 skrll CommentNode->Next = NULL;
673 1.1.1.1.8.2 skrll
674 1.1.1.1.8.2 skrll if (!AcpiGbl_EndBlkCommentListHead)
675 1.1.1.1.8.2 skrll {
676 1.1.1.1.8.2 skrll AcpiGbl_EndBlkCommentListHead = CommentNode;
677 1.1.1.1.8.2 skrll AcpiGbl_EndBlkCommentListTail = CommentNode;
678 1.1.1.1.8.2 skrll }
679 1.1.1.1.8.2 skrll else
680 1.1.1.1.8.2 skrll {
681 1.1.1.1.8.2 skrll AcpiGbl_EndBlkCommentListTail->Next = CommentNode;
682 1.1.1.1.8.2 skrll AcpiGbl_EndBlkCommentListTail = AcpiGbl_EndBlkCommentListTail->Next;
683 1.1.1.1.8.2 skrll }
684 1.1.1.1.8.2 skrll break;
685 1.1.1.1.8.2 skrll
686 1.1.1.1.8.2 skrll case INLINE_COMMENT:
687 1.1.1.1.8.2 skrll
688 1.1.1.1.8.2 skrll CvDbgPrint ("found inline comment.\n");
689 1.1.1.1.8.2 skrll AcpiGbl_CurrentInlineComment = ACPI_CAST_PTR (char, Aml);
690 1.1.1.1.8.2 skrll break;
691 1.1.1.1.8.2 skrll
692 1.1.1.1.8.2 skrll case ENDNODE_COMMENT:
693 1.1.1.1.8.2 skrll
694 1.1.1.1.8.2 skrll CvDbgPrint ("found EndNode comment.\n");
695 1.1.1.1.8.2 skrll AcpiGbl_CurrentEndNodeComment = ACPI_CAST_PTR (char, Aml);
696 1.1.1.1.8.2 skrll break;
697 1.1.1.1.8.2 skrll
698 1.1.1.1.8.2 skrll case CLOSE_BRACE_COMMENT:
699 1.1.1.1.8.2 skrll
700 1.1.1.1.8.2 skrll CvDbgPrint ("found close brace comment.\n");
701 1.1.1.1.8.2 skrll AcpiGbl_CurrentCloseBraceComment = ACPI_CAST_PTR (char, Aml);
702 1.1.1.1.8.2 skrll break;
703 1.1.1.1.8.2 skrll
704 1.1.1.1.8.2 skrll case END_DEFBLK_COMMENT:
705 1.1.1.1.8.2 skrll
706 1.1.1.1.8.2 skrll CvDbgPrint ("Found comment that belongs after the } for a definition block.\n");
707 1.1.1.1.8.2 skrll AcpiGbl_CurrentScope->Common.CloseBraceComment = ACPI_CAST_PTR (char, Aml);
708 1.1.1.1.8.2 skrll break;
709 1.1.1.1.8.2 skrll
710 1.1.1.1.8.2 skrll case FILENAME_COMMENT:
711 1.1.1.1.8.2 skrll
712 1.1.1.1.8.2 skrll CvDbgPrint ("Found a filename: %s\n", ACPI_CAST_PTR (char, Aml));
713 1.1.1.1.8.2 skrll FileNode = CvFilenameExists (ACPI_CAST_PTR (char, Aml), AcpiGbl_FileTreeRoot);
714 1.1.1.1.8.2 skrll
715 1.1.1.1.8.2 skrll /*
716 1.1.1.1.8.2 skrll * If there is an INCLUDE_COMMENT followed by a
717 1.1.1.1.8.2 skrll * FILENAME_COMMENT, then the INCLUDE_COMMENT is a comment
718 1.1.1.1.8.2 skrll * that is emitted before the #include for the file.
719 1.1.1.1.8.2 skrll * We will save the IncludeComment within the FileNode
720 1.1.1.1.8.2 skrll * associated with this FILENAME_COMMENT.
721 1.1.1.1.8.2 skrll */
722 1.1.1.1.8.2 skrll if (FileNode && AcpiGbl_IncCommentListHead)
723 1.1.1.1.8.2 skrll {
724 1.1.1.1.8.2 skrll FileNode->IncludeComment = AcpiGbl_IncCommentListHead;
725 1.1.1.1.8.2 skrll AcpiGbl_IncCommentListHead = NULL;
726 1.1.1.1.8.2 skrll AcpiGbl_IncCommentListTail = NULL;
727 1.1.1.1.8.2 skrll }
728 1.1.1.1.8.2 skrll break;
729 1.1.1.1.8.2 skrll
730 1.1.1.1.8.2 skrll case PARENTFILENAME_COMMENT:
731 1.1.1.1.8.2 skrll CvDbgPrint (" Found a parent filename.\n");
732 1.1.1.1.8.2 skrll break;
733 1.1.1.1.8.2 skrll
734 1.1.1.1.8.2 skrll case INCLUDE_COMMENT:
735 1.1.1.1.8.2 skrll
736 1.1.1.1.8.2 skrll /*
737 1.1.1.1.8.2 skrll * Add to a linked list. This list will be taken by the
738 1.1.1.1.8.2 skrll * parse node created next. See the FILENAME_COMMENT case
739 1.1.1.1.8.2 skrll * for more details
740 1.1.1.1.8.2 skrll */
741 1.1.1.1.8.2 skrll CommentNode = AcpiOsAcquireObject (AcpiGbl_RegCommentCache);
742 1.1.1.1.8.2 skrll CommentNode->Comment = ACPI_CAST_PTR (char, Aml);
743 1.1.1.1.8.2 skrll CommentNode->Next = NULL;
744 1.1.1.1.8.2 skrll
745 1.1.1.1.8.2 skrll if (!AcpiGbl_IncCommentListHead)
746 1.1.1.1.8.2 skrll {
747 1.1.1.1.8.2 skrll AcpiGbl_IncCommentListHead = CommentNode;
748 1.1.1.1.8.2 skrll AcpiGbl_IncCommentListTail = CommentNode;
749 1.1.1.1.8.2 skrll }
750 1.1.1.1.8.2 skrll else
751 1.1.1.1.8.2 skrll {
752 1.1.1.1.8.2 skrll AcpiGbl_IncCommentListTail->Next = CommentNode;
753 1.1.1.1.8.2 skrll AcpiGbl_IncCommentListTail = AcpiGbl_IncCommentListTail->Next;
754 1.1.1.1.8.2 skrll }
755 1.1.1.1.8.2 skrll
756 1.1.1.1.8.2 skrll CvDbgPrint ("Found a include comment: %s\n", CommentNode->Comment);
757 1.1.1.1.8.2 skrll break;
758 1.1.1.1.8.2 skrll
759 1.1.1.1.8.2 skrll default:
760 1.1.1.1.8.2 skrll
761 1.1.1.1.8.2 skrll /* Not a valid comment option. Revert the AML */
762 1.1.1.1.8.2 skrll
763 1.1.1.1.8.2 skrll Aml -= 2;
764 1.1.1.1.8.2 skrll goto DefBlock;
765 1.1.1.1.8.2 skrll break;
766 1.1.1.1.8.2 skrll
767 1.1.1.1.8.2 skrll } /* end switch statement */
768 1.1.1.1.8.2 skrll
769 1.1.1.1.8.2 skrll } /* end else */
770 1.1.1.1.8.2 skrll
771 1.1.1.1.8.2 skrll /* determine the length and move forward that amount */
772 1.1.1.1.8.2 skrll
773 1.1.1.1.8.2 skrll Length = 0;
774 1.1.1.1.8.2 skrll while (ParserState->Aml[Length])
775 1.1.1.1.8.2 skrll {
776 1.1.1.1.8.2 skrll Length++;
777 1.1.1.1.8.2 skrll }
778 1.1.1.1.8.2 skrll
779 1.1.1.1.8.2 skrll ParserState->Aml += Length + 1;
780 1.1.1.1.8.2 skrll
781 1.1.1.1.8.2 skrll
782 1.1.1.1.8.2 skrll /* Peek at the next Opcode. */
783 1.1.1.1.8.2 skrll
784 1.1.1.1.8.2 skrll Aml = ParserState->Aml;
785 1.1.1.1.8.2 skrll Opcode = (UINT16) ACPI_GET8 (Aml);
786 1.1.1.1.8.2 skrll
787 1.1.1.1.8.2 skrll }
788 1.1.1.1.8.2 skrll
789 1.1.1.1.8.2 skrll DefBlock:
790 1.1.1.1.8.2 skrll if (StdDefBlockFlag)
791 1.1.1.1.8.2 skrll {
792 1.1.1.1.8.2 skrll /*
793 1.1.1.1.8.2 skrll * Give all of its comments to the current scope, which is known as
794 1.1.1.1.8.2 skrll * the definition block, since STD_DEFBLK_COMMENT only appears after
795 1.1.1.1.8.2 skrll * definition block headers.
796 1.1.1.1.8.2 skrll */
797 1.1.1.1.8.2 skrll AcpiGbl_CurrentScope->Common.CommentList
798 1.1.1.1.8.2 skrll = AcpiGbl_DefBlkCommentListHead;
799 1.1.1.1.8.2 skrll AcpiGbl_DefBlkCommentListHead = NULL;
800 1.1.1.1.8.2 skrll AcpiGbl_DefBlkCommentListTail = NULL;
801 1.1.1.1.8.2 skrll }
802 1.1.1.1.8.2 skrll }
803 1.1.1.1.8.2 skrll
804 1.1.1.1.8.2 skrll
805 1.1.1.1.8.2 skrll /*******************************************************************************
806 1.1.1.1.8.2 skrll *
807 1.1.1.1.8.2 skrll * FUNCTION: CvCaptureComments
808 1.1.1.1.8.2 skrll *
809 1.1.1.1.8.2 skrll * PARAMETERS: ParserState - A parser state object
810 1.1.1.1.8.2 skrll *
811 1.1.1.1.8.2 skrll * RETURN: none
812 1.1.1.1.8.2 skrll *
813 1.1.1.1.8.2 skrll * DESCRIPTION: Wrapper function for CvCaptureCommentsOnly
814 1.1.1.1.8.2 skrll * This is referred as ASL_CV_CAPTURE_COMMENTS.
815 1.1.1.1.8.2 skrll *
816 1.1.1.1.8.2 skrll ******************************************************************************/
817 1.1.1.1.8.2 skrll
818 1.1.1.1.8.2 skrll void
819 1.1.1.1.8.2 skrll CvCaptureComments (
820 1.1.1.1.8.2 skrll ACPI_WALK_STATE *WalkState)
821 1.1.1.1.8.2 skrll {
822 1.1.1.1.8.2 skrll UINT8 *Aml;
823 1.1.1.1.8.2 skrll UINT16 Opcode;
824 1.1.1.1.8.2 skrll const ACPI_OPCODE_INFO *OpInfo;
825 1.1.1.1.8.2 skrll
826 1.1.1.1.8.2 skrll
827 1.1.1.1.8.2 skrll if (!Gbl_CaptureComments)
828 1.1.1.1.8.2 skrll {
829 1.1.1.1.8.2 skrll return;
830 1.1.1.1.8.2 skrll }
831 1.1.1.1.8.2 skrll
832 1.1.1.1.8.2 skrll /*
833 1.1.1.1.8.2 skrll * Before parsing, check to see that comments that come directly after
834 1.1.1.1.8.2 skrll * deferred opcodes aren't being processed.
835 1.1.1.1.8.2 skrll */
836 1.1.1.1.8.2 skrll Aml = WalkState->ParserState.Aml;
837 1.1.1.1.8.2 skrll Opcode = (UINT16) ACPI_GET8 (Aml);
838 1.1.1.1.8.2 skrll OpInfo = AcpiPsGetOpcodeInfo (Opcode);
839 1.1.1.1.8.2 skrll
840 1.1.1.1.8.2 skrll if (!(OpInfo->Flags & AML_DEFER) ||
841 1.1.1.1.8.2 skrll ((OpInfo->Flags & AML_DEFER) &&
842 1.1.1.1.8.2 skrll (WalkState->PassNumber != ACPI_IMODE_LOAD_PASS1)))
843 1.1.1.1.8.2 skrll {
844 1.1.1.1.8.2 skrll CvCaptureCommentsOnly (&WalkState->ParserState);
845 1.1.1.1.8.2 skrll WalkState->Aml = WalkState->ParserState.Aml;
846 1.1.1.1.8.2 skrll }
847 1.1.1.1.8.2 skrll
848 1.1.1.1.8.2 skrll }
849 1.1.1.1.8.2 skrll
850 1.1.1.1.8.2 skrll
851 1.1.1.1.8.2 skrll /*******************************************************************************
852 1.1.1.1.8.2 skrll *
853 1.1.1.1.8.2 skrll * FUNCTION: CvTransferComments
854 1.1.1.1.8.2 skrll *
855 1.1.1.1.8.2 skrll * PARAMETERS: Op - Transfer comments to this Op
856 1.1.1.1.8.2 skrll *
857 1.1.1.1.8.2 skrll * RETURN: none
858 1.1.1.1.8.2 skrll *
859 1.1.1.1.8.2 skrll * DESCRIPTION: Transfer all of the commments stored in global containers to the
860 1.1.1.1.8.2 skrll * given Op. This will be invoked shortly after the parser creates
861 1.1.1.1.8.2 skrll * a ParseOp.
862 1.1.1.1.8.2 skrll * This is referred as ASL_CV_TRANSFER_COMMENTS.
863 1.1.1.1.8.2 skrll *
864 1.1.1.1.8.2 skrll ******************************************************************************/
865 1.1.1.1.8.2 skrll
866 1.1.1.1.8.2 skrll void
867 1.1.1.1.8.2 skrll CvTransferComments (
868 1.1.1.1.8.2 skrll ACPI_PARSE_OBJECT *Op)
869 1.1.1.1.8.2 skrll {
870 1.1.1.1.8.2 skrll Op->Common.InlineComment = AcpiGbl_CurrentInlineComment;
871 1.1.1.1.8.2 skrll AcpiGbl_CurrentInlineComment = NULL;
872 1.1.1.1.8.2 skrll
873 1.1.1.1.8.2 skrll Op->Common.EndNodeComment = AcpiGbl_CurrentEndNodeComment;
874 1.1.1.1.8.2 skrll AcpiGbl_CurrentEndNodeComment = NULL;
875 1.1.1.1.8.2 skrll
876 1.1.1.1.8.2 skrll Op->Common.CloseBraceComment = AcpiGbl_CurrentCloseBraceComment;
877 1.1.1.1.8.2 skrll AcpiGbl_CurrentCloseBraceComment = NULL;
878 1.1.1.1.8.2 skrll
879 1.1.1.1.8.2 skrll Op->Common.CommentList = AcpiGbl_RegCommentListHead;
880 1.1.1.1.8.2 skrll AcpiGbl_RegCommentListHead = NULL;
881 1.1.1.1.8.2 skrll AcpiGbl_RegCommentListTail = NULL;
882 1.1.1.1.8.2 skrll
883 1.1.1.1.8.2 skrll Op->Common.EndBlkComment = AcpiGbl_EndBlkCommentListHead;
884 1.1.1.1.8.2 skrll AcpiGbl_EndBlkCommentListHead = NULL;
885 1.1.1.1.8.2 skrll AcpiGbl_EndBlkCommentListTail = NULL;
886 1.1.1.1.8.2 skrll
887 1.1.1.1.8.2 skrll }
888