xref: /onnv-gate/usr/src/uts/intel/io/acpica/dispatcher/dswstate.c (revision 7851:e828bbb1689c)
1*7851SDana.Myers@Sun.COM /******************************************************************************
2*7851SDana.Myers@Sun.COM  *
3*7851SDana.Myers@Sun.COM  * Module Name: dswstate - Dispatcher parse tree walk management routines
4*7851SDana.Myers@Sun.COM  *              $Revision: 1.105 $
5*7851SDana.Myers@Sun.COM  *
6*7851SDana.Myers@Sun.COM  *****************************************************************************/
7*7851SDana.Myers@Sun.COM 
8*7851SDana.Myers@Sun.COM /******************************************************************************
9*7851SDana.Myers@Sun.COM  *
10*7851SDana.Myers@Sun.COM  * 1. Copyright Notice
11*7851SDana.Myers@Sun.COM  *
12*7851SDana.Myers@Sun.COM  * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp.
13*7851SDana.Myers@Sun.COM  * All rights reserved.
14*7851SDana.Myers@Sun.COM  *
15*7851SDana.Myers@Sun.COM  * 2. License
16*7851SDana.Myers@Sun.COM  *
17*7851SDana.Myers@Sun.COM  * 2.1. This is your license from Intel Corp. under its intellectual property
18*7851SDana.Myers@Sun.COM  * rights.  You may have additional license terms from the party that provided
19*7851SDana.Myers@Sun.COM  * you this software, covering your right to use that party's intellectual
20*7851SDana.Myers@Sun.COM  * property rights.
21*7851SDana.Myers@Sun.COM  *
22*7851SDana.Myers@Sun.COM  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23*7851SDana.Myers@Sun.COM  * copy of the source code appearing in this file ("Covered Code") an
24*7851SDana.Myers@Sun.COM  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25*7851SDana.Myers@Sun.COM  * base code distributed originally by Intel ("Original Intel Code") to copy,
26*7851SDana.Myers@Sun.COM  * make derivatives, distribute, use and display any portion of the Covered
27*7851SDana.Myers@Sun.COM  * Code in any form, with the right to sublicense such rights; and
28*7851SDana.Myers@Sun.COM  *
29*7851SDana.Myers@Sun.COM  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30*7851SDana.Myers@Sun.COM  * license (with the right to sublicense), under only those claims of Intel
31*7851SDana.Myers@Sun.COM  * patents that are infringed by the Original Intel Code, to make, use, sell,
32*7851SDana.Myers@Sun.COM  * offer to sell, and import the Covered Code and derivative works thereof
33*7851SDana.Myers@Sun.COM  * solely to the minimum extent necessary to exercise the above copyright
34*7851SDana.Myers@Sun.COM  * license, and in no event shall the patent license extend to any additions
35*7851SDana.Myers@Sun.COM  * to or modifications of the Original Intel Code.  No other license or right
36*7851SDana.Myers@Sun.COM  * is granted directly or by implication, estoppel or otherwise;
37*7851SDana.Myers@Sun.COM  *
38*7851SDana.Myers@Sun.COM  * The above copyright and patent license is granted only if the following
39*7851SDana.Myers@Sun.COM  * conditions are met:
40*7851SDana.Myers@Sun.COM  *
41*7851SDana.Myers@Sun.COM  * 3. Conditions
42*7851SDana.Myers@Sun.COM  *
43*7851SDana.Myers@Sun.COM  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44*7851SDana.Myers@Sun.COM  * Redistribution of source code of any substantial portion of the Covered
45*7851SDana.Myers@Sun.COM  * Code or modification with rights to further distribute source must include
46*7851SDana.Myers@Sun.COM  * the above Copyright Notice, the above License, this list of Conditions,
47*7851SDana.Myers@Sun.COM  * and the following Disclaimer and Export Compliance provision.  In addition,
48*7851SDana.Myers@Sun.COM  * Licensee must cause all Covered Code to which Licensee contributes to
49*7851SDana.Myers@Sun.COM  * contain a file documenting the changes Licensee made to create that Covered
50*7851SDana.Myers@Sun.COM  * Code and the date of any change.  Licensee must include in that file the
51*7851SDana.Myers@Sun.COM  * documentation of any changes made by any predecessor Licensee.  Licensee
52*7851SDana.Myers@Sun.COM  * must include a prominent statement that the modification is derived,
53*7851SDana.Myers@Sun.COM  * directly or indirectly, from Original Intel Code.
54*7851SDana.Myers@Sun.COM  *
55*7851SDana.Myers@Sun.COM  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56*7851SDana.Myers@Sun.COM  * Redistribution of source code of any substantial portion of the Covered
57*7851SDana.Myers@Sun.COM  * Code or modification without rights to further distribute source must
58*7851SDana.Myers@Sun.COM  * include the following Disclaimer and Export Compliance provision in the
59*7851SDana.Myers@Sun.COM  * documentation and/or other materials provided with distribution.  In
60*7851SDana.Myers@Sun.COM  * addition, Licensee may not authorize further sublicense of source of any
61*7851SDana.Myers@Sun.COM  * portion of the Covered Code, and must include terms to the effect that the
62*7851SDana.Myers@Sun.COM  * license from Licensee to its licensee is limited to the intellectual
63*7851SDana.Myers@Sun.COM  * property embodied in the software Licensee provides to its licensee, and
64*7851SDana.Myers@Sun.COM  * not to intellectual property embodied in modifications its licensee may
65*7851SDana.Myers@Sun.COM  * make.
66*7851SDana.Myers@Sun.COM  *
67*7851SDana.Myers@Sun.COM  * 3.3. Redistribution of Executable. Redistribution in executable form of any
68*7851SDana.Myers@Sun.COM  * substantial portion of the Covered Code or modification must reproduce the
69*7851SDana.Myers@Sun.COM  * above Copyright Notice, and the following Disclaimer and Export Compliance
70*7851SDana.Myers@Sun.COM  * provision in the documentation and/or other materials provided with the
71*7851SDana.Myers@Sun.COM  * distribution.
72*7851SDana.Myers@Sun.COM  *
73*7851SDana.Myers@Sun.COM  * 3.4. Intel retains all right, title, and interest in and to the Original
74*7851SDana.Myers@Sun.COM  * Intel Code.
75*7851SDana.Myers@Sun.COM  *
76*7851SDana.Myers@Sun.COM  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77*7851SDana.Myers@Sun.COM  * Intel shall be used in advertising or otherwise to promote the sale, use or
78*7851SDana.Myers@Sun.COM  * other dealings in products derived from or relating to the Covered Code
79*7851SDana.Myers@Sun.COM  * without prior written authorization from Intel.
80*7851SDana.Myers@Sun.COM  *
81*7851SDana.Myers@Sun.COM  * 4. Disclaimer and Export Compliance
82*7851SDana.Myers@Sun.COM  *
83*7851SDana.Myers@Sun.COM  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84*7851SDana.Myers@Sun.COM  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85*7851SDana.Myers@Sun.COM  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86*7851SDana.Myers@Sun.COM  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87*7851SDana.Myers@Sun.COM  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88*7851SDana.Myers@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89*7851SDana.Myers@Sun.COM  * PARTICULAR PURPOSE.
90*7851SDana.Myers@Sun.COM  *
91*7851SDana.Myers@Sun.COM  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92*7851SDana.Myers@Sun.COM  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93*7851SDana.Myers@Sun.COM  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94*7851SDana.Myers@Sun.COM  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95*7851SDana.Myers@Sun.COM  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96*7851SDana.Myers@Sun.COM  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97*7851SDana.Myers@Sun.COM  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98*7851SDana.Myers@Sun.COM  * LIMITED REMEDY.
99*7851SDana.Myers@Sun.COM  *
100*7851SDana.Myers@Sun.COM  * 4.3. Licensee shall not export, either directly or indirectly, any of this
101*7851SDana.Myers@Sun.COM  * software or system incorporating such software without first obtaining any
102*7851SDana.Myers@Sun.COM  * required license or other approval from the U. S. Department of Commerce or
103*7851SDana.Myers@Sun.COM  * any other agency or department of the United States Government.  In the
104*7851SDana.Myers@Sun.COM  * event Licensee exports any such software from the United States or
105*7851SDana.Myers@Sun.COM  * re-exports any such software from a foreign destination, Licensee shall
106*7851SDana.Myers@Sun.COM  * ensure that the distribution and export/re-export of the software is in
107*7851SDana.Myers@Sun.COM  * compliance with all laws, regulations, orders, or other restrictions of the
108*7851SDana.Myers@Sun.COM  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109*7851SDana.Myers@Sun.COM  * any of its subsidiaries will export/re-export any technical data, process,
110*7851SDana.Myers@Sun.COM  * software, or service, directly or indirectly, to any country for which the
111*7851SDana.Myers@Sun.COM  * United States government or any agency thereof requires an export license,
112*7851SDana.Myers@Sun.COM  * other governmental approval, or letter of assurance, without first obtaining
113*7851SDana.Myers@Sun.COM  * such license, approval or letter.
114*7851SDana.Myers@Sun.COM  *
115*7851SDana.Myers@Sun.COM  *****************************************************************************/
116*7851SDana.Myers@Sun.COM 
117*7851SDana.Myers@Sun.COM 
118*7851SDana.Myers@Sun.COM #define __DSWSTATE_C__
119*7851SDana.Myers@Sun.COM 
120*7851SDana.Myers@Sun.COM #include "acpi.h"
121*7851SDana.Myers@Sun.COM #include "acparser.h"
122*7851SDana.Myers@Sun.COM #include "acdispat.h"
123*7851SDana.Myers@Sun.COM #include "acnamesp.h"
124*7851SDana.Myers@Sun.COM 
125*7851SDana.Myers@Sun.COM #define _COMPONENT          ACPI_DISPATCHER
126*7851SDana.Myers@Sun.COM         ACPI_MODULE_NAME    ("dswstate")
127*7851SDana.Myers@Sun.COM 
128*7851SDana.Myers@Sun.COM /* Local prototypes */
129*7851SDana.Myers@Sun.COM 
130*7851SDana.Myers@Sun.COM static ACPI_STATUS
131*7851SDana.Myers@Sun.COM AcpiDsResultStackPush (
132*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState);
133*7851SDana.Myers@Sun.COM 
134*7851SDana.Myers@Sun.COM static ACPI_STATUS
135*7851SDana.Myers@Sun.COM AcpiDsResultStackPop (
136*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState);
137*7851SDana.Myers@Sun.COM 
138*7851SDana.Myers@Sun.COM 
139*7851SDana.Myers@Sun.COM /*******************************************************************************
140*7851SDana.Myers@Sun.COM  *
141*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsResultPop
142*7851SDana.Myers@Sun.COM  *
143*7851SDana.Myers@Sun.COM  * PARAMETERS:  Object              - Where to return the popped object
144*7851SDana.Myers@Sun.COM  *              WalkState           - Current Walk state
145*7851SDana.Myers@Sun.COM  *
146*7851SDana.Myers@Sun.COM  * RETURN:      Status
147*7851SDana.Myers@Sun.COM  *
148*7851SDana.Myers@Sun.COM  * DESCRIPTION: Pop an object off the top of this walk's result stack
149*7851SDana.Myers@Sun.COM  *
150*7851SDana.Myers@Sun.COM  ******************************************************************************/
151*7851SDana.Myers@Sun.COM 
152*7851SDana.Myers@Sun.COM ACPI_STATUS
153*7851SDana.Myers@Sun.COM AcpiDsResultPop (
154*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **Object,
155*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
156*7851SDana.Myers@Sun.COM {
157*7851SDana.Myers@Sun.COM     UINT32                  Index;
158*7851SDana.Myers@Sun.COM     ACPI_GENERIC_STATE      *State;
159*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
160*7851SDana.Myers@Sun.COM 
161*7851SDana.Myers@Sun.COM 
162*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (DsResultPop);
163*7851SDana.Myers@Sun.COM 
164*7851SDana.Myers@Sun.COM 
165*7851SDana.Myers@Sun.COM     State = WalkState->Results;
166*7851SDana.Myers@Sun.COM 
167*7851SDana.Myers@Sun.COM     /* Incorrect state of result stack */
168*7851SDana.Myers@Sun.COM 
169*7851SDana.Myers@Sun.COM     if (State && !WalkState->ResultCount)
170*7851SDana.Myers@Sun.COM     {
171*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "No results on result stack"));
172*7851SDana.Myers@Sun.COM         return (AE_AML_INTERNAL);
173*7851SDana.Myers@Sun.COM     }
174*7851SDana.Myers@Sun.COM 
175*7851SDana.Myers@Sun.COM     if (!State && WalkState->ResultCount)
176*7851SDana.Myers@Sun.COM     {
177*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "No result state for result stack"));
178*7851SDana.Myers@Sun.COM         return (AE_AML_INTERNAL);
179*7851SDana.Myers@Sun.COM     }
180*7851SDana.Myers@Sun.COM 
181*7851SDana.Myers@Sun.COM     /* Empty result stack */
182*7851SDana.Myers@Sun.COM 
183*7851SDana.Myers@Sun.COM     if (!State)
184*7851SDana.Myers@Sun.COM     {
185*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Result stack is empty! State=%p", WalkState));
186*7851SDana.Myers@Sun.COM         return (AE_AML_NO_RETURN_VALUE);
187*7851SDana.Myers@Sun.COM     }
188*7851SDana.Myers@Sun.COM 
189*7851SDana.Myers@Sun.COM     /* Return object of the top element and clean that top element result stack */
190*7851SDana.Myers@Sun.COM 
191*7851SDana.Myers@Sun.COM     WalkState->ResultCount--;
192*7851SDana.Myers@Sun.COM     Index = WalkState->ResultCount % ACPI_RESULTS_FRAME_OBJ_NUM;
193*7851SDana.Myers@Sun.COM 
194*7851SDana.Myers@Sun.COM     *Object = State->Results.ObjDesc [Index];
195*7851SDana.Myers@Sun.COM     if (!*Object)
196*7851SDana.Myers@Sun.COM     {
197*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "No result objects on result stack, State=%p",
198*7851SDana.Myers@Sun.COM             WalkState));
199*7851SDana.Myers@Sun.COM         return (AE_AML_NO_RETURN_VALUE);
200*7851SDana.Myers@Sun.COM     }
201*7851SDana.Myers@Sun.COM 
202*7851SDana.Myers@Sun.COM     State->Results.ObjDesc [Index] = NULL;
203*7851SDana.Myers@Sun.COM     if (Index == 0)
204*7851SDana.Myers@Sun.COM     {
205*7851SDana.Myers@Sun.COM         Status = AcpiDsResultStackPop (WalkState);
206*7851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
207*7851SDana.Myers@Sun.COM         {
208*7851SDana.Myers@Sun.COM             return (Status);
209*7851SDana.Myers@Sun.COM         }
210*7851SDana.Myers@Sun.COM     }
211*7851SDana.Myers@Sun.COM 
212*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
213*7851SDana.Myers@Sun.COM         "Obj=%p [%s] Index=%X State=%p Num=%X\n", *Object,
214*7851SDana.Myers@Sun.COM         AcpiUtGetObjectTypeName (*Object),
215*7851SDana.Myers@Sun.COM         Index, WalkState, WalkState->ResultCount));
216*7851SDana.Myers@Sun.COM 
217*7851SDana.Myers@Sun.COM     return (AE_OK);
218*7851SDana.Myers@Sun.COM }
219*7851SDana.Myers@Sun.COM 
220*7851SDana.Myers@Sun.COM 
221*7851SDana.Myers@Sun.COM /*******************************************************************************
222*7851SDana.Myers@Sun.COM  *
223*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsResultPush
224*7851SDana.Myers@Sun.COM  *
225*7851SDana.Myers@Sun.COM  * PARAMETERS:  Object              - Where to return the popped object
226*7851SDana.Myers@Sun.COM  *              WalkState           - Current Walk state
227*7851SDana.Myers@Sun.COM  *
228*7851SDana.Myers@Sun.COM  * RETURN:      Status
229*7851SDana.Myers@Sun.COM  *
230*7851SDana.Myers@Sun.COM  * DESCRIPTION: Push an object onto the current result stack
231*7851SDana.Myers@Sun.COM  *
232*7851SDana.Myers@Sun.COM  ******************************************************************************/
233*7851SDana.Myers@Sun.COM 
234*7851SDana.Myers@Sun.COM ACPI_STATUS
235*7851SDana.Myers@Sun.COM AcpiDsResultPush (
236*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *Object,
237*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
238*7851SDana.Myers@Sun.COM {
239*7851SDana.Myers@Sun.COM     ACPI_GENERIC_STATE      *State;
240*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
241*7851SDana.Myers@Sun.COM     UINT32                  Index;
242*7851SDana.Myers@Sun.COM 
243*7851SDana.Myers@Sun.COM 
244*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (DsResultPush);
245*7851SDana.Myers@Sun.COM 
246*7851SDana.Myers@Sun.COM 
247*7851SDana.Myers@Sun.COM     if (WalkState->ResultCount > WalkState->ResultSize)
248*7851SDana.Myers@Sun.COM     {
249*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Result stack is full"));
250*7851SDana.Myers@Sun.COM         return (AE_AML_INTERNAL);
251*7851SDana.Myers@Sun.COM     }
252*7851SDana.Myers@Sun.COM     else if (WalkState->ResultCount == WalkState->ResultSize)
253*7851SDana.Myers@Sun.COM     {
254*7851SDana.Myers@Sun.COM         /* Extend the result stack */
255*7851SDana.Myers@Sun.COM 
256*7851SDana.Myers@Sun.COM         Status = AcpiDsResultStackPush (WalkState);
257*7851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
258*7851SDana.Myers@Sun.COM         {
259*7851SDana.Myers@Sun.COM             ACPI_ERROR ((AE_INFO, "Failed to extend the result stack"));
260*7851SDana.Myers@Sun.COM             return (Status);
261*7851SDana.Myers@Sun.COM         }
262*7851SDana.Myers@Sun.COM     }
263*7851SDana.Myers@Sun.COM 
264*7851SDana.Myers@Sun.COM     if (!(WalkState->ResultCount < WalkState->ResultSize))
265*7851SDana.Myers@Sun.COM     {
266*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "No free elements in result stack"));
267*7851SDana.Myers@Sun.COM         return (AE_AML_INTERNAL);
268*7851SDana.Myers@Sun.COM     }
269*7851SDana.Myers@Sun.COM 
270*7851SDana.Myers@Sun.COM     State = WalkState->Results;
271*7851SDana.Myers@Sun.COM     if (!State)
272*7851SDana.Myers@Sun.COM     {
273*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "No result stack frame during push"));
274*7851SDana.Myers@Sun.COM         return (AE_AML_INTERNAL);
275*7851SDana.Myers@Sun.COM     }
276*7851SDana.Myers@Sun.COM 
277*7851SDana.Myers@Sun.COM     if (!Object)
278*7851SDana.Myers@Sun.COM     {
279*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
280*7851SDana.Myers@Sun.COM             "Null Object! Obj=%p State=%p Num=%X",
281*7851SDana.Myers@Sun.COM             Object, WalkState, WalkState->ResultCount));
282*7851SDana.Myers@Sun.COM         return (AE_BAD_PARAMETER);
283*7851SDana.Myers@Sun.COM     }
284*7851SDana.Myers@Sun.COM 
285*7851SDana.Myers@Sun.COM     /* Assign the address of object to the top free element of result stack */
286*7851SDana.Myers@Sun.COM 
287*7851SDana.Myers@Sun.COM     Index = WalkState->ResultCount % ACPI_RESULTS_FRAME_OBJ_NUM;
288*7851SDana.Myers@Sun.COM     State->Results.ObjDesc [Index] = Object;
289*7851SDana.Myers@Sun.COM     WalkState->ResultCount++;
290*7851SDana.Myers@Sun.COM 
291*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] State=%p Num=%X Cur=%X\n",
292*7851SDana.Myers@Sun.COM         Object, AcpiUtGetObjectTypeName ((ACPI_OPERAND_OBJECT *) Object),
293*7851SDana.Myers@Sun.COM         WalkState, WalkState->ResultCount, WalkState->CurrentResult));
294*7851SDana.Myers@Sun.COM 
295*7851SDana.Myers@Sun.COM     return (AE_OK);
296*7851SDana.Myers@Sun.COM }
297*7851SDana.Myers@Sun.COM 
298*7851SDana.Myers@Sun.COM 
299*7851SDana.Myers@Sun.COM /*******************************************************************************
300*7851SDana.Myers@Sun.COM  *
301*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsResultStackPush
302*7851SDana.Myers@Sun.COM  *
303*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState           - Current Walk state
304*7851SDana.Myers@Sun.COM  *
305*7851SDana.Myers@Sun.COM  * RETURN:      Status
306*7851SDana.Myers@Sun.COM  *
307*7851SDana.Myers@Sun.COM  * DESCRIPTION: Push an object onto the WalkState result stack
308*7851SDana.Myers@Sun.COM  *
309*7851SDana.Myers@Sun.COM  ******************************************************************************/
310*7851SDana.Myers@Sun.COM 
311*7851SDana.Myers@Sun.COM static ACPI_STATUS
312*7851SDana.Myers@Sun.COM AcpiDsResultStackPush (
313*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
314*7851SDana.Myers@Sun.COM {
315*7851SDana.Myers@Sun.COM     ACPI_GENERIC_STATE      *State;
316*7851SDana.Myers@Sun.COM 
317*7851SDana.Myers@Sun.COM 
318*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (DsResultStackPush);
319*7851SDana.Myers@Sun.COM 
320*7851SDana.Myers@Sun.COM 
321*7851SDana.Myers@Sun.COM     /* Check for stack overflow */
322*7851SDana.Myers@Sun.COM 
323*7851SDana.Myers@Sun.COM     if (((UINT32) WalkState->ResultSize + ACPI_RESULTS_FRAME_OBJ_NUM) >
324*7851SDana.Myers@Sun.COM         ACPI_RESULTS_OBJ_NUM_MAX)
325*7851SDana.Myers@Sun.COM     {
326*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Result stack overflow: State=%p Num=%X",
327*7851SDana.Myers@Sun.COM             WalkState, WalkState->ResultSize));
328*7851SDana.Myers@Sun.COM         return (AE_STACK_OVERFLOW);
329*7851SDana.Myers@Sun.COM     }
330*7851SDana.Myers@Sun.COM 
331*7851SDana.Myers@Sun.COM     State = AcpiUtCreateGenericState ();
332*7851SDana.Myers@Sun.COM     if (!State)
333*7851SDana.Myers@Sun.COM     {
334*7851SDana.Myers@Sun.COM         return (AE_NO_MEMORY);
335*7851SDana.Myers@Sun.COM     }
336*7851SDana.Myers@Sun.COM 
337*7851SDana.Myers@Sun.COM     State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_RESULT;
338*7851SDana.Myers@Sun.COM     AcpiUtPushGenericState (&WalkState->Results, State);
339*7851SDana.Myers@Sun.COM 
340*7851SDana.Myers@Sun.COM     /* Increase the length of the result stack by the length of frame */
341*7851SDana.Myers@Sun.COM 
342*7851SDana.Myers@Sun.COM     WalkState->ResultSize += ACPI_RESULTS_FRAME_OBJ_NUM;
343*7851SDana.Myers@Sun.COM 
344*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Results=%p State=%p\n",
345*7851SDana.Myers@Sun.COM         State, WalkState));
346*7851SDana.Myers@Sun.COM 
347*7851SDana.Myers@Sun.COM     return (AE_OK);
348*7851SDana.Myers@Sun.COM }
349*7851SDana.Myers@Sun.COM 
350*7851SDana.Myers@Sun.COM 
351*7851SDana.Myers@Sun.COM /*******************************************************************************
352*7851SDana.Myers@Sun.COM  *
353*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsResultStackPop
354*7851SDana.Myers@Sun.COM  *
355*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState           - Current Walk state
356*7851SDana.Myers@Sun.COM  *
357*7851SDana.Myers@Sun.COM  * RETURN:      Status
358*7851SDana.Myers@Sun.COM  *
359*7851SDana.Myers@Sun.COM  * DESCRIPTION: Pop an object off of the WalkState result stack
360*7851SDana.Myers@Sun.COM  *
361*7851SDana.Myers@Sun.COM  ******************************************************************************/
362*7851SDana.Myers@Sun.COM 
363*7851SDana.Myers@Sun.COM static ACPI_STATUS
364*7851SDana.Myers@Sun.COM AcpiDsResultStackPop (
365*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
366*7851SDana.Myers@Sun.COM {
367*7851SDana.Myers@Sun.COM     ACPI_GENERIC_STATE      *State;
368*7851SDana.Myers@Sun.COM 
369*7851SDana.Myers@Sun.COM 
370*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (DsResultStackPop);
371*7851SDana.Myers@Sun.COM 
372*7851SDana.Myers@Sun.COM 
373*7851SDana.Myers@Sun.COM     /* Check for stack underflow */
374*7851SDana.Myers@Sun.COM 
375*7851SDana.Myers@Sun.COM     if (WalkState->Results == NULL)
376*7851SDana.Myers@Sun.COM     {
377*7851SDana.Myers@Sun.COM         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Result stack underflow - State=%p\n",
378*7851SDana.Myers@Sun.COM             WalkState));
379*7851SDana.Myers@Sun.COM         return (AE_AML_NO_OPERAND);
380*7851SDana.Myers@Sun.COM     }
381*7851SDana.Myers@Sun.COM 
382*7851SDana.Myers@Sun.COM     if (WalkState->ResultSize < ACPI_RESULTS_FRAME_OBJ_NUM)
383*7851SDana.Myers@Sun.COM     {
384*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Insufficient result stack size"));
385*7851SDana.Myers@Sun.COM         return (AE_AML_INTERNAL);
386*7851SDana.Myers@Sun.COM     }
387*7851SDana.Myers@Sun.COM 
388*7851SDana.Myers@Sun.COM     State = AcpiUtPopGenericState (&WalkState->Results);
389*7851SDana.Myers@Sun.COM     AcpiUtDeleteGenericState (State);
390*7851SDana.Myers@Sun.COM 
391*7851SDana.Myers@Sun.COM     /* Decrease the length of result stack by the length of frame */
392*7851SDana.Myers@Sun.COM 
393*7851SDana.Myers@Sun.COM     WalkState->ResultSize -= ACPI_RESULTS_FRAME_OBJ_NUM;
394*7851SDana.Myers@Sun.COM 
395*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
396*7851SDana.Myers@Sun.COM         "Result=%p RemainingResults=%X State=%p\n",
397*7851SDana.Myers@Sun.COM         State, WalkState->ResultCount, WalkState));
398*7851SDana.Myers@Sun.COM 
399*7851SDana.Myers@Sun.COM     return (AE_OK);
400*7851SDana.Myers@Sun.COM }
401*7851SDana.Myers@Sun.COM 
402*7851SDana.Myers@Sun.COM 
403*7851SDana.Myers@Sun.COM /*******************************************************************************
404*7851SDana.Myers@Sun.COM  *
405*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsObjStackPush
406*7851SDana.Myers@Sun.COM  *
407*7851SDana.Myers@Sun.COM  * PARAMETERS:  Object              - Object to push
408*7851SDana.Myers@Sun.COM  *              WalkState           - Current Walk state
409*7851SDana.Myers@Sun.COM  *
410*7851SDana.Myers@Sun.COM  * RETURN:      Status
411*7851SDana.Myers@Sun.COM  *
412*7851SDana.Myers@Sun.COM  * DESCRIPTION: Push an object onto this walk's object/operand stack
413*7851SDana.Myers@Sun.COM  *
414*7851SDana.Myers@Sun.COM  ******************************************************************************/
415*7851SDana.Myers@Sun.COM 
416*7851SDana.Myers@Sun.COM ACPI_STATUS
417*7851SDana.Myers@Sun.COM AcpiDsObjStackPush (
418*7851SDana.Myers@Sun.COM     void                    *Object,
419*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
420*7851SDana.Myers@Sun.COM {
421*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (DsObjStackPush);
422*7851SDana.Myers@Sun.COM 
423*7851SDana.Myers@Sun.COM 
424*7851SDana.Myers@Sun.COM     /* Check for stack overflow */
425*7851SDana.Myers@Sun.COM 
426*7851SDana.Myers@Sun.COM     if (WalkState->NumOperands >= ACPI_OBJ_NUM_OPERANDS)
427*7851SDana.Myers@Sun.COM     {
428*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
429*7851SDana.Myers@Sun.COM             "Object stack overflow! Obj=%p State=%p #Ops=%X",
430*7851SDana.Myers@Sun.COM             Object, WalkState, WalkState->NumOperands));
431*7851SDana.Myers@Sun.COM         return (AE_STACK_OVERFLOW);
432*7851SDana.Myers@Sun.COM     }
433*7851SDana.Myers@Sun.COM 
434*7851SDana.Myers@Sun.COM     /* Put the object onto the stack */
435*7851SDana.Myers@Sun.COM 
436*7851SDana.Myers@Sun.COM     WalkState->Operands [WalkState->OperandIndex] = Object;
437*7851SDana.Myers@Sun.COM     WalkState->NumOperands++;
438*7851SDana.Myers@Sun.COM 
439*7851SDana.Myers@Sun.COM     /* For the usual order of filling the operand stack */
440*7851SDana.Myers@Sun.COM 
441*7851SDana.Myers@Sun.COM     WalkState->OperandIndex++;
442*7851SDana.Myers@Sun.COM 
443*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] State=%p #Ops=%X\n",
444*7851SDana.Myers@Sun.COM         Object, AcpiUtGetObjectTypeName ((ACPI_OPERAND_OBJECT *) Object),
445*7851SDana.Myers@Sun.COM         WalkState, WalkState->NumOperands));
446*7851SDana.Myers@Sun.COM 
447*7851SDana.Myers@Sun.COM     return (AE_OK);
448*7851SDana.Myers@Sun.COM }
449*7851SDana.Myers@Sun.COM 
450*7851SDana.Myers@Sun.COM 
451*7851SDana.Myers@Sun.COM /*******************************************************************************
452*7851SDana.Myers@Sun.COM  *
453*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsObjStackPop
454*7851SDana.Myers@Sun.COM  *
455*7851SDana.Myers@Sun.COM  * PARAMETERS:  PopCount            - Number of objects/entries to pop
456*7851SDana.Myers@Sun.COM  *              WalkState           - Current Walk state
457*7851SDana.Myers@Sun.COM  *
458*7851SDana.Myers@Sun.COM  * RETURN:      Status
459*7851SDana.Myers@Sun.COM  *
460*7851SDana.Myers@Sun.COM  * DESCRIPTION: Pop this walk's object stack.  Objects on the stack are NOT
461*7851SDana.Myers@Sun.COM  *              deleted by this routine.
462*7851SDana.Myers@Sun.COM  *
463*7851SDana.Myers@Sun.COM  ******************************************************************************/
464*7851SDana.Myers@Sun.COM 
465*7851SDana.Myers@Sun.COM ACPI_STATUS
466*7851SDana.Myers@Sun.COM AcpiDsObjStackPop (
467*7851SDana.Myers@Sun.COM     UINT32                  PopCount,
468*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
469*7851SDana.Myers@Sun.COM {
470*7851SDana.Myers@Sun.COM     UINT32                  i;
471*7851SDana.Myers@Sun.COM 
472*7851SDana.Myers@Sun.COM 
473*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (DsObjStackPop);
474*7851SDana.Myers@Sun.COM 
475*7851SDana.Myers@Sun.COM 
476*7851SDana.Myers@Sun.COM     for (i = 0; i < PopCount; i++)
477*7851SDana.Myers@Sun.COM     {
478*7851SDana.Myers@Sun.COM         /* Check for stack underflow */
479*7851SDana.Myers@Sun.COM 
480*7851SDana.Myers@Sun.COM         if (WalkState->NumOperands == 0)
481*7851SDana.Myers@Sun.COM         {
482*7851SDana.Myers@Sun.COM             ACPI_ERROR ((AE_INFO,
483*7851SDana.Myers@Sun.COM                 "Object stack underflow! Count=%X State=%p #Ops=%X",
484*7851SDana.Myers@Sun.COM                 PopCount, WalkState, WalkState->NumOperands));
485*7851SDana.Myers@Sun.COM             return (AE_STACK_UNDERFLOW);
486*7851SDana.Myers@Sun.COM         }
487*7851SDana.Myers@Sun.COM 
488*7851SDana.Myers@Sun.COM         /* Just set the stack entry to null */
489*7851SDana.Myers@Sun.COM 
490*7851SDana.Myers@Sun.COM         WalkState->NumOperands--;
491*7851SDana.Myers@Sun.COM         WalkState->Operands [WalkState->NumOperands] = NULL;
492*7851SDana.Myers@Sun.COM     }
493*7851SDana.Myers@Sun.COM 
494*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Count=%X State=%p #Ops=%X\n",
495*7851SDana.Myers@Sun.COM         PopCount, WalkState, WalkState->NumOperands));
496*7851SDana.Myers@Sun.COM 
497*7851SDana.Myers@Sun.COM     return (AE_OK);
498*7851SDana.Myers@Sun.COM }
499*7851SDana.Myers@Sun.COM 
500*7851SDana.Myers@Sun.COM 
501*7851SDana.Myers@Sun.COM /*******************************************************************************
502*7851SDana.Myers@Sun.COM  *
503*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsObjStackPopAndDelete
504*7851SDana.Myers@Sun.COM  *
505*7851SDana.Myers@Sun.COM  * PARAMETERS:  PopCount            - Number of objects/entries to pop
506*7851SDana.Myers@Sun.COM  *              WalkState           - Current Walk state
507*7851SDana.Myers@Sun.COM  *
508*7851SDana.Myers@Sun.COM  * RETURN:      Status
509*7851SDana.Myers@Sun.COM  *
510*7851SDana.Myers@Sun.COM  * DESCRIPTION: Pop this walk's object stack and delete each object that is
511*7851SDana.Myers@Sun.COM  *              popped off.
512*7851SDana.Myers@Sun.COM  *
513*7851SDana.Myers@Sun.COM  ******************************************************************************/
514*7851SDana.Myers@Sun.COM 
515*7851SDana.Myers@Sun.COM void
516*7851SDana.Myers@Sun.COM AcpiDsObjStackPopAndDelete (
517*7851SDana.Myers@Sun.COM     UINT32                  PopCount,
518*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
519*7851SDana.Myers@Sun.COM {
520*7851SDana.Myers@Sun.COM     INT32                   i;
521*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc;
522*7851SDana.Myers@Sun.COM 
523*7851SDana.Myers@Sun.COM 
524*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (DsObjStackPopAndDelete);
525*7851SDana.Myers@Sun.COM 
526*7851SDana.Myers@Sun.COM 
527*7851SDana.Myers@Sun.COM     if (PopCount == 0)
528*7851SDana.Myers@Sun.COM     {
529*7851SDana.Myers@Sun.COM         return;
530*7851SDana.Myers@Sun.COM     }
531*7851SDana.Myers@Sun.COM 
532*7851SDana.Myers@Sun.COM     for (i = (INT32) PopCount - 1; i >= 0; i--)
533*7851SDana.Myers@Sun.COM     {
534*7851SDana.Myers@Sun.COM         if (WalkState->NumOperands == 0)
535*7851SDana.Myers@Sun.COM         {
536*7851SDana.Myers@Sun.COM             return;
537*7851SDana.Myers@Sun.COM         }
538*7851SDana.Myers@Sun.COM 
539*7851SDana.Myers@Sun.COM         /* Pop the stack and delete an object if present in this stack entry */
540*7851SDana.Myers@Sun.COM 
541*7851SDana.Myers@Sun.COM         WalkState->NumOperands--;
542*7851SDana.Myers@Sun.COM         ObjDesc = WalkState->Operands [i];
543*7851SDana.Myers@Sun.COM         if (ObjDesc)
544*7851SDana.Myers@Sun.COM         {
545*7851SDana.Myers@Sun.COM             AcpiUtRemoveReference (WalkState->Operands [i]);
546*7851SDana.Myers@Sun.COM             WalkState->Operands [i] = NULL;
547*7851SDana.Myers@Sun.COM         }
548*7851SDana.Myers@Sun.COM     }
549*7851SDana.Myers@Sun.COM 
550*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Count=%X State=%p #Ops=%X\n",
551*7851SDana.Myers@Sun.COM         PopCount, WalkState, WalkState->NumOperands));
552*7851SDana.Myers@Sun.COM }
553*7851SDana.Myers@Sun.COM 
554*7851SDana.Myers@Sun.COM 
555*7851SDana.Myers@Sun.COM /*******************************************************************************
556*7851SDana.Myers@Sun.COM  *
557*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsGetCurrentWalkState
558*7851SDana.Myers@Sun.COM  *
559*7851SDana.Myers@Sun.COM  * PARAMETERS:  Thread          - Get current active state for this Thread
560*7851SDana.Myers@Sun.COM  *
561*7851SDana.Myers@Sun.COM  * RETURN:      Pointer to the current walk state
562*7851SDana.Myers@Sun.COM  *
563*7851SDana.Myers@Sun.COM  * DESCRIPTION: Get the walk state that is at the head of the list (the "current"
564*7851SDana.Myers@Sun.COM  *              walk state.)
565*7851SDana.Myers@Sun.COM  *
566*7851SDana.Myers@Sun.COM  ******************************************************************************/
567*7851SDana.Myers@Sun.COM 
568*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *
569*7851SDana.Myers@Sun.COM AcpiDsGetCurrentWalkState (
570*7851SDana.Myers@Sun.COM     ACPI_THREAD_STATE       *Thread)
571*7851SDana.Myers@Sun.COM {
572*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (DsGetCurrentWalkState);
573*7851SDana.Myers@Sun.COM 
574*7851SDana.Myers@Sun.COM 
575*7851SDana.Myers@Sun.COM     if (!Thread)
576*7851SDana.Myers@Sun.COM     {
577*7851SDana.Myers@Sun.COM         return (NULL);
578*7851SDana.Myers@Sun.COM     }
579*7851SDana.Myers@Sun.COM 
580*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Current WalkState %p\n",
581*7851SDana.Myers@Sun.COM         Thread->WalkStateList));
582*7851SDana.Myers@Sun.COM 
583*7851SDana.Myers@Sun.COM     return (Thread->WalkStateList);
584*7851SDana.Myers@Sun.COM }
585*7851SDana.Myers@Sun.COM 
586*7851SDana.Myers@Sun.COM 
587*7851SDana.Myers@Sun.COM /*******************************************************************************
588*7851SDana.Myers@Sun.COM  *
589*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsPushWalkState
590*7851SDana.Myers@Sun.COM  *
591*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - State to push
592*7851SDana.Myers@Sun.COM  *              Thread          - Thread state object
593*7851SDana.Myers@Sun.COM  *
594*7851SDana.Myers@Sun.COM  * RETURN:      None
595*7851SDana.Myers@Sun.COM  *
596*7851SDana.Myers@Sun.COM  * DESCRIPTION: Place the Thread state at the head of the state list
597*7851SDana.Myers@Sun.COM  *
598*7851SDana.Myers@Sun.COM  ******************************************************************************/
599*7851SDana.Myers@Sun.COM 
600*7851SDana.Myers@Sun.COM void
601*7851SDana.Myers@Sun.COM AcpiDsPushWalkState (
602*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
603*7851SDana.Myers@Sun.COM     ACPI_THREAD_STATE       *Thread)
604*7851SDana.Myers@Sun.COM {
605*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsPushWalkState);
606*7851SDana.Myers@Sun.COM 
607*7851SDana.Myers@Sun.COM 
608*7851SDana.Myers@Sun.COM     WalkState->Next = Thread->WalkStateList;
609*7851SDana.Myers@Sun.COM     Thread->WalkStateList = WalkState;
610*7851SDana.Myers@Sun.COM 
611*7851SDana.Myers@Sun.COM     return_VOID;
612*7851SDana.Myers@Sun.COM }
613*7851SDana.Myers@Sun.COM 
614*7851SDana.Myers@Sun.COM 
615*7851SDana.Myers@Sun.COM /*******************************************************************************
616*7851SDana.Myers@Sun.COM  *
617*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsPopWalkState
618*7851SDana.Myers@Sun.COM  *
619*7851SDana.Myers@Sun.COM  * PARAMETERS:  Thread      - Current thread state
620*7851SDana.Myers@Sun.COM  *
621*7851SDana.Myers@Sun.COM  * RETURN:      A WalkState object popped from the thread's stack
622*7851SDana.Myers@Sun.COM  *
623*7851SDana.Myers@Sun.COM  * DESCRIPTION: Remove and return the walkstate object that is at the head of
624*7851SDana.Myers@Sun.COM  *              the walk stack for the given walk list.  NULL indicates that
625*7851SDana.Myers@Sun.COM  *              the list is empty.
626*7851SDana.Myers@Sun.COM  *
627*7851SDana.Myers@Sun.COM  ******************************************************************************/
628*7851SDana.Myers@Sun.COM 
629*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *
630*7851SDana.Myers@Sun.COM AcpiDsPopWalkState (
631*7851SDana.Myers@Sun.COM     ACPI_THREAD_STATE       *Thread)
632*7851SDana.Myers@Sun.COM {
633*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState;
634*7851SDana.Myers@Sun.COM 
635*7851SDana.Myers@Sun.COM 
636*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsPopWalkState);
637*7851SDana.Myers@Sun.COM 
638*7851SDana.Myers@Sun.COM 
639*7851SDana.Myers@Sun.COM     WalkState = Thread->WalkStateList;
640*7851SDana.Myers@Sun.COM 
641*7851SDana.Myers@Sun.COM     if (WalkState)
642*7851SDana.Myers@Sun.COM     {
643*7851SDana.Myers@Sun.COM         /* Next walk state becomes the current walk state */
644*7851SDana.Myers@Sun.COM 
645*7851SDana.Myers@Sun.COM         Thread->WalkStateList = WalkState->Next;
646*7851SDana.Myers@Sun.COM 
647*7851SDana.Myers@Sun.COM         /*
648*7851SDana.Myers@Sun.COM          * Don't clear the NEXT field, this serves as an indicator
649*7851SDana.Myers@Sun.COM          * that there is a parent WALK STATE
650*7851SDana.Myers@Sun.COM          * Do Not: WalkState->Next = NULL;
651*7851SDana.Myers@Sun.COM          */
652*7851SDana.Myers@Sun.COM     }
653*7851SDana.Myers@Sun.COM 
654*7851SDana.Myers@Sun.COM     return_PTR (WalkState);
655*7851SDana.Myers@Sun.COM }
656*7851SDana.Myers@Sun.COM 
657*7851SDana.Myers@Sun.COM 
658*7851SDana.Myers@Sun.COM /*******************************************************************************
659*7851SDana.Myers@Sun.COM  *
660*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsCreateWalkState
661*7851SDana.Myers@Sun.COM  *
662*7851SDana.Myers@Sun.COM  * PARAMETERS:  OwnerId         - ID for object creation
663*7851SDana.Myers@Sun.COM  *              Origin          - Starting point for this walk
664*7851SDana.Myers@Sun.COM  *              MethodDesc      - Method object
665*7851SDana.Myers@Sun.COM  *              Thread          - Current thread state
666*7851SDana.Myers@Sun.COM  *
667*7851SDana.Myers@Sun.COM  * RETURN:      Pointer to the new walk state.
668*7851SDana.Myers@Sun.COM  *
669*7851SDana.Myers@Sun.COM  * DESCRIPTION: Allocate and initialize a new walk state.  The current walk
670*7851SDana.Myers@Sun.COM  *              state is set to this new state.
671*7851SDana.Myers@Sun.COM  *
672*7851SDana.Myers@Sun.COM  ******************************************************************************/
673*7851SDana.Myers@Sun.COM 
674*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *
675*7851SDana.Myers@Sun.COM AcpiDsCreateWalkState (
676*7851SDana.Myers@Sun.COM     ACPI_OWNER_ID           OwnerId,
677*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Origin,
678*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *MethodDesc,
679*7851SDana.Myers@Sun.COM     ACPI_THREAD_STATE       *Thread)
680*7851SDana.Myers@Sun.COM {
681*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState;
682*7851SDana.Myers@Sun.COM 
683*7851SDana.Myers@Sun.COM 
684*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsCreateWalkState);
685*7851SDana.Myers@Sun.COM 
686*7851SDana.Myers@Sun.COM 
687*7851SDana.Myers@Sun.COM     WalkState = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_WALK_STATE));
688*7851SDana.Myers@Sun.COM     if (!WalkState)
689*7851SDana.Myers@Sun.COM     {
690*7851SDana.Myers@Sun.COM         return_PTR (NULL);
691*7851SDana.Myers@Sun.COM     }
692*7851SDana.Myers@Sun.COM 
693*7851SDana.Myers@Sun.COM     WalkState->DescriptorType = ACPI_DESC_TYPE_WALK;
694*7851SDana.Myers@Sun.COM     WalkState->MethodDesc = MethodDesc;
695*7851SDana.Myers@Sun.COM     WalkState->OwnerId = OwnerId;
696*7851SDana.Myers@Sun.COM     WalkState->Origin = Origin;
697*7851SDana.Myers@Sun.COM     WalkState->Thread = Thread;
698*7851SDana.Myers@Sun.COM 
699*7851SDana.Myers@Sun.COM     WalkState->ParserState.StartOp = Origin;
700*7851SDana.Myers@Sun.COM 
701*7851SDana.Myers@Sun.COM     /* Init the method args/local */
702*7851SDana.Myers@Sun.COM 
703*7851SDana.Myers@Sun.COM #if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
704*7851SDana.Myers@Sun.COM     AcpiDsMethodDataInit (WalkState);
705*7851SDana.Myers@Sun.COM #endif
706*7851SDana.Myers@Sun.COM 
707*7851SDana.Myers@Sun.COM     /* Put the new state at the head of the walk list */
708*7851SDana.Myers@Sun.COM 
709*7851SDana.Myers@Sun.COM     if (Thread)
710*7851SDana.Myers@Sun.COM     {
711*7851SDana.Myers@Sun.COM         AcpiDsPushWalkState (WalkState, Thread);
712*7851SDana.Myers@Sun.COM     }
713*7851SDana.Myers@Sun.COM 
714*7851SDana.Myers@Sun.COM     return_PTR (WalkState);
715*7851SDana.Myers@Sun.COM }
716*7851SDana.Myers@Sun.COM 
717*7851SDana.Myers@Sun.COM 
718*7851SDana.Myers@Sun.COM /*******************************************************************************
719*7851SDana.Myers@Sun.COM  *
720*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsInitAmlWalk
721*7851SDana.Myers@Sun.COM  *
722*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - New state to be initialized
723*7851SDana.Myers@Sun.COM  *              Op              - Current parse op
724*7851SDana.Myers@Sun.COM  *              MethodNode      - Control method NS node, if any
725*7851SDana.Myers@Sun.COM  *              AmlStart        - Start of AML
726*7851SDana.Myers@Sun.COM  *              AmlLength       - Length of AML
727*7851SDana.Myers@Sun.COM  *              Info            - Method info block (params, etc.)
728*7851SDana.Myers@Sun.COM  *              PassNumber      - 1, 2, or 3
729*7851SDana.Myers@Sun.COM  *
730*7851SDana.Myers@Sun.COM  * RETURN:      Status
731*7851SDana.Myers@Sun.COM  *
732*7851SDana.Myers@Sun.COM  * DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk
733*7851SDana.Myers@Sun.COM  *
734*7851SDana.Myers@Sun.COM  ******************************************************************************/
735*7851SDana.Myers@Sun.COM 
736*7851SDana.Myers@Sun.COM ACPI_STATUS
737*7851SDana.Myers@Sun.COM AcpiDsInitAmlWalk (
738*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
739*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op,
740*7851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *MethodNode,
741*7851SDana.Myers@Sun.COM     UINT8                   *AmlStart,
742*7851SDana.Myers@Sun.COM     UINT32                  AmlLength,
743*7851SDana.Myers@Sun.COM     ACPI_EVALUATE_INFO      *Info,
744*7851SDana.Myers@Sun.COM     UINT8                   PassNumber)
745*7851SDana.Myers@Sun.COM {
746*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
747*7851SDana.Myers@Sun.COM     ACPI_PARSE_STATE        *ParserState = &WalkState->ParserState;
748*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *ExtraOp;
749*7851SDana.Myers@Sun.COM 
750*7851SDana.Myers@Sun.COM 
751*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsInitAmlWalk);
752*7851SDana.Myers@Sun.COM 
753*7851SDana.Myers@Sun.COM 
754*7851SDana.Myers@Sun.COM     WalkState->ParserState.Aml =
755*7851SDana.Myers@Sun.COM     WalkState->ParserState.AmlStart = AmlStart;
756*7851SDana.Myers@Sun.COM     WalkState->ParserState.AmlEnd =
757*7851SDana.Myers@Sun.COM     WalkState->ParserState.PkgEnd = AmlStart + AmlLength;
758*7851SDana.Myers@Sun.COM 
759*7851SDana.Myers@Sun.COM     /* The NextOp of the NextWalk will be the beginning of the method */
760*7851SDana.Myers@Sun.COM 
761*7851SDana.Myers@Sun.COM     WalkState->NextOp = NULL;
762*7851SDana.Myers@Sun.COM     WalkState->PassNumber = PassNumber;
763*7851SDana.Myers@Sun.COM 
764*7851SDana.Myers@Sun.COM     if (Info)
765*7851SDana.Myers@Sun.COM     {
766*7851SDana.Myers@Sun.COM         WalkState->Params = Info->Parameters;
767*7851SDana.Myers@Sun.COM         WalkState->CallerReturnDesc = &Info->ReturnObject;
768*7851SDana.Myers@Sun.COM     }
769*7851SDana.Myers@Sun.COM 
770*7851SDana.Myers@Sun.COM     Status = AcpiPsInitScope (&WalkState->ParserState, Op);
771*7851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
772*7851SDana.Myers@Sun.COM     {
773*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
774*7851SDana.Myers@Sun.COM     }
775*7851SDana.Myers@Sun.COM 
776*7851SDana.Myers@Sun.COM     if (MethodNode)
777*7851SDana.Myers@Sun.COM     {
778*7851SDana.Myers@Sun.COM         WalkState->ParserState.StartNode = MethodNode;
779*7851SDana.Myers@Sun.COM         WalkState->WalkType = ACPI_WALK_METHOD;
780*7851SDana.Myers@Sun.COM         WalkState->MethodNode = MethodNode;
781*7851SDana.Myers@Sun.COM         WalkState->MethodDesc = AcpiNsGetAttachedObject (MethodNode);
782*7851SDana.Myers@Sun.COM 
783*7851SDana.Myers@Sun.COM         /* Push start scope on scope stack and make it current  */
784*7851SDana.Myers@Sun.COM 
785*7851SDana.Myers@Sun.COM         Status = AcpiDsScopeStackPush (MethodNode, ACPI_TYPE_METHOD, WalkState);
786*7851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
787*7851SDana.Myers@Sun.COM         {
788*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (Status);
789*7851SDana.Myers@Sun.COM         }
790*7851SDana.Myers@Sun.COM 
791*7851SDana.Myers@Sun.COM         /* Init the method arguments */
792*7851SDana.Myers@Sun.COM 
793*7851SDana.Myers@Sun.COM         Status = AcpiDsMethodDataInitArgs (WalkState->Params,
794*7851SDana.Myers@Sun.COM                     ACPI_METHOD_NUM_ARGS, WalkState);
795*7851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
796*7851SDana.Myers@Sun.COM         {
797*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (Status);
798*7851SDana.Myers@Sun.COM         }
799*7851SDana.Myers@Sun.COM     }
800*7851SDana.Myers@Sun.COM     else
801*7851SDana.Myers@Sun.COM     {
802*7851SDana.Myers@Sun.COM         /*
803*7851SDana.Myers@Sun.COM          * Setup the current scope.
804*7851SDana.Myers@Sun.COM          * Find a Named Op that has a namespace node associated with it.
805*7851SDana.Myers@Sun.COM          * search upwards from this Op.  Current scope is the first
806*7851SDana.Myers@Sun.COM          * Op with a namespace node.
807*7851SDana.Myers@Sun.COM          */
808*7851SDana.Myers@Sun.COM         ExtraOp = ParserState->StartOp;
809*7851SDana.Myers@Sun.COM         while (ExtraOp && !ExtraOp->Common.Node)
810*7851SDana.Myers@Sun.COM         {
811*7851SDana.Myers@Sun.COM             ExtraOp = ExtraOp->Common.Parent;
812*7851SDana.Myers@Sun.COM         }
813*7851SDana.Myers@Sun.COM 
814*7851SDana.Myers@Sun.COM         if (!ExtraOp)
815*7851SDana.Myers@Sun.COM         {
816*7851SDana.Myers@Sun.COM             ParserState->StartNode = NULL;
817*7851SDana.Myers@Sun.COM         }
818*7851SDana.Myers@Sun.COM         else
819*7851SDana.Myers@Sun.COM         {
820*7851SDana.Myers@Sun.COM             ParserState->StartNode = ExtraOp->Common.Node;
821*7851SDana.Myers@Sun.COM         }
822*7851SDana.Myers@Sun.COM 
823*7851SDana.Myers@Sun.COM         if (ParserState->StartNode)
824*7851SDana.Myers@Sun.COM         {
825*7851SDana.Myers@Sun.COM             /* Push start scope on scope stack and make it current  */
826*7851SDana.Myers@Sun.COM 
827*7851SDana.Myers@Sun.COM             Status = AcpiDsScopeStackPush (ParserState->StartNode,
828*7851SDana.Myers@Sun.COM                             ParserState->StartNode->Type, WalkState);
829*7851SDana.Myers@Sun.COM             if (ACPI_FAILURE (Status))
830*7851SDana.Myers@Sun.COM             {
831*7851SDana.Myers@Sun.COM                 return_ACPI_STATUS (Status);
832*7851SDana.Myers@Sun.COM             }
833*7851SDana.Myers@Sun.COM         }
834*7851SDana.Myers@Sun.COM     }
835*7851SDana.Myers@Sun.COM 
836*7851SDana.Myers@Sun.COM     Status = AcpiDsInitCallbacks (WalkState, PassNumber);
837*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
838*7851SDana.Myers@Sun.COM }
839*7851SDana.Myers@Sun.COM 
840*7851SDana.Myers@Sun.COM 
841*7851SDana.Myers@Sun.COM /*******************************************************************************
842*7851SDana.Myers@Sun.COM  *
843*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsDeleteWalkState
844*7851SDana.Myers@Sun.COM  *
845*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - State to delete
846*7851SDana.Myers@Sun.COM  *
847*7851SDana.Myers@Sun.COM  * RETURN:      Status
848*7851SDana.Myers@Sun.COM  *
849*7851SDana.Myers@Sun.COM  * DESCRIPTION: Delete a walk state including all internal data structures
850*7851SDana.Myers@Sun.COM  *
851*7851SDana.Myers@Sun.COM  ******************************************************************************/
852*7851SDana.Myers@Sun.COM 
853*7851SDana.Myers@Sun.COM void
854*7851SDana.Myers@Sun.COM AcpiDsDeleteWalkState (
855*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
856*7851SDana.Myers@Sun.COM {
857*7851SDana.Myers@Sun.COM     ACPI_GENERIC_STATE      *State;
858*7851SDana.Myers@Sun.COM 
859*7851SDana.Myers@Sun.COM 
860*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsDeleteWalkState, WalkState);
861*7851SDana.Myers@Sun.COM 
862*7851SDana.Myers@Sun.COM 
863*7851SDana.Myers@Sun.COM     if (!WalkState)
864*7851SDana.Myers@Sun.COM     {
865*7851SDana.Myers@Sun.COM         return;
866*7851SDana.Myers@Sun.COM     }
867*7851SDana.Myers@Sun.COM 
868*7851SDana.Myers@Sun.COM     if (WalkState->DescriptorType != ACPI_DESC_TYPE_WALK)
869*7851SDana.Myers@Sun.COM     {
870*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "%p is not a valid walk state",
871*7851SDana.Myers@Sun.COM             WalkState));
872*7851SDana.Myers@Sun.COM         return;
873*7851SDana.Myers@Sun.COM     }
874*7851SDana.Myers@Sun.COM 
875*7851SDana.Myers@Sun.COM     /* There should not be any open scopes */
876*7851SDana.Myers@Sun.COM 
877*7851SDana.Myers@Sun.COM     if (WalkState->ParserState.Scope)
878*7851SDana.Myers@Sun.COM     {
879*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "%p walk still has a scope list",
880*7851SDana.Myers@Sun.COM             WalkState));
881*7851SDana.Myers@Sun.COM         AcpiPsCleanupScope (&WalkState->ParserState);
882*7851SDana.Myers@Sun.COM     }
883*7851SDana.Myers@Sun.COM 
884*7851SDana.Myers@Sun.COM     /* Always must free any linked control states */
885*7851SDana.Myers@Sun.COM 
886*7851SDana.Myers@Sun.COM     while (WalkState->ControlState)
887*7851SDana.Myers@Sun.COM     {
888*7851SDana.Myers@Sun.COM         State = WalkState->ControlState;
889*7851SDana.Myers@Sun.COM         WalkState->ControlState = State->Common.Next;
890*7851SDana.Myers@Sun.COM 
891*7851SDana.Myers@Sun.COM         AcpiUtDeleteGenericState (State);
892*7851SDana.Myers@Sun.COM     }
893*7851SDana.Myers@Sun.COM 
894*7851SDana.Myers@Sun.COM     /* Always must free any linked parse states */
895*7851SDana.Myers@Sun.COM 
896*7851SDana.Myers@Sun.COM     while (WalkState->ScopeInfo)
897*7851SDana.Myers@Sun.COM     {
898*7851SDana.Myers@Sun.COM         State = WalkState->ScopeInfo;
899*7851SDana.Myers@Sun.COM         WalkState->ScopeInfo = State->Common.Next;
900*7851SDana.Myers@Sun.COM 
901*7851SDana.Myers@Sun.COM         AcpiUtDeleteGenericState (State);
902*7851SDana.Myers@Sun.COM     }
903*7851SDana.Myers@Sun.COM 
904*7851SDana.Myers@Sun.COM     /* Always must free any stacked result states */
905*7851SDana.Myers@Sun.COM 
906*7851SDana.Myers@Sun.COM     while (WalkState->Results)
907*7851SDana.Myers@Sun.COM     {
908*7851SDana.Myers@Sun.COM         State = WalkState->Results;
909*7851SDana.Myers@Sun.COM         WalkState->Results = State->Common.Next;
910*7851SDana.Myers@Sun.COM 
911*7851SDana.Myers@Sun.COM         AcpiUtDeleteGenericState (State);
912*7851SDana.Myers@Sun.COM     }
913*7851SDana.Myers@Sun.COM 
914*7851SDana.Myers@Sun.COM     ACPI_FREE (WalkState);
915*7851SDana.Myers@Sun.COM     return_VOID;
916*7851SDana.Myers@Sun.COM }
917*7851SDana.Myers@Sun.COM 
918*7851SDana.Myers@Sun.COM 
919