dswload.c revision 1.1 1 1.1 jruoho /******************************************************************************
2 1.1 jruoho *
3 1.1 jruoho * Module Name: dswload - Dispatcher namespace load callbacks
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 __DSWLOAD_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 "acdispat.h"
123 1.1 jruoho #include "acinterp.h"
124 1.1 jruoho #include "acnamesp.h"
125 1.1 jruoho #include "acevents.h"
126 1.1 jruoho
127 1.1 jruoho #ifdef ACPI_ASL_COMPILER
128 1.1 jruoho #include "acdisasm.h"
129 1.1 jruoho #endif
130 1.1 jruoho
131 1.1 jruoho #define _COMPONENT ACPI_DISPATCHER
132 1.1 jruoho ACPI_MODULE_NAME ("dswload")
133 1.1 jruoho
134 1.1 jruoho
135 1.1 jruoho /*******************************************************************************
136 1.1 jruoho *
137 1.1 jruoho * FUNCTION: AcpiDsInitCallbacks
138 1.1 jruoho *
139 1.1 jruoho * PARAMETERS: WalkState - Current state of the parse tree walk
140 1.1 jruoho * PassNumber - 1, 2, or 3
141 1.1 jruoho *
142 1.1 jruoho * RETURN: Status
143 1.1 jruoho *
144 1.1 jruoho * DESCRIPTION: Init walk state callbacks
145 1.1 jruoho *
146 1.1 jruoho ******************************************************************************/
147 1.1 jruoho
148 1.1 jruoho ACPI_STATUS
149 1.1 jruoho AcpiDsInitCallbacks (
150 1.1 jruoho ACPI_WALK_STATE *WalkState,
151 1.1 jruoho UINT32 PassNumber)
152 1.1 jruoho {
153 1.1 jruoho
154 1.1 jruoho switch (PassNumber)
155 1.1 jruoho {
156 1.1 jruoho case 1:
157 1.1 jruoho WalkState->ParseFlags = ACPI_PARSE_LOAD_PASS1 |
158 1.1 jruoho ACPI_PARSE_DELETE_TREE;
159 1.1 jruoho WalkState->DescendingCallback = AcpiDsLoad1BeginOp;
160 1.1 jruoho WalkState->AscendingCallback = AcpiDsLoad1EndOp;
161 1.1 jruoho break;
162 1.1 jruoho
163 1.1 jruoho case 2:
164 1.1 jruoho WalkState->ParseFlags = ACPI_PARSE_LOAD_PASS1 |
165 1.1 jruoho ACPI_PARSE_DELETE_TREE;
166 1.1 jruoho WalkState->DescendingCallback = AcpiDsLoad2BeginOp;
167 1.1 jruoho WalkState->AscendingCallback = AcpiDsLoad2EndOp;
168 1.1 jruoho break;
169 1.1 jruoho
170 1.1 jruoho case 3:
171 1.1 jruoho #ifndef ACPI_NO_METHOD_EXECUTION
172 1.1 jruoho WalkState->ParseFlags |= ACPI_PARSE_EXECUTE |
173 1.1 jruoho ACPI_PARSE_DELETE_TREE;
174 1.1 jruoho WalkState->DescendingCallback = AcpiDsExecBeginOp;
175 1.1 jruoho WalkState->AscendingCallback = AcpiDsExecEndOp;
176 1.1 jruoho #endif
177 1.1 jruoho break;
178 1.1 jruoho
179 1.1 jruoho default:
180 1.1 jruoho return (AE_BAD_PARAMETER);
181 1.1 jruoho }
182 1.1 jruoho
183 1.1 jruoho return (AE_OK);
184 1.1 jruoho }
185 1.1 jruoho
186 1.1 jruoho
187 1.1 jruoho /*******************************************************************************
188 1.1 jruoho *
189 1.1 jruoho * FUNCTION: AcpiDsLoad1BeginOp
190 1.1 jruoho *
191 1.1 jruoho * PARAMETERS: WalkState - Current state of the parse tree walk
192 1.1 jruoho * OutOp - Where to return op if a new one is created
193 1.1 jruoho *
194 1.1 jruoho * RETURN: Status
195 1.1 jruoho *
196 1.1 jruoho * DESCRIPTION: Descending callback used during the loading of ACPI tables.
197 1.1 jruoho *
198 1.1 jruoho ******************************************************************************/
199 1.1 jruoho
200 1.1 jruoho ACPI_STATUS
201 1.1 jruoho AcpiDsLoad1BeginOp (
202 1.1 jruoho ACPI_WALK_STATE *WalkState,
203 1.1 jruoho ACPI_PARSE_OBJECT **OutOp)
204 1.1 jruoho {
205 1.1 jruoho ACPI_PARSE_OBJECT *Op;
206 1.1 jruoho ACPI_NAMESPACE_NODE *Node;
207 1.1 jruoho ACPI_STATUS Status;
208 1.1 jruoho ACPI_OBJECT_TYPE ObjectType;
209 1.1 jruoho char *Path;
210 1.1 jruoho UINT32 Flags;
211 1.1 jruoho
212 1.1 jruoho
213 1.1 jruoho ACPI_FUNCTION_TRACE (DsLoad1BeginOp);
214 1.1 jruoho
215 1.1 jruoho
216 1.1 jruoho Op = WalkState->Op;
217 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState));
218 1.1 jruoho
219 1.1 jruoho /* We are only interested in opcodes that have an associated name */
220 1.1 jruoho
221 1.1 jruoho if (Op)
222 1.1 jruoho {
223 1.1 jruoho if (!(WalkState->OpInfo->Flags & AML_NAMED))
224 1.1 jruoho {
225 1.1 jruoho *OutOp = Op;
226 1.1 jruoho return_ACPI_STATUS (AE_OK);
227 1.1 jruoho }
228 1.1 jruoho
229 1.1 jruoho /* Check if this object has already been installed in the namespace */
230 1.1 jruoho
231 1.1 jruoho if (Op->Common.Node)
232 1.1 jruoho {
233 1.1 jruoho *OutOp = Op;
234 1.1 jruoho return_ACPI_STATUS (AE_OK);
235 1.1 jruoho }
236 1.1 jruoho }
237 1.1 jruoho
238 1.1 jruoho Path = AcpiPsGetNextNamestring (&WalkState->ParserState);
239 1.1 jruoho
240 1.1 jruoho /* Map the raw opcode into an internal object type */
241 1.1 jruoho
242 1.1 jruoho ObjectType = WalkState->OpInfo->ObjectType;
243 1.1 jruoho
244 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
245 1.1 jruoho "State=%p Op=%p [%s]\n", WalkState, Op, AcpiUtGetTypeName (ObjectType)));
246 1.1 jruoho
247 1.1 jruoho switch (WalkState->Opcode)
248 1.1 jruoho {
249 1.1 jruoho case AML_SCOPE_OP:
250 1.1 jruoho
251 1.1 jruoho /*
252 1.1 jruoho * The target name of the Scope() operator must exist at this point so
253 1.1 jruoho * that we can actually open the scope to enter new names underneath it.
254 1.1 jruoho * Allow search-to-root for single namesegs.
255 1.1 jruoho */
256 1.1 jruoho Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
257 1.1 jruoho ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &(Node));
258 1.1 jruoho #ifdef ACPI_ASL_COMPILER
259 1.1 jruoho if (Status == AE_NOT_FOUND)
260 1.1 jruoho {
261 1.1 jruoho /*
262 1.1 jruoho * Table disassembly:
263 1.1 jruoho * Target of Scope() not found. Generate an External for it, and
264 1.1 jruoho * insert the name into the namespace.
265 1.1 jruoho */
266 1.1 jruoho AcpiDmAddToExternalList (Op, Path, ACPI_TYPE_DEVICE, 0);
267 1.1 jruoho Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
268 1.1 jruoho ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT,
269 1.1 jruoho WalkState, &Node);
270 1.1 jruoho }
271 1.1 jruoho #endif
272 1.1 jruoho if (ACPI_FAILURE (Status))
273 1.1 jruoho {
274 1.1 jruoho ACPI_ERROR_NAMESPACE (Path, Status);
275 1.1 jruoho return_ACPI_STATUS (Status);
276 1.1 jruoho }
277 1.1 jruoho
278 1.1 jruoho /*
279 1.1 jruoho * Check to make sure that the target is
280 1.1 jruoho * one of the opcodes that actually opens a scope
281 1.1 jruoho */
282 1.1 jruoho switch (Node->Type)
283 1.1 jruoho {
284 1.1 jruoho case ACPI_TYPE_ANY:
285 1.1 jruoho case ACPI_TYPE_LOCAL_SCOPE: /* Scope */
286 1.1 jruoho case ACPI_TYPE_DEVICE:
287 1.1 jruoho case ACPI_TYPE_POWER:
288 1.1 jruoho case ACPI_TYPE_PROCESSOR:
289 1.1 jruoho case ACPI_TYPE_THERMAL:
290 1.1 jruoho
291 1.1 jruoho /* These are acceptable types */
292 1.1 jruoho break;
293 1.1 jruoho
294 1.1 jruoho case ACPI_TYPE_INTEGER:
295 1.1 jruoho case ACPI_TYPE_STRING:
296 1.1 jruoho case ACPI_TYPE_BUFFER:
297 1.1 jruoho
298 1.1 jruoho /*
299 1.1 jruoho * These types we will allow, but we will change the type.
300 1.1 jruoho * This enables some existing code of the form:
301 1.1 jruoho *
302 1.1 jruoho * Name (DEB, 0)
303 1.1 jruoho * Scope (DEB) { ... }
304 1.1 jruoho *
305 1.1 jruoho * Note: silently change the type here. On the second pass,
306 1.1 jruoho * we will report a warning
307 1.1 jruoho */
308 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
309 1.1 jruoho "Type override - [%4.4s] had invalid type (%s) "
310 1.1 jruoho "for Scope operator, changed to type ANY\n",
311 1.1 jruoho AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type)));
312 1.1 jruoho
313 1.1 jruoho Node->Type = ACPI_TYPE_ANY;
314 1.1 jruoho WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
315 1.1 jruoho break;
316 1.1 jruoho
317 1.1 jruoho default:
318 1.1 jruoho
319 1.1 jruoho /* All other types are an error */
320 1.1 jruoho
321 1.1 jruoho ACPI_ERROR ((AE_INFO,
322 1.1 jruoho "Invalid type (%s) for target of "
323 1.1 jruoho "Scope operator [%4.4s] (Cannot override)",
324 1.1 jruoho AcpiUtGetTypeName (Node->Type), AcpiUtGetNodeName (Node)));
325 1.1 jruoho
326 1.1 jruoho return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
327 1.1 jruoho }
328 1.1 jruoho break;
329 1.1 jruoho
330 1.1 jruoho
331 1.1 jruoho default:
332 1.1 jruoho /*
333 1.1 jruoho * For all other named opcodes, we will enter the name into
334 1.1 jruoho * the namespace.
335 1.1 jruoho *
336 1.1 jruoho * Setup the search flags.
337 1.1 jruoho * Since we are entering a name into the namespace, we do not want to
338 1.1 jruoho * enable the search-to-root upsearch.
339 1.1 jruoho *
340 1.1 jruoho * There are only two conditions where it is acceptable that the name
341 1.1 jruoho * already exists:
342 1.1 jruoho * 1) the Scope() operator can reopen a scoping object that was
343 1.1 jruoho * previously defined (Scope, Method, Device, etc.)
344 1.1 jruoho * 2) Whenever we are parsing a deferred opcode (OpRegion, Buffer,
345 1.1 jruoho * BufferField, or Package), the name of the object is already
346 1.1 jruoho * in the namespace.
347 1.1 jruoho */
348 1.1 jruoho if (WalkState->DeferredNode)
349 1.1 jruoho {
350 1.1 jruoho /* This name is already in the namespace, get the node */
351 1.1 jruoho
352 1.1 jruoho Node = WalkState->DeferredNode;
353 1.1 jruoho Status = AE_OK;
354 1.1 jruoho break;
355 1.1 jruoho }
356 1.1 jruoho
357 1.1 jruoho /*
358 1.1 jruoho * If we are executing a method, do not create any namespace objects
359 1.1 jruoho * during the load phase, only during execution.
360 1.1 jruoho */
361 1.1 jruoho if (WalkState->MethodNode)
362 1.1 jruoho {
363 1.1 jruoho Node = NULL;
364 1.1 jruoho Status = AE_OK;
365 1.1 jruoho break;
366 1.1 jruoho }
367 1.1 jruoho
368 1.1 jruoho Flags = ACPI_NS_NO_UPSEARCH;
369 1.1 jruoho if ((WalkState->Opcode != AML_SCOPE_OP) &&
370 1.1 jruoho (!(WalkState->ParseFlags & ACPI_PARSE_DEFERRED_OP)))
371 1.1 jruoho {
372 1.1 jruoho Flags |= ACPI_NS_ERROR_IF_FOUND;
373 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[%s] Cannot already exist\n",
374 1.1 jruoho AcpiUtGetTypeName (ObjectType)));
375 1.1 jruoho }
376 1.1 jruoho else
377 1.1 jruoho {
378 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
379 1.1 jruoho "[%s] Both Find or Create allowed\n",
380 1.1 jruoho AcpiUtGetTypeName (ObjectType)));
381 1.1 jruoho }
382 1.1 jruoho
383 1.1 jruoho /*
384 1.1 jruoho * Enter the named type into the internal namespace. We enter the name
385 1.1 jruoho * as we go downward in the parse tree. Any necessary subobjects that
386 1.1 jruoho * involve arguments to the opcode must be created as we go back up the
387 1.1 jruoho * parse tree later.
388 1.1 jruoho */
389 1.1 jruoho Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
390 1.1 jruoho ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node);
391 1.1 jruoho if (ACPI_FAILURE (Status))
392 1.1 jruoho {
393 1.1 jruoho if (Status == AE_ALREADY_EXISTS)
394 1.1 jruoho {
395 1.1 jruoho /* The name already exists in this scope */
396 1.1 jruoho
397 1.1 jruoho if (Node->Flags & ANOBJ_IS_EXTERNAL)
398 1.1 jruoho {
399 1.1 jruoho /*
400 1.1 jruoho * Allow one create on an object or segment that was
401 1.1 jruoho * previously declared External
402 1.1 jruoho */
403 1.1 jruoho Node->Flags &= ~ANOBJ_IS_EXTERNAL;
404 1.1 jruoho Node->Type = (UINT8) ObjectType;
405 1.1 jruoho
406 1.1 jruoho /* Just retyped a node, probably will need to open a scope */
407 1.1 jruoho
408 1.1 jruoho if (AcpiNsOpensScope (ObjectType))
409 1.1 jruoho {
410 1.1 jruoho Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
411 1.1 jruoho if (ACPI_FAILURE (Status))
412 1.1 jruoho {
413 1.1 jruoho return_ACPI_STATUS (Status);
414 1.1 jruoho }
415 1.1 jruoho }
416 1.1 jruoho
417 1.1 jruoho Status = AE_OK;
418 1.1 jruoho }
419 1.1 jruoho }
420 1.1 jruoho
421 1.1 jruoho if (ACPI_FAILURE (Status))
422 1.1 jruoho {
423 1.1 jruoho ACPI_ERROR_NAMESPACE (Path, Status);
424 1.1 jruoho return_ACPI_STATUS (Status);
425 1.1 jruoho }
426 1.1 jruoho }
427 1.1 jruoho break;
428 1.1 jruoho }
429 1.1 jruoho
430 1.1 jruoho /* Common exit */
431 1.1 jruoho
432 1.1 jruoho if (!Op)
433 1.1 jruoho {
434 1.1 jruoho /* Create a new op */
435 1.1 jruoho
436 1.1 jruoho Op = AcpiPsAllocOp (WalkState->Opcode);
437 1.1 jruoho if (!Op)
438 1.1 jruoho {
439 1.1 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
440 1.1 jruoho }
441 1.1 jruoho }
442 1.1 jruoho
443 1.1 jruoho /* Initialize the op */
444 1.1 jruoho
445 1.1 jruoho #if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY))
446 1.1 jruoho Op->Named.Path = ACPI_CAST_PTR (UINT8, Path);
447 1.1 jruoho #endif
448 1.1 jruoho
449 1.1 jruoho if (Node)
450 1.1 jruoho {
451 1.1 jruoho /*
452 1.1 jruoho * Put the Node in the "op" object that the parser uses, so we
453 1.1 jruoho * can get it again quickly when this scope is closed
454 1.1 jruoho */
455 1.1 jruoho Op->Common.Node = Node;
456 1.1 jruoho Op->Named.Name = Node->Name.Integer;
457 1.1 jruoho }
458 1.1 jruoho
459 1.1 jruoho AcpiPsAppendArg (AcpiPsGetParentScope (&WalkState->ParserState), Op);
460 1.1 jruoho *OutOp = Op;
461 1.1 jruoho return_ACPI_STATUS (Status);
462 1.1 jruoho }
463 1.1 jruoho
464 1.1 jruoho
465 1.1 jruoho /*******************************************************************************
466 1.1 jruoho *
467 1.1 jruoho * FUNCTION: AcpiDsLoad1EndOp
468 1.1 jruoho *
469 1.1 jruoho * PARAMETERS: WalkState - Current state of the parse tree walk
470 1.1 jruoho *
471 1.1 jruoho * RETURN: Status
472 1.1 jruoho *
473 1.1 jruoho * DESCRIPTION: Ascending callback used during the loading of the namespace,
474 1.1 jruoho * both control methods and everything else.
475 1.1 jruoho *
476 1.1 jruoho ******************************************************************************/
477 1.1 jruoho
478 1.1 jruoho ACPI_STATUS
479 1.1 jruoho AcpiDsLoad1EndOp (
480 1.1 jruoho ACPI_WALK_STATE *WalkState)
481 1.1 jruoho {
482 1.1 jruoho ACPI_PARSE_OBJECT *Op;
483 1.1 jruoho ACPI_OBJECT_TYPE ObjectType;
484 1.1 jruoho ACPI_STATUS Status = AE_OK;
485 1.1 jruoho
486 1.1 jruoho
487 1.1 jruoho ACPI_FUNCTION_TRACE (DsLoad1EndOp);
488 1.1 jruoho
489 1.1 jruoho
490 1.1 jruoho Op = WalkState->Op;
491 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState));
492 1.1 jruoho
493 1.1 jruoho /* We are only interested in opcodes that have an associated name */
494 1.1 jruoho
495 1.1 jruoho if (!(WalkState->OpInfo->Flags & (AML_NAMED | AML_FIELD)))
496 1.1 jruoho {
497 1.1 jruoho return_ACPI_STATUS (AE_OK);
498 1.1 jruoho }
499 1.1 jruoho
500 1.1 jruoho /* Get the object type to determine if we should pop the scope */
501 1.1 jruoho
502 1.1 jruoho ObjectType = WalkState->OpInfo->ObjectType;
503 1.1 jruoho
504 1.1 jruoho #ifndef ACPI_NO_METHOD_EXECUTION
505 1.1 jruoho if (WalkState->OpInfo->Flags & AML_FIELD)
506 1.1 jruoho {
507 1.1 jruoho /*
508 1.1 jruoho * If we are executing a method, do not create any namespace objects
509 1.1 jruoho * during the load phase, only during execution.
510 1.1 jruoho */
511 1.1 jruoho if (!WalkState->MethodNode)
512 1.1 jruoho {
513 1.1 jruoho if (WalkState->Opcode == AML_FIELD_OP ||
514 1.1 jruoho WalkState->Opcode == AML_BANK_FIELD_OP ||
515 1.1 jruoho WalkState->Opcode == AML_INDEX_FIELD_OP)
516 1.1 jruoho {
517 1.1 jruoho Status = AcpiDsInitFieldObjects (Op, WalkState);
518 1.1 jruoho }
519 1.1 jruoho }
520 1.1 jruoho return_ACPI_STATUS (Status);
521 1.1 jruoho }
522 1.1 jruoho
523 1.1 jruoho /*
524 1.1 jruoho * If we are executing a method, do not create any namespace objects
525 1.1 jruoho * during the load phase, only during execution.
526 1.1 jruoho */
527 1.1 jruoho if (!WalkState->MethodNode)
528 1.1 jruoho {
529 1.1 jruoho if (Op->Common.AmlOpcode == AML_REGION_OP)
530 1.1 jruoho {
531 1.1 jruoho Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length,
532 1.1 jruoho (ACPI_ADR_SPACE_TYPE) ((Op->Common.Value.Arg)->Common.Value.Integer),
533 1.1 jruoho WalkState);
534 1.1 jruoho if (ACPI_FAILURE (Status))
535 1.1 jruoho {
536 1.1 jruoho return_ACPI_STATUS (Status);
537 1.1 jruoho }
538 1.1 jruoho }
539 1.1 jruoho else if (Op->Common.AmlOpcode == AML_DATA_REGION_OP)
540 1.1 jruoho {
541 1.1 jruoho Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length,
542 1.1 jruoho REGION_DATA_TABLE, WalkState);
543 1.1 jruoho if (ACPI_FAILURE (Status))
544 1.1 jruoho {
545 1.1 jruoho return_ACPI_STATUS (Status);
546 1.1 jruoho }
547 1.1 jruoho }
548 1.1 jruoho }
549 1.1 jruoho #endif
550 1.1 jruoho
551 1.1 jruoho if (Op->Common.AmlOpcode == AML_NAME_OP)
552 1.1 jruoho {
553 1.1 jruoho /* For Name opcode, get the object type from the argument */
554 1.1 jruoho
555 1.1 jruoho if (Op->Common.Value.Arg)
556 1.1 jruoho {
557 1.1 jruoho ObjectType = (AcpiPsGetOpcodeInfo (
558 1.1 jruoho (Op->Common.Value.Arg)->Common.AmlOpcode))->ObjectType;
559 1.1 jruoho
560 1.1 jruoho /* Set node type if we have a namespace node */
561 1.1 jruoho
562 1.1 jruoho if (Op->Common.Node)
563 1.1 jruoho {
564 1.1 jruoho Op->Common.Node->Type = (UINT8) ObjectType;
565 1.1 jruoho }
566 1.1 jruoho }
567 1.1 jruoho }
568 1.1 jruoho
569 1.1 jruoho /*
570 1.1 jruoho * If we are executing a method, do not create any namespace objects
571 1.1 jruoho * during the load phase, only during execution.
572 1.1 jruoho */
573 1.1 jruoho if (!WalkState->MethodNode)
574 1.1 jruoho {
575 1.1 jruoho if (Op->Common.AmlOpcode == AML_METHOD_OP)
576 1.1 jruoho {
577 1.1 jruoho /*
578 1.1 jruoho * MethodOp PkgLength NameString MethodFlags TermList
579 1.1 jruoho *
580 1.1 jruoho * Note: We must create the method node/object pair as soon as we
581 1.1 jruoho * see the method declaration. This allows later pass1 parsing
582 1.1 jruoho * of invocations of the method (need to know the number of
583 1.1 jruoho * arguments.)
584 1.1 jruoho */
585 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
586 1.1 jruoho "LOADING-Method: State=%p Op=%p NamedObj=%p\n",
587 1.1 jruoho WalkState, Op, Op->Named.Node));
588 1.1 jruoho
589 1.1 jruoho if (!AcpiNsGetAttachedObject (Op->Named.Node))
590 1.1 jruoho {
591 1.1 jruoho WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node);
592 1.1 jruoho WalkState->NumOperands = 1;
593 1.1 jruoho
594 1.1 jruoho Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg);
595 1.1 jruoho if (ACPI_SUCCESS (Status))
596 1.1 jruoho {
597 1.1 jruoho Status = AcpiExCreateMethod (Op->Named.Data,
598 1.1 jruoho Op->Named.Length, WalkState);
599 1.1 jruoho }
600 1.1 jruoho
601 1.1 jruoho WalkState->Operands[0] = NULL;
602 1.1 jruoho WalkState->NumOperands = 0;
603 1.1 jruoho
604 1.1 jruoho if (ACPI_FAILURE (Status))
605 1.1 jruoho {
606 1.1 jruoho return_ACPI_STATUS (Status);
607 1.1 jruoho }
608 1.1 jruoho }
609 1.1 jruoho }
610 1.1 jruoho }
611 1.1 jruoho
612 1.1 jruoho /* Pop the scope stack (only if loading a table) */
613 1.1 jruoho
614 1.1 jruoho if (!WalkState->MethodNode &&
615 1.1 jruoho AcpiNsOpensScope (ObjectType))
616 1.1 jruoho {
617 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s): Popping scope for Op %p\n",
618 1.1 jruoho AcpiUtGetTypeName (ObjectType), Op));
619 1.1 jruoho
620 1.1 jruoho Status = AcpiDsScopeStackPop (WalkState);
621 1.1 jruoho }
622 1.1 jruoho
623 1.1 jruoho return_ACPI_STATUS (Status);
624 1.1 jruoho }
625 1.1 jruoho
626 1.1 jruoho
627 1.1 jruoho /*******************************************************************************
628 1.1 jruoho *
629 1.1 jruoho * FUNCTION: AcpiDsLoad2BeginOp
630 1.1 jruoho *
631 1.1 jruoho * PARAMETERS: WalkState - Current state of the parse tree walk
632 1.1 jruoho * OutOp - Wher to return op if a new one is created
633 1.1 jruoho *
634 1.1 jruoho * RETURN: Status
635 1.1 jruoho *
636 1.1 jruoho * DESCRIPTION: Descending callback used during the loading of ACPI tables.
637 1.1 jruoho *
638 1.1 jruoho ******************************************************************************/
639 1.1 jruoho
640 1.1 jruoho ACPI_STATUS
641 1.1 jruoho AcpiDsLoad2BeginOp (
642 1.1 jruoho ACPI_WALK_STATE *WalkState,
643 1.1 jruoho ACPI_PARSE_OBJECT **OutOp)
644 1.1 jruoho {
645 1.1 jruoho ACPI_PARSE_OBJECT *Op;
646 1.1 jruoho ACPI_NAMESPACE_NODE *Node;
647 1.1 jruoho ACPI_STATUS Status;
648 1.1 jruoho ACPI_OBJECT_TYPE ObjectType;
649 1.1 jruoho char *BufferPtr;
650 1.1 jruoho UINT32 Flags;
651 1.1 jruoho
652 1.1 jruoho
653 1.1 jruoho ACPI_FUNCTION_TRACE (DsLoad2BeginOp);
654 1.1 jruoho
655 1.1 jruoho
656 1.1 jruoho Op = WalkState->Op;
657 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState));
658 1.1 jruoho
659 1.1 jruoho if (Op)
660 1.1 jruoho {
661 1.1 jruoho if ((WalkState->ControlState) &&
662 1.1 jruoho (WalkState->ControlState->Common.State ==
663 1.1 jruoho ACPI_CONTROL_CONDITIONAL_EXECUTING))
664 1.1 jruoho {
665 1.1 jruoho /* We are executing a while loop outside of a method */
666 1.1 jruoho
667 1.1 jruoho Status = AcpiDsExecBeginOp (WalkState, OutOp);
668 1.1 jruoho return_ACPI_STATUS (Status);
669 1.1 jruoho }
670 1.1 jruoho
671 1.1 jruoho /* We only care about Namespace opcodes here */
672 1.1 jruoho
673 1.1 jruoho if ((!(WalkState->OpInfo->Flags & AML_NSOPCODE) &&
674 1.1 jruoho (WalkState->Opcode != AML_INT_NAMEPATH_OP)) ||
675 1.1 jruoho (!(WalkState->OpInfo->Flags & AML_NAMED)))
676 1.1 jruoho {
677 1.1 jruoho return_ACPI_STATUS (AE_OK);
678 1.1 jruoho }
679 1.1 jruoho
680 1.1 jruoho /* Get the name we are going to enter or lookup in the namespace */
681 1.1 jruoho
682 1.1 jruoho if (WalkState->Opcode == AML_INT_NAMEPATH_OP)
683 1.1 jruoho {
684 1.1 jruoho /* For Namepath op, get the path string */
685 1.1 jruoho
686 1.1 jruoho BufferPtr = Op->Common.Value.String;
687 1.1 jruoho if (!BufferPtr)
688 1.1 jruoho {
689 1.1 jruoho /* No name, just exit */
690 1.1 jruoho
691 1.1 jruoho return_ACPI_STATUS (AE_OK);
692 1.1 jruoho }
693 1.1 jruoho }
694 1.1 jruoho else
695 1.1 jruoho {
696 1.1 jruoho /* Get name from the op */
697 1.1 jruoho
698 1.1 jruoho BufferPtr = ACPI_CAST_PTR (char, &Op->Named.Name);
699 1.1 jruoho }
700 1.1 jruoho }
701 1.1 jruoho else
702 1.1 jruoho {
703 1.1 jruoho /* Get the namestring from the raw AML */
704 1.1 jruoho
705 1.1 jruoho BufferPtr = AcpiPsGetNextNamestring (&WalkState->ParserState);
706 1.1 jruoho }
707 1.1 jruoho
708 1.1 jruoho /* Map the opcode into an internal object type */
709 1.1 jruoho
710 1.1 jruoho ObjectType = WalkState->OpInfo->ObjectType;
711 1.1 jruoho
712 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
713 1.1 jruoho "State=%p Op=%p Type=%X\n", WalkState, Op, ObjectType));
714 1.1 jruoho
715 1.1 jruoho switch (WalkState->Opcode)
716 1.1 jruoho {
717 1.1 jruoho case AML_FIELD_OP:
718 1.1 jruoho case AML_BANK_FIELD_OP:
719 1.1 jruoho case AML_INDEX_FIELD_OP:
720 1.1 jruoho
721 1.1 jruoho Node = NULL;
722 1.1 jruoho Status = AE_OK;
723 1.1 jruoho break;
724 1.1 jruoho
725 1.1 jruoho case AML_INT_NAMEPATH_OP:
726 1.1 jruoho /*
727 1.1 jruoho * The NamePath is an object reference to an existing object.
728 1.1 jruoho * Don't enter the name into the namespace, but look it up
729 1.1 jruoho * for use later.
730 1.1 jruoho */
731 1.1 jruoho Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
732 1.1 jruoho ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
733 1.1 jruoho WalkState, &(Node));
734 1.1 jruoho break;
735 1.1 jruoho
736 1.1 jruoho case AML_SCOPE_OP:
737 1.1 jruoho
738 1.1 jruoho /* Special case for Scope(\) -> refers to the Root node */
739 1.1 jruoho
740 1.1 jruoho if (Op && (Op->Named.Node == AcpiGbl_RootNode))
741 1.1 jruoho {
742 1.1 jruoho Node = Op->Named.Node;
743 1.1 jruoho
744 1.1 jruoho Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
745 1.1 jruoho if (ACPI_FAILURE (Status))
746 1.1 jruoho {
747 1.1 jruoho return_ACPI_STATUS (Status);
748 1.1 jruoho }
749 1.1 jruoho }
750 1.1 jruoho else
751 1.1 jruoho {
752 1.1 jruoho /*
753 1.1 jruoho * The Path is an object reference to an existing object.
754 1.1 jruoho * Don't enter the name into the namespace, but look it up
755 1.1 jruoho * for use later.
756 1.1 jruoho */
757 1.1 jruoho Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
758 1.1 jruoho ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
759 1.1 jruoho WalkState, &(Node));
760 1.1 jruoho if (ACPI_FAILURE (Status))
761 1.1 jruoho {
762 1.1 jruoho #ifdef ACPI_ASL_COMPILER
763 1.1 jruoho if (Status == AE_NOT_FOUND)
764 1.1 jruoho {
765 1.1 jruoho Status = AE_OK;
766 1.1 jruoho }
767 1.1 jruoho else
768 1.1 jruoho {
769 1.1 jruoho ACPI_ERROR_NAMESPACE (BufferPtr, Status);
770 1.1 jruoho }
771 1.1 jruoho #else
772 1.1 jruoho ACPI_ERROR_NAMESPACE (BufferPtr, Status);
773 1.1 jruoho #endif
774 1.1 jruoho return_ACPI_STATUS (Status);
775 1.1 jruoho }
776 1.1 jruoho }
777 1.1 jruoho
778 1.1 jruoho /*
779 1.1 jruoho * We must check to make sure that the target is
780 1.1 jruoho * one of the opcodes that actually opens a scope
781 1.1 jruoho */
782 1.1 jruoho switch (Node->Type)
783 1.1 jruoho {
784 1.1 jruoho case ACPI_TYPE_ANY:
785 1.1 jruoho case ACPI_TYPE_LOCAL_SCOPE: /* Scope */
786 1.1 jruoho case ACPI_TYPE_DEVICE:
787 1.1 jruoho case ACPI_TYPE_POWER:
788 1.1 jruoho case ACPI_TYPE_PROCESSOR:
789 1.1 jruoho case ACPI_TYPE_THERMAL:
790 1.1 jruoho
791 1.1 jruoho /* These are acceptable types */
792 1.1 jruoho break;
793 1.1 jruoho
794 1.1 jruoho case ACPI_TYPE_INTEGER:
795 1.1 jruoho case ACPI_TYPE_STRING:
796 1.1 jruoho case ACPI_TYPE_BUFFER:
797 1.1 jruoho
798 1.1 jruoho /*
799 1.1 jruoho * These types we will allow, but we will change the type.
800 1.1 jruoho * This enables some existing code of the form:
801 1.1 jruoho *
802 1.1 jruoho * Name (DEB, 0)
803 1.1 jruoho * Scope (DEB) { ... }
804 1.1 jruoho */
805 1.1 jruoho ACPI_WARNING ((AE_INFO,
806 1.1 jruoho "Type override - [%4.4s] had invalid type (%s) "
807 1.1 jruoho "for Scope operator, changed to type ANY\n",
808 1.1 jruoho AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type)));
809 1.1 jruoho
810 1.1 jruoho Node->Type = ACPI_TYPE_ANY;
811 1.1 jruoho WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
812 1.1 jruoho break;
813 1.1 jruoho
814 1.1 jruoho default:
815 1.1 jruoho
816 1.1 jruoho /* All other types are an error */
817 1.1 jruoho
818 1.1 jruoho ACPI_ERROR ((AE_INFO,
819 1.1 jruoho "Invalid type (%s) for target of "
820 1.1 jruoho "Scope operator [%4.4s] (Cannot override)",
821 1.1 jruoho AcpiUtGetTypeName (Node->Type), AcpiUtGetNodeName (Node)));
822 1.1 jruoho
823 1.1 jruoho return (AE_AML_OPERAND_TYPE);
824 1.1 jruoho }
825 1.1 jruoho break;
826 1.1 jruoho
827 1.1 jruoho default:
828 1.1 jruoho
829 1.1 jruoho /* All other opcodes */
830 1.1 jruoho
831 1.1 jruoho if (Op && Op->Common.Node)
832 1.1 jruoho {
833 1.1 jruoho /* This op/node was previously entered into the namespace */
834 1.1 jruoho
835 1.1 jruoho Node = Op->Common.Node;
836 1.1 jruoho
837 1.1 jruoho if (AcpiNsOpensScope (ObjectType))
838 1.1 jruoho {
839 1.1 jruoho Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
840 1.1 jruoho if (ACPI_FAILURE (Status))
841 1.1 jruoho {
842 1.1 jruoho return_ACPI_STATUS (Status);
843 1.1 jruoho }
844 1.1 jruoho }
845 1.1 jruoho
846 1.1 jruoho return_ACPI_STATUS (AE_OK);
847 1.1 jruoho }
848 1.1 jruoho
849 1.1 jruoho /*
850 1.1 jruoho * Enter the named type into the internal namespace. We enter the name
851 1.1 jruoho * as we go downward in the parse tree. Any necessary subobjects that
852 1.1 jruoho * involve arguments to the opcode must be created as we go back up the
853 1.1 jruoho * parse tree later.
854 1.1 jruoho *
855 1.1 jruoho * Note: Name may already exist if we are executing a deferred opcode.
856 1.1 jruoho */
857 1.1 jruoho if (WalkState->DeferredNode)
858 1.1 jruoho {
859 1.1 jruoho /* This name is already in the namespace, get the node */
860 1.1 jruoho
861 1.1 jruoho Node = WalkState->DeferredNode;
862 1.1 jruoho Status = AE_OK;
863 1.1 jruoho break;
864 1.1 jruoho }
865 1.1 jruoho
866 1.1 jruoho Flags = ACPI_NS_NO_UPSEARCH;
867 1.1 jruoho if (WalkState->PassNumber == ACPI_IMODE_EXECUTE)
868 1.1 jruoho {
869 1.1 jruoho /* Execution mode, node cannot already exist, node is temporary */
870 1.1 jruoho
871 1.1 jruoho Flags |= ACPI_NS_ERROR_IF_FOUND;
872 1.1 jruoho
873 1.1 jruoho if (!(WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
874 1.1 jruoho {
875 1.1 jruoho Flags |= ACPI_NS_TEMPORARY;
876 1.1 jruoho }
877 1.1 jruoho }
878 1.1 jruoho
879 1.1 jruoho /* Add new entry or lookup existing entry */
880 1.1 jruoho
881 1.1 jruoho Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
882 1.1 jruoho ACPI_IMODE_LOAD_PASS2, Flags, WalkState, &Node);
883 1.1 jruoho
884 1.1 jruoho if (ACPI_SUCCESS (Status) && (Flags & ACPI_NS_TEMPORARY))
885 1.1 jruoho {
886 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
887 1.1 jruoho "***New Node [%4.4s] %p is temporary\n",
888 1.1 jruoho AcpiUtGetNodeName (Node), Node));
889 1.1 jruoho }
890 1.1 jruoho break;
891 1.1 jruoho }
892 1.1 jruoho
893 1.1 jruoho if (ACPI_FAILURE (Status))
894 1.1 jruoho {
895 1.1 jruoho ACPI_ERROR_NAMESPACE (BufferPtr, Status);
896 1.1 jruoho return_ACPI_STATUS (Status);
897 1.1 jruoho }
898 1.1 jruoho
899 1.1 jruoho if (!Op)
900 1.1 jruoho {
901 1.1 jruoho /* Create a new op */
902 1.1 jruoho
903 1.1 jruoho Op = AcpiPsAllocOp (WalkState->Opcode);
904 1.1 jruoho if (!Op)
905 1.1 jruoho {
906 1.1 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
907 1.1 jruoho }
908 1.1 jruoho
909 1.1 jruoho /* Initialize the new op */
910 1.1 jruoho
911 1.1 jruoho if (Node)
912 1.1 jruoho {
913 1.1 jruoho Op->Named.Name = Node->Name.Integer;
914 1.1 jruoho }
915 1.1 jruoho *OutOp = Op;
916 1.1 jruoho }
917 1.1 jruoho
918 1.1 jruoho /*
919 1.1 jruoho * Put the Node in the "op" object that the parser uses, so we
920 1.1 jruoho * can get it again quickly when this scope is closed
921 1.1 jruoho */
922 1.1 jruoho Op->Common.Node = Node;
923 1.1 jruoho return_ACPI_STATUS (Status);
924 1.1 jruoho }
925 1.1 jruoho
926 1.1 jruoho
927 1.1 jruoho /*******************************************************************************
928 1.1 jruoho *
929 1.1 jruoho * FUNCTION: AcpiDsLoad2EndOp
930 1.1 jruoho *
931 1.1 jruoho * PARAMETERS: WalkState - Current state of the parse tree walk
932 1.1 jruoho *
933 1.1 jruoho * RETURN: Status
934 1.1 jruoho *
935 1.1 jruoho * DESCRIPTION: Ascending callback used during the loading of the namespace,
936 1.1 jruoho * both control methods and everything else.
937 1.1 jruoho *
938 1.1 jruoho ******************************************************************************/
939 1.1 jruoho
940 1.1 jruoho ACPI_STATUS
941 1.1 jruoho AcpiDsLoad2EndOp (
942 1.1 jruoho ACPI_WALK_STATE *WalkState)
943 1.1 jruoho {
944 1.1 jruoho ACPI_PARSE_OBJECT *Op;
945 1.1 jruoho ACPI_STATUS Status = AE_OK;
946 1.1 jruoho ACPI_OBJECT_TYPE ObjectType;
947 1.1 jruoho ACPI_NAMESPACE_NODE *Node;
948 1.1 jruoho ACPI_PARSE_OBJECT *Arg;
949 1.1 jruoho ACPI_NAMESPACE_NODE *NewNode;
950 1.1 jruoho #ifndef ACPI_NO_METHOD_EXECUTION
951 1.1 jruoho UINT32 i;
952 1.1 jruoho UINT8 RegionSpace;
953 1.1 jruoho #endif
954 1.1 jruoho
955 1.1 jruoho
956 1.1 jruoho ACPI_FUNCTION_TRACE (DsLoad2EndOp);
957 1.1 jruoho
958 1.1 jruoho Op = WalkState->Op;
959 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n",
960 1.1 jruoho WalkState->OpInfo->Name, Op, WalkState));
961 1.1 jruoho
962 1.1 jruoho /* Check if opcode had an associated namespace object */
963 1.1 jruoho
964 1.1 jruoho if (!(WalkState->OpInfo->Flags & AML_NSOBJECT))
965 1.1 jruoho {
966 1.1 jruoho return_ACPI_STATUS (AE_OK);
967 1.1 jruoho }
968 1.1 jruoho
969 1.1 jruoho if (Op->Common.AmlOpcode == AML_SCOPE_OP)
970 1.1 jruoho {
971 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
972 1.1 jruoho "Ending scope Op=%p State=%p\n", Op, WalkState));
973 1.1 jruoho }
974 1.1 jruoho
975 1.1 jruoho ObjectType = WalkState->OpInfo->ObjectType;
976 1.1 jruoho
977 1.1 jruoho /*
978 1.1 jruoho * Get the Node/name from the earlier lookup
979 1.1 jruoho * (It was saved in the *op structure)
980 1.1 jruoho */
981 1.1 jruoho Node = Op->Common.Node;
982 1.1 jruoho
983 1.1 jruoho /*
984 1.1 jruoho * Put the Node on the object stack (Contains the ACPI Name of
985 1.1 jruoho * this object)
986 1.1 jruoho */
987 1.1 jruoho WalkState->Operands[0] = (void *) Node;
988 1.1 jruoho WalkState->NumOperands = 1;
989 1.1 jruoho
990 1.1 jruoho /* Pop the scope stack */
991 1.1 jruoho
992 1.1 jruoho if (AcpiNsOpensScope (ObjectType) &&
993 1.1 jruoho (Op->Common.AmlOpcode != AML_INT_METHODCALL_OP))
994 1.1 jruoho {
995 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s) Popping scope for Op %p\n",
996 1.1 jruoho AcpiUtGetTypeName (ObjectType), Op));
997 1.1 jruoho
998 1.1 jruoho Status = AcpiDsScopeStackPop (WalkState);
999 1.1 jruoho if (ACPI_FAILURE (Status))
1000 1.1 jruoho {
1001 1.1 jruoho goto Cleanup;
1002 1.1 jruoho }
1003 1.1 jruoho }
1004 1.1 jruoho
1005 1.1 jruoho /*
1006 1.1 jruoho * Named operations are as follows:
1007 1.1 jruoho *
1008 1.1 jruoho * AML_ALIAS
1009 1.1 jruoho * AML_BANKFIELD
1010 1.1 jruoho * AML_CREATEBITFIELD
1011 1.1 jruoho * AML_CREATEBYTEFIELD
1012 1.1 jruoho * AML_CREATEDWORDFIELD
1013 1.1 jruoho * AML_CREATEFIELD
1014 1.1 jruoho * AML_CREATEQWORDFIELD
1015 1.1 jruoho * AML_CREATEWORDFIELD
1016 1.1 jruoho * AML_DATA_REGION
1017 1.1 jruoho * AML_DEVICE
1018 1.1 jruoho * AML_EVENT
1019 1.1 jruoho * AML_FIELD
1020 1.1 jruoho * AML_INDEXFIELD
1021 1.1 jruoho * AML_METHOD
1022 1.1 jruoho * AML_METHODCALL
1023 1.1 jruoho * AML_MUTEX
1024 1.1 jruoho * AML_NAME
1025 1.1 jruoho * AML_NAMEDFIELD
1026 1.1 jruoho * AML_OPREGION
1027 1.1 jruoho * AML_POWERRES
1028 1.1 jruoho * AML_PROCESSOR
1029 1.1 jruoho * AML_SCOPE
1030 1.1 jruoho * AML_THERMALZONE
1031 1.1 jruoho */
1032 1.1 jruoho
1033 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
1034 1.1 jruoho "Create-Load [%s] State=%p Op=%p NamedObj=%p\n",
1035 1.1 jruoho AcpiPsGetOpcodeName (Op->Common.AmlOpcode), WalkState, Op, Node));
1036 1.1 jruoho
1037 1.1 jruoho /* Decode the opcode */
1038 1.1 jruoho
1039 1.1 jruoho Arg = Op->Common.Value.Arg;
1040 1.1 jruoho
1041 1.1 jruoho switch (WalkState->OpInfo->Type)
1042 1.1 jruoho {
1043 1.1 jruoho #ifndef ACPI_NO_METHOD_EXECUTION
1044 1.1 jruoho
1045 1.1 jruoho case AML_TYPE_CREATE_FIELD:
1046 1.1 jruoho /*
1047 1.1 jruoho * Create the field object, but the field buffer and index must
1048 1.1 jruoho * be evaluated later during the execution phase
1049 1.1 jruoho */
1050 1.1 jruoho Status = AcpiDsCreateBufferField (Op, WalkState);
1051 1.1 jruoho break;
1052 1.1 jruoho
1053 1.1 jruoho
1054 1.1 jruoho case AML_TYPE_NAMED_FIELD:
1055 1.1 jruoho /*
1056 1.1 jruoho * If we are executing a method, initialize the field
1057 1.1 jruoho */
1058 1.1 jruoho if (WalkState->MethodNode)
1059 1.1 jruoho {
1060 1.1 jruoho Status = AcpiDsInitFieldObjects (Op, WalkState);
1061 1.1 jruoho }
1062 1.1 jruoho
1063 1.1 jruoho switch (Op->Common.AmlOpcode)
1064 1.1 jruoho {
1065 1.1 jruoho case AML_INDEX_FIELD_OP:
1066 1.1 jruoho
1067 1.1 jruoho Status = AcpiDsCreateIndexField (Op, (ACPI_HANDLE) Arg->Common.Node,
1068 1.1 jruoho WalkState);
1069 1.1 jruoho break;
1070 1.1 jruoho
1071 1.1 jruoho case AML_BANK_FIELD_OP:
1072 1.1 jruoho
1073 1.1 jruoho Status = AcpiDsCreateBankField (Op, Arg->Common.Node, WalkState);
1074 1.1 jruoho break;
1075 1.1 jruoho
1076 1.1 jruoho case AML_FIELD_OP:
1077 1.1 jruoho
1078 1.1 jruoho Status = AcpiDsCreateField (Op, Arg->Common.Node, WalkState);
1079 1.1 jruoho break;
1080 1.1 jruoho
1081 1.1 jruoho default:
1082 1.1 jruoho /* All NAMED_FIELD opcodes must be handled above */
1083 1.1 jruoho break;
1084 1.1 jruoho }
1085 1.1 jruoho break;
1086 1.1 jruoho
1087 1.1 jruoho
1088 1.1 jruoho case AML_TYPE_NAMED_SIMPLE:
1089 1.1 jruoho
1090 1.1 jruoho Status = AcpiDsCreateOperands (WalkState, Arg);
1091 1.1 jruoho if (ACPI_FAILURE (Status))
1092 1.1 jruoho {
1093 1.1 jruoho goto Cleanup;
1094 1.1 jruoho }
1095 1.1 jruoho
1096 1.1 jruoho switch (Op->Common.AmlOpcode)
1097 1.1 jruoho {
1098 1.1 jruoho case AML_PROCESSOR_OP:
1099 1.1 jruoho
1100 1.1 jruoho Status = AcpiExCreateProcessor (WalkState);
1101 1.1 jruoho break;
1102 1.1 jruoho
1103 1.1 jruoho case AML_POWER_RES_OP:
1104 1.1 jruoho
1105 1.1 jruoho Status = AcpiExCreatePowerResource (WalkState);
1106 1.1 jruoho break;
1107 1.1 jruoho
1108 1.1 jruoho case AML_MUTEX_OP:
1109 1.1 jruoho
1110 1.1 jruoho Status = AcpiExCreateMutex (WalkState);
1111 1.1 jruoho break;
1112 1.1 jruoho
1113 1.1 jruoho case AML_EVENT_OP:
1114 1.1 jruoho
1115 1.1 jruoho Status = AcpiExCreateEvent (WalkState);
1116 1.1 jruoho break;
1117 1.1 jruoho
1118 1.1 jruoho
1119 1.1 jruoho case AML_ALIAS_OP:
1120 1.1 jruoho
1121 1.1 jruoho Status = AcpiExCreateAlias (WalkState);
1122 1.1 jruoho break;
1123 1.1 jruoho
1124 1.1 jruoho default:
1125 1.1 jruoho /* Unknown opcode */
1126 1.1 jruoho
1127 1.1 jruoho Status = AE_OK;
1128 1.1 jruoho goto Cleanup;
1129 1.1 jruoho }
1130 1.1 jruoho
1131 1.1 jruoho /* Delete operands */
1132 1.1 jruoho
1133 1.1 jruoho for (i = 1; i < WalkState->NumOperands; i++)
1134 1.1 jruoho {
1135 1.1 jruoho AcpiUtRemoveReference (WalkState->Operands[i]);
1136 1.1 jruoho WalkState->Operands[i] = NULL;
1137 1.1 jruoho }
1138 1.1 jruoho
1139 1.1 jruoho break;
1140 1.1 jruoho #endif /* ACPI_NO_METHOD_EXECUTION */
1141 1.1 jruoho
1142 1.1 jruoho case AML_TYPE_NAMED_COMPLEX:
1143 1.1 jruoho
1144 1.1 jruoho switch (Op->Common.AmlOpcode)
1145 1.1 jruoho {
1146 1.1 jruoho #ifndef ACPI_NO_METHOD_EXECUTION
1147 1.1 jruoho case AML_REGION_OP:
1148 1.1 jruoho case AML_DATA_REGION_OP:
1149 1.1 jruoho
1150 1.1 jruoho if (Op->Common.AmlOpcode == AML_REGION_OP)
1151 1.1 jruoho {
1152 1.1 jruoho RegionSpace = (ACPI_ADR_SPACE_TYPE)
1153 1.1 jruoho ((Op->Common.Value.Arg)->Common.Value.Integer);
1154 1.1 jruoho }
1155 1.1 jruoho else
1156 1.1 jruoho {
1157 1.1 jruoho RegionSpace = REGION_DATA_TABLE;
1158 1.1 jruoho }
1159 1.1 jruoho
1160 1.1 jruoho /*
1161 1.1 jruoho * The OpRegion is not fully parsed at this time. The only valid
1162 1.1 jruoho * argument is the SpaceId. (We must save the address of the
1163 1.1 jruoho * AML of the address and length operands)
1164 1.1 jruoho *
1165 1.1 jruoho * If we have a valid region, initialize it. The namespace is
1166 1.1 jruoho * unlocked at this point.
1167 1.1 jruoho *
1168 1.1 jruoho * Need to unlock interpreter if it is locked (if we are running
1169 1.1 jruoho * a control method), in order to allow _REG methods to be run
1170 1.1 jruoho * during AcpiEvInitializeRegion.
1171 1.1 jruoho */
1172 1.1 jruoho if (WalkState->MethodNode)
1173 1.1 jruoho {
1174 1.1 jruoho /*
1175 1.1 jruoho * Executing a method: initialize the region and unlock
1176 1.1 jruoho * the interpreter
1177 1.1 jruoho */
1178 1.1 jruoho Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length,
1179 1.1 jruoho RegionSpace, WalkState);
1180 1.1 jruoho if (ACPI_FAILURE (Status))
1181 1.1 jruoho {
1182 1.1 jruoho return (Status);
1183 1.1 jruoho }
1184 1.1 jruoho
1185 1.1 jruoho AcpiExExitInterpreter ();
1186 1.1 jruoho }
1187 1.1 jruoho
1188 1.1 jruoho Status = AcpiEvInitializeRegion (AcpiNsGetAttachedObject (Node),
1189 1.1 jruoho FALSE);
1190 1.1 jruoho if (WalkState->MethodNode)
1191 1.1 jruoho {
1192 1.1 jruoho AcpiExEnterInterpreter ();
1193 1.1 jruoho }
1194 1.1 jruoho
1195 1.1 jruoho if (ACPI_FAILURE (Status))
1196 1.1 jruoho {
1197 1.1 jruoho /*
1198 1.1 jruoho * If AE_NOT_EXIST is returned, it is not fatal
1199 1.1 jruoho * because many regions get created before a handler
1200 1.1 jruoho * is installed for said region.
1201 1.1 jruoho */
1202 1.1 jruoho if (AE_NOT_EXIST == Status)
1203 1.1 jruoho {
1204 1.1 jruoho Status = AE_OK;
1205 1.1 jruoho }
1206 1.1 jruoho }
1207 1.1 jruoho break;
1208 1.1 jruoho
1209 1.1 jruoho
1210 1.1 jruoho case AML_NAME_OP:
1211 1.1 jruoho
1212 1.1 jruoho Status = AcpiDsCreateNode (WalkState, Node, Op);
1213 1.1 jruoho break;
1214 1.1 jruoho
1215 1.1 jruoho
1216 1.1 jruoho case AML_METHOD_OP:
1217 1.1 jruoho /*
1218 1.1 jruoho * MethodOp PkgLength NameString MethodFlags TermList
1219 1.1 jruoho *
1220 1.1 jruoho * Note: We must create the method node/object pair as soon as we
1221 1.1 jruoho * see the method declaration. This allows later pass1 parsing
1222 1.1 jruoho * of invocations of the method (need to know the number of
1223 1.1 jruoho * arguments.)
1224 1.1 jruoho */
1225 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
1226 1.1 jruoho "LOADING-Method: State=%p Op=%p NamedObj=%p\n",
1227 1.1 jruoho WalkState, Op, Op->Named.Node));
1228 1.1 jruoho
1229 1.1 jruoho if (!AcpiNsGetAttachedObject (Op->Named.Node))
1230 1.1 jruoho {
1231 1.1 jruoho WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node);
1232 1.1 jruoho WalkState->NumOperands = 1;
1233 1.1 jruoho
1234 1.1 jruoho Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg);
1235 1.1 jruoho if (ACPI_SUCCESS (Status))
1236 1.1 jruoho {
1237 1.1 jruoho Status = AcpiExCreateMethod (Op->Named.Data,
1238 1.1 jruoho Op->Named.Length, WalkState);
1239 1.1 jruoho }
1240 1.1 jruoho WalkState->Operands[0] = NULL;
1241 1.1 jruoho WalkState->NumOperands = 0;
1242 1.1 jruoho
1243 1.1 jruoho if (ACPI_FAILURE (Status))
1244 1.1 jruoho {
1245 1.1 jruoho return_ACPI_STATUS (Status);
1246 1.1 jruoho }
1247 1.1 jruoho }
1248 1.1 jruoho break;
1249 1.1 jruoho
1250 1.1 jruoho #endif /* ACPI_NO_METHOD_EXECUTION */
1251 1.1 jruoho
1252 1.1 jruoho default:
1253 1.1 jruoho /* All NAMED_COMPLEX opcodes must be handled above */
1254 1.1 jruoho break;
1255 1.1 jruoho }
1256 1.1 jruoho break;
1257 1.1 jruoho
1258 1.1 jruoho
1259 1.1 jruoho case AML_CLASS_INTERNAL:
1260 1.1 jruoho
1261 1.1 jruoho /* case AML_INT_NAMEPATH_OP: */
1262 1.1 jruoho break;
1263 1.1 jruoho
1264 1.1 jruoho
1265 1.1 jruoho case AML_CLASS_METHOD_CALL:
1266 1.1 jruoho
1267 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
1268 1.1 jruoho "RESOLVING-MethodCall: State=%p Op=%p NamedObj=%p\n",
1269 1.1 jruoho WalkState, Op, Node));
1270 1.1 jruoho
1271 1.1 jruoho /*
1272 1.1 jruoho * Lookup the method name and save the Node
1273 1.1 jruoho */
1274 1.1 jruoho Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
1275 1.1 jruoho ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS2,
1276 1.1 jruoho ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
1277 1.1 jruoho WalkState, &(NewNode));
1278 1.1 jruoho if (ACPI_SUCCESS (Status))
1279 1.1 jruoho {
1280 1.1 jruoho /*
1281 1.1 jruoho * Make sure that what we found is indeed a method
1282 1.1 jruoho * We didn't search for a method on purpose, to see if the name
1283 1.1 jruoho * would resolve
1284 1.1 jruoho */
1285 1.1 jruoho if (NewNode->Type != ACPI_TYPE_METHOD)
1286 1.1 jruoho {
1287 1.1 jruoho Status = AE_AML_OPERAND_TYPE;
1288 1.1 jruoho }
1289 1.1 jruoho
1290 1.1 jruoho /* We could put the returned object (Node) on the object stack for
1291 1.1 jruoho * later, but for now, we will put it in the "op" object that the
1292 1.1 jruoho * parser uses, so we can get it again at the end of this scope
1293 1.1 jruoho */
1294 1.1 jruoho Op->Common.Node = NewNode;
1295 1.1 jruoho }
1296 1.1 jruoho else
1297 1.1 jruoho {
1298 1.1 jruoho ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
1299 1.1 jruoho }
1300 1.1 jruoho break;
1301 1.1 jruoho
1302 1.1 jruoho
1303 1.1 jruoho default:
1304 1.1 jruoho break;
1305 1.1 jruoho }
1306 1.1 jruoho
1307 1.1 jruoho Cleanup:
1308 1.1 jruoho
1309 1.1 jruoho /* Remove the Node pushed at the very beginning */
1310 1.1 jruoho
1311 1.1 jruoho WalkState->Operands[0] = NULL;
1312 1.1 jruoho WalkState->NumOperands = 0;
1313 1.1 jruoho return_ACPI_STATUS (Status);
1314 1.1 jruoho }
1315 1.1 jruoho
1316 1.1 jruoho
1317