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