psargs.c revision 1.1 1 1.1 jruoho /******************************************************************************
2 1.1 jruoho *
3 1.1 jruoho * Module Name: psargs - Parse AML opcode arguments
4 1.1 jruoho *
5 1.1 jruoho *****************************************************************************/
6 1.1 jruoho
7 1.1 jruoho /******************************************************************************
8 1.1 jruoho *
9 1.1 jruoho * 1. Copyright Notice
10 1.1 jruoho *
11 1.1 jruoho * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
12 1.1 jruoho * All rights reserved.
13 1.1 jruoho *
14 1.1 jruoho * 2. License
15 1.1 jruoho *
16 1.1 jruoho * 2.1. This is your license from Intel Corp. under its intellectual property
17 1.1 jruoho * rights. You may have additional license terms from the party that provided
18 1.1 jruoho * you this software, covering your right to use that party's intellectual
19 1.1 jruoho * property rights.
20 1.1 jruoho *
21 1.1 jruoho * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22 1.1 jruoho * copy of the source code appearing in this file ("Covered Code") an
23 1.1 jruoho * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24 1.1 jruoho * base code distributed originally by Intel ("Original Intel Code") to copy,
25 1.1 jruoho * make derivatives, distribute, use and display any portion of the Covered
26 1.1 jruoho * Code in any form, with the right to sublicense such rights; and
27 1.1 jruoho *
28 1.1 jruoho * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29 1.1 jruoho * license (with the right to sublicense), under only those claims of Intel
30 1.1 jruoho * patents that are infringed by the Original Intel Code, to make, use, sell,
31 1.1 jruoho * offer to sell, and import the Covered Code and derivative works thereof
32 1.1 jruoho * solely to the minimum extent necessary to exercise the above copyright
33 1.1 jruoho * license, and in no event shall the patent license extend to any additions
34 1.1 jruoho * to or modifications of the Original Intel Code. No other license or right
35 1.1 jruoho * is granted directly or by implication, estoppel or otherwise;
36 1.1 jruoho *
37 1.1 jruoho * The above copyright and patent license is granted only if the following
38 1.1 jruoho * conditions are met:
39 1.1 jruoho *
40 1.1 jruoho * 3. Conditions
41 1.1 jruoho *
42 1.1 jruoho * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43 1.1 jruoho * Redistribution of source code of any substantial portion of the Covered
44 1.1 jruoho * Code or modification with rights to further distribute source must include
45 1.1 jruoho * the above Copyright Notice, the above License, this list of Conditions,
46 1.1 jruoho * and the following Disclaimer and Export Compliance provision. In addition,
47 1.1 jruoho * Licensee must cause all Covered Code to which Licensee contributes to
48 1.1 jruoho * contain a file documenting the changes Licensee made to create that Covered
49 1.1 jruoho * Code and the date of any change. Licensee must include in that file the
50 1.1 jruoho * documentation of any changes made by any predecessor Licensee. Licensee
51 1.1 jruoho * must include a prominent statement that the modification is derived,
52 1.1 jruoho * directly or indirectly, from Original Intel Code.
53 1.1 jruoho *
54 1.1 jruoho * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55 1.1 jruoho * Redistribution of source code of any substantial portion of the Covered
56 1.1 jruoho * Code or modification without rights to further distribute source must
57 1.1 jruoho * include the following Disclaimer and Export Compliance provision in the
58 1.1 jruoho * documentation and/or other materials provided with distribution. In
59 1.1 jruoho * addition, Licensee may not authorize further sublicense of source of any
60 1.1 jruoho * portion of the Covered Code, and must include terms to the effect that the
61 1.1 jruoho * license from Licensee to its licensee is limited to the intellectual
62 1.1 jruoho * property embodied in the software Licensee provides to its licensee, and
63 1.1 jruoho * not to intellectual property embodied in modifications its licensee may
64 1.1 jruoho * make.
65 1.1 jruoho *
66 1.1 jruoho * 3.3. Redistribution of Executable. Redistribution in executable form of any
67 1.1 jruoho * substantial portion of the Covered Code or modification must reproduce the
68 1.1 jruoho * above Copyright Notice, and the following Disclaimer and Export Compliance
69 1.1 jruoho * provision in the documentation and/or other materials provided with the
70 1.1 jruoho * distribution.
71 1.1 jruoho *
72 1.1 jruoho * 3.4. Intel retains all right, title, and interest in and to the Original
73 1.1 jruoho * Intel Code.
74 1.1 jruoho *
75 1.1 jruoho * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76 1.1 jruoho * Intel shall be used in advertising or otherwise to promote the sale, use or
77 1.1 jruoho * other dealings in products derived from or relating to the Covered Code
78 1.1 jruoho * without prior written authorization from Intel.
79 1.1 jruoho *
80 1.1 jruoho * 4. Disclaimer and Export Compliance
81 1.1 jruoho *
82 1.1 jruoho * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83 1.1 jruoho * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84 1.1 jruoho * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85 1.1 jruoho * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86 1.1 jruoho * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87 1.1 jruoho * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88 1.1 jruoho * PARTICULAR PURPOSE.
89 1.1 jruoho *
90 1.1 jruoho * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91 1.1 jruoho * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92 1.1 jruoho * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93 1.1 jruoho * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94 1.1 jruoho * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95 1.1 jruoho * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96 1.1 jruoho * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97 1.1 jruoho * LIMITED REMEDY.
98 1.1 jruoho *
99 1.1 jruoho * 4.3. Licensee shall not export, either directly or indirectly, any of this
100 1.1 jruoho * software or system incorporating such software without first obtaining any
101 1.1 jruoho * required license or other approval from the U. S. Department of Commerce or
102 1.1 jruoho * any other agency or department of the United States Government. In the
103 1.1 jruoho * event Licensee exports any such software from the United States or
104 1.1 jruoho * re-exports any such software from a foreign destination, Licensee shall
105 1.1 jruoho * ensure that the distribution and export/re-export of the software is in
106 1.1 jruoho * compliance with all laws, regulations, orders, or other restrictions of the
107 1.1 jruoho * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108 1.1 jruoho * any of its subsidiaries will export/re-export any technical data, process,
109 1.1 jruoho * software, or service, directly or indirectly, to any country for which the
110 1.1 jruoho * United States government or any agency thereof requires an export license,
111 1.1 jruoho * other governmental approval, or letter of assurance, without first obtaining
112 1.1 jruoho * such license, approval or letter.
113 1.1 jruoho *
114 1.1 jruoho *****************************************************************************/
115 1.1 jruoho
116 1.1 jruoho #define __PSARGS_C__
117 1.1 jruoho
118 1.1 jruoho #include "acpi.h"
119 1.1 jruoho #include "accommon.h"
120 1.1 jruoho #include "acparser.h"
121 1.1 jruoho #include "amlcode.h"
122 1.1 jruoho #include "acnamesp.h"
123 1.1 jruoho #include "acdispat.h"
124 1.1 jruoho
125 1.1 jruoho #define _COMPONENT ACPI_PARSER
126 1.1 jruoho ACPI_MODULE_NAME ("psargs")
127 1.1 jruoho
128 1.1 jruoho /* Local prototypes */
129 1.1 jruoho
130 1.1 jruoho static UINT32
131 1.1 jruoho AcpiPsGetNextPackageLength (
132 1.1 jruoho ACPI_PARSE_STATE *ParserState);
133 1.1 jruoho
134 1.1 jruoho static ACPI_PARSE_OBJECT *
135 1.1 jruoho AcpiPsGetNextField (
136 1.1 jruoho ACPI_PARSE_STATE *ParserState);
137 1.1 jruoho
138 1.1 jruoho
139 1.1 jruoho /*******************************************************************************
140 1.1 jruoho *
141 1.1 jruoho * FUNCTION: AcpiPsGetNextPackageLength
142 1.1 jruoho *
143 1.1 jruoho * PARAMETERS: ParserState - Current parser state object
144 1.1 jruoho *
145 1.1 jruoho * RETURN: Decoded package length. On completion, the AML pointer points
146 1.1 jruoho * past the length byte or bytes.
147 1.1 jruoho *
148 1.1 jruoho * DESCRIPTION: Decode and return a package length field.
149 1.1 jruoho * Note: Largest package length is 28 bits, from ACPI specification
150 1.1 jruoho *
151 1.1 jruoho ******************************************************************************/
152 1.1 jruoho
153 1.1 jruoho static UINT32
154 1.1 jruoho AcpiPsGetNextPackageLength (
155 1.1 jruoho ACPI_PARSE_STATE *ParserState)
156 1.1 jruoho {
157 1.1 jruoho UINT8 *Aml = ParserState->Aml;
158 1.1 jruoho UINT32 PackageLength = 0;
159 1.1 jruoho UINT32 ByteCount;
160 1.1 jruoho UINT8 ByteZeroMask = 0x3F; /* Default [0:5] */
161 1.1 jruoho
162 1.1 jruoho
163 1.1 jruoho ACPI_FUNCTION_TRACE (PsGetNextPackageLength);
164 1.1 jruoho
165 1.1 jruoho
166 1.1 jruoho /*
167 1.1 jruoho * Byte 0 bits [6:7] contain the number of additional bytes
168 1.1 jruoho * used to encode the package length, either 0,1,2, or 3
169 1.1 jruoho */
170 1.1 jruoho ByteCount = (Aml[0] >> 6);
171 1.1 jruoho ParserState->Aml += ((ACPI_SIZE) ByteCount + 1);
172 1.1 jruoho
173 1.1 jruoho /* Get bytes 3, 2, 1 as needed */
174 1.1 jruoho
175 1.1 jruoho while (ByteCount)
176 1.1 jruoho {
177 1.1 jruoho /*
178 1.1 jruoho * Final bit positions for the package length bytes:
179 1.1 jruoho * Byte3->[20:27]
180 1.1 jruoho * Byte2->[12:19]
181 1.1 jruoho * Byte1->[04:11]
182 1.1 jruoho * Byte0->[00:03]
183 1.1 jruoho */
184 1.1 jruoho PackageLength |= (Aml[ByteCount] << ((ByteCount << 3) - 4));
185 1.1 jruoho
186 1.1 jruoho ByteZeroMask = 0x0F; /* Use bits [0:3] of byte 0 */
187 1.1 jruoho ByteCount--;
188 1.1 jruoho }
189 1.1 jruoho
190 1.1 jruoho /* Byte 0 is a special case, either bits [0:3] or [0:5] are used */
191 1.1 jruoho
192 1.1 jruoho PackageLength |= (Aml[0] & ByteZeroMask);
193 1.1 jruoho return_UINT32 (PackageLength);
194 1.1 jruoho }
195 1.1 jruoho
196 1.1 jruoho
197 1.1 jruoho /*******************************************************************************
198 1.1 jruoho *
199 1.1 jruoho * FUNCTION: AcpiPsGetNextPackageEnd
200 1.1 jruoho *
201 1.1 jruoho * PARAMETERS: ParserState - Current parser state object
202 1.1 jruoho *
203 1.1 jruoho * RETURN: Pointer to end-of-package +1
204 1.1 jruoho *
205 1.1 jruoho * DESCRIPTION: Get next package length and return a pointer past the end of
206 1.1 jruoho * the package. Consumes the package length field
207 1.1 jruoho *
208 1.1 jruoho ******************************************************************************/
209 1.1 jruoho
210 1.1 jruoho UINT8 *
211 1.1 jruoho AcpiPsGetNextPackageEnd (
212 1.1 jruoho ACPI_PARSE_STATE *ParserState)
213 1.1 jruoho {
214 1.1 jruoho UINT8 *Start = ParserState->Aml;
215 1.1 jruoho UINT32 PackageLength;
216 1.1 jruoho
217 1.1 jruoho
218 1.1 jruoho ACPI_FUNCTION_TRACE (PsGetNextPackageEnd);
219 1.1 jruoho
220 1.1 jruoho
221 1.1 jruoho /* Function below updates ParserState->Aml */
222 1.1 jruoho
223 1.1 jruoho PackageLength = AcpiPsGetNextPackageLength (ParserState);
224 1.1 jruoho
225 1.1 jruoho return_PTR (Start + PackageLength); /* end of package */
226 1.1 jruoho }
227 1.1 jruoho
228 1.1 jruoho
229 1.1 jruoho /*******************************************************************************
230 1.1 jruoho *
231 1.1 jruoho * FUNCTION: AcpiPsGetNextNamestring
232 1.1 jruoho *
233 1.1 jruoho * PARAMETERS: ParserState - Current parser state object
234 1.1 jruoho *
235 1.1 jruoho * RETURN: Pointer to the start of the name string (pointer points into
236 1.1 jruoho * the AML.
237 1.1 jruoho *
238 1.1 jruoho * DESCRIPTION: Get next raw namestring within the AML stream. Handles all name
239 1.1 jruoho * prefix characters. Set parser state to point past the string.
240 1.1 jruoho * (Name is consumed from the AML.)
241 1.1 jruoho *
242 1.1 jruoho ******************************************************************************/
243 1.1 jruoho
244 1.1 jruoho char *
245 1.1 jruoho AcpiPsGetNextNamestring (
246 1.1 jruoho ACPI_PARSE_STATE *ParserState)
247 1.1 jruoho {
248 1.1 jruoho UINT8 *Start = ParserState->Aml;
249 1.1 jruoho UINT8 *End = ParserState->Aml;
250 1.1 jruoho
251 1.1 jruoho
252 1.1 jruoho ACPI_FUNCTION_TRACE (PsGetNextNamestring);
253 1.1 jruoho
254 1.1 jruoho
255 1.1 jruoho /* Point past any namestring prefix characters (backslash or carat) */
256 1.1 jruoho
257 1.1 jruoho while (AcpiPsIsPrefixChar (*End))
258 1.1 jruoho {
259 1.1 jruoho End++;
260 1.1 jruoho }
261 1.1 jruoho
262 1.1 jruoho /* Decode the path prefix character */
263 1.1 jruoho
264 1.1 jruoho switch (*End)
265 1.1 jruoho {
266 1.1 jruoho case 0:
267 1.1 jruoho
268 1.1 jruoho /* NullName */
269 1.1 jruoho
270 1.1 jruoho if (End == Start)
271 1.1 jruoho {
272 1.1 jruoho Start = NULL;
273 1.1 jruoho }
274 1.1 jruoho End++;
275 1.1 jruoho break;
276 1.1 jruoho
277 1.1 jruoho case AML_DUAL_NAME_PREFIX:
278 1.1 jruoho
279 1.1 jruoho /* Two name segments */
280 1.1 jruoho
281 1.1 jruoho End += 1 + (2 * ACPI_NAME_SIZE);
282 1.1 jruoho break;
283 1.1 jruoho
284 1.1 jruoho case AML_MULTI_NAME_PREFIX_OP:
285 1.1 jruoho
286 1.1 jruoho /* Multiple name segments, 4 chars each, count in next byte */
287 1.1 jruoho
288 1.1 jruoho End += 2 + (*(End + 1) * ACPI_NAME_SIZE);
289 1.1 jruoho break;
290 1.1 jruoho
291 1.1 jruoho default:
292 1.1 jruoho
293 1.1 jruoho /* Single name segment */
294 1.1 jruoho
295 1.1 jruoho End += ACPI_NAME_SIZE;
296 1.1 jruoho break;
297 1.1 jruoho }
298 1.1 jruoho
299 1.1 jruoho ParserState->Aml = End;
300 1.1 jruoho return_PTR ((char *) Start);
301 1.1 jruoho }
302 1.1 jruoho
303 1.1 jruoho
304 1.1 jruoho /*******************************************************************************
305 1.1 jruoho *
306 1.1 jruoho * FUNCTION: AcpiPsGetNextNamepath
307 1.1 jruoho *
308 1.1 jruoho * PARAMETERS: ParserState - Current parser state object
309 1.1 jruoho * Arg - Where the namepath will be stored
310 1.1 jruoho * ArgCount - If the namepath points to a control method
311 1.1 jruoho * the method's argument is returned here.
312 1.1 jruoho * PossibleMethodCall - Whether the namepath can possibly be the
313 1.1 jruoho * start of a method call
314 1.1 jruoho *
315 1.1 jruoho * RETURN: Status
316 1.1 jruoho *
317 1.1 jruoho * DESCRIPTION: Get next name (if method call, return # of required args).
318 1.1 jruoho * Names are looked up in the internal namespace to determine
319 1.1 jruoho * if the name represents a control method. If a method
320 1.1 jruoho * is found, the number of arguments to the method is returned.
321 1.1 jruoho * This information is critical for parsing to continue correctly.
322 1.1 jruoho *
323 1.1 jruoho ******************************************************************************/
324 1.1 jruoho
325 1.1 jruoho ACPI_STATUS
326 1.1 jruoho AcpiPsGetNextNamepath (
327 1.1 jruoho ACPI_WALK_STATE *WalkState,
328 1.1 jruoho ACPI_PARSE_STATE *ParserState,
329 1.1 jruoho ACPI_PARSE_OBJECT *Arg,
330 1.1 jruoho BOOLEAN PossibleMethodCall)
331 1.1 jruoho {
332 1.1 jruoho ACPI_STATUS Status;
333 1.1 jruoho char *Path;
334 1.1 jruoho ACPI_PARSE_OBJECT *NameOp;
335 1.1 jruoho ACPI_OPERAND_OBJECT *MethodDesc;
336 1.1 jruoho ACPI_NAMESPACE_NODE *Node;
337 1.1 jruoho UINT8 *Start = ParserState->Aml;
338 1.1 jruoho
339 1.1 jruoho
340 1.1 jruoho ACPI_FUNCTION_TRACE (PsGetNextNamepath);
341 1.1 jruoho
342 1.1 jruoho
343 1.1 jruoho Path = AcpiPsGetNextNamestring (ParserState);
344 1.1 jruoho AcpiPsInitOp (Arg, AML_INT_NAMEPATH_OP);
345 1.1 jruoho
346 1.1 jruoho /* Null path case is allowed, just exit */
347 1.1 jruoho
348 1.1 jruoho if (!Path)
349 1.1 jruoho {
350 1.1 jruoho Arg->Common.Value.Name = Path;
351 1.1 jruoho return_ACPI_STATUS (AE_OK);
352 1.1 jruoho }
353 1.1 jruoho
354 1.1 jruoho /*
355 1.1 jruoho * Lookup the name in the internal namespace, starting with the current
356 1.1 jruoho * scope. We don't want to add anything new to the namespace here,
357 1.1 jruoho * however, so we use MODE_EXECUTE.
358 1.1 jruoho * Allow searching of the parent tree, but don't open a new scope -
359 1.1 jruoho * we just want to lookup the object (must be mode EXECUTE to perform
360 1.1 jruoho * the upsearch)
361 1.1 jruoho */
362 1.1 jruoho Status = AcpiNsLookup (WalkState->ScopeInfo, Path,
363 1.1 jruoho ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
364 1.1 jruoho ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node);
365 1.1 jruoho
366 1.1 jruoho /*
367 1.1 jruoho * If this name is a control method invocation, we must
368 1.1 jruoho * setup the method call
369 1.1 jruoho */
370 1.1 jruoho if (ACPI_SUCCESS (Status) &&
371 1.1 jruoho PossibleMethodCall &&
372 1.1 jruoho (Node->Type == ACPI_TYPE_METHOD))
373 1.1 jruoho {
374 1.1 jruoho if (WalkState->Opcode == AML_UNLOAD_OP)
375 1.1 jruoho {
376 1.1 jruoho /*
377 1.1 jruoho * AcpiPsGetNextNamestring has increased the AML pointer,
378 1.1 jruoho * so we need to restore the saved AML pointer for method call.
379 1.1 jruoho */
380 1.1 jruoho WalkState->ParserState.Aml = Start;
381 1.1 jruoho WalkState->ArgCount = 1;
382 1.1 jruoho AcpiPsInitOp (Arg, AML_INT_METHODCALL_OP);
383 1.1 jruoho return_ACPI_STATUS (AE_OK);
384 1.1 jruoho }
385 1.1 jruoho
386 1.1 jruoho /* This name is actually a control method invocation */
387 1.1 jruoho
388 1.1 jruoho MethodDesc = AcpiNsGetAttachedObject (Node);
389 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
390 1.1 jruoho "Control Method - %p Desc %p Path=%p\n", Node, MethodDesc, Path));
391 1.1 jruoho
392 1.1 jruoho NameOp = AcpiPsAllocOp (AML_INT_NAMEPATH_OP);
393 1.1 jruoho if (!NameOp)
394 1.1 jruoho {
395 1.1 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
396 1.1 jruoho }
397 1.1 jruoho
398 1.1 jruoho /* Change Arg into a METHOD CALL and attach name to it */
399 1.1 jruoho
400 1.1 jruoho AcpiPsInitOp (Arg, AML_INT_METHODCALL_OP);
401 1.1 jruoho NameOp->Common.Value.Name = Path;
402 1.1 jruoho
403 1.1 jruoho /* Point METHODCALL/NAME to the METHOD Node */
404 1.1 jruoho
405 1.1 jruoho NameOp->Common.Node = Node;
406 1.1 jruoho AcpiPsAppendArg (Arg, NameOp);
407 1.1 jruoho
408 1.1 jruoho if (!MethodDesc)
409 1.1 jruoho {
410 1.1 jruoho ACPI_ERROR ((AE_INFO,
411 1.1 jruoho "Control Method %p has no attached object",
412 1.1 jruoho Node));
413 1.1 jruoho return_ACPI_STATUS (AE_AML_INTERNAL);
414 1.1 jruoho }
415 1.1 jruoho
416 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
417 1.1 jruoho "Control Method - %p Args %X\n",
418 1.1 jruoho Node, MethodDesc->Method.ParamCount));
419 1.1 jruoho
420 1.1 jruoho /* Get the number of arguments to expect */
421 1.1 jruoho
422 1.1 jruoho WalkState->ArgCount = MethodDesc->Method.ParamCount;
423 1.1 jruoho return_ACPI_STATUS (AE_OK);
424 1.1 jruoho }
425 1.1 jruoho
426 1.1 jruoho /*
427 1.1 jruoho * Special handling if the name was not found during the lookup -
428 1.1 jruoho * some NotFound cases are allowed
429 1.1 jruoho */
430 1.1 jruoho if (Status == AE_NOT_FOUND)
431 1.1 jruoho {
432 1.1 jruoho /* 1) NotFound is ok during load pass 1/2 (allow forward references) */
433 1.1 jruoho
434 1.1 jruoho if ((WalkState->ParseFlags & ACPI_PARSE_MODE_MASK) !=
435 1.1 jruoho ACPI_PARSE_EXECUTE)
436 1.1 jruoho {
437 1.1 jruoho Status = AE_OK;
438 1.1 jruoho }
439 1.1 jruoho
440 1.1 jruoho /* 2) NotFound during a CondRefOf(x) is ok by definition */
441 1.1 jruoho
442 1.1 jruoho else if (WalkState->Op->Common.AmlOpcode == AML_COND_REF_OF_OP)
443 1.1 jruoho {
444 1.1 jruoho Status = AE_OK;
445 1.1 jruoho }
446 1.1 jruoho
447 1.1 jruoho /*
448 1.1 jruoho * 3) NotFound while building a Package is ok at this point, we
449 1.1 jruoho * may flag as an error later if slack mode is not enabled.
450 1.1 jruoho * (Some ASL code depends on allowing this behavior)
451 1.1 jruoho */
452 1.1 jruoho else if ((Arg->Common.Parent) &&
453 1.1 jruoho ((Arg->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
454 1.1 jruoho (Arg->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP)))
455 1.1 jruoho {
456 1.1 jruoho Status = AE_OK;
457 1.1 jruoho }
458 1.1 jruoho }
459 1.1 jruoho
460 1.1 jruoho /* Final exception check (may have been changed from code above) */
461 1.1 jruoho
462 1.1 jruoho if (ACPI_FAILURE (Status))
463 1.1 jruoho {
464 1.1 jruoho ACPI_ERROR_NAMESPACE (Path, Status);
465 1.1 jruoho
466 1.1 jruoho if ((WalkState->ParseFlags & ACPI_PARSE_MODE_MASK) ==
467 1.1 jruoho ACPI_PARSE_EXECUTE)
468 1.1 jruoho {
469 1.1 jruoho /* Report a control method execution error */
470 1.1 jruoho
471 1.1 jruoho Status = AcpiDsMethodError (Status, WalkState);
472 1.1 jruoho }
473 1.1 jruoho }
474 1.1 jruoho
475 1.1 jruoho /* Save the namepath */
476 1.1 jruoho
477 1.1 jruoho Arg->Common.Value.Name = Path;
478 1.1 jruoho return_ACPI_STATUS (Status);
479 1.1 jruoho }
480 1.1 jruoho
481 1.1 jruoho
482 1.1 jruoho /*******************************************************************************
483 1.1 jruoho *
484 1.1 jruoho * FUNCTION: AcpiPsGetNextSimpleArg
485 1.1 jruoho *
486 1.1 jruoho * PARAMETERS: ParserState - Current parser state object
487 1.1 jruoho * ArgType - The argument type (AML_*_ARG)
488 1.1 jruoho * Arg - Where the argument is returned
489 1.1 jruoho *
490 1.1 jruoho * RETURN: None
491 1.1 jruoho *
492 1.1 jruoho * DESCRIPTION: Get the next simple argument (constant, string, or namestring)
493 1.1 jruoho *
494 1.1 jruoho ******************************************************************************/
495 1.1 jruoho
496 1.1 jruoho void
497 1.1 jruoho AcpiPsGetNextSimpleArg (
498 1.1 jruoho ACPI_PARSE_STATE *ParserState,
499 1.1 jruoho UINT32 ArgType,
500 1.1 jruoho ACPI_PARSE_OBJECT *Arg)
501 1.1 jruoho {
502 1.1 jruoho UINT32 Length;
503 1.1 jruoho UINT16 Opcode;
504 1.1 jruoho UINT8 *Aml = ParserState->Aml;
505 1.1 jruoho
506 1.1 jruoho
507 1.1 jruoho ACPI_FUNCTION_TRACE_U32 (PsGetNextSimpleArg, ArgType);
508 1.1 jruoho
509 1.1 jruoho
510 1.1 jruoho switch (ArgType)
511 1.1 jruoho {
512 1.1 jruoho case ARGP_BYTEDATA:
513 1.1 jruoho
514 1.1 jruoho /* Get 1 byte from the AML stream */
515 1.1 jruoho
516 1.1 jruoho Opcode = AML_BYTE_OP;
517 1.1 jruoho Arg->Common.Value.Integer = (UINT64) *Aml;
518 1.1 jruoho Length = 1;
519 1.1 jruoho break;
520 1.1 jruoho
521 1.1 jruoho
522 1.1 jruoho case ARGP_WORDDATA:
523 1.1 jruoho
524 1.1 jruoho /* Get 2 bytes from the AML stream */
525 1.1 jruoho
526 1.1 jruoho Opcode = AML_WORD_OP;
527 1.1 jruoho ACPI_MOVE_16_TO_64 (&Arg->Common.Value.Integer, Aml);
528 1.1 jruoho Length = 2;
529 1.1 jruoho break;
530 1.1 jruoho
531 1.1 jruoho
532 1.1 jruoho case ARGP_DWORDDATA:
533 1.1 jruoho
534 1.1 jruoho /* Get 4 bytes from the AML stream */
535 1.1 jruoho
536 1.1 jruoho Opcode = AML_DWORD_OP;
537 1.1 jruoho ACPI_MOVE_32_TO_64 (&Arg->Common.Value.Integer, Aml);
538 1.1 jruoho Length = 4;
539 1.1 jruoho break;
540 1.1 jruoho
541 1.1 jruoho
542 1.1 jruoho case ARGP_QWORDDATA:
543 1.1 jruoho
544 1.1 jruoho /* Get 8 bytes from the AML stream */
545 1.1 jruoho
546 1.1 jruoho Opcode = AML_QWORD_OP;
547 1.1 jruoho ACPI_MOVE_64_TO_64 (&Arg->Common.Value.Integer, Aml);
548 1.1 jruoho Length = 8;
549 1.1 jruoho break;
550 1.1 jruoho
551 1.1 jruoho
552 1.1 jruoho case ARGP_CHARLIST:
553 1.1 jruoho
554 1.1 jruoho /* Get a pointer to the string, point past the string */
555 1.1 jruoho
556 1.1 jruoho Opcode = AML_STRING_OP;
557 1.1 jruoho Arg->Common.Value.String = ACPI_CAST_PTR (char, Aml);
558 1.1 jruoho
559 1.1 jruoho /* Find the null terminator */
560 1.1 jruoho
561 1.1 jruoho Length = 0;
562 1.1 jruoho while (Aml[Length])
563 1.1 jruoho {
564 1.1 jruoho Length++;
565 1.1 jruoho }
566 1.1 jruoho Length++;
567 1.1 jruoho break;
568 1.1 jruoho
569 1.1 jruoho
570 1.1 jruoho case ARGP_NAME:
571 1.1 jruoho case ARGP_NAMESTRING:
572 1.1 jruoho
573 1.1 jruoho AcpiPsInitOp (Arg, AML_INT_NAMEPATH_OP);
574 1.1 jruoho Arg->Common.Value.Name = AcpiPsGetNextNamestring (ParserState);
575 1.1 jruoho return_VOID;
576 1.1 jruoho
577 1.1 jruoho
578 1.1 jruoho default:
579 1.1 jruoho
580 1.1 jruoho ACPI_ERROR ((AE_INFO, "Invalid ArgType 0x%X", ArgType));
581 1.1 jruoho return_VOID;
582 1.1 jruoho }
583 1.1 jruoho
584 1.1 jruoho AcpiPsInitOp (Arg, Opcode);
585 1.1 jruoho ParserState->Aml += Length;
586 1.1 jruoho return_VOID;
587 1.1 jruoho }
588 1.1 jruoho
589 1.1 jruoho
590 1.1 jruoho /*******************************************************************************
591 1.1 jruoho *
592 1.1 jruoho * FUNCTION: AcpiPsGetNextField
593 1.1 jruoho *
594 1.1 jruoho * PARAMETERS: ParserState - Current parser state object
595 1.1 jruoho *
596 1.1 jruoho * RETURN: A newly allocated FIELD op
597 1.1 jruoho *
598 1.1 jruoho * DESCRIPTION: Get next field (NamedField, ReservedField, or AccessField)
599 1.1 jruoho *
600 1.1 jruoho ******************************************************************************/
601 1.1 jruoho
602 1.1 jruoho static ACPI_PARSE_OBJECT *
603 1.1 jruoho AcpiPsGetNextField (
604 1.1 jruoho ACPI_PARSE_STATE *ParserState)
605 1.1 jruoho {
606 1.1 jruoho UINT32 AmlOffset = (UINT32)
607 1.1 jruoho ACPI_PTR_DIFF (ParserState->Aml,
608 1.1 jruoho ParserState->AmlStart);
609 1.1 jruoho ACPI_PARSE_OBJECT *Field;
610 1.1 jruoho UINT16 Opcode;
611 1.1 jruoho UINT32 Name;
612 1.1 jruoho
613 1.1 jruoho
614 1.1 jruoho ACPI_FUNCTION_TRACE (PsGetNextField);
615 1.1 jruoho
616 1.1 jruoho
617 1.1 jruoho /* Determine field type */
618 1.1 jruoho
619 1.1 jruoho switch (ACPI_GET8 (ParserState->Aml))
620 1.1 jruoho {
621 1.1 jruoho default:
622 1.1 jruoho
623 1.1 jruoho Opcode = AML_INT_NAMEDFIELD_OP;
624 1.1 jruoho break;
625 1.1 jruoho
626 1.1 jruoho case 0x00:
627 1.1 jruoho
628 1.1 jruoho Opcode = AML_INT_RESERVEDFIELD_OP;
629 1.1 jruoho ParserState->Aml++;
630 1.1 jruoho break;
631 1.1 jruoho
632 1.1 jruoho case 0x01:
633 1.1 jruoho
634 1.1 jruoho Opcode = AML_INT_ACCESSFIELD_OP;
635 1.1 jruoho ParserState->Aml++;
636 1.1 jruoho break;
637 1.1 jruoho }
638 1.1 jruoho
639 1.1 jruoho /* Allocate a new field op */
640 1.1 jruoho
641 1.1 jruoho Field = AcpiPsAllocOp (Opcode);
642 1.1 jruoho if (!Field)
643 1.1 jruoho {
644 1.1 jruoho return_PTR (NULL);
645 1.1 jruoho }
646 1.1 jruoho
647 1.1 jruoho Field->Common.AmlOffset = AmlOffset;
648 1.1 jruoho
649 1.1 jruoho /* Decode the field type */
650 1.1 jruoho
651 1.1 jruoho switch (Opcode)
652 1.1 jruoho {
653 1.1 jruoho case AML_INT_NAMEDFIELD_OP:
654 1.1 jruoho
655 1.1 jruoho /* Get the 4-character name */
656 1.1 jruoho
657 1.1 jruoho ACPI_MOVE_32_TO_32 (&Name, ParserState->Aml);
658 1.1 jruoho AcpiPsSetName (Field, Name);
659 1.1 jruoho ParserState->Aml += ACPI_NAME_SIZE;
660 1.1 jruoho
661 1.1 jruoho /* Get the length which is encoded as a package length */
662 1.1 jruoho
663 1.1 jruoho Field->Common.Value.Size = AcpiPsGetNextPackageLength (ParserState);
664 1.1 jruoho break;
665 1.1 jruoho
666 1.1 jruoho
667 1.1 jruoho case AML_INT_RESERVEDFIELD_OP:
668 1.1 jruoho
669 1.1 jruoho /* Get the length which is encoded as a package length */
670 1.1 jruoho
671 1.1 jruoho Field->Common.Value.Size = AcpiPsGetNextPackageLength (ParserState);
672 1.1 jruoho break;
673 1.1 jruoho
674 1.1 jruoho
675 1.1 jruoho case AML_INT_ACCESSFIELD_OP:
676 1.1 jruoho
677 1.1 jruoho /*
678 1.1 jruoho * Get AccessType and AccessAttrib and merge into the field Op
679 1.1 jruoho * AccessType is first operand, AccessAttribute is second
680 1.1 jruoho */
681 1.1 jruoho Field->Common.Value.Integer = (((UINT32) ACPI_GET8 (ParserState->Aml) << 8));
682 1.1 jruoho ParserState->Aml++;
683 1.1 jruoho Field->Common.Value.Integer |= ACPI_GET8 (ParserState->Aml);
684 1.1 jruoho ParserState->Aml++;
685 1.1 jruoho break;
686 1.1 jruoho
687 1.1 jruoho default:
688 1.1 jruoho
689 1.1 jruoho /* Opcode was set in previous switch */
690 1.1 jruoho break;
691 1.1 jruoho }
692 1.1 jruoho
693 1.1 jruoho return_PTR (Field);
694 1.1 jruoho }
695 1.1 jruoho
696 1.1 jruoho
697 1.1 jruoho /*******************************************************************************
698 1.1 jruoho *
699 1.1 jruoho * FUNCTION: AcpiPsGetNextArg
700 1.1 jruoho *
701 1.1 jruoho * PARAMETERS: WalkState - Current state
702 1.1 jruoho * ParserState - Current parser state object
703 1.1 jruoho * ArgType - The argument type (AML_*_ARG)
704 1.1 jruoho * ReturnArg - Where the next arg is returned
705 1.1 jruoho *
706 1.1 jruoho * RETURN: Status, and an op object containing the next argument.
707 1.1 jruoho *
708 1.1 jruoho * DESCRIPTION: Get next argument (including complex list arguments that require
709 1.1 jruoho * pushing the parser stack)
710 1.1 jruoho *
711 1.1 jruoho ******************************************************************************/
712 1.1 jruoho
713 1.1 jruoho ACPI_STATUS
714 1.1 jruoho AcpiPsGetNextArg (
715 1.1 jruoho ACPI_WALK_STATE *WalkState,
716 1.1 jruoho ACPI_PARSE_STATE *ParserState,
717 1.1 jruoho UINT32 ArgType,
718 1.1 jruoho ACPI_PARSE_OBJECT **ReturnArg)
719 1.1 jruoho {
720 1.1 jruoho ACPI_PARSE_OBJECT *Arg = NULL;
721 1.1 jruoho ACPI_PARSE_OBJECT *Prev = NULL;
722 1.1 jruoho ACPI_PARSE_OBJECT *Field;
723 1.1 jruoho UINT32 Subop;
724 1.1 jruoho ACPI_STATUS Status = AE_OK;
725 1.1 jruoho
726 1.1 jruoho
727 1.1 jruoho ACPI_FUNCTION_TRACE_PTR (PsGetNextArg, ParserState);
728 1.1 jruoho
729 1.1 jruoho
730 1.1 jruoho switch (ArgType)
731 1.1 jruoho {
732 1.1 jruoho case ARGP_BYTEDATA:
733 1.1 jruoho case ARGP_WORDDATA:
734 1.1 jruoho case ARGP_DWORDDATA:
735 1.1 jruoho case ARGP_CHARLIST:
736 1.1 jruoho case ARGP_NAME:
737 1.1 jruoho case ARGP_NAMESTRING:
738 1.1 jruoho
739 1.1 jruoho /* Constants, strings, and namestrings are all the same size */
740 1.1 jruoho
741 1.1 jruoho Arg = AcpiPsAllocOp (AML_BYTE_OP);
742 1.1 jruoho if (!Arg)
743 1.1 jruoho {
744 1.1 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
745 1.1 jruoho }
746 1.1 jruoho AcpiPsGetNextSimpleArg (ParserState, ArgType, Arg);
747 1.1 jruoho break;
748 1.1 jruoho
749 1.1 jruoho
750 1.1 jruoho case ARGP_PKGLENGTH:
751 1.1 jruoho
752 1.1 jruoho /* Package length, nothing returned */
753 1.1 jruoho
754 1.1 jruoho ParserState->PkgEnd = AcpiPsGetNextPackageEnd (ParserState);
755 1.1 jruoho break;
756 1.1 jruoho
757 1.1 jruoho
758 1.1 jruoho case ARGP_FIELDLIST:
759 1.1 jruoho
760 1.1 jruoho if (ParserState->Aml < ParserState->PkgEnd)
761 1.1 jruoho {
762 1.1 jruoho /* Non-empty list */
763 1.1 jruoho
764 1.1 jruoho while (ParserState->Aml < ParserState->PkgEnd)
765 1.1 jruoho {
766 1.1 jruoho Field = AcpiPsGetNextField (ParserState);
767 1.1 jruoho if (!Field)
768 1.1 jruoho {
769 1.1 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
770 1.1 jruoho }
771 1.1 jruoho
772 1.1 jruoho if (Prev)
773 1.1 jruoho {
774 1.1 jruoho Prev->Common.Next = Field;
775 1.1 jruoho }
776 1.1 jruoho else
777 1.1 jruoho {
778 1.1 jruoho Arg = Field;
779 1.1 jruoho }
780 1.1 jruoho Prev = Field;
781 1.1 jruoho }
782 1.1 jruoho
783 1.1 jruoho /* Skip to End of byte data */
784 1.1 jruoho
785 1.1 jruoho ParserState->Aml = ParserState->PkgEnd;
786 1.1 jruoho }
787 1.1 jruoho break;
788 1.1 jruoho
789 1.1 jruoho
790 1.1 jruoho case ARGP_BYTELIST:
791 1.1 jruoho
792 1.1 jruoho if (ParserState->Aml < ParserState->PkgEnd)
793 1.1 jruoho {
794 1.1 jruoho /* Non-empty list */
795 1.1 jruoho
796 1.1 jruoho Arg = AcpiPsAllocOp (AML_INT_BYTELIST_OP);
797 1.1 jruoho if (!Arg)
798 1.1 jruoho {
799 1.1 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
800 1.1 jruoho }
801 1.1 jruoho
802 1.1 jruoho /* Fill in bytelist data */
803 1.1 jruoho
804 1.1 jruoho Arg->Common.Value.Size = (UINT32)
805 1.1 jruoho ACPI_PTR_DIFF (ParserState->PkgEnd, ParserState->Aml);
806 1.1 jruoho Arg->Named.Data = ParserState->Aml;
807 1.1 jruoho
808 1.1 jruoho /* Skip to End of byte data */
809 1.1 jruoho
810 1.1 jruoho ParserState->Aml = ParserState->PkgEnd;
811 1.1 jruoho }
812 1.1 jruoho break;
813 1.1 jruoho
814 1.1 jruoho
815 1.1 jruoho case ARGP_TARGET:
816 1.1 jruoho case ARGP_SUPERNAME:
817 1.1 jruoho case ARGP_SIMPLENAME:
818 1.1 jruoho
819 1.1 jruoho Subop = AcpiPsPeekOpcode (ParserState);
820 1.1 jruoho if (Subop == 0 ||
821 1.1 jruoho AcpiPsIsLeadingChar (Subop) ||
822 1.1 jruoho AcpiPsIsPrefixChar (Subop))
823 1.1 jruoho {
824 1.1 jruoho /* NullName or NameString */
825 1.1 jruoho
826 1.1 jruoho Arg = AcpiPsAllocOp (AML_INT_NAMEPATH_OP);
827 1.1 jruoho if (!Arg)
828 1.1 jruoho {
829 1.1 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
830 1.1 jruoho }
831 1.1 jruoho
832 1.1 jruoho /* To support SuperName arg of Unload */
833 1.1 jruoho
834 1.1 jruoho if (WalkState->Opcode == AML_UNLOAD_OP)
835 1.1 jruoho {
836 1.1 jruoho Status = AcpiPsGetNextNamepath (WalkState, ParserState, Arg, 1);
837 1.1 jruoho
838 1.1 jruoho /*
839 1.1 jruoho * If the SuperName arg of Unload is a method call,
840 1.1 jruoho * we have restored the AML pointer, just free this Arg
841 1.1 jruoho */
842 1.1 jruoho if (Arg->Common.AmlOpcode == AML_INT_METHODCALL_OP)
843 1.1 jruoho {
844 1.1 jruoho AcpiPsFreeOp (Arg);
845 1.1 jruoho Arg = NULL;
846 1.1 jruoho }
847 1.1 jruoho }
848 1.1 jruoho else
849 1.1 jruoho {
850 1.1 jruoho Status = AcpiPsGetNextNamepath (WalkState, ParserState, Arg, 0);
851 1.1 jruoho }
852 1.1 jruoho }
853 1.1 jruoho else
854 1.1 jruoho {
855 1.1 jruoho /* Single complex argument, nothing returned */
856 1.1 jruoho
857 1.1 jruoho WalkState->ArgCount = 1;
858 1.1 jruoho }
859 1.1 jruoho break;
860 1.1 jruoho
861 1.1 jruoho
862 1.1 jruoho case ARGP_DATAOBJ:
863 1.1 jruoho case ARGP_TERMARG:
864 1.1 jruoho
865 1.1 jruoho /* Single complex argument, nothing returned */
866 1.1 jruoho
867 1.1 jruoho WalkState->ArgCount = 1;
868 1.1 jruoho break;
869 1.1 jruoho
870 1.1 jruoho
871 1.1 jruoho case ARGP_DATAOBJLIST:
872 1.1 jruoho case ARGP_TERMLIST:
873 1.1 jruoho case ARGP_OBJLIST:
874 1.1 jruoho
875 1.1 jruoho if (ParserState->Aml < ParserState->PkgEnd)
876 1.1 jruoho {
877 1.1 jruoho /* Non-empty list of variable arguments, nothing returned */
878 1.1 jruoho
879 1.1 jruoho WalkState->ArgCount = ACPI_VAR_ARGS;
880 1.1 jruoho }
881 1.1 jruoho break;
882 1.1 jruoho
883 1.1 jruoho
884 1.1 jruoho default:
885 1.1 jruoho
886 1.1 jruoho ACPI_ERROR ((AE_INFO, "Invalid ArgType: 0x%X", ArgType));
887 1.1 jruoho Status = AE_AML_OPERAND_TYPE;
888 1.1 jruoho break;
889 1.1 jruoho }
890 1.1 jruoho
891 1.1 jruoho *ReturnArg = Arg;
892 1.1 jruoho return_ACPI_STATUS (Status);
893 1.1 jruoho }
894