xref: /minix3/minix/drivers/power/acpi/dispatcher/dswstate.c (revision 29492bb71c7148a089a5afafa0c99409161218df)
1433d6423SLionel Sambuc /******************************************************************************
2433d6423SLionel Sambuc  *
3433d6423SLionel Sambuc  * Module Name: dswstate - Dispatcher parse tree walk management routines
4433d6423SLionel Sambuc  *
5433d6423SLionel Sambuc  *****************************************************************************/
6433d6423SLionel Sambuc 
7*29492bb7SDavid van Moolenbroek /*
8*29492bb7SDavid van Moolenbroek  * Copyright (C) 2000 - 2014, Intel Corp.
9433d6423SLionel Sambuc  * All rights reserved.
10433d6423SLionel Sambuc  *
11*29492bb7SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
12*29492bb7SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
13*29492bb7SDavid van Moolenbroek  * are met:
14*29492bb7SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
15*29492bb7SDavid van Moolenbroek  *    notice, this list of conditions, and the following disclaimer,
16*29492bb7SDavid van Moolenbroek  *    without modification.
17*29492bb7SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*29492bb7SDavid van Moolenbroek  *    substantially similar to the "NO WARRANTY" disclaimer below
19*29492bb7SDavid van Moolenbroek  *    ("Disclaimer") and any redistribution must be conditioned upon
20*29492bb7SDavid van Moolenbroek  *    including a substantially similar Disclaimer requirement for further
21*29492bb7SDavid van Moolenbroek  *    binary redistribution.
22*29492bb7SDavid van Moolenbroek  * 3. Neither the names of the above-listed copyright holders nor the names
23*29492bb7SDavid van Moolenbroek  *    of any contributors may be used to endorse or promote products derived
24*29492bb7SDavid van Moolenbroek  *    from this software without specific prior written permission.
25433d6423SLionel Sambuc  *
26*29492bb7SDavid van Moolenbroek  * Alternatively, this software may be distributed under the terms of the
27*29492bb7SDavid van Moolenbroek  * GNU General Public License ("GPL") version 2 as published by the Free
28*29492bb7SDavid van Moolenbroek  * Software Foundation.
29433d6423SLionel Sambuc  *
30*29492bb7SDavid van Moolenbroek  * NO WARRANTY
31*29492bb7SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*29492bb7SDavid van Moolenbroek  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*29492bb7SDavid van Moolenbroek  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*29492bb7SDavid van Moolenbroek  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*29492bb7SDavid van Moolenbroek  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*29492bb7SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*29492bb7SDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*29492bb7SDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*29492bb7SDavid van Moolenbroek  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*29492bb7SDavid van Moolenbroek  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*29492bb7SDavid van Moolenbroek  * POSSIBILITY OF SUCH DAMAGES.
42*29492bb7SDavid van Moolenbroek  */
43433d6423SLionel Sambuc 
44433d6423SLionel Sambuc #include "acpi.h"
45433d6423SLionel Sambuc #include "accommon.h"
46433d6423SLionel Sambuc #include "acparser.h"
47433d6423SLionel Sambuc #include "acdispat.h"
48433d6423SLionel Sambuc #include "acnamesp.h"
49433d6423SLionel Sambuc 
50433d6423SLionel Sambuc #define _COMPONENT          ACPI_DISPATCHER
51433d6423SLionel Sambuc         ACPI_MODULE_NAME    ("dswstate")
52433d6423SLionel Sambuc 
53433d6423SLionel Sambuc /* Local prototypes */
54433d6423SLionel Sambuc 
55433d6423SLionel Sambuc static ACPI_STATUS
56433d6423SLionel Sambuc AcpiDsResultStackPush (
57433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState);
58433d6423SLionel Sambuc 
59433d6423SLionel Sambuc static ACPI_STATUS
60433d6423SLionel Sambuc AcpiDsResultStackPop (
61433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState);
62433d6423SLionel Sambuc 
63433d6423SLionel Sambuc 
64433d6423SLionel Sambuc /*******************************************************************************
65433d6423SLionel Sambuc  *
66433d6423SLionel Sambuc  * FUNCTION:    AcpiDsResultPop
67433d6423SLionel Sambuc  *
68433d6423SLionel Sambuc  * PARAMETERS:  Object              - Where to return the popped object
69433d6423SLionel Sambuc  *              WalkState           - Current Walk state
70433d6423SLionel Sambuc  *
71433d6423SLionel Sambuc  * RETURN:      Status
72433d6423SLionel Sambuc  *
73433d6423SLionel Sambuc  * DESCRIPTION: Pop an object off the top of this walk's result stack
74433d6423SLionel Sambuc  *
75433d6423SLionel Sambuc  ******************************************************************************/
76433d6423SLionel Sambuc 
77433d6423SLionel Sambuc ACPI_STATUS
AcpiDsResultPop(ACPI_OPERAND_OBJECT ** Object,ACPI_WALK_STATE * WalkState)78433d6423SLionel Sambuc AcpiDsResultPop (
79433d6423SLionel Sambuc     ACPI_OPERAND_OBJECT     **Object,
80433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState)
81433d6423SLionel Sambuc {
82433d6423SLionel Sambuc     UINT32                  Index;
83433d6423SLionel Sambuc     ACPI_GENERIC_STATE      *State;
84433d6423SLionel Sambuc     ACPI_STATUS             Status;
85433d6423SLionel Sambuc 
86433d6423SLionel Sambuc 
87433d6423SLionel Sambuc     ACPI_FUNCTION_NAME (DsResultPop);
88433d6423SLionel Sambuc 
89433d6423SLionel Sambuc 
90433d6423SLionel Sambuc     State = WalkState->Results;
91433d6423SLionel Sambuc 
92433d6423SLionel Sambuc     /* Incorrect state of result stack */
93433d6423SLionel Sambuc 
94433d6423SLionel Sambuc     if (State && !WalkState->ResultCount)
95433d6423SLionel Sambuc     {
96433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO, "No results on result stack"));
97433d6423SLionel Sambuc         return (AE_AML_INTERNAL);
98433d6423SLionel Sambuc     }
99433d6423SLionel Sambuc 
100433d6423SLionel Sambuc     if (!State && WalkState->ResultCount)
101433d6423SLionel Sambuc     {
102433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO, "No result state for result stack"));
103433d6423SLionel Sambuc         return (AE_AML_INTERNAL);
104433d6423SLionel Sambuc     }
105433d6423SLionel Sambuc 
106433d6423SLionel Sambuc     /* Empty result stack */
107433d6423SLionel Sambuc 
108433d6423SLionel Sambuc     if (!State)
109433d6423SLionel Sambuc     {
110433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO, "Result stack is empty! State=%p", WalkState));
111433d6423SLionel Sambuc         return (AE_AML_NO_RETURN_VALUE);
112433d6423SLionel Sambuc     }
113433d6423SLionel Sambuc 
114433d6423SLionel Sambuc     /* Return object of the top element and clean that top element result stack */
115433d6423SLionel Sambuc 
116433d6423SLionel Sambuc     WalkState->ResultCount--;
117433d6423SLionel Sambuc     Index = (UINT32) WalkState->ResultCount % ACPI_RESULTS_FRAME_OBJ_NUM;
118433d6423SLionel Sambuc 
119433d6423SLionel Sambuc     *Object = State->Results.ObjDesc [Index];
120433d6423SLionel Sambuc     if (!*Object)
121433d6423SLionel Sambuc     {
122433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO, "No result objects on result stack, State=%p",
123433d6423SLionel Sambuc             WalkState));
124433d6423SLionel Sambuc         return (AE_AML_NO_RETURN_VALUE);
125433d6423SLionel Sambuc     }
126433d6423SLionel Sambuc 
127433d6423SLionel Sambuc     State->Results.ObjDesc [Index] = NULL;
128433d6423SLionel Sambuc     if (Index == 0)
129433d6423SLionel Sambuc     {
130433d6423SLionel Sambuc         Status = AcpiDsResultStackPop (WalkState);
131433d6423SLionel Sambuc         if (ACPI_FAILURE (Status))
132433d6423SLionel Sambuc         {
133433d6423SLionel Sambuc             return (Status);
134433d6423SLionel Sambuc         }
135433d6423SLionel Sambuc     }
136433d6423SLionel Sambuc 
137433d6423SLionel Sambuc     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
138433d6423SLionel Sambuc         "Obj=%p [%s] Index=%X State=%p Num=%X\n", *Object,
139433d6423SLionel Sambuc         AcpiUtGetObjectTypeName (*Object),
140433d6423SLionel Sambuc         Index, WalkState, WalkState->ResultCount));
141433d6423SLionel Sambuc 
142433d6423SLionel Sambuc     return (AE_OK);
143433d6423SLionel Sambuc }
144433d6423SLionel Sambuc 
145433d6423SLionel Sambuc 
146433d6423SLionel Sambuc /*******************************************************************************
147433d6423SLionel Sambuc  *
148433d6423SLionel Sambuc  * FUNCTION:    AcpiDsResultPush
149433d6423SLionel Sambuc  *
150433d6423SLionel Sambuc  * PARAMETERS:  Object              - Where to return the popped object
151433d6423SLionel Sambuc  *              WalkState           - Current Walk state
152433d6423SLionel Sambuc  *
153433d6423SLionel Sambuc  * RETURN:      Status
154433d6423SLionel Sambuc  *
155433d6423SLionel Sambuc  * DESCRIPTION: Push an object onto the current result stack
156433d6423SLionel Sambuc  *
157433d6423SLionel Sambuc  ******************************************************************************/
158433d6423SLionel Sambuc 
159433d6423SLionel Sambuc ACPI_STATUS
AcpiDsResultPush(ACPI_OPERAND_OBJECT * Object,ACPI_WALK_STATE * WalkState)160433d6423SLionel Sambuc AcpiDsResultPush (
161433d6423SLionel Sambuc     ACPI_OPERAND_OBJECT     *Object,
162433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState)
163433d6423SLionel Sambuc {
164433d6423SLionel Sambuc     ACPI_GENERIC_STATE      *State;
165433d6423SLionel Sambuc     ACPI_STATUS             Status;
166433d6423SLionel Sambuc     UINT32                  Index;
167433d6423SLionel Sambuc 
168433d6423SLionel Sambuc 
169433d6423SLionel Sambuc     ACPI_FUNCTION_NAME (DsResultPush);
170433d6423SLionel Sambuc 
171433d6423SLionel Sambuc 
172433d6423SLionel Sambuc     if (WalkState->ResultCount > WalkState->ResultSize)
173433d6423SLionel Sambuc     {
174433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO, "Result stack is full"));
175433d6423SLionel Sambuc         return (AE_AML_INTERNAL);
176433d6423SLionel Sambuc     }
177433d6423SLionel Sambuc     else if (WalkState->ResultCount == WalkState->ResultSize)
178433d6423SLionel Sambuc     {
179433d6423SLionel Sambuc         /* Extend the result stack */
180433d6423SLionel Sambuc 
181433d6423SLionel Sambuc         Status = AcpiDsResultStackPush (WalkState);
182433d6423SLionel Sambuc         if (ACPI_FAILURE (Status))
183433d6423SLionel Sambuc         {
184433d6423SLionel Sambuc             ACPI_ERROR ((AE_INFO, "Failed to extend the result stack"));
185433d6423SLionel Sambuc             return (Status);
186433d6423SLionel Sambuc         }
187433d6423SLionel Sambuc     }
188433d6423SLionel Sambuc 
189433d6423SLionel Sambuc     if (!(WalkState->ResultCount < WalkState->ResultSize))
190433d6423SLionel Sambuc     {
191433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO, "No free elements in result stack"));
192433d6423SLionel Sambuc         return (AE_AML_INTERNAL);
193433d6423SLionel Sambuc     }
194433d6423SLionel Sambuc 
195433d6423SLionel Sambuc     State = WalkState->Results;
196433d6423SLionel Sambuc     if (!State)
197433d6423SLionel Sambuc     {
198433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO, "No result stack frame during push"));
199433d6423SLionel Sambuc         return (AE_AML_INTERNAL);
200433d6423SLionel Sambuc     }
201433d6423SLionel Sambuc 
202433d6423SLionel Sambuc     if (!Object)
203433d6423SLionel Sambuc     {
204433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO,
205433d6423SLionel Sambuc             "Null Object! Obj=%p State=%p Num=%u",
206433d6423SLionel Sambuc             Object, WalkState, WalkState->ResultCount));
207433d6423SLionel Sambuc         return (AE_BAD_PARAMETER);
208433d6423SLionel Sambuc     }
209433d6423SLionel Sambuc 
210433d6423SLionel Sambuc     /* Assign the address of object to the top free element of result stack */
211433d6423SLionel Sambuc 
212433d6423SLionel Sambuc     Index = (UINT32) WalkState->ResultCount % ACPI_RESULTS_FRAME_OBJ_NUM;
213433d6423SLionel Sambuc     State->Results.ObjDesc [Index] = Object;
214433d6423SLionel Sambuc     WalkState->ResultCount++;
215433d6423SLionel Sambuc 
216433d6423SLionel Sambuc     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] State=%p Num=%X Cur=%X\n",
217433d6423SLionel Sambuc         Object, AcpiUtGetObjectTypeName ((ACPI_OPERAND_OBJECT *) Object),
218433d6423SLionel Sambuc         WalkState, WalkState->ResultCount, WalkState->CurrentResult));
219433d6423SLionel Sambuc 
220433d6423SLionel Sambuc     return (AE_OK);
221433d6423SLionel Sambuc }
222433d6423SLionel Sambuc 
223433d6423SLionel Sambuc 
224433d6423SLionel Sambuc /*******************************************************************************
225433d6423SLionel Sambuc  *
226433d6423SLionel Sambuc  * FUNCTION:    AcpiDsResultStackPush
227433d6423SLionel Sambuc  *
228433d6423SLionel Sambuc  * PARAMETERS:  WalkState           - Current Walk state
229433d6423SLionel Sambuc  *
230433d6423SLionel Sambuc  * RETURN:      Status
231433d6423SLionel Sambuc  *
232433d6423SLionel Sambuc  * DESCRIPTION: Push an object onto the WalkState result stack
233433d6423SLionel Sambuc  *
234433d6423SLionel Sambuc  ******************************************************************************/
235433d6423SLionel Sambuc 
236433d6423SLionel Sambuc static ACPI_STATUS
AcpiDsResultStackPush(ACPI_WALK_STATE * WalkState)237433d6423SLionel Sambuc AcpiDsResultStackPush (
238433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState)
239433d6423SLionel Sambuc {
240433d6423SLionel Sambuc     ACPI_GENERIC_STATE      *State;
241433d6423SLionel Sambuc 
242433d6423SLionel Sambuc 
243433d6423SLionel Sambuc     ACPI_FUNCTION_NAME (DsResultStackPush);
244433d6423SLionel Sambuc 
245433d6423SLionel Sambuc 
246433d6423SLionel Sambuc     /* Check for stack overflow */
247433d6423SLionel Sambuc 
248433d6423SLionel Sambuc     if (((UINT32) WalkState->ResultSize + ACPI_RESULTS_FRAME_OBJ_NUM) >
249433d6423SLionel Sambuc         ACPI_RESULTS_OBJ_NUM_MAX)
250433d6423SLionel Sambuc     {
251433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO, "Result stack overflow: State=%p Num=%u",
252433d6423SLionel Sambuc             WalkState, WalkState->ResultSize));
253433d6423SLionel Sambuc         return (AE_STACK_OVERFLOW);
254433d6423SLionel Sambuc     }
255433d6423SLionel Sambuc 
256433d6423SLionel Sambuc     State = AcpiUtCreateGenericState ();
257433d6423SLionel Sambuc     if (!State)
258433d6423SLionel Sambuc     {
259433d6423SLionel Sambuc         return (AE_NO_MEMORY);
260433d6423SLionel Sambuc     }
261433d6423SLionel Sambuc 
262433d6423SLionel Sambuc     State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_RESULT;
263433d6423SLionel Sambuc     AcpiUtPushGenericState (&WalkState->Results, State);
264433d6423SLionel Sambuc 
265433d6423SLionel Sambuc     /* Increase the length of the result stack by the length of frame */
266433d6423SLionel Sambuc 
267433d6423SLionel Sambuc     WalkState->ResultSize += ACPI_RESULTS_FRAME_OBJ_NUM;
268433d6423SLionel Sambuc 
269433d6423SLionel Sambuc     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Results=%p State=%p\n",
270433d6423SLionel Sambuc         State, WalkState));
271433d6423SLionel Sambuc 
272433d6423SLionel Sambuc     return (AE_OK);
273433d6423SLionel Sambuc }
274433d6423SLionel Sambuc 
275433d6423SLionel Sambuc 
276433d6423SLionel Sambuc /*******************************************************************************
277433d6423SLionel Sambuc  *
278433d6423SLionel Sambuc  * FUNCTION:    AcpiDsResultStackPop
279433d6423SLionel Sambuc  *
280433d6423SLionel Sambuc  * PARAMETERS:  WalkState           - Current Walk state
281433d6423SLionel Sambuc  *
282433d6423SLionel Sambuc  * RETURN:      Status
283433d6423SLionel Sambuc  *
284433d6423SLionel Sambuc  * DESCRIPTION: Pop an object off of the WalkState result stack
285433d6423SLionel Sambuc  *
286433d6423SLionel Sambuc  ******************************************************************************/
287433d6423SLionel Sambuc 
288433d6423SLionel Sambuc static ACPI_STATUS
AcpiDsResultStackPop(ACPI_WALK_STATE * WalkState)289433d6423SLionel Sambuc AcpiDsResultStackPop (
290433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState)
291433d6423SLionel Sambuc {
292433d6423SLionel Sambuc     ACPI_GENERIC_STATE      *State;
293433d6423SLionel Sambuc 
294433d6423SLionel Sambuc 
295433d6423SLionel Sambuc     ACPI_FUNCTION_NAME (DsResultStackPop);
296433d6423SLionel Sambuc 
297433d6423SLionel Sambuc 
298433d6423SLionel Sambuc     /* Check for stack underflow */
299433d6423SLionel Sambuc 
300433d6423SLionel Sambuc     if (WalkState->Results == NULL)
301433d6423SLionel Sambuc     {
302433d6423SLionel Sambuc         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Result stack underflow - State=%p\n",
303433d6423SLionel Sambuc             WalkState));
304433d6423SLionel Sambuc         return (AE_AML_NO_OPERAND);
305433d6423SLionel Sambuc     }
306433d6423SLionel Sambuc 
307433d6423SLionel Sambuc     if (WalkState->ResultSize < ACPI_RESULTS_FRAME_OBJ_NUM)
308433d6423SLionel Sambuc     {
309433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO, "Insufficient result stack size"));
310433d6423SLionel Sambuc         return (AE_AML_INTERNAL);
311433d6423SLionel Sambuc     }
312433d6423SLionel Sambuc 
313433d6423SLionel Sambuc     State = AcpiUtPopGenericState (&WalkState->Results);
314433d6423SLionel Sambuc     AcpiUtDeleteGenericState (State);
315433d6423SLionel Sambuc 
316433d6423SLionel Sambuc     /* Decrease the length of result stack by the length of frame */
317433d6423SLionel Sambuc 
318433d6423SLionel Sambuc     WalkState->ResultSize -= ACPI_RESULTS_FRAME_OBJ_NUM;
319433d6423SLionel Sambuc 
320433d6423SLionel Sambuc     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
321433d6423SLionel Sambuc         "Result=%p RemainingResults=%X State=%p\n",
322433d6423SLionel Sambuc         State, WalkState->ResultCount, WalkState));
323433d6423SLionel Sambuc 
324433d6423SLionel Sambuc     return (AE_OK);
325433d6423SLionel Sambuc }
326433d6423SLionel Sambuc 
327433d6423SLionel Sambuc 
328433d6423SLionel Sambuc /*******************************************************************************
329433d6423SLionel Sambuc  *
330433d6423SLionel Sambuc  * FUNCTION:    AcpiDsObjStackPush
331433d6423SLionel Sambuc  *
332433d6423SLionel Sambuc  * PARAMETERS:  Object              - Object to push
333433d6423SLionel Sambuc  *              WalkState           - Current Walk state
334433d6423SLionel Sambuc  *
335433d6423SLionel Sambuc  * RETURN:      Status
336433d6423SLionel Sambuc  *
337433d6423SLionel Sambuc  * DESCRIPTION: Push an object onto this walk's object/operand stack
338433d6423SLionel Sambuc  *
339433d6423SLionel Sambuc  ******************************************************************************/
340433d6423SLionel Sambuc 
341433d6423SLionel Sambuc ACPI_STATUS
AcpiDsObjStackPush(void * Object,ACPI_WALK_STATE * WalkState)342433d6423SLionel Sambuc AcpiDsObjStackPush (
343433d6423SLionel Sambuc     void                    *Object,
344433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState)
345433d6423SLionel Sambuc {
346433d6423SLionel Sambuc     ACPI_FUNCTION_NAME (DsObjStackPush);
347433d6423SLionel Sambuc 
348433d6423SLionel Sambuc 
349433d6423SLionel Sambuc     /* Check for stack overflow */
350433d6423SLionel Sambuc 
351433d6423SLionel Sambuc     if (WalkState->NumOperands >= ACPI_OBJ_NUM_OPERANDS)
352433d6423SLionel Sambuc     {
353433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO,
354433d6423SLionel Sambuc             "Object stack overflow! Obj=%p State=%p #Ops=%u",
355433d6423SLionel Sambuc             Object, WalkState, WalkState->NumOperands));
356433d6423SLionel Sambuc         return (AE_STACK_OVERFLOW);
357433d6423SLionel Sambuc     }
358433d6423SLionel Sambuc 
359433d6423SLionel Sambuc     /* Put the object onto the stack */
360433d6423SLionel Sambuc 
361433d6423SLionel Sambuc     WalkState->Operands [WalkState->OperandIndex] = Object;
362433d6423SLionel Sambuc     WalkState->NumOperands++;
363433d6423SLionel Sambuc 
364433d6423SLionel Sambuc     /* For the usual order of filling the operand stack */
365433d6423SLionel Sambuc 
366433d6423SLionel Sambuc     WalkState->OperandIndex++;
367433d6423SLionel Sambuc 
368433d6423SLionel Sambuc     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] State=%p #Ops=%X\n",
369433d6423SLionel Sambuc         Object, AcpiUtGetObjectTypeName ((ACPI_OPERAND_OBJECT *) Object),
370433d6423SLionel Sambuc         WalkState, WalkState->NumOperands));
371433d6423SLionel Sambuc 
372433d6423SLionel Sambuc     return (AE_OK);
373433d6423SLionel Sambuc }
374433d6423SLionel Sambuc 
375433d6423SLionel Sambuc 
376433d6423SLionel Sambuc /*******************************************************************************
377433d6423SLionel Sambuc  *
378433d6423SLionel Sambuc  * FUNCTION:    AcpiDsObjStackPop
379433d6423SLionel Sambuc  *
380433d6423SLionel Sambuc  * PARAMETERS:  PopCount            - Number of objects/entries to pop
381433d6423SLionel Sambuc  *              WalkState           - Current Walk state
382433d6423SLionel Sambuc  *
383433d6423SLionel Sambuc  * RETURN:      Status
384433d6423SLionel Sambuc  *
385433d6423SLionel Sambuc  * DESCRIPTION: Pop this walk's object stack. Objects on the stack are NOT
386433d6423SLionel Sambuc  *              deleted by this routine.
387433d6423SLionel Sambuc  *
388433d6423SLionel Sambuc  ******************************************************************************/
389433d6423SLionel Sambuc 
390433d6423SLionel Sambuc ACPI_STATUS
AcpiDsObjStackPop(UINT32 PopCount,ACPI_WALK_STATE * WalkState)391433d6423SLionel Sambuc AcpiDsObjStackPop (
392433d6423SLionel Sambuc     UINT32                  PopCount,
393433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState)
394433d6423SLionel Sambuc {
395433d6423SLionel Sambuc     UINT32                  i;
396433d6423SLionel Sambuc 
397433d6423SLionel Sambuc 
398433d6423SLionel Sambuc     ACPI_FUNCTION_NAME (DsObjStackPop);
399433d6423SLionel Sambuc 
400433d6423SLionel Sambuc 
401433d6423SLionel Sambuc     for (i = 0; i < PopCount; i++)
402433d6423SLionel Sambuc     {
403433d6423SLionel Sambuc         /* Check for stack underflow */
404433d6423SLionel Sambuc 
405433d6423SLionel Sambuc         if (WalkState->NumOperands == 0)
406433d6423SLionel Sambuc         {
407433d6423SLionel Sambuc             ACPI_ERROR ((AE_INFO,
408433d6423SLionel Sambuc                 "Object stack underflow! Count=%X State=%p #Ops=%u",
409433d6423SLionel Sambuc                 PopCount, WalkState, WalkState->NumOperands));
410433d6423SLionel Sambuc             return (AE_STACK_UNDERFLOW);
411433d6423SLionel Sambuc         }
412433d6423SLionel Sambuc 
413433d6423SLionel Sambuc         /* Just set the stack entry to null */
414433d6423SLionel Sambuc 
415433d6423SLionel Sambuc         WalkState->NumOperands--;
416433d6423SLionel Sambuc         WalkState->Operands [WalkState->NumOperands] = NULL;
417433d6423SLionel Sambuc     }
418433d6423SLionel Sambuc 
419433d6423SLionel Sambuc     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Count=%X State=%p #Ops=%u\n",
420433d6423SLionel Sambuc         PopCount, WalkState, WalkState->NumOperands));
421433d6423SLionel Sambuc 
422433d6423SLionel Sambuc     return (AE_OK);
423433d6423SLionel Sambuc }
424433d6423SLionel Sambuc 
425433d6423SLionel Sambuc 
426433d6423SLionel Sambuc /*******************************************************************************
427433d6423SLionel Sambuc  *
428433d6423SLionel Sambuc  * FUNCTION:    AcpiDsObjStackPopAndDelete
429433d6423SLionel Sambuc  *
430433d6423SLionel Sambuc  * PARAMETERS:  PopCount            - Number of objects/entries to pop
431433d6423SLionel Sambuc  *              WalkState           - Current Walk state
432433d6423SLionel Sambuc  *
433433d6423SLionel Sambuc  * RETURN:      Status
434433d6423SLionel Sambuc  *
435433d6423SLionel Sambuc  * DESCRIPTION: Pop this walk's object stack and delete each object that is
436433d6423SLionel Sambuc  *              popped off.
437433d6423SLionel Sambuc  *
438433d6423SLionel Sambuc  ******************************************************************************/
439433d6423SLionel Sambuc 
440433d6423SLionel Sambuc void
AcpiDsObjStackPopAndDelete(UINT32 PopCount,ACPI_WALK_STATE * WalkState)441433d6423SLionel Sambuc AcpiDsObjStackPopAndDelete (
442433d6423SLionel Sambuc     UINT32                  PopCount,
443433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState)
444433d6423SLionel Sambuc {
445433d6423SLionel Sambuc     INT32                   i;
446433d6423SLionel Sambuc     ACPI_OPERAND_OBJECT     *ObjDesc;
447433d6423SLionel Sambuc 
448433d6423SLionel Sambuc 
449433d6423SLionel Sambuc     ACPI_FUNCTION_NAME (DsObjStackPopAndDelete);
450433d6423SLionel Sambuc 
451433d6423SLionel Sambuc 
452433d6423SLionel Sambuc     if (PopCount == 0)
453433d6423SLionel Sambuc     {
454433d6423SLionel Sambuc         return;
455433d6423SLionel Sambuc     }
456433d6423SLionel Sambuc 
457433d6423SLionel Sambuc     for (i = (INT32) PopCount - 1; i >= 0; i--)
458433d6423SLionel Sambuc     {
459433d6423SLionel Sambuc         if (WalkState->NumOperands == 0)
460433d6423SLionel Sambuc         {
461433d6423SLionel Sambuc             return;
462433d6423SLionel Sambuc         }
463433d6423SLionel Sambuc 
464433d6423SLionel Sambuc         /* Pop the stack and delete an object if present in this stack entry */
465433d6423SLionel Sambuc 
466433d6423SLionel Sambuc         WalkState->NumOperands--;
467433d6423SLionel Sambuc         ObjDesc = WalkState->Operands [i];
468433d6423SLionel Sambuc         if (ObjDesc)
469433d6423SLionel Sambuc         {
470433d6423SLionel Sambuc             AcpiUtRemoveReference (WalkState->Operands [i]);
471433d6423SLionel Sambuc             WalkState->Operands [i] = NULL;
472433d6423SLionel Sambuc         }
473433d6423SLionel Sambuc     }
474433d6423SLionel Sambuc 
475433d6423SLionel Sambuc     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Count=%X State=%p #Ops=%X\n",
476433d6423SLionel Sambuc         PopCount, WalkState, WalkState->NumOperands));
477433d6423SLionel Sambuc }
478433d6423SLionel Sambuc 
479433d6423SLionel Sambuc 
480433d6423SLionel Sambuc /*******************************************************************************
481433d6423SLionel Sambuc  *
482433d6423SLionel Sambuc  * FUNCTION:    AcpiDsGetCurrentWalkState
483433d6423SLionel Sambuc  *
484433d6423SLionel Sambuc  * PARAMETERS:  Thread          - Get current active state for this Thread
485433d6423SLionel Sambuc  *
486433d6423SLionel Sambuc  * RETURN:      Pointer to the current walk state
487433d6423SLionel Sambuc  *
488433d6423SLionel Sambuc  * DESCRIPTION: Get the walk state that is at the head of the list (the "current"
489433d6423SLionel Sambuc  *              walk state.)
490433d6423SLionel Sambuc  *
491433d6423SLionel Sambuc  ******************************************************************************/
492433d6423SLionel Sambuc 
493433d6423SLionel Sambuc ACPI_WALK_STATE *
AcpiDsGetCurrentWalkState(ACPI_THREAD_STATE * Thread)494433d6423SLionel Sambuc AcpiDsGetCurrentWalkState (
495433d6423SLionel Sambuc     ACPI_THREAD_STATE       *Thread)
496433d6423SLionel Sambuc {
497433d6423SLionel Sambuc     ACPI_FUNCTION_NAME (DsGetCurrentWalkState);
498433d6423SLionel Sambuc 
499433d6423SLionel Sambuc 
500433d6423SLionel Sambuc     if (!Thread)
501433d6423SLionel Sambuc     {
502433d6423SLionel Sambuc         return (NULL);
503433d6423SLionel Sambuc     }
504433d6423SLionel Sambuc 
505433d6423SLionel Sambuc     ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Current WalkState %p\n",
506433d6423SLionel Sambuc         Thread->WalkStateList));
507433d6423SLionel Sambuc 
508433d6423SLionel Sambuc     return (Thread->WalkStateList);
509433d6423SLionel Sambuc }
510433d6423SLionel Sambuc 
511433d6423SLionel Sambuc 
512433d6423SLionel Sambuc /*******************************************************************************
513433d6423SLionel Sambuc  *
514433d6423SLionel Sambuc  * FUNCTION:    AcpiDsPushWalkState
515433d6423SLionel Sambuc  *
516433d6423SLionel Sambuc  * PARAMETERS:  WalkState       - State to push
517433d6423SLionel Sambuc  *              Thread          - Thread state object
518433d6423SLionel Sambuc  *
519433d6423SLionel Sambuc  * RETURN:      None
520433d6423SLionel Sambuc  *
521433d6423SLionel Sambuc  * DESCRIPTION: Place the Thread state at the head of the state list
522433d6423SLionel Sambuc  *
523433d6423SLionel Sambuc  ******************************************************************************/
524433d6423SLionel Sambuc 
525433d6423SLionel Sambuc void
AcpiDsPushWalkState(ACPI_WALK_STATE * WalkState,ACPI_THREAD_STATE * Thread)526433d6423SLionel Sambuc AcpiDsPushWalkState (
527433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState,
528433d6423SLionel Sambuc     ACPI_THREAD_STATE       *Thread)
529433d6423SLionel Sambuc {
530433d6423SLionel Sambuc     ACPI_FUNCTION_TRACE (DsPushWalkState);
531433d6423SLionel Sambuc 
532433d6423SLionel Sambuc 
533433d6423SLionel Sambuc     WalkState->Next = Thread->WalkStateList;
534433d6423SLionel Sambuc     Thread->WalkStateList = WalkState;
535433d6423SLionel Sambuc 
536433d6423SLionel Sambuc     return_VOID;
537433d6423SLionel Sambuc }
538433d6423SLionel Sambuc 
539433d6423SLionel Sambuc 
540433d6423SLionel Sambuc /*******************************************************************************
541433d6423SLionel Sambuc  *
542433d6423SLionel Sambuc  * FUNCTION:    AcpiDsPopWalkState
543433d6423SLionel Sambuc  *
544433d6423SLionel Sambuc  * PARAMETERS:  Thread      - Current thread state
545433d6423SLionel Sambuc  *
546433d6423SLionel Sambuc  * RETURN:      A WalkState object popped from the thread's stack
547433d6423SLionel Sambuc  *
548433d6423SLionel Sambuc  * DESCRIPTION: Remove and return the walkstate object that is at the head of
549433d6423SLionel Sambuc  *              the walk stack for the given walk list. NULL indicates that
550433d6423SLionel Sambuc  *              the list is empty.
551433d6423SLionel Sambuc  *
552433d6423SLionel Sambuc  ******************************************************************************/
553433d6423SLionel Sambuc 
554433d6423SLionel Sambuc ACPI_WALK_STATE *
AcpiDsPopWalkState(ACPI_THREAD_STATE * Thread)555433d6423SLionel Sambuc AcpiDsPopWalkState (
556433d6423SLionel Sambuc     ACPI_THREAD_STATE       *Thread)
557433d6423SLionel Sambuc {
558433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState;
559433d6423SLionel Sambuc 
560433d6423SLionel Sambuc 
561433d6423SLionel Sambuc     ACPI_FUNCTION_TRACE (DsPopWalkState);
562433d6423SLionel Sambuc 
563433d6423SLionel Sambuc 
564433d6423SLionel Sambuc     WalkState = Thread->WalkStateList;
565433d6423SLionel Sambuc 
566433d6423SLionel Sambuc     if (WalkState)
567433d6423SLionel Sambuc     {
568433d6423SLionel Sambuc         /* Next walk state becomes the current walk state */
569433d6423SLionel Sambuc 
570433d6423SLionel Sambuc         Thread->WalkStateList = WalkState->Next;
571433d6423SLionel Sambuc 
572433d6423SLionel Sambuc         /*
573433d6423SLionel Sambuc          * Don't clear the NEXT field, this serves as an indicator
574433d6423SLionel Sambuc          * that there is a parent WALK STATE
575433d6423SLionel Sambuc          * Do Not: WalkState->Next = NULL;
576433d6423SLionel Sambuc          */
577433d6423SLionel Sambuc     }
578433d6423SLionel Sambuc 
579433d6423SLionel Sambuc     return_PTR (WalkState);
580433d6423SLionel Sambuc }
581433d6423SLionel Sambuc 
582433d6423SLionel Sambuc 
583433d6423SLionel Sambuc /*******************************************************************************
584433d6423SLionel Sambuc  *
585433d6423SLionel Sambuc  * FUNCTION:    AcpiDsCreateWalkState
586433d6423SLionel Sambuc  *
587433d6423SLionel Sambuc  * PARAMETERS:  OwnerId         - ID for object creation
588433d6423SLionel Sambuc  *              Origin          - Starting point for this walk
589433d6423SLionel Sambuc  *              MethodDesc      - Method object
590433d6423SLionel Sambuc  *              Thread          - Current thread state
591433d6423SLionel Sambuc  *
592433d6423SLionel Sambuc  * RETURN:      Pointer to the new walk state.
593433d6423SLionel Sambuc  *
594433d6423SLionel Sambuc  * DESCRIPTION: Allocate and initialize a new walk state. The current walk
595433d6423SLionel Sambuc  *              state is set to this new state.
596433d6423SLionel Sambuc  *
597433d6423SLionel Sambuc  ******************************************************************************/
598433d6423SLionel Sambuc 
599433d6423SLionel Sambuc ACPI_WALK_STATE *
AcpiDsCreateWalkState(ACPI_OWNER_ID OwnerId,ACPI_PARSE_OBJECT * Origin,ACPI_OPERAND_OBJECT * MethodDesc,ACPI_THREAD_STATE * Thread)600433d6423SLionel Sambuc AcpiDsCreateWalkState (
601433d6423SLionel Sambuc     ACPI_OWNER_ID           OwnerId,
602433d6423SLionel Sambuc     ACPI_PARSE_OBJECT       *Origin,
603433d6423SLionel Sambuc     ACPI_OPERAND_OBJECT     *MethodDesc,
604433d6423SLionel Sambuc     ACPI_THREAD_STATE       *Thread)
605433d6423SLionel Sambuc {
606433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState;
607433d6423SLionel Sambuc 
608433d6423SLionel Sambuc 
609433d6423SLionel Sambuc     ACPI_FUNCTION_TRACE (DsCreateWalkState);
610433d6423SLionel Sambuc 
611433d6423SLionel Sambuc 
612433d6423SLionel Sambuc     WalkState = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_WALK_STATE));
613433d6423SLionel Sambuc     if (!WalkState)
614433d6423SLionel Sambuc     {
615433d6423SLionel Sambuc         return_PTR (NULL);
616433d6423SLionel Sambuc     }
617433d6423SLionel Sambuc 
618433d6423SLionel Sambuc     WalkState->DescriptorType = ACPI_DESC_TYPE_WALK;
619433d6423SLionel Sambuc     WalkState->MethodDesc = MethodDesc;
620433d6423SLionel Sambuc     WalkState->OwnerId = OwnerId;
621433d6423SLionel Sambuc     WalkState->Origin = Origin;
622433d6423SLionel Sambuc     WalkState->Thread = Thread;
623433d6423SLionel Sambuc 
624433d6423SLionel Sambuc     WalkState->ParserState.StartOp = Origin;
625433d6423SLionel Sambuc 
626433d6423SLionel Sambuc     /* Init the method args/local */
627433d6423SLionel Sambuc 
628433d6423SLionel Sambuc #if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
629433d6423SLionel Sambuc     AcpiDsMethodDataInit (WalkState);
630433d6423SLionel Sambuc #endif
631433d6423SLionel Sambuc 
632433d6423SLionel Sambuc     /* Put the new state at the head of the walk list */
633433d6423SLionel Sambuc 
634433d6423SLionel Sambuc     if (Thread)
635433d6423SLionel Sambuc     {
636433d6423SLionel Sambuc         AcpiDsPushWalkState (WalkState, Thread);
637433d6423SLionel Sambuc     }
638433d6423SLionel Sambuc 
639433d6423SLionel Sambuc     return_PTR (WalkState);
640433d6423SLionel Sambuc }
641433d6423SLionel Sambuc 
642433d6423SLionel Sambuc 
643433d6423SLionel Sambuc /*******************************************************************************
644433d6423SLionel Sambuc  *
645433d6423SLionel Sambuc  * FUNCTION:    AcpiDsInitAmlWalk
646433d6423SLionel Sambuc  *
647433d6423SLionel Sambuc  * PARAMETERS:  WalkState       - New state to be initialized
648433d6423SLionel Sambuc  *              Op              - Current parse op
649433d6423SLionel Sambuc  *              MethodNode      - Control method NS node, if any
650433d6423SLionel Sambuc  *              AmlStart        - Start of AML
651433d6423SLionel Sambuc  *              AmlLength       - Length of AML
652433d6423SLionel Sambuc  *              Info            - Method info block (params, etc.)
653433d6423SLionel Sambuc  *              PassNumber      - 1, 2, or 3
654433d6423SLionel Sambuc  *
655433d6423SLionel Sambuc  * RETURN:      Status
656433d6423SLionel Sambuc  *
657433d6423SLionel Sambuc  * DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk
658433d6423SLionel Sambuc  *
659433d6423SLionel Sambuc  ******************************************************************************/
660433d6423SLionel Sambuc 
661433d6423SLionel Sambuc ACPI_STATUS
AcpiDsInitAmlWalk(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Op,ACPI_NAMESPACE_NODE * MethodNode,UINT8 * AmlStart,UINT32 AmlLength,ACPI_EVALUATE_INFO * Info,UINT8 PassNumber)662433d6423SLionel Sambuc AcpiDsInitAmlWalk (
663433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState,
664433d6423SLionel Sambuc     ACPI_PARSE_OBJECT       *Op,
665433d6423SLionel Sambuc     ACPI_NAMESPACE_NODE     *MethodNode,
666433d6423SLionel Sambuc     UINT8                   *AmlStart,
667433d6423SLionel Sambuc     UINT32                  AmlLength,
668433d6423SLionel Sambuc     ACPI_EVALUATE_INFO      *Info,
669433d6423SLionel Sambuc     UINT8                   PassNumber)
670433d6423SLionel Sambuc {
671433d6423SLionel Sambuc     ACPI_STATUS             Status;
672433d6423SLionel Sambuc     ACPI_PARSE_STATE        *ParserState = &WalkState->ParserState;
673433d6423SLionel Sambuc     ACPI_PARSE_OBJECT       *ExtraOp;
674433d6423SLionel Sambuc 
675433d6423SLionel Sambuc 
676433d6423SLionel Sambuc     ACPI_FUNCTION_TRACE (DsInitAmlWalk);
677433d6423SLionel Sambuc 
678433d6423SLionel Sambuc 
679433d6423SLionel Sambuc     WalkState->ParserState.Aml =
680433d6423SLionel Sambuc     WalkState->ParserState.AmlStart = AmlStart;
681433d6423SLionel Sambuc     WalkState->ParserState.AmlEnd =
682433d6423SLionel Sambuc     WalkState->ParserState.PkgEnd = AmlStart + AmlLength;
683433d6423SLionel Sambuc 
684433d6423SLionel Sambuc     /* The NextOp of the NextWalk will be the beginning of the method */
685433d6423SLionel Sambuc 
686433d6423SLionel Sambuc     WalkState->NextOp = NULL;
687433d6423SLionel Sambuc     WalkState->PassNumber = PassNumber;
688433d6423SLionel Sambuc 
689433d6423SLionel Sambuc     if (Info)
690433d6423SLionel Sambuc     {
691433d6423SLionel Sambuc         WalkState->Params = Info->Parameters;
692433d6423SLionel Sambuc         WalkState->CallerReturnDesc = &Info->ReturnObject;
693433d6423SLionel Sambuc     }
694433d6423SLionel Sambuc 
695433d6423SLionel Sambuc     Status = AcpiPsInitScope (&WalkState->ParserState, Op);
696433d6423SLionel Sambuc     if (ACPI_FAILURE (Status))
697433d6423SLionel Sambuc     {
698433d6423SLionel Sambuc         return_ACPI_STATUS (Status);
699433d6423SLionel Sambuc     }
700433d6423SLionel Sambuc 
701433d6423SLionel Sambuc     if (MethodNode)
702433d6423SLionel Sambuc     {
703433d6423SLionel Sambuc         WalkState->ParserState.StartNode = MethodNode;
704433d6423SLionel Sambuc         WalkState->WalkType = ACPI_WALK_METHOD;
705433d6423SLionel Sambuc         WalkState->MethodNode = MethodNode;
706433d6423SLionel Sambuc         WalkState->MethodDesc = AcpiNsGetAttachedObject (MethodNode);
707433d6423SLionel Sambuc 
708433d6423SLionel Sambuc         /* Push start scope on scope stack and make it current  */
709433d6423SLionel Sambuc 
710433d6423SLionel Sambuc         Status = AcpiDsScopeStackPush (MethodNode, ACPI_TYPE_METHOD, WalkState);
711433d6423SLionel Sambuc         if (ACPI_FAILURE (Status))
712433d6423SLionel Sambuc         {
713433d6423SLionel Sambuc             return_ACPI_STATUS (Status);
714433d6423SLionel Sambuc         }
715433d6423SLionel Sambuc 
716433d6423SLionel Sambuc         /* Init the method arguments */
717433d6423SLionel Sambuc 
718433d6423SLionel Sambuc         Status = AcpiDsMethodDataInitArgs (WalkState->Params,
719433d6423SLionel Sambuc                     ACPI_METHOD_NUM_ARGS, WalkState);
720433d6423SLionel Sambuc         if (ACPI_FAILURE (Status))
721433d6423SLionel Sambuc         {
722433d6423SLionel Sambuc             return_ACPI_STATUS (Status);
723433d6423SLionel Sambuc         }
724433d6423SLionel Sambuc     }
725433d6423SLionel Sambuc     else
726433d6423SLionel Sambuc     {
727433d6423SLionel Sambuc         /*
728433d6423SLionel Sambuc          * Setup the current scope.
729433d6423SLionel Sambuc          * Find a Named Op that has a namespace node associated with it.
730433d6423SLionel Sambuc          * search upwards from this Op. Current scope is the first
731433d6423SLionel Sambuc          * Op with a namespace node.
732433d6423SLionel Sambuc          */
733433d6423SLionel Sambuc         ExtraOp = ParserState->StartOp;
734433d6423SLionel Sambuc         while (ExtraOp && !ExtraOp->Common.Node)
735433d6423SLionel Sambuc         {
736433d6423SLionel Sambuc             ExtraOp = ExtraOp->Common.Parent;
737433d6423SLionel Sambuc         }
738433d6423SLionel Sambuc 
739433d6423SLionel Sambuc         if (!ExtraOp)
740433d6423SLionel Sambuc         {
741433d6423SLionel Sambuc             ParserState->StartNode = NULL;
742433d6423SLionel Sambuc         }
743433d6423SLionel Sambuc         else
744433d6423SLionel Sambuc         {
745433d6423SLionel Sambuc             ParserState->StartNode = ExtraOp->Common.Node;
746433d6423SLionel Sambuc         }
747433d6423SLionel Sambuc 
748433d6423SLionel Sambuc         if (ParserState->StartNode)
749433d6423SLionel Sambuc         {
750433d6423SLionel Sambuc             /* Push start scope on scope stack and make it current  */
751433d6423SLionel Sambuc 
752433d6423SLionel Sambuc             Status = AcpiDsScopeStackPush (ParserState->StartNode,
753433d6423SLionel Sambuc                             ParserState->StartNode->Type, WalkState);
754433d6423SLionel Sambuc             if (ACPI_FAILURE (Status))
755433d6423SLionel Sambuc             {
756433d6423SLionel Sambuc                 return_ACPI_STATUS (Status);
757433d6423SLionel Sambuc             }
758433d6423SLionel Sambuc         }
759433d6423SLionel Sambuc     }
760433d6423SLionel Sambuc 
761433d6423SLionel Sambuc     Status = AcpiDsInitCallbacks (WalkState, PassNumber);
762433d6423SLionel Sambuc     return_ACPI_STATUS (Status);
763433d6423SLionel Sambuc }
764433d6423SLionel Sambuc 
765433d6423SLionel Sambuc 
766433d6423SLionel Sambuc /*******************************************************************************
767433d6423SLionel Sambuc  *
768433d6423SLionel Sambuc  * FUNCTION:    AcpiDsDeleteWalkState
769433d6423SLionel Sambuc  *
770433d6423SLionel Sambuc  * PARAMETERS:  WalkState       - State to delete
771433d6423SLionel Sambuc  *
772433d6423SLionel Sambuc  * RETURN:      Status
773433d6423SLionel Sambuc  *
774433d6423SLionel Sambuc  * DESCRIPTION: Delete a walk state including all internal data structures
775433d6423SLionel Sambuc  *
776433d6423SLionel Sambuc  ******************************************************************************/
777433d6423SLionel Sambuc 
778433d6423SLionel Sambuc void
AcpiDsDeleteWalkState(ACPI_WALK_STATE * WalkState)779433d6423SLionel Sambuc AcpiDsDeleteWalkState (
780433d6423SLionel Sambuc     ACPI_WALK_STATE         *WalkState)
781433d6423SLionel Sambuc {
782433d6423SLionel Sambuc     ACPI_GENERIC_STATE      *State;
783433d6423SLionel Sambuc 
784433d6423SLionel Sambuc 
785433d6423SLionel Sambuc     ACPI_FUNCTION_TRACE_PTR (DsDeleteWalkState, WalkState);
786433d6423SLionel Sambuc 
787433d6423SLionel Sambuc 
788433d6423SLionel Sambuc     if (!WalkState)
789433d6423SLionel Sambuc     {
790*29492bb7SDavid van Moolenbroek         return_VOID;
791433d6423SLionel Sambuc     }
792433d6423SLionel Sambuc 
793433d6423SLionel Sambuc     if (WalkState->DescriptorType != ACPI_DESC_TYPE_WALK)
794433d6423SLionel Sambuc     {
795433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO, "%p is not a valid walk state",
796433d6423SLionel Sambuc             WalkState));
797*29492bb7SDavid van Moolenbroek         return_VOID;
798433d6423SLionel Sambuc     }
799433d6423SLionel Sambuc 
800433d6423SLionel Sambuc     /* There should not be any open scopes */
801433d6423SLionel Sambuc 
802433d6423SLionel Sambuc     if (WalkState->ParserState.Scope)
803433d6423SLionel Sambuc     {
804433d6423SLionel Sambuc         ACPI_ERROR ((AE_INFO, "%p walk still has a scope list",
805433d6423SLionel Sambuc             WalkState));
806433d6423SLionel Sambuc         AcpiPsCleanupScope (&WalkState->ParserState);
807433d6423SLionel Sambuc     }
808433d6423SLionel Sambuc 
809433d6423SLionel Sambuc     /* Always must free any linked control states */
810433d6423SLionel Sambuc 
811433d6423SLionel Sambuc     while (WalkState->ControlState)
812433d6423SLionel Sambuc     {
813433d6423SLionel Sambuc         State = WalkState->ControlState;
814433d6423SLionel Sambuc         WalkState->ControlState = State->Common.Next;
815433d6423SLionel Sambuc 
816433d6423SLionel Sambuc         AcpiUtDeleteGenericState (State);
817433d6423SLionel Sambuc     }
818433d6423SLionel Sambuc 
819433d6423SLionel Sambuc     /* Always must free any linked parse states */
820433d6423SLionel Sambuc 
821433d6423SLionel Sambuc     while (WalkState->ScopeInfo)
822433d6423SLionel Sambuc     {
823433d6423SLionel Sambuc         State = WalkState->ScopeInfo;
824433d6423SLionel Sambuc         WalkState->ScopeInfo = State->Common.Next;
825433d6423SLionel Sambuc 
826433d6423SLionel Sambuc         AcpiUtDeleteGenericState (State);
827433d6423SLionel Sambuc     }
828433d6423SLionel Sambuc 
829433d6423SLionel Sambuc     /* Always must free any stacked result states */
830433d6423SLionel Sambuc 
831433d6423SLionel Sambuc     while (WalkState->Results)
832433d6423SLionel Sambuc     {
833433d6423SLionel Sambuc         State = WalkState->Results;
834433d6423SLionel Sambuc         WalkState->Results = State->Common.Next;
835433d6423SLionel Sambuc 
836433d6423SLionel Sambuc         AcpiUtDeleteGenericState (State);
837433d6423SLionel Sambuc     }
838433d6423SLionel Sambuc 
839433d6423SLionel Sambuc     ACPI_FREE (WalkState);
840433d6423SLionel Sambuc     return_VOID;
841433d6423SLionel Sambuc }
842