xref: /freebsd/sys/contrib/dev/acpica/components/dispatcher/dswexec.c (revision 493deb390baef09f40125589cbdb714cb274ab04)
1a159c266SJung-uk Kim /******************************************************************************
2a159c266SJung-uk Kim  *
3a159c266SJung-uk Kim  * Module Name: dswexec - Dispatcher method execution callbacks;
4a159c266SJung-uk Kim  *                        dispatch to interpreter.
5a159c266SJung-uk Kim  *
6a159c266SJung-uk Kim  *****************************************************************************/
7a159c266SJung-uk Kim 
8a159c266SJung-uk Kim /*
9f8146b88SJung-uk Kim  * Copyright (C) 2000 - 2016, Intel Corp.
10a159c266SJung-uk Kim  * All rights reserved.
11a159c266SJung-uk Kim  *
12a159c266SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
13a159c266SJung-uk Kim  * modification, are permitted provided that the following conditions
14a159c266SJung-uk Kim  * are met:
15a159c266SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
16a159c266SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
17a159c266SJung-uk Kim  *    without modification.
18a159c266SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19a159c266SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
20a159c266SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
21a159c266SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
22a159c266SJung-uk Kim  *    binary redistribution.
23a159c266SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
24a159c266SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
25a159c266SJung-uk Kim  *    from this software without specific prior written permission.
26a159c266SJung-uk Kim  *
27a159c266SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
28a159c266SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
29a159c266SJung-uk Kim  * Software Foundation.
30a159c266SJung-uk Kim  *
31a159c266SJung-uk Kim  * NO WARRANTY
32a159c266SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33a159c266SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34a159c266SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35a159c266SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36a159c266SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37a159c266SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38a159c266SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39a159c266SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40a159c266SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41a159c266SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42a159c266SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
43a159c266SJung-uk Kim  */
44a159c266SJung-uk Kim 
45a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
46a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
47a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h>
48a159c266SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
49a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h>
50a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h>
51a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
52a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h>
53a159c266SJung-uk Kim 
54a159c266SJung-uk Kim 
55a159c266SJung-uk Kim #define _COMPONENT          ACPI_DISPATCHER
56a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("dswexec")
57a159c266SJung-uk Kim 
58a159c266SJung-uk Kim /*
59a159c266SJung-uk Kim  * Dispatch table for opcode classes
60a159c266SJung-uk Kim  */
61a159c266SJung-uk Kim static ACPI_EXECUTE_OP      AcpiGbl_OpTypeDispatch [] =
62a159c266SJung-uk Kim {
63a159c266SJung-uk Kim     AcpiExOpcode_0A_0T_1R,
64a159c266SJung-uk Kim     AcpiExOpcode_1A_0T_0R,
65a159c266SJung-uk Kim     AcpiExOpcode_1A_0T_1R,
66a159c266SJung-uk Kim     AcpiExOpcode_1A_1T_0R,
67a159c266SJung-uk Kim     AcpiExOpcode_1A_1T_1R,
68a159c266SJung-uk Kim     AcpiExOpcode_2A_0T_0R,
69a159c266SJung-uk Kim     AcpiExOpcode_2A_0T_1R,
70a159c266SJung-uk Kim     AcpiExOpcode_2A_1T_1R,
71a159c266SJung-uk Kim     AcpiExOpcode_2A_2T_1R,
72a159c266SJung-uk Kim     AcpiExOpcode_3A_0T_0R,
73a159c266SJung-uk Kim     AcpiExOpcode_3A_1T_1R,
74a159c266SJung-uk Kim     AcpiExOpcode_6A_0T_1R
75a159c266SJung-uk Kim };
76a159c266SJung-uk Kim 
77a159c266SJung-uk Kim 
78a159c266SJung-uk Kim /*****************************************************************************
79a159c266SJung-uk Kim  *
80a159c266SJung-uk Kim  * FUNCTION:    AcpiDsGetPredicateValue
81a159c266SJung-uk Kim  *
82a159c266SJung-uk Kim  * PARAMETERS:  WalkState       - Current state of the parse tree walk
83a159c266SJung-uk Kim  *              ResultObj       - if non-zero, pop result from result stack
84a159c266SJung-uk Kim  *
85a159c266SJung-uk Kim  * RETURN:      Status
86a159c266SJung-uk Kim  *
87a159c266SJung-uk Kim  * DESCRIPTION: Get the result of a predicate evaluation
88a159c266SJung-uk Kim  *
89a159c266SJung-uk Kim  ****************************************************************************/
90a159c266SJung-uk Kim 
91a159c266SJung-uk Kim ACPI_STATUS
92a159c266SJung-uk Kim AcpiDsGetPredicateValue (
93a159c266SJung-uk Kim     ACPI_WALK_STATE         *WalkState,
94a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *ResultObj)
95a159c266SJung-uk Kim {
96a159c266SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
97a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *ObjDesc;
98a159c266SJung-uk Kim     ACPI_OPERAND_OBJECT     *LocalObjDesc = NULL;
99a159c266SJung-uk Kim 
100a159c266SJung-uk Kim 
101a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE_PTR (DsGetPredicateValue, WalkState);
102a159c266SJung-uk Kim 
103a159c266SJung-uk Kim 
104a159c266SJung-uk Kim     WalkState->ControlState->Common.State = 0;
105a159c266SJung-uk Kim 
106a159c266SJung-uk Kim     if (ResultObj)
107a159c266SJung-uk Kim     {
108a159c266SJung-uk Kim         Status = AcpiDsResultPop (&ObjDesc, WalkState);
109a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
110a159c266SJung-uk Kim         {
111a159c266SJung-uk Kim             ACPI_EXCEPTION ((AE_INFO, Status,
112a159c266SJung-uk Kim                 "Could not get result from predicate evaluation"));
113a159c266SJung-uk Kim 
114a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
115a159c266SJung-uk Kim         }
116a159c266SJung-uk Kim     }
117a159c266SJung-uk Kim     else
118a159c266SJung-uk Kim     {
119a159c266SJung-uk Kim         Status = AcpiDsCreateOperand (WalkState, WalkState->Op, 0);
120a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
121a159c266SJung-uk Kim         {
122a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
123a159c266SJung-uk Kim         }
124a159c266SJung-uk Kim 
125a159c266SJung-uk Kim         Status = AcpiExResolveToValue (&WalkState->Operands [0], WalkState);
126a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
127a159c266SJung-uk Kim         {
128a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
129a159c266SJung-uk Kim         }
130a159c266SJung-uk Kim 
131a159c266SJung-uk Kim         ObjDesc = WalkState->Operands [0];
132a159c266SJung-uk Kim     }
133a159c266SJung-uk Kim 
134a159c266SJung-uk Kim     if (!ObjDesc)
135a159c266SJung-uk Kim     {
136a159c266SJung-uk Kim         ACPI_ERROR ((AE_INFO,
137a159c266SJung-uk Kim             "No predicate ObjDesc=%p State=%p",
138a159c266SJung-uk Kim             ObjDesc, WalkState));
139a159c266SJung-uk Kim 
140a159c266SJung-uk Kim         return_ACPI_STATUS (AE_AML_NO_OPERAND);
141a159c266SJung-uk Kim     }
142a159c266SJung-uk Kim 
143a159c266SJung-uk Kim     /*
144a159c266SJung-uk Kim      * Result of predicate evaluation must be an Integer
145a159c266SJung-uk Kim      * object. Implicitly convert the argument if necessary.
146a159c266SJung-uk Kim      */
147*493deb39SJung-uk Kim     Status = AcpiExConvertToInteger (ObjDesc, &LocalObjDesc,
148*493deb39SJung-uk Kim         ACPI_STRTOUL_BASE16);
149a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
150a159c266SJung-uk Kim     {
151a159c266SJung-uk Kim         goto Cleanup;
152a159c266SJung-uk Kim     }
153a159c266SJung-uk Kim 
154a159c266SJung-uk Kim     if (LocalObjDesc->Common.Type != ACPI_TYPE_INTEGER)
155a159c266SJung-uk Kim     {
156a159c266SJung-uk Kim         ACPI_ERROR ((AE_INFO,
157a159c266SJung-uk Kim             "Bad predicate (not an integer) ObjDesc=%p State=%p Type=0x%X",
158a159c266SJung-uk Kim             ObjDesc, WalkState, ObjDesc->Common.Type));
159a159c266SJung-uk Kim 
160a159c266SJung-uk Kim         Status = AE_AML_OPERAND_TYPE;
161a159c266SJung-uk Kim         goto Cleanup;
162a159c266SJung-uk Kim     }
163a159c266SJung-uk Kim 
164a159c266SJung-uk Kim     /* Truncate the predicate to 32-bits if necessary */
165a159c266SJung-uk Kim 
166efcc2a30SJung-uk Kim     (void) AcpiExTruncateFor32bitTable (LocalObjDesc);
167a159c266SJung-uk Kim 
168a159c266SJung-uk Kim     /*
169a159c266SJung-uk Kim      * Save the result of the predicate evaluation on
170a159c266SJung-uk Kim      * the control stack
171a159c266SJung-uk Kim      */
172a159c266SJung-uk Kim     if (LocalObjDesc->Integer.Value)
173a159c266SJung-uk Kim     {
174a159c266SJung-uk Kim         WalkState->ControlState->Common.Value = TRUE;
175a159c266SJung-uk Kim     }
176a159c266SJung-uk Kim     else
177a159c266SJung-uk Kim     {
178a159c266SJung-uk Kim         /*
179a159c266SJung-uk Kim          * Predicate is FALSE, we will just toss the
180a159c266SJung-uk Kim          * rest of the package
181a159c266SJung-uk Kim          */
182a159c266SJung-uk Kim         WalkState->ControlState->Common.Value = FALSE;
183a159c266SJung-uk Kim         Status = AE_CTRL_FALSE;
184a159c266SJung-uk Kim     }
185a159c266SJung-uk Kim 
186a159c266SJung-uk Kim     /* Predicate can be used for an implicit return value */
187a159c266SJung-uk Kim 
188a159c266SJung-uk Kim     (void) AcpiDsDoImplicitReturn (LocalObjDesc, WalkState, TRUE);
189a159c266SJung-uk Kim 
190a159c266SJung-uk Kim 
191a159c266SJung-uk Kim Cleanup:
192a159c266SJung-uk Kim 
193f8146b88SJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
194f8146b88SJung-uk Kim         "Completed a predicate eval=%X Op=%p\n",
195a159c266SJung-uk Kim         WalkState->ControlState->Common.Value, WalkState->Op));
196a159c266SJung-uk Kim 
197a159c266SJung-uk Kim     /* Break to debugger to display result */
198a159c266SJung-uk Kim 
199f8146b88SJung-uk Kim     AcpiDbDisplayResultObject (LocalObjDesc, WalkState);
200a159c266SJung-uk Kim 
201a159c266SJung-uk Kim     /*
202a159c266SJung-uk Kim      * Delete the predicate result object (we know that
203a159c266SJung-uk Kim      * we don't need it anymore)
204a159c266SJung-uk Kim      */
205a159c266SJung-uk Kim     if (LocalObjDesc != ObjDesc)
206a159c266SJung-uk Kim     {
207a159c266SJung-uk Kim         AcpiUtRemoveReference (LocalObjDesc);
208a159c266SJung-uk Kim     }
209a159c266SJung-uk Kim     AcpiUtRemoveReference (ObjDesc);
210a159c266SJung-uk Kim 
211a159c266SJung-uk Kim     WalkState->ControlState->Common.State = ACPI_CONTROL_NORMAL;
212a159c266SJung-uk Kim     return_ACPI_STATUS (Status);
213a159c266SJung-uk Kim }
214a159c266SJung-uk Kim 
215a159c266SJung-uk Kim 
216a159c266SJung-uk Kim /*****************************************************************************
217a159c266SJung-uk Kim  *
218a159c266SJung-uk Kim  * FUNCTION:    AcpiDsExecBeginOp
219a159c266SJung-uk Kim  *
220a159c266SJung-uk Kim  * PARAMETERS:  WalkState       - Current state of the parse tree walk
221a159c266SJung-uk Kim  *              OutOp           - Where to return op if a new one is created
222a159c266SJung-uk Kim  *
223a159c266SJung-uk Kim  * RETURN:      Status
224a159c266SJung-uk Kim  *
225a159c266SJung-uk Kim  * DESCRIPTION: Descending callback used during the execution of control
226a159c266SJung-uk Kim  *              methods. This is where most operators and operands are
227a159c266SJung-uk Kim  *              dispatched to the interpreter.
228a159c266SJung-uk Kim  *
229a159c266SJung-uk Kim  ****************************************************************************/
230a159c266SJung-uk Kim 
231a159c266SJung-uk Kim ACPI_STATUS
232a159c266SJung-uk Kim AcpiDsExecBeginOp (
233a159c266SJung-uk Kim     ACPI_WALK_STATE         *WalkState,
234a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       **OutOp)
235a159c266SJung-uk Kim {
236a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op;
237a159c266SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
238a159c266SJung-uk Kim     UINT32                  OpcodeClass;
239a159c266SJung-uk Kim 
240a159c266SJung-uk Kim 
241a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE_PTR (DsExecBeginOp, WalkState);
242a159c266SJung-uk Kim 
243a159c266SJung-uk Kim 
244a159c266SJung-uk Kim     Op = WalkState->Op;
245a159c266SJung-uk Kim     if (!Op)
246a159c266SJung-uk Kim     {
247a159c266SJung-uk Kim         Status = AcpiDsLoad2BeginOp (WalkState, OutOp);
248a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
249a159c266SJung-uk Kim         {
250a159c266SJung-uk Kim             goto ErrorExit;
251a159c266SJung-uk Kim         }
252a159c266SJung-uk Kim 
253a159c266SJung-uk Kim         Op = *OutOp;
254a159c266SJung-uk Kim         WalkState->Op = Op;
255a159c266SJung-uk Kim         WalkState->Opcode = Op->Common.AmlOpcode;
256a159c266SJung-uk Kim         WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
257a159c266SJung-uk Kim 
258a159c266SJung-uk Kim         if (AcpiNsOpensScope (WalkState->OpInfo->ObjectType))
259a159c266SJung-uk Kim         {
260a159c266SJung-uk Kim             ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
261a159c266SJung-uk Kim                 "(%s) Popping scope for Op %p\n",
262a159c266SJung-uk Kim                 AcpiUtGetTypeName (WalkState->OpInfo->ObjectType), Op));
263a159c266SJung-uk Kim 
264a159c266SJung-uk Kim             Status = AcpiDsScopeStackPop (WalkState);
265a159c266SJung-uk Kim             if (ACPI_FAILURE (Status))
266a159c266SJung-uk Kim             {
267a159c266SJung-uk Kim                 goto ErrorExit;
268a159c266SJung-uk Kim             }
269a159c266SJung-uk Kim         }
270a159c266SJung-uk Kim     }
271a159c266SJung-uk Kim 
272a159c266SJung-uk Kim     if (Op == WalkState->Origin)
273a159c266SJung-uk Kim     {
274a159c266SJung-uk Kim         if (OutOp)
275a159c266SJung-uk Kim         {
276a159c266SJung-uk Kim             *OutOp = Op;
277a159c266SJung-uk Kim         }
278a159c266SJung-uk Kim 
279a159c266SJung-uk Kim         return_ACPI_STATUS (AE_OK);
280a159c266SJung-uk Kim     }
281a159c266SJung-uk Kim 
282a159c266SJung-uk Kim     /*
283a159c266SJung-uk Kim      * If the previous opcode was a conditional, this opcode
284a159c266SJung-uk Kim      * must be the beginning of the associated predicate.
285a159c266SJung-uk Kim      * Save this knowledge in the current scope descriptor
286a159c266SJung-uk Kim      */
287a159c266SJung-uk Kim     if ((WalkState->ControlState) &&
288a159c266SJung-uk Kim         (WalkState->ControlState->Common.State ==
289a159c266SJung-uk Kim             ACPI_CONTROL_CONDITIONAL_EXECUTING))
290a159c266SJung-uk Kim     {
291f8146b88SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
292f8146b88SJung-uk Kim             "Exec predicate Op=%p State=%p\n",
293a159c266SJung-uk Kim             Op, WalkState));
294a159c266SJung-uk Kim 
295f8146b88SJung-uk Kim         WalkState->ControlState->Common.State =
296f8146b88SJung-uk Kim             ACPI_CONTROL_PREDICATE_EXECUTING;
297a159c266SJung-uk Kim 
298a159c266SJung-uk Kim         /* Save start of predicate */
299a159c266SJung-uk Kim 
300a159c266SJung-uk Kim         WalkState->ControlState->Control.PredicateOp = Op;
301a159c266SJung-uk Kim     }
302a159c266SJung-uk Kim 
303a159c266SJung-uk Kim 
304a159c266SJung-uk Kim     OpcodeClass = WalkState->OpInfo->Class;
305a159c266SJung-uk Kim 
306a159c266SJung-uk Kim     /* We want to send namepaths to the load code */
307a159c266SJung-uk Kim 
308a159c266SJung-uk Kim     if (Op->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
309a159c266SJung-uk Kim     {
310a159c266SJung-uk Kim         OpcodeClass = AML_CLASS_NAMED_OBJECT;
311a159c266SJung-uk Kim     }
312a159c266SJung-uk Kim 
313a159c266SJung-uk Kim     /*
314a159c266SJung-uk Kim      * Handle the opcode based upon the opcode type
315a159c266SJung-uk Kim      */
316a159c266SJung-uk Kim     switch (OpcodeClass)
317a159c266SJung-uk Kim     {
318a159c266SJung-uk Kim     case AML_CLASS_CONTROL:
319a159c266SJung-uk Kim 
320a159c266SJung-uk Kim         Status = AcpiDsExecBeginControlOp (WalkState, Op);
321a159c266SJung-uk Kim         break;
322a159c266SJung-uk Kim 
323a159c266SJung-uk Kim     case AML_CLASS_NAMED_OBJECT:
324a159c266SJung-uk Kim 
325a159c266SJung-uk Kim         if (WalkState->WalkType & ACPI_WALK_METHOD)
326a159c266SJung-uk Kim         {
327a159c266SJung-uk Kim             /*
328a159c266SJung-uk Kim              * Found a named object declaration during method execution;
329a159c266SJung-uk Kim              * we must enter this object into the namespace. The created
330a159c266SJung-uk Kim              * object is temporary and will be deleted upon completion of
331a159c266SJung-uk Kim              * the execution of this method.
332a159c266SJung-uk Kim              *
333a159c266SJung-uk Kim              * Note 10/2010: Except for the Scope() op. This opcode does
334a159c266SJung-uk Kim              * not actually create a new object, it refers to an existing
335a159c266SJung-uk Kim              * object. However, for Scope(), we want to indeed open a
336a159c266SJung-uk Kim              * new scope.
337a159c266SJung-uk Kim              */
338a159c266SJung-uk Kim             if (Op->Common.AmlOpcode != AML_SCOPE_OP)
339a159c266SJung-uk Kim             {
340a159c266SJung-uk Kim                 Status = AcpiDsLoad2BeginOp (WalkState, NULL);
341a159c266SJung-uk Kim             }
342a159c266SJung-uk Kim             else
343a159c266SJung-uk Kim             {
344f8146b88SJung-uk Kim                 Status = AcpiDsScopeStackPush (
345f8146b88SJung-uk Kim                     Op->Named.Node, Op->Named.Node->Type, WalkState);
346a159c266SJung-uk Kim                 if (ACPI_FAILURE (Status))
347a159c266SJung-uk Kim                 {
348a159c266SJung-uk Kim                     return_ACPI_STATUS (Status);
349a159c266SJung-uk Kim                 }
350a159c266SJung-uk Kim             }
351a159c266SJung-uk Kim         }
352a159c266SJung-uk Kim         break;
353a159c266SJung-uk Kim 
354a159c266SJung-uk Kim     case AML_CLASS_EXECUTE:
355a159c266SJung-uk Kim     case AML_CLASS_CREATE:
356a159c266SJung-uk Kim 
357a159c266SJung-uk Kim         break;
358a159c266SJung-uk Kim 
359a159c266SJung-uk Kim     default:
360a9d8d09cSJung-uk Kim 
361a159c266SJung-uk Kim         break;
362a159c266SJung-uk Kim     }
363a159c266SJung-uk Kim 
364a159c266SJung-uk Kim     /* Nothing to do here during method execution */
365a159c266SJung-uk Kim 
366a159c266SJung-uk Kim     return_ACPI_STATUS (Status);
367a159c266SJung-uk Kim 
368a159c266SJung-uk Kim 
369a159c266SJung-uk Kim ErrorExit:
370a159c266SJung-uk Kim     Status = AcpiDsMethodError (Status, WalkState);
371a159c266SJung-uk Kim     return_ACPI_STATUS (Status);
372a159c266SJung-uk Kim }
373a159c266SJung-uk Kim 
374a159c266SJung-uk Kim 
375a159c266SJung-uk Kim /*****************************************************************************
376a159c266SJung-uk Kim  *
377a159c266SJung-uk Kim  * FUNCTION:    AcpiDsExecEndOp
378a159c266SJung-uk Kim  *
379a159c266SJung-uk Kim  * PARAMETERS:  WalkState       - Current state of the parse tree walk
380a159c266SJung-uk Kim  *
381a159c266SJung-uk Kim  * RETURN:      Status
382a159c266SJung-uk Kim  *
383a159c266SJung-uk Kim  * DESCRIPTION: Ascending callback used during the execution of control
384a159c266SJung-uk Kim  *              methods. The only thing we really need to do here is to
385a159c266SJung-uk Kim  *              notice the beginning of IF, ELSE, and WHILE blocks.
386a159c266SJung-uk Kim  *
387a159c266SJung-uk Kim  ****************************************************************************/
388a159c266SJung-uk Kim 
389a159c266SJung-uk Kim ACPI_STATUS
390a159c266SJung-uk Kim AcpiDsExecEndOp (
391a159c266SJung-uk Kim     ACPI_WALK_STATE         *WalkState)
392a159c266SJung-uk Kim {
393a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op;
394a159c266SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
395a159c266SJung-uk Kim     UINT32                  OpType;
396a159c266SJung-uk Kim     UINT32                  OpClass;
397a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
398a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *FirstArg;
399a159c266SJung-uk Kim 
400a159c266SJung-uk Kim 
401a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE_PTR (DsExecEndOp, WalkState);
402a159c266SJung-uk Kim 
403a159c266SJung-uk Kim 
404a159c266SJung-uk Kim     Op = WalkState->Op;
405a159c266SJung-uk Kim     OpType = WalkState->OpInfo->Type;
406a159c266SJung-uk Kim     OpClass = WalkState->OpInfo->Class;
407a159c266SJung-uk Kim 
408a159c266SJung-uk Kim     if (OpClass == AML_CLASS_UNKNOWN)
409a159c266SJung-uk Kim     {
410a159c266SJung-uk Kim         ACPI_ERROR ((AE_INFO, "Unknown opcode 0x%X", Op->Common.AmlOpcode));
411a159c266SJung-uk Kim         return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
412a159c266SJung-uk Kim     }
413a159c266SJung-uk Kim 
414a159c266SJung-uk Kim     FirstArg = Op->Common.Value.Arg;
415a159c266SJung-uk Kim 
416a159c266SJung-uk Kim     /* Init the walk state */
417a159c266SJung-uk Kim 
418a159c266SJung-uk Kim     WalkState->NumOperands = 0;
419a159c266SJung-uk Kim     WalkState->OperandIndex = 0;
420a159c266SJung-uk Kim     WalkState->ReturnDesc = NULL;
421a159c266SJung-uk Kim     WalkState->ResultObj = NULL;
422a159c266SJung-uk Kim 
423a159c266SJung-uk Kim     /* Call debugger for single step support (DEBUG build only) */
424a159c266SJung-uk Kim 
425f8146b88SJung-uk Kim     Status = AcpiDbSingleStep (WalkState, Op, OpClass);
426f8146b88SJung-uk Kim     if (ACPI_FAILURE (Status))
427f8146b88SJung-uk Kim     {
428f8146b88SJung-uk Kim         return_ACPI_STATUS (Status);
429f8146b88SJung-uk Kim     }
430a159c266SJung-uk Kim 
431a159c266SJung-uk Kim     /* Decode the Opcode Class */
432a159c266SJung-uk Kim 
433a159c266SJung-uk Kim     switch (OpClass)
434a159c266SJung-uk Kim     {
435a159c266SJung-uk Kim     case AML_CLASS_ARGUMENT:    /* Constants, literals, etc. */
436a159c266SJung-uk Kim 
437a159c266SJung-uk Kim         if (WalkState->Opcode == AML_INT_NAMEPATH_OP)
438a159c266SJung-uk Kim         {
439a159c266SJung-uk Kim             Status = AcpiDsEvaluateNamePath (WalkState);
440a159c266SJung-uk Kim             if (ACPI_FAILURE (Status))
441a159c266SJung-uk Kim             {
442a159c266SJung-uk Kim                 goto Cleanup;
443a159c266SJung-uk Kim             }
444a159c266SJung-uk Kim         }
445a159c266SJung-uk Kim         break;
446a159c266SJung-uk Kim 
447a159c266SJung-uk Kim     case AML_CLASS_EXECUTE:     /* Most operators with arguments */
448a159c266SJung-uk Kim 
449a159c266SJung-uk Kim         /* Build resolved operand stack */
450a159c266SJung-uk Kim 
451a159c266SJung-uk Kim         Status = AcpiDsCreateOperands (WalkState, FirstArg);
452a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
453a159c266SJung-uk Kim         {
454a159c266SJung-uk Kim             goto Cleanup;
455a159c266SJung-uk Kim         }
456a159c266SJung-uk Kim 
457a159c266SJung-uk Kim         /*
458a159c266SJung-uk Kim          * All opcodes require operand resolution, with the only exceptions
459a159c266SJung-uk Kim          * being the ObjectType and SizeOf operators.
460a159c266SJung-uk Kim          */
461a159c266SJung-uk Kim         if (!(WalkState->OpInfo->Flags & AML_NO_OPERAND_RESOLVE))
462a159c266SJung-uk Kim         {
463a159c266SJung-uk Kim             /* Resolve all operands */
464a159c266SJung-uk Kim 
465a159c266SJung-uk Kim             Status = AcpiExResolveOperands (WalkState->Opcode,
466a159c266SJung-uk Kim                 &(WalkState->Operands [WalkState->NumOperands -1]),
467a159c266SJung-uk Kim                 WalkState);
468a159c266SJung-uk Kim         }
469a159c266SJung-uk Kim 
470a159c266SJung-uk Kim         if (ACPI_SUCCESS (Status))
471a159c266SJung-uk Kim         {
472a159c266SJung-uk Kim             /*
473a159c266SJung-uk Kim              * Dispatch the request to the appropriate interpreter handler
474a159c266SJung-uk Kim              * routine. There is one routine per opcode "type" based upon the
475a159c266SJung-uk Kim              * number of opcode arguments and return type.
476a159c266SJung-uk Kim              */
477a159c266SJung-uk Kim             Status = AcpiGbl_OpTypeDispatch[OpType] (WalkState);
478a159c266SJung-uk Kim         }
479a159c266SJung-uk Kim         else
480a159c266SJung-uk Kim         {
481a159c266SJung-uk Kim             /*
482a159c266SJung-uk Kim              * Treat constructs of the form "Store(LocalX,LocalX)" as noops when the
483a159c266SJung-uk Kim              * Local is uninitialized.
484a159c266SJung-uk Kim              */
485a159c266SJung-uk Kim             if  ((Status == AE_AML_UNINITIALIZED_LOCAL) &&
486a159c266SJung-uk Kim                 (WalkState->Opcode == AML_STORE_OP) &&
487a159c266SJung-uk Kim                 (WalkState->Operands[0]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
488a159c266SJung-uk Kim                 (WalkState->Operands[1]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
489a159c266SJung-uk Kim                 (WalkState->Operands[0]->Reference.Class ==
490a159c266SJung-uk Kim                  WalkState->Operands[1]->Reference.Class) &&
491a159c266SJung-uk Kim                 (WalkState->Operands[0]->Reference.Value ==
492a159c266SJung-uk Kim                  WalkState->Operands[1]->Reference.Value))
493a159c266SJung-uk Kim             {
494a159c266SJung-uk Kim                 Status = AE_OK;
495a159c266SJung-uk Kim             }
496a159c266SJung-uk Kim             else
497a159c266SJung-uk Kim             {
498a159c266SJung-uk Kim                 ACPI_EXCEPTION ((AE_INFO, Status,
499a159c266SJung-uk Kim                     "While resolving operands for [%s]",
500a159c266SJung-uk Kim                     AcpiPsGetOpcodeName (WalkState->Opcode)));
501a159c266SJung-uk Kim             }
502a159c266SJung-uk Kim         }
503a159c266SJung-uk Kim 
504a159c266SJung-uk Kim         /* Always delete the argument objects and clear the operand stack */
505a159c266SJung-uk Kim 
506a159c266SJung-uk Kim         AcpiDsClearOperands (WalkState);
507a159c266SJung-uk Kim 
508a159c266SJung-uk Kim         /*
509a159c266SJung-uk Kim          * If a result object was returned from above, push it on the
510a159c266SJung-uk Kim          * current result stack
511a159c266SJung-uk Kim          */
512a159c266SJung-uk Kim         if (ACPI_SUCCESS (Status) &&
513a159c266SJung-uk Kim             WalkState->ResultObj)
514a159c266SJung-uk Kim         {
515a159c266SJung-uk Kim             Status = AcpiDsResultPush (WalkState->ResultObj, WalkState);
516a159c266SJung-uk Kim         }
517a159c266SJung-uk Kim         break;
518a159c266SJung-uk Kim 
519a159c266SJung-uk Kim     default:
520a159c266SJung-uk Kim 
521a159c266SJung-uk Kim         switch (OpType)
522a159c266SJung-uk Kim         {
523a159c266SJung-uk Kim         case AML_TYPE_CONTROL:    /* Type 1 opcode, IF/ELSE/WHILE/NOOP */
524a159c266SJung-uk Kim 
525a159c266SJung-uk Kim             /* 1 Operand, 0 ExternalResult, 0 InternalResult */
526a159c266SJung-uk Kim 
527a159c266SJung-uk Kim             Status = AcpiDsExecEndControlOp (WalkState, Op);
528a159c266SJung-uk Kim 
529a159c266SJung-uk Kim             break;
530a159c266SJung-uk Kim 
531a159c266SJung-uk Kim         case AML_TYPE_METHOD_CALL:
532a159c266SJung-uk Kim             /*
533a159c266SJung-uk Kim              * If the method is referenced from within a package
534a159c266SJung-uk Kim              * declaration, it is not a invocation of the method, just
535a159c266SJung-uk Kim              * a reference to it.
536a159c266SJung-uk Kim              */
537a159c266SJung-uk Kim             if ((Op->Asl.Parent) &&
538a159c266SJung-uk Kim                ((Op->Asl.Parent->Asl.AmlOpcode == AML_PACKAGE_OP) ||
539a159c266SJung-uk Kim                 (Op->Asl.Parent->Asl.AmlOpcode == AML_VAR_PACKAGE_OP)))
540a159c266SJung-uk Kim             {
541a159c266SJung-uk Kim                 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
542a159c266SJung-uk Kim                     "Method Reference in a Package, Op=%p\n", Op));
543a159c266SJung-uk Kim 
544f8146b88SJung-uk Kim                 Op->Common.Node = (ACPI_NAMESPACE_NODE *)
545f8146b88SJung-uk Kim                     Op->Asl.Value.Arg->Asl.Node;
546a159c266SJung-uk Kim                 AcpiUtAddReference (Op->Asl.Value.Arg->Asl.Node->Object);
547a159c266SJung-uk Kim                 return_ACPI_STATUS (AE_OK);
548a159c266SJung-uk Kim             }
549a159c266SJung-uk Kim 
550313a0c13SJung-uk Kim             ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
551313a0c13SJung-uk Kim                 "Method invocation, Op=%p\n", Op));
552a159c266SJung-uk Kim 
553a159c266SJung-uk Kim             /*
554a159c266SJung-uk Kim              * (AML_METHODCALL) Op->Asl.Value.Arg->Asl.Node contains
555a159c266SJung-uk Kim              * the method Node pointer
556a159c266SJung-uk Kim              */
557a159c266SJung-uk Kim             /* NextOp points to the op that holds the method name */
558a159c266SJung-uk Kim 
559a159c266SJung-uk Kim             NextOp = FirstArg;
560a159c266SJung-uk Kim 
561a159c266SJung-uk Kim             /* NextOp points to first argument op */
562a159c266SJung-uk Kim 
563a159c266SJung-uk Kim             NextOp = NextOp->Common.Next;
564a159c266SJung-uk Kim 
565a159c266SJung-uk Kim             /*
566a159c266SJung-uk Kim              * Get the method's arguments and put them on the operand stack
567a159c266SJung-uk Kim              */
568a159c266SJung-uk Kim             Status = AcpiDsCreateOperands (WalkState, NextOp);
569a159c266SJung-uk Kim             if (ACPI_FAILURE (Status))
570a159c266SJung-uk Kim             {
571a159c266SJung-uk Kim                 break;
572a159c266SJung-uk Kim             }
573a159c266SJung-uk Kim 
574a159c266SJung-uk Kim             /*
575a159c266SJung-uk Kim              * Since the operands will be passed to another control method,
576a159c266SJung-uk Kim              * we must resolve all local references here (Local variables,
577a159c266SJung-uk Kim              * arguments to *this* method, etc.)
578a159c266SJung-uk Kim              */
579a159c266SJung-uk Kim             Status = AcpiDsResolveOperands (WalkState);
580a159c266SJung-uk Kim             if (ACPI_FAILURE (Status))
581a159c266SJung-uk Kim             {
582a159c266SJung-uk Kim                 /* On error, clear all resolved operands */
583a159c266SJung-uk Kim 
584a159c266SJung-uk Kim                 AcpiDsClearOperands (WalkState);
585a159c266SJung-uk Kim                 break;
586a159c266SJung-uk Kim             }
587a159c266SJung-uk Kim 
588a159c266SJung-uk Kim             /*
589a159c266SJung-uk Kim              * Tell the walk loop to preempt this running method and
590a159c266SJung-uk Kim              * execute the new method
591a159c266SJung-uk Kim              */
592a159c266SJung-uk Kim             Status = AE_CTRL_TRANSFER;
593a159c266SJung-uk Kim 
594a159c266SJung-uk Kim             /*
595a159c266SJung-uk Kim              * Return now; we don't want to disturb anything,
596a159c266SJung-uk Kim              * especially the operand count!
597a159c266SJung-uk Kim              */
598a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
599a159c266SJung-uk Kim 
600a159c266SJung-uk Kim         case AML_TYPE_CREATE_FIELD:
601a159c266SJung-uk Kim 
602a159c266SJung-uk Kim             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
603a159c266SJung-uk Kim                 "Executing CreateField Buffer/Index Op=%p\n", Op));
604a159c266SJung-uk Kim 
605a159c266SJung-uk Kim             Status = AcpiDsLoad2EndOp (WalkState);
606a159c266SJung-uk Kim             if (ACPI_FAILURE (Status))
607a159c266SJung-uk Kim             {
608a159c266SJung-uk Kim                 break;
609a159c266SJung-uk Kim             }
610a159c266SJung-uk Kim 
611a159c266SJung-uk Kim             Status = AcpiDsEvalBufferFieldOperands (WalkState, Op);
612a159c266SJung-uk Kim             break;
613a159c266SJung-uk Kim 
614a159c266SJung-uk Kim 
615a159c266SJung-uk Kim         case AML_TYPE_CREATE_OBJECT:
616a159c266SJung-uk Kim 
617a159c266SJung-uk Kim             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
618a159c266SJung-uk Kim                 "Executing CreateObject (Buffer/Package) Op=%p\n", Op));
619a159c266SJung-uk Kim 
620a159c266SJung-uk Kim             switch (Op->Common.Parent->Common.AmlOpcode)
621a159c266SJung-uk Kim             {
622a159c266SJung-uk Kim             case AML_NAME_OP:
623a159c266SJung-uk Kim                 /*
624a159c266SJung-uk Kim                  * Put the Node on the object stack (Contains the ACPI Name
625a159c266SJung-uk Kim                  * of this object)
626a159c266SJung-uk Kim                  */
627f8146b88SJung-uk Kim                 WalkState->Operands[0] = (void *)
628f8146b88SJung-uk Kim                     Op->Common.Parent->Common.Node;
629a159c266SJung-uk Kim                 WalkState->NumOperands = 1;
630a159c266SJung-uk Kim 
631a159c266SJung-uk Kim                 Status = AcpiDsCreateNode (WalkState,
632f8146b88SJung-uk Kim                     Op->Common.Parent->Common.Node, Op->Common.Parent);
633a159c266SJung-uk Kim                 if (ACPI_FAILURE (Status))
634a159c266SJung-uk Kim                 {
635a159c266SJung-uk Kim                     break;
636a159c266SJung-uk Kim                 }
637a159c266SJung-uk Kim 
638a159c266SJung-uk Kim                 /* Fall through */
639a159c266SJung-uk Kim                 /*lint -fallthrough */
640a159c266SJung-uk Kim 
641a159c266SJung-uk Kim             case AML_INT_EVAL_SUBTREE_OP:
642a159c266SJung-uk Kim 
643a159c266SJung-uk Kim                 Status = AcpiDsEvalDataObjectOperands (WalkState, Op,
644a159c266SJung-uk Kim                     AcpiNsGetAttachedObject (Op->Common.Parent->Common.Node));
645a159c266SJung-uk Kim                 break;
646a159c266SJung-uk Kim 
647a159c266SJung-uk Kim             default:
648a159c266SJung-uk Kim 
649a159c266SJung-uk Kim                 Status = AcpiDsEvalDataObjectOperands (WalkState, Op, NULL);
650a159c266SJung-uk Kim                 break;
651a159c266SJung-uk Kim             }
652a159c266SJung-uk Kim 
653a159c266SJung-uk Kim             /*
654a159c266SJung-uk Kim              * If a result object was returned from above, push it on the
655a159c266SJung-uk Kim              * current result stack
656a159c266SJung-uk Kim              */
657a159c266SJung-uk Kim             if (WalkState->ResultObj)
658a159c266SJung-uk Kim             {
659a159c266SJung-uk Kim                 Status = AcpiDsResultPush (WalkState->ResultObj, WalkState);
660a159c266SJung-uk Kim             }
661a159c266SJung-uk Kim             break;
662a159c266SJung-uk Kim 
663a159c266SJung-uk Kim         case AML_TYPE_NAMED_FIELD:
664a159c266SJung-uk Kim         case AML_TYPE_NAMED_COMPLEX:
665a159c266SJung-uk Kim         case AML_TYPE_NAMED_SIMPLE:
666a159c266SJung-uk Kim         case AML_TYPE_NAMED_NO_OBJ:
667a159c266SJung-uk Kim 
668a159c266SJung-uk Kim             Status = AcpiDsLoad2EndOp (WalkState);
669a159c266SJung-uk Kim             if (ACPI_FAILURE (Status))
670a159c266SJung-uk Kim             {
671a159c266SJung-uk Kim                 break;
672a159c266SJung-uk Kim             }
673a159c266SJung-uk Kim 
674a159c266SJung-uk Kim             if (Op->Common.AmlOpcode == AML_REGION_OP)
675a159c266SJung-uk Kim             {
676a159c266SJung-uk Kim                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
677a159c266SJung-uk Kim                     "Executing OpRegion Address/Length Op=%p\n", Op));
678a159c266SJung-uk Kim 
679a159c266SJung-uk Kim                 Status = AcpiDsEvalRegionOperands (WalkState, Op);
680a159c266SJung-uk Kim                 if (ACPI_FAILURE (Status))
681a159c266SJung-uk Kim                 {
682a159c266SJung-uk Kim                     break;
683a159c266SJung-uk Kim                 }
684a159c266SJung-uk Kim             }
685a159c266SJung-uk Kim             else if (Op->Common.AmlOpcode == AML_DATA_REGION_OP)
686a159c266SJung-uk Kim             {
687a159c266SJung-uk Kim                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
688a159c266SJung-uk Kim                     "Executing DataTableRegion Strings Op=%p\n", Op));
689a159c266SJung-uk Kim 
690a159c266SJung-uk Kim                 Status = AcpiDsEvalTableRegionOperands (WalkState, Op);
691a159c266SJung-uk Kim                 if (ACPI_FAILURE (Status))
692a159c266SJung-uk Kim                 {
693a159c266SJung-uk Kim                     break;
694a159c266SJung-uk Kim                 }
695a159c266SJung-uk Kim             }
696a159c266SJung-uk Kim             else if (Op->Common.AmlOpcode == AML_BANK_FIELD_OP)
697a159c266SJung-uk Kim             {
698a159c266SJung-uk Kim                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
699a159c266SJung-uk Kim                     "Executing BankField Op=%p\n", Op));
700a159c266SJung-uk Kim 
701a159c266SJung-uk Kim                 Status = AcpiDsEvalBankFieldOperands (WalkState, Op);
702a159c266SJung-uk Kim                 if (ACPI_FAILURE (Status))
703a159c266SJung-uk Kim                 {
704a159c266SJung-uk Kim                     break;
705a159c266SJung-uk Kim                 }
706a159c266SJung-uk Kim             }
707a159c266SJung-uk Kim             break;
708a159c266SJung-uk Kim 
709a159c266SJung-uk Kim         case AML_TYPE_UNDEFINED:
710a159c266SJung-uk Kim 
711a159c266SJung-uk Kim             ACPI_ERROR ((AE_INFO,
712a159c266SJung-uk Kim                 "Undefined opcode type Op=%p", Op));
713a159c266SJung-uk Kim             return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
714a159c266SJung-uk Kim 
715a159c266SJung-uk Kim         case AML_TYPE_BOGUS:
716a159c266SJung-uk Kim 
717a159c266SJung-uk Kim             ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
718a159c266SJung-uk Kim                 "Internal opcode=%X type Op=%p\n",
719a159c266SJung-uk Kim                 WalkState->Opcode, Op));
720a159c266SJung-uk Kim             break;
721a159c266SJung-uk Kim 
722a159c266SJung-uk Kim         default:
723a159c266SJung-uk Kim 
724a159c266SJung-uk Kim             ACPI_ERROR ((AE_INFO,
725f8146b88SJung-uk Kim                 "Unimplemented opcode, class=0x%X "
726f8146b88SJung-uk Kim                 "type=0x%X Opcode=0x%X Op=%p",
727a159c266SJung-uk Kim                 OpClass, OpType, Op->Common.AmlOpcode, Op));
728a159c266SJung-uk Kim 
729a159c266SJung-uk Kim             Status = AE_NOT_IMPLEMENTED;
730a159c266SJung-uk Kim             break;
731a159c266SJung-uk Kim         }
732a159c266SJung-uk Kim     }
733a159c266SJung-uk Kim 
734a159c266SJung-uk Kim     /*
735a159c266SJung-uk Kim      * ACPI 2.0 support for 64-bit integers: Truncate numeric
736a159c266SJung-uk Kim      * result value if we are executing from a 32-bit ACPI table
737a159c266SJung-uk Kim      */
738efcc2a30SJung-uk Kim     (void) AcpiExTruncateFor32bitTable (WalkState->ResultObj);
739a159c266SJung-uk Kim 
740a159c266SJung-uk Kim     /*
741a159c266SJung-uk Kim      * Check if we just completed the evaluation of a
742a159c266SJung-uk Kim      * conditional predicate
743a159c266SJung-uk Kim      */
744a159c266SJung-uk Kim     if ((ACPI_SUCCESS (Status)) &&
745a159c266SJung-uk Kim         (WalkState->ControlState) &&
746a159c266SJung-uk Kim         (WalkState->ControlState->Common.State ==
747a159c266SJung-uk Kim             ACPI_CONTROL_PREDICATE_EXECUTING) &&
748a159c266SJung-uk Kim         (WalkState->ControlState->Control.PredicateOp == Op))
749a159c266SJung-uk Kim     {
750a159c266SJung-uk Kim         Status = AcpiDsGetPredicateValue (WalkState, WalkState->ResultObj);
751a159c266SJung-uk Kim         WalkState->ResultObj = NULL;
752a159c266SJung-uk Kim     }
753a159c266SJung-uk Kim 
754a159c266SJung-uk Kim 
755a159c266SJung-uk Kim Cleanup:
756a159c266SJung-uk Kim 
757a159c266SJung-uk Kim     if (WalkState->ResultObj)
758a159c266SJung-uk Kim     {
759a159c266SJung-uk Kim         /* Break to debugger to display result */
760a159c266SJung-uk Kim 
761f8146b88SJung-uk Kim         AcpiDbDisplayResultObject (WalkState->ResultObj,WalkState);
762a159c266SJung-uk Kim 
763a159c266SJung-uk Kim         /*
764a159c266SJung-uk Kim          * Delete the result op if and only if:
765a159c266SJung-uk Kim          * Parent will not use the result -- such as any
766a159c266SJung-uk Kim          * non-nested type2 op in a method (parent will be method)
767a159c266SJung-uk Kim          */
768a159c266SJung-uk Kim         AcpiDsDeleteResultIfNotUsed (Op, WalkState->ResultObj, WalkState);
769a159c266SJung-uk Kim     }
770a159c266SJung-uk Kim 
771a159c266SJung-uk Kim #ifdef _UNDER_DEVELOPMENT
772a159c266SJung-uk Kim 
773a159c266SJung-uk Kim     if (WalkState->ParserState.Aml == WalkState->ParserState.AmlEnd)
774a159c266SJung-uk Kim     {
775a159c266SJung-uk Kim         AcpiDbMethodEnd (WalkState);
776a159c266SJung-uk Kim     }
777a159c266SJung-uk Kim #endif
778a159c266SJung-uk Kim 
779a159c266SJung-uk Kim     /* Invoke exception handler on error */
780a159c266SJung-uk Kim 
781a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
782a159c266SJung-uk Kim     {
783a159c266SJung-uk Kim         Status = AcpiDsMethodError (Status, WalkState);
784a159c266SJung-uk Kim     }
785a159c266SJung-uk Kim 
786a159c266SJung-uk Kim     /* Always clear the object stack */
787a159c266SJung-uk Kim 
788a159c266SJung-uk Kim     WalkState->NumOperands = 0;
789a159c266SJung-uk Kim     return_ACPI_STATUS (Status);
790a159c266SJung-uk Kim }
791