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