17c478bd9Sstevel@tonic-gate /*******************************************************************************
27c478bd9Sstevel@tonic-gate *
37c478bd9Sstevel@tonic-gate * Module Name: dsutils - Dispatcher utilities
47c478bd9Sstevel@tonic-gate *
57c478bd9Sstevel@tonic-gate ******************************************************************************/
67c478bd9Sstevel@tonic-gate
7*35786f68SRobert Mustacchi /******************************************************************************
8*35786f68SRobert Mustacchi *
9*35786f68SRobert Mustacchi * 1. Copyright Notice
10*35786f68SRobert Mustacchi *
11*35786f68SRobert Mustacchi * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp.
127c478bd9Sstevel@tonic-gate * All rights reserved.
137c478bd9Sstevel@tonic-gate *
14*35786f68SRobert Mustacchi * 2. License
15*35786f68SRobert Mustacchi *
16*35786f68SRobert Mustacchi * 2.1. This is your license from Intel Corp. under its intellectual property
17*35786f68SRobert Mustacchi * rights. You may have additional license terms from the party that provided
18*35786f68SRobert Mustacchi * you this software, covering your right to use that party's intellectual
19*35786f68SRobert Mustacchi * property rights.
20*35786f68SRobert Mustacchi *
21*35786f68SRobert Mustacchi * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*35786f68SRobert Mustacchi * copy of the source code appearing in this file ("Covered Code") an
23*35786f68SRobert Mustacchi * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*35786f68SRobert Mustacchi * base code distributed originally by Intel ("Original Intel Code") to copy,
25*35786f68SRobert Mustacchi * make derivatives, distribute, use and display any portion of the Covered
26*35786f68SRobert Mustacchi * Code in any form, with the right to sublicense such rights; and
27*35786f68SRobert Mustacchi *
28*35786f68SRobert Mustacchi * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*35786f68SRobert Mustacchi * license (with the right to sublicense), under only those claims of Intel
30*35786f68SRobert Mustacchi * patents that are infringed by the Original Intel Code, to make, use, sell,
31*35786f68SRobert Mustacchi * offer to sell, and import the Covered Code and derivative works thereof
32*35786f68SRobert Mustacchi * solely to the minimum extent necessary to exercise the above copyright
33*35786f68SRobert Mustacchi * license, and in no event shall the patent license extend to any additions
34*35786f68SRobert Mustacchi * to or modifications of the Original Intel Code. No other license or right
35*35786f68SRobert Mustacchi * is granted directly or by implication, estoppel or otherwise;
36*35786f68SRobert Mustacchi *
37*35786f68SRobert Mustacchi * The above copyright and patent license is granted only if the following
38*35786f68SRobert Mustacchi * conditions are met:
39*35786f68SRobert Mustacchi *
40*35786f68SRobert Mustacchi * 3. Conditions
41*35786f68SRobert Mustacchi *
42*35786f68SRobert Mustacchi * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*35786f68SRobert Mustacchi * Redistribution of source code of any substantial portion of the Covered
44*35786f68SRobert Mustacchi * Code or modification with rights to further distribute source must include
45*35786f68SRobert Mustacchi * the above Copyright Notice, the above License, this list of Conditions,
46*35786f68SRobert Mustacchi * and the following Disclaimer and Export Compliance provision. In addition,
47*35786f68SRobert Mustacchi * Licensee must cause all Covered Code to which Licensee contributes to
48*35786f68SRobert Mustacchi * contain a file documenting the changes Licensee made to create that Covered
49*35786f68SRobert Mustacchi * Code and the date of any change. Licensee must include in that file the
50*35786f68SRobert Mustacchi * documentation of any changes made by any predecessor Licensee. Licensee
51*35786f68SRobert Mustacchi * must include a prominent statement that the modification is derived,
52*35786f68SRobert Mustacchi * directly or indirectly, from Original Intel Code.
53*35786f68SRobert Mustacchi *
54*35786f68SRobert Mustacchi * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*35786f68SRobert Mustacchi * Redistribution of source code of any substantial portion of the Covered
56*35786f68SRobert Mustacchi * Code or modification without rights to further distribute source must
57*35786f68SRobert Mustacchi * include the following Disclaimer and Export Compliance provision in the
58*35786f68SRobert Mustacchi * documentation and/or other materials provided with distribution. In
59*35786f68SRobert Mustacchi * addition, Licensee may not authorize further sublicense of source of any
60*35786f68SRobert Mustacchi * portion of the Covered Code, and must include terms to the effect that the
61*35786f68SRobert Mustacchi * license from Licensee to its licensee is limited to the intellectual
62*35786f68SRobert Mustacchi * property embodied in the software Licensee provides to its licensee, and
63*35786f68SRobert Mustacchi * not to intellectual property embodied in modifications its licensee may
64*35786f68SRobert Mustacchi * make.
65*35786f68SRobert Mustacchi *
66*35786f68SRobert Mustacchi * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*35786f68SRobert Mustacchi * substantial portion of the Covered Code or modification must reproduce the
68*35786f68SRobert Mustacchi * above Copyright Notice, and the following Disclaimer and Export Compliance
69*35786f68SRobert Mustacchi * provision in the documentation and/or other materials provided with the
70*35786f68SRobert Mustacchi * distribution.
71*35786f68SRobert Mustacchi *
72*35786f68SRobert Mustacchi * 3.4. Intel retains all right, title, and interest in and to the Original
73*35786f68SRobert Mustacchi * Intel Code.
74*35786f68SRobert Mustacchi *
75*35786f68SRobert Mustacchi * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*35786f68SRobert Mustacchi * Intel shall be used in advertising or otherwise to promote the sale, use or
77*35786f68SRobert Mustacchi * other dealings in products derived from or relating to the Covered Code
78*35786f68SRobert Mustacchi * without prior written authorization from Intel.
79*35786f68SRobert Mustacchi *
80*35786f68SRobert Mustacchi * 4. Disclaimer and Export Compliance
81*35786f68SRobert Mustacchi *
82*35786f68SRobert Mustacchi * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*35786f68SRobert Mustacchi * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*35786f68SRobert Mustacchi * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85*35786f68SRobert Mustacchi * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86*35786f68SRobert Mustacchi * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87*35786f68SRobert Mustacchi * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*35786f68SRobert Mustacchi * PARTICULAR PURPOSE.
89*35786f68SRobert Mustacchi *
90*35786f68SRobert Mustacchi * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*35786f68SRobert Mustacchi * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*35786f68SRobert Mustacchi * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*35786f68SRobert Mustacchi * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*35786f68SRobert Mustacchi * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*35786f68SRobert Mustacchi * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96*35786f68SRobert Mustacchi * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*35786f68SRobert Mustacchi * LIMITED REMEDY.
98*35786f68SRobert Mustacchi *
99*35786f68SRobert Mustacchi * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*35786f68SRobert Mustacchi * software or system incorporating such software without first obtaining any
101*35786f68SRobert Mustacchi * required license or other approval from the U. S. Department of Commerce or
102*35786f68SRobert Mustacchi * any other agency or department of the United States Government. In the
103*35786f68SRobert Mustacchi * event Licensee exports any such software from the United States or
104*35786f68SRobert Mustacchi * re-exports any such software from a foreign destination, Licensee shall
105*35786f68SRobert Mustacchi * ensure that the distribution and export/re-export of the software is in
106*35786f68SRobert Mustacchi * compliance with all laws, regulations, orders, or other restrictions of the
107*35786f68SRobert Mustacchi * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*35786f68SRobert Mustacchi * any of its subsidiaries will export/re-export any technical data, process,
109*35786f68SRobert Mustacchi * software, or service, directly or indirectly, to any country for which the
110*35786f68SRobert Mustacchi * United States government or any agency thereof requires an export license,
111*35786f68SRobert Mustacchi * other governmental approval, or letter of assurance, without first obtaining
112*35786f68SRobert Mustacchi * such license, approval or letter.
113*35786f68SRobert Mustacchi *
114*35786f68SRobert Mustacchi *****************************************************************************
115*35786f68SRobert Mustacchi *
116*35786f68SRobert Mustacchi * Alternatively, you may choose to be licensed under the terms of the
117*35786f68SRobert Mustacchi * following license:
118*35786f68SRobert Mustacchi *
11926f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without
12026f3cdf0SGordon Ross * modification, are permitted provided that the following conditions
12126f3cdf0SGordon Ross * are met:
12226f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright
12326f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer,
12426f3cdf0SGordon Ross * without modification.
12526f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12626f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below
12726f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon
12826f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further
12926f3cdf0SGordon Ross * binary redistribution.
13026f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names
13126f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived
13226f3cdf0SGordon Ross * from this software without specific prior written permission.
13326f3cdf0SGordon Ross *
13426f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
13526f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136*35786f68SRobert Mustacchi * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
13726f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138*35786f68SRobert Mustacchi * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139*35786f68SRobert Mustacchi * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140*35786f68SRobert Mustacchi * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141*35786f68SRobert Mustacchi * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142*35786f68SRobert Mustacchi * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143*35786f68SRobert Mustacchi * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144*35786f68SRobert Mustacchi * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145*35786f68SRobert Mustacchi *
146*35786f68SRobert Mustacchi * Alternatively, you may choose to be licensed under the terms of the
147*35786f68SRobert Mustacchi * GNU General Public License ("GPL") version 2 as published by the Free
148*35786f68SRobert Mustacchi * Software Foundation.
149*35786f68SRobert Mustacchi *
150*35786f68SRobert Mustacchi *****************************************************************************/
1517c478bd9Sstevel@tonic-gate
1527c478bd9Sstevel@tonic-gate #include "acpi.h"
153aa2aa9a6SDana Myers #include "accommon.h"
1547c478bd9Sstevel@tonic-gate #include "acparser.h"
1557c478bd9Sstevel@tonic-gate #include "amlcode.h"
1567c478bd9Sstevel@tonic-gate #include "acdispat.h"
1577c478bd9Sstevel@tonic-gate #include "acinterp.h"
1587c478bd9Sstevel@tonic-gate #include "acnamesp.h"
1597c478bd9Sstevel@tonic-gate #include "acdebug.h"
1607c478bd9Sstevel@tonic-gate
1617c478bd9Sstevel@tonic-gate #define _COMPONENT ACPI_DISPATCHER
1627c478bd9Sstevel@tonic-gate ACPI_MODULE_NAME ("dsutils")
1637c478bd9Sstevel@tonic-gate
1647c478bd9Sstevel@tonic-gate
1657c478bd9Sstevel@tonic-gate /*******************************************************************************
1667c478bd9Sstevel@tonic-gate *
1677c478bd9Sstevel@tonic-gate * FUNCTION: AcpiDsClearImplicitReturn
1687c478bd9Sstevel@tonic-gate *
1697c478bd9Sstevel@tonic-gate * PARAMETERS: WalkState - Current State
1707c478bd9Sstevel@tonic-gate *
1717c478bd9Sstevel@tonic-gate * RETURN: None.
1727c478bd9Sstevel@tonic-gate *
1737b1019a6SJerry Jelinek * DESCRIPTION: Clear and remove a reference on an implicit return value. Used
1747c478bd9Sstevel@tonic-gate * to delete "stale" return values (if enabled, the return value
1757c478bd9Sstevel@tonic-gate * from every operator is saved at least momentarily, in case the
1767c478bd9Sstevel@tonic-gate * parent method exits.)
1777c478bd9Sstevel@tonic-gate *
1787c478bd9Sstevel@tonic-gate ******************************************************************************/
1797c478bd9Sstevel@tonic-gate
1807c478bd9Sstevel@tonic-gate void
AcpiDsClearImplicitReturn(ACPI_WALK_STATE * WalkState)1817c478bd9Sstevel@tonic-gate AcpiDsClearImplicitReturn (
1827c478bd9Sstevel@tonic-gate ACPI_WALK_STATE *WalkState)
1837c478bd9Sstevel@tonic-gate {
18427f7c583Smyers ACPI_FUNCTION_NAME (DsClearImplicitReturn);
1857c478bd9Sstevel@tonic-gate
1867c478bd9Sstevel@tonic-gate
1877c478bd9Sstevel@tonic-gate /*
1887c478bd9Sstevel@tonic-gate * Slack must be enabled for this feature
1897c478bd9Sstevel@tonic-gate */
1907c478bd9Sstevel@tonic-gate if (!AcpiGbl_EnableInterpreterSlack)
1917c478bd9Sstevel@tonic-gate {
1927c478bd9Sstevel@tonic-gate return;
1937c478bd9Sstevel@tonic-gate }
1947c478bd9Sstevel@tonic-gate
1957c478bd9Sstevel@tonic-gate if (WalkState->ImplicitReturnObj)
1967c478bd9Sstevel@tonic-gate {
1977c478bd9Sstevel@tonic-gate /*
1987c478bd9Sstevel@tonic-gate * Delete any "stale" implicit return. However, in
1997c478bd9Sstevel@tonic-gate * complex statements, the implicit return value can be
2007c478bd9Sstevel@tonic-gate * bubbled up several levels.
2017c478bd9Sstevel@tonic-gate */
2027c478bd9Sstevel@tonic-gate ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
2037c478bd9Sstevel@tonic-gate "Removing reference on stale implicit return obj %p\n",
2047c478bd9Sstevel@tonic-gate WalkState->ImplicitReturnObj));
2057c478bd9Sstevel@tonic-gate
2067c478bd9Sstevel@tonic-gate AcpiUtRemoveReference (WalkState->ImplicitReturnObj);
2077c478bd9Sstevel@tonic-gate WalkState->ImplicitReturnObj = NULL;
2087c478bd9Sstevel@tonic-gate }
2097c478bd9Sstevel@tonic-gate }
2107c478bd9Sstevel@tonic-gate
2117c478bd9Sstevel@tonic-gate
2127c478bd9Sstevel@tonic-gate #ifndef ACPI_NO_METHOD_EXECUTION
2137c478bd9Sstevel@tonic-gate /*******************************************************************************
2147c478bd9Sstevel@tonic-gate *
2157c478bd9Sstevel@tonic-gate * FUNCTION: AcpiDsDoImplicitReturn
2167c478bd9Sstevel@tonic-gate *
2177c478bd9Sstevel@tonic-gate * PARAMETERS: ReturnDesc - The return value
2187c478bd9Sstevel@tonic-gate * WalkState - Current State
2197c478bd9Sstevel@tonic-gate * AddReference - True if a reference should be added to the
2207c478bd9Sstevel@tonic-gate * return object
2217c478bd9Sstevel@tonic-gate *
2227c478bd9Sstevel@tonic-gate * RETURN: TRUE if implicit return enabled, FALSE otherwise
2237c478bd9Sstevel@tonic-gate *
2247c478bd9Sstevel@tonic-gate * DESCRIPTION: Implements the optional "implicit return". We save the result
2257c478bd9Sstevel@tonic-gate * of every ASL operator and control method invocation in case the
2267b1019a6SJerry Jelinek * parent method exit. Before storing a new return value, we
2277c478bd9Sstevel@tonic-gate * delete the previous return value.
2287c478bd9Sstevel@tonic-gate *
2297c478bd9Sstevel@tonic-gate ******************************************************************************/
2307c478bd9Sstevel@tonic-gate
2317c478bd9Sstevel@tonic-gate BOOLEAN
AcpiDsDoImplicitReturn(ACPI_OPERAND_OBJECT * ReturnDesc,ACPI_WALK_STATE * WalkState,BOOLEAN AddReference)2327c478bd9Sstevel@tonic-gate AcpiDsDoImplicitReturn (
2337c478bd9Sstevel@tonic-gate ACPI_OPERAND_OBJECT *ReturnDesc,
2347c478bd9Sstevel@tonic-gate ACPI_WALK_STATE *WalkState,
2357c478bd9Sstevel@tonic-gate BOOLEAN AddReference)
2367c478bd9Sstevel@tonic-gate {
23727f7c583Smyers ACPI_FUNCTION_NAME (DsDoImplicitReturn);
2387c478bd9Sstevel@tonic-gate
2397c478bd9Sstevel@tonic-gate
2407c478bd9Sstevel@tonic-gate /*
2417c478bd9Sstevel@tonic-gate * Slack must be enabled for this feature, and we must
2427c478bd9Sstevel@tonic-gate * have a valid return object
2437c478bd9Sstevel@tonic-gate */
2447c478bd9Sstevel@tonic-gate if ((!AcpiGbl_EnableInterpreterSlack) ||
2457c478bd9Sstevel@tonic-gate (!ReturnDesc))
2467c478bd9Sstevel@tonic-gate {
2477c478bd9Sstevel@tonic-gate return (FALSE);
2487c478bd9Sstevel@tonic-gate }
2497c478bd9Sstevel@tonic-gate
2507c478bd9Sstevel@tonic-gate ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
2517b1019a6SJerry Jelinek "Result %p will be implicitly returned; Prev=%p\n",
2527b1019a6SJerry Jelinek ReturnDesc,
2537b1019a6SJerry Jelinek WalkState->ImplicitReturnObj));
2547c478bd9Sstevel@tonic-gate
2557c478bd9Sstevel@tonic-gate /*
2567c478bd9Sstevel@tonic-gate * Delete any "stale" implicit return value first. However, in
2577c478bd9Sstevel@tonic-gate * complex statements, the implicit return value can be
2587c478bd9Sstevel@tonic-gate * bubbled up several levels, so we don't clear the value if it
2597c478bd9Sstevel@tonic-gate * is the same as the ReturnDesc.
2607c478bd9Sstevel@tonic-gate */
2617c478bd9Sstevel@tonic-gate if (WalkState->ImplicitReturnObj)
2627c478bd9Sstevel@tonic-gate {
2637c478bd9Sstevel@tonic-gate if (WalkState->ImplicitReturnObj == ReturnDesc)
2647c478bd9Sstevel@tonic-gate {
2657c478bd9Sstevel@tonic-gate return (TRUE);
2667c478bd9Sstevel@tonic-gate }
2677c478bd9Sstevel@tonic-gate AcpiDsClearImplicitReturn (WalkState);
2687c478bd9Sstevel@tonic-gate }
2697c478bd9Sstevel@tonic-gate
2707c478bd9Sstevel@tonic-gate /* Save the implicit return value, add a reference if requested */
2717c478bd9Sstevel@tonic-gate
2727c478bd9Sstevel@tonic-gate WalkState->ImplicitReturnObj = ReturnDesc;
2737c478bd9Sstevel@tonic-gate if (AddReference)
2747c478bd9Sstevel@tonic-gate {
2757c478bd9Sstevel@tonic-gate AcpiUtAddReference (ReturnDesc);
2767c478bd9Sstevel@tonic-gate }
2777c478bd9Sstevel@tonic-gate
2787c478bd9Sstevel@tonic-gate return (TRUE);
2797c478bd9Sstevel@tonic-gate }
2807c478bd9Sstevel@tonic-gate
2817c478bd9Sstevel@tonic-gate
2827c478bd9Sstevel@tonic-gate /*******************************************************************************
2837c478bd9Sstevel@tonic-gate *
2847c478bd9Sstevel@tonic-gate * FUNCTION: AcpiDsIsResultUsed
2857c478bd9Sstevel@tonic-gate *
2867c478bd9Sstevel@tonic-gate * PARAMETERS: Op - Current Op
2877c478bd9Sstevel@tonic-gate * WalkState - Current State
2887c478bd9Sstevel@tonic-gate *
2897c478bd9Sstevel@tonic-gate * RETURN: TRUE if result is used, FALSE otherwise
2907c478bd9Sstevel@tonic-gate *
2917c478bd9Sstevel@tonic-gate * DESCRIPTION: Check if a result object will be used by the parent
2927c478bd9Sstevel@tonic-gate *
2937c478bd9Sstevel@tonic-gate ******************************************************************************/
2947c478bd9Sstevel@tonic-gate
2957c478bd9Sstevel@tonic-gate BOOLEAN
AcpiDsIsResultUsed(ACPI_PARSE_OBJECT * Op,ACPI_WALK_STATE * WalkState)2967c478bd9Sstevel@tonic-gate AcpiDsIsResultUsed (
2977c478bd9Sstevel@tonic-gate ACPI_PARSE_OBJECT *Op,
2987c478bd9Sstevel@tonic-gate ACPI_WALK_STATE *WalkState)
2997c478bd9Sstevel@tonic-gate {
3007c478bd9Sstevel@tonic-gate const ACPI_OPCODE_INFO *ParentInfo;
3017c478bd9Sstevel@tonic-gate
30227f7c583Smyers ACPI_FUNCTION_TRACE_PTR (DsIsResultUsed, Op);
3037c478bd9Sstevel@tonic-gate
3047c478bd9Sstevel@tonic-gate
3057c478bd9Sstevel@tonic-gate /* Must have both an Op and a Result Object */
3067c478bd9Sstevel@tonic-gate
3077c478bd9Sstevel@tonic-gate if (!Op)
3087c478bd9Sstevel@tonic-gate {
30930082d0cSmyers ACPI_ERROR ((AE_INFO, "Null Op"));
310186507a7Smyers return_UINT8 (TRUE);
3117c478bd9Sstevel@tonic-gate }
3127c478bd9Sstevel@tonic-gate
3137c478bd9Sstevel@tonic-gate /*
3147c478bd9Sstevel@tonic-gate * We know that this operator is not a
3157c478bd9Sstevel@tonic-gate * Return() operator (would not come here.) The following code is the
3167c478bd9Sstevel@tonic-gate * optional support for a so-called "implicit return". Some AML code
3177c478bd9Sstevel@tonic-gate * assumes that the last value of the method is "implicitly" returned
3187c478bd9Sstevel@tonic-gate * to the caller. Just save the last result as the return value.
3197c478bd9Sstevel@tonic-gate * NOTE: this is optional because the ASL language does not actually
3207c478bd9Sstevel@tonic-gate * support this behavior.
3217c478bd9Sstevel@tonic-gate */
3227c478bd9Sstevel@tonic-gate (void) AcpiDsDoImplicitReturn (WalkState->ResultObj, WalkState, TRUE);
3237c478bd9Sstevel@tonic-gate
3247c478bd9Sstevel@tonic-gate /*
3257c478bd9Sstevel@tonic-gate * Now determine if the parent will use the result
3267c478bd9Sstevel@tonic-gate *
3277c478bd9Sstevel@tonic-gate * If there is no parent, or the parent is a ScopeOp, we are executing
3287c478bd9Sstevel@tonic-gate * at the method level. An executing method typically has no parent,
3297b1019a6SJerry Jelinek * since each method is parsed separately. A method invoked externally
3307c478bd9Sstevel@tonic-gate * via ExecuteControlMethod has a ScopeOp as the parent.
3317c478bd9Sstevel@tonic-gate */
3327c478bd9Sstevel@tonic-gate if ((!Op->Common.Parent) ||
3337c478bd9Sstevel@tonic-gate (Op->Common.Parent->Common.AmlOpcode == AML_SCOPE_OP))
3347c478bd9Sstevel@tonic-gate {
3357c478bd9Sstevel@tonic-gate /* No parent, the return value cannot possibly be used */
3367c478bd9Sstevel@tonic-gate
3377c478bd9Sstevel@tonic-gate ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
3387c478bd9Sstevel@tonic-gate "At Method level, result of [%s] not used\n",
3397c478bd9Sstevel@tonic-gate AcpiPsGetOpcodeName (Op->Common.AmlOpcode)));
340186507a7Smyers return_UINT8 (FALSE);
3417c478bd9Sstevel@tonic-gate }
3427c478bd9Sstevel@tonic-gate
3437c478bd9Sstevel@tonic-gate /* Get info on the parent. The RootOp is AML_SCOPE */
3447c478bd9Sstevel@tonic-gate
3457c478bd9Sstevel@tonic-gate ParentInfo = AcpiPsGetOpcodeInfo (Op->Common.Parent->Common.AmlOpcode);
3467c478bd9Sstevel@tonic-gate if (ParentInfo->Class == AML_CLASS_UNKNOWN)
3477c478bd9Sstevel@tonic-gate {
34830082d0cSmyers ACPI_ERROR ((AE_INFO,
34930082d0cSmyers "Unknown parent opcode Op=%p", Op));
350186507a7Smyers return_UINT8 (FALSE);
3517c478bd9Sstevel@tonic-gate }
3527c478bd9Sstevel@tonic-gate
3537c478bd9Sstevel@tonic-gate /*
3547b1019a6SJerry Jelinek * Decide what to do with the result based on the parent. If
3557c478bd9Sstevel@tonic-gate * the parent opcode will not use the result, delete the object.
3567c478bd9Sstevel@tonic-gate * Otherwise leave it as is, it will be deleted when it is used
3577c478bd9Sstevel@tonic-gate * as an operand later.
3587c478bd9Sstevel@tonic-gate */
3597c478bd9Sstevel@tonic-gate switch (ParentInfo->Class)
3607c478bd9Sstevel@tonic-gate {
3617c478bd9Sstevel@tonic-gate case AML_CLASS_CONTROL:
3627c478bd9Sstevel@tonic-gate
3637c478bd9Sstevel@tonic-gate switch (Op->Common.Parent->Common.AmlOpcode)
3647c478bd9Sstevel@tonic-gate {
3657c478bd9Sstevel@tonic-gate case AML_RETURN_OP:
3667c478bd9Sstevel@tonic-gate
3677c478bd9Sstevel@tonic-gate /* Never delete the return value associated with a return opcode */
3687c478bd9Sstevel@tonic-gate
3697c478bd9Sstevel@tonic-gate goto ResultUsed;
3707c478bd9Sstevel@tonic-gate
3717c478bd9Sstevel@tonic-gate case AML_IF_OP:
3727c478bd9Sstevel@tonic-gate case AML_WHILE_OP:
3737c478bd9Sstevel@tonic-gate /*
3747c478bd9Sstevel@tonic-gate * If we are executing the predicate AND this is the predicate op,
3757c478bd9Sstevel@tonic-gate * we will use the return value
3767c478bd9Sstevel@tonic-gate */
3777b1019a6SJerry Jelinek if ((WalkState->ControlState->Common.State ==
3787b1019a6SJerry Jelinek ACPI_CONTROL_PREDICATE_EXECUTING) &&
3797c478bd9Sstevel@tonic-gate (WalkState->ControlState->Control.PredicateOp == Op))
3807c478bd9Sstevel@tonic-gate {
3817c478bd9Sstevel@tonic-gate goto ResultUsed;
3827c478bd9Sstevel@tonic-gate }
3837c478bd9Sstevel@tonic-gate break;
3847c478bd9Sstevel@tonic-gate
3857c478bd9Sstevel@tonic-gate default:
3867b1019a6SJerry Jelinek
3877c478bd9Sstevel@tonic-gate /* Ignore other control opcodes */
3887b1019a6SJerry Jelinek
3897c478bd9Sstevel@tonic-gate break;
3907c478bd9Sstevel@tonic-gate }
3917c478bd9Sstevel@tonic-gate
3927c478bd9Sstevel@tonic-gate /* The general control opcode returns no result */
3937c478bd9Sstevel@tonic-gate
3947c478bd9Sstevel@tonic-gate goto ResultNotUsed;
3957c478bd9Sstevel@tonic-gate
3967c478bd9Sstevel@tonic-gate case AML_CLASS_CREATE:
3977c478bd9Sstevel@tonic-gate /*
3987c478bd9Sstevel@tonic-gate * These opcodes allow TermArg(s) as operands and therefore
3997b1019a6SJerry Jelinek * the operands can be method calls. The result is used.
4007c478bd9Sstevel@tonic-gate */
4017c478bd9Sstevel@tonic-gate goto ResultUsed;
4027c478bd9Sstevel@tonic-gate
4037c478bd9Sstevel@tonic-gate case AML_CLASS_NAMED_OBJECT:
4047c478bd9Sstevel@tonic-gate
4057c478bd9Sstevel@tonic-gate if ((Op->Common.Parent->Common.AmlOpcode == AML_REGION_OP) ||
4067c478bd9Sstevel@tonic-gate (Op->Common.Parent->Common.AmlOpcode == AML_DATA_REGION_OP) ||
4077c478bd9Sstevel@tonic-gate (Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
4087c478bd9Sstevel@tonic-gate (Op->Common.Parent->Common.AmlOpcode == AML_BUFFER_OP) ||
409*35786f68SRobert Mustacchi (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP) ||
410db2bae30SDana Myers (Op->Common.Parent->Common.AmlOpcode == AML_INT_EVAL_SUBTREE_OP) ||
411db2bae30SDana Myers (Op->Common.Parent->Common.AmlOpcode == AML_BANK_FIELD_OP))
4127c478bd9Sstevel@tonic-gate {
4137c478bd9Sstevel@tonic-gate /*
4147c478bd9Sstevel@tonic-gate * These opcodes allow TermArg(s) as operands and therefore
4157b1019a6SJerry Jelinek * the operands can be method calls. The result is used.
4167c478bd9Sstevel@tonic-gate */
4177c478bd9Sstevel@tonic-gate goto ResultUsed;
4187c478bd9Sstevel@tonic-gate }
4197c478bd9Sstevel@tonic-gate
4207c478bd9Sstevel@tonic-gate goto ResultNotUsed;
4217c478bd9Sstevel@tonic-gate
4227c478bd9Sstevel@tonic-gate default:
4237c478bd9Sstevel@tonic-gate /*
4247c478bd9Sstevel@tonic-gate * In all other cases. the parent will actually use the return
4257c478bd9Sstevel@tonic-gate * object, so keep it.
4267c478bd9Sstevel@tonic-gate */
4277c478bd9Sstevel@tonic-gate goto ResultUsed;
4287c478bd9Sstevel@tonic-gate }
4297c478bd9Sstevel@tonic-gate
4307c478bd9Sstevel@tonic-gate
4317c478bd9Sstevel@tonic-gate ResultUsed:
4327c478bd9Sstevel@tonic-gate ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
4337c478bd9Sstevel@tonic-gate "Result of [%s] used by Parent [%s] Op=%p\n",
4347c478bd9Sstevel@tonic-gate AcpiPsGetOpcodeName (Op->Common.AmlOpcode),
4357c478bd9Sstevel@tonic-gate AcpiPsGetOpcodeName (Op->Common.Parent->Common.AmlOpcode), Op));
4367c478bd9Sstevel@tonic-gate
437186507a7Smyers return_UINT8 (TRUE);
4387c478bd9Sstevel@tonic-gate
4397c478bd9Sstevel@tonic-gate
4407c478bd9Sstevel@tonic-gate ResultNotUsed:
4417c478bd9Sstevel@tonic-gate ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
4427c478bd9Sstevel@tonic-gate "Result of [%s] not used by Parent [%s] Op=%p\n",
4437c478bd9Sstevel@tonic-gate AcpiPsGetOpcodeName (Op->Common.AmlOpcode),
4447c478bd9Sstevel@tonic-gate AcpiPsGetOpcodeName (Op->Common.Parent->Common.AmlOpcode), Op));
4457c478bd9Sstevel@tonic-gate
446186507a7Smyers return_UINT8 (FALSE);
4477c478bd9Sstevel@tonic-gate }
4487c478bd9Sstevel@tonic-gate
4497c478bd9Sstevel@tonic-gate
4507c478bd9Sstevel@tonic-gate /*******************************************************************************
4517c478bd9Sstevel@tonic-gate *
4527c478bd9Sstevel@tonic-gate * FUNCTION: AcpiDsDeleteResultIfNotUsed
4537c478bd9Sstevel@tonic-gate *
4547c478bd9Sstevel@tonic-gate * PARAMETERS: Op - Current parse Op
4557c478bd9Sstevel@tonic-gate * ResultObj - Result of the operation
4567c478bd9Sstevel@tonic-gate * WalkState - Current state
4577c478bd9Sstevel@tonic-gate *
4587c478bd9Sstevel@tonic-gate * RETURN: Status
4597c478bd9Sstevel@tonic-gate *
4607b1019a6SJerry Jelinek * DESCRIPTION: Used after interpretation of an opcode. If there is an internal
4617c478bd9Sstevel@tonic-gate * result descriptor, check if the parent opcode will actually use
4627b1019a6SJerry Jelinek * this result. If not, delete the result now so that it will
4637c478bd9Sstevel@tonic-gate * not become orphaned.
4647c478bd9Sstevel@tonic-gate *
4657c478bd9Sstevel@tonic-gate ******************************************************************************/
4667c478bd9Sstevel@tonic-gate
4677c478bd9Sstevel@tonic-gate void
AcpiDsDeleteResultIfNotUsed(ACPI_PARSE_OBJECT * Op,ACPI_OPERAND_OBJECT * ResultObj,ACPI_WALK_STATE * WalkState)4687c478bd9Sstevel@tonic-gate AcpiDsDeleteResultIfNotUsed (
4697c478bd9Sstevel@tonic-gate ACPI_PARSE_OBJECT *Op,
4707c478bd9Sstevel@tonic-gate ACPI_OPERAND_OBJECT *ResultObj,
4717c478bd9Sstevel@tonic-gate ACPI_WALK_STATE *WalkState)
4727c478bd9Sstevel@tonic-gate {
4737c478bd9Sstevel@tonic-gate ACPI_OPERAND_OBJECT *ObjDesc;
4747c478bd9Sstevel@tonic-gate ACPI_STATUS Status;
4757c478bd9Sstevel@tonic-gate
4767c478bd9Sstevel@tonic-gate
47727f7c583Smyers ACPI_FUNCTION_TRACE_PTR (DsDeleteResultIfNotUsed, ResultObj);
4787c478bd9Sstevel@tonic-gate
4797c478bd9Sstevel@tonic-gate
4807c478bd9Sstevel@tonic-gate if (!Op)
4817c478bd9Sstevel@tonic-gate {
48230082d0cSmyers ACPI_ERROR ((AE_INFO, "Null Op"));
4837c478bd9Sstevel@tonic-gate return_VOID;
4847c478bd9Sstevel@tonic-gate }
4857c478bd9Sstevel@tonic-gate
4867c478bd9Sstevel@tonic-gate if (!ResultObj)
4877c478bd9Sstevel@tonic-gate {
4887c478bd9Sstevel@tonic-gate return_VOID;
4897c478bd9Sstevel@tonic-gate }
4907c478bd9Sstevel@tonic-gate
4917c478bd9Sstevel@tonic-gate if (!AcpiDsIsResultUsed (Op, WalkState))
4927c478bd9Sstevel@tonic-gate {
4937c478bd9Sstevel@tonic-gate /* Must pop the result stack (ObjDesc should be equal to ResultObj) */
4947c478bd9Sstevel@tonic-gate
4957c478bd9Sstevel@tonic-gate Status = AcpiDsResultPop (&ObjDesc, WalkState);
4967c478bd9Sstevel@tonic-gate if (ACPI_SUCCESS (Status))
4977c478bd9Sstevel@tonic-gate {
4987c478bd9Sstevel@tonic-gate AcpiUtRemoveReference (ResultObj);
4997c478bd9Sstevel@tonic-gate }
5007c478bd9Sstevel@tonic-gate }
5017c478bd9Sstevel@tonic-gate
5027c478bd9Sstevel@tonic-gate return_VOID;
5037c478bd9Sstevel@tonic-gate }
5047c478bd9Sstevel@tonic-gate
5057c478bd9Sstevel@tonic-gate
5067c478bd9Sstevel@tonic-gate /*******************************************************************************
5077c478bd9Sstevel@tonic-gate *
5087c478bd9Sstevel@tonic-gate * FUNCTION: AcpiDsResolveOperands
5097c478bd9Sstevel@tonic-gate *
5107c478bd9Sstevel@tonic-gate * PARAMETERS: WalkState - Current walk state with operands on stack
5117c478bd9Sstevel@tonic-gate *
5127c478bd9Sstevel@tonic-gate * RETURN: Status
5137c478bd9Sstevel@tonic-gate *
5147b1019a6SJerry Jelinek * DESCRIPTION: Resolve all operands to their values. Used to prepare
5157c478bd9Sstevel@tonic-gate * arguments to a control method invocation (a call from one
5167c478bd9Sstevel@tonic-gate * method to another.)
5177c478bd9Sstevel@tonic-gate *
5187c478bd9Sstevel@tonic-gate ******************************************************************************/
5197c478bd9Sstevel@tonic-gate
5207c478bd9Sstevel@tonic-gate ACPI_STATUS
AcpiDsResolveOperands(ACPI_WALK_STATE * WalkState)5217c478bd9Sstevel@tonic-gate AcpiDsResolveOperands (
5227c478bd9Sstevel@tonic-gate ACPI_WALK_STATE *WalkState)
5237c478bd9Sstevel@tonic-gate {
5247c478bd9Sstevel@tonic-gate UINT32 i;
5257c478bd9Sstevel@tonic-gate ACPI_STATUS Status = AE_OK;
5267c478bd9Sstevel@tonic-gate
5277c478bd9Sstevel@tonic-gate
52827f7c583Smyers ACPI_FUNCTION_TRACE_PTR (DsResolveOperands, WalkState);
5297c478bd9Sstevel@tonic-gate
5307c478bd9Sstevel@tonic-gate
5317c478bd9Sstevel@tonic-gate /*
5327c478bd9Sstevel@tonic-gate * Attempt to resolve each of the valid operands
5337b1019a6SJerry Jelinek * Method arguments are passed by reference, not by value. This means
5347c478bd9Sstevel@tonic-gate * that the actual objects are passed, not copies of the objects.
5357c478bd9Sstevel@tonic-gate */
5367c478bd9Sstevel@tonic-gate for (i = 0; i < WalkState->NumOperands; i++)
5377c478bd9Sstevel@tonic-gate {
5387c478bd9Sstevel@tonic-gate Status = AcpiExResolveToValue (&WalkState->Operands[i], WalkState);
5397c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
5407c478bd9Sstevel@tonic-gate {
5417c478bd9Sstevel@tonic-gate break;
5427c478bd9Sstevel@tonic-gate }
5437c478bd9Sstevel@tonic-gate }
5447c478bd9Sstevel@tonic-gate
5457c478bd9Sstevel@tonic-gate return_ACPI_STATUS (Status);
5467c478bd9Sstevel@tonic-gate }
5477c478bd9Sstevel@tonic-gate
5487c478bd9Sstevel@tonic-gate
5497c478bd9Sstevel@tonic-gate /*******************************************************************************
5507c478bd9Sstevel@tonic-gate *
5517c478bd9Sstevel@tonic-gate * FUNCTION: AcpiDsClearOperands
5527c478bd9Sstevel@tonic-gate *
5537c478bd9Sstevel@tonic-gate * PARAMETERS: WalkState - Current walk state with operands on stack
5547c478bd9Sstevel@tonic-gate *
5557c478bd9Sstevel@tonic-gate * RETURN: None
5567c478bd9Sstevel@tonic-gate *
5577c478bd9Sstevel@tonic-gate * DESCRIPTION: Clear all operands on the current walk state operand stack.
5587c478bd9Sstevel@tonic-gate *
5597c478bd9Sstevel@tonic-gate ******************************************************************************/
5607c478bd9Sstevel@tonic-gate
5617c478bd9Sstevel@tonic-gate void
AcpiDsClearOperands(ACPI_WALK_STATE * WalkState)5627c478bd9Sstevel@tonic-gate AcpiDsClearOperands (
5637c478bd9Sstevel@tonic-gate ACPI_WALK_STATE *WalkState)
5647c478bd9Sstevel@tonic-gate {
5657c478bd9Sstevel@tonic-gate UINT32 i;
5667c478bd9Sstevel@tonic-gate
5677c478bd9Sstevel@tonic-gate
56827f7c583Smyers ACPI_FUNCTION_TRACE_PTR (DsClearOperands, WalkState);
5697c478bd9Sstevel@tonic-gate
5707c478bd9Sstevel@tonic-gate
5717c478bd9Sstevel@tonic-gate /* Remove a reference on each operand on the stack */
5727c478bd9Sstevel@tonic-gate
5737c478bd9Sstevel@tonic-gate for (i = 0; i < WalkState->NumOperands; i++)
5747c478bd9Sstevel@tonic-gate {
5757c478bd9Sstevel@tonic-gate /*
5767c478bd9Sstevel@tonic-gate * Remove a reference to all operands, including both
5777c478bd9Sstevel@tonic-gate * "Arguments" and "Targets".
5787c478bd9Sstevel@tonic-gate */
5797c478bd9Sstevel@tonic-gate AcpiUtRemoveReference (WalkState->Operands[i]);
5807c478bd9Sstevel@tonic-gate WalkState->Operands[i] = NULL;
5817c478bd9Sstevel@tonic-gate }
5827c478bd9Sstevel@tonic-gate
5837c478bd9Sstevel@tonic-gate WalkState->NumOperands = 0;
5847c478bd9Sstevel@tonic-gate return_VOID;
5857c478bd9Sstevel@tonic-gate }
5867c478bd9Sstevel@tonic-gate #endif
5877c478bd9Sstevel@tonic-gate
5887c478bd9Sstevel@tonic-gate
5897c478bd9Sstevel@tonic-gate /*******************************************************************************
5907c478bd9Sstevel@tonic-gate *
5917c478bd9Sstevel@tonic-gate * FUNCTION: AcpiDsCreateOperand
5927c478bd9Sstevel@tonic-gate *
5937c478bd9Sstevel@tonic-gate * PARAMETERS: WalkState - Current walk state
5947c478bd9Sstevel@tonic-gate * Arg - Parse object for the argument
5957c478bd9Sstevel@tonic-gate * ArgIndex - Which argument (zero based)
5967c478bd9Sstevel@tonic-gate *
5977c478bd9Sstevel@tonic-gate * RETURN: Status
5987c478bd9Sstevel@tonic-gate *
5997c478bd9Sstevel@tonic-gate * DESCRIPTION: Translate a parse tree object that is an argument to an AML
6007b1019a6SJerry Jelinek * opcode to the equivalent interpreter object. This may include
6017c478bd9Sstevel@tonic-gate * looking up a name or entering a new name into the internal
6027c478bd9Sstevel@tonic-gate * namespace.
6037c478bd9Sstevel@tonic-gate *
6047c478bd9Sstevel@tonic-gate ******************************************************************************/
6057c478bd9Sstevel@tonic-gate
6067c478bd9Sstevel@tonic-gate ACPI_STATUS
AcpiDsCreateOperand(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Arg,UINT32 ArgIndex)6077c478bd9Sstevel@tonic-gate AcpiDsCreateOperand (
6087c478bd9Sstevel@tonic-gate ACPI_WALK_STATE *WalkState,
6097c478bd9Sstevel@tonic-gate ACPI_PARSE_OBJECT *Arg,
6107c478bd9Sstevel@tonic-gate UINT32 ArgIndex)
6117c478bd9Sstevel@tonic-gate {
6127c478bd9Sstevel@tonic-gate ACPI_STATUS Status = AE_OK;
6137c478bd9Sstevel@tonic-gate char *NameString;
6147c478bd9Sstevel@tonic-gate UINT32 NameLength;
6157c478bd9Sstevel@tonic-gate ACPI_OPERAND_OBJECT *ObjDesc;
6167c478bd9Sstevel@tonic-gate ACPI_PARSE_OBJECT *ParentOp;
6177c478bd9Sstevel@tonic-gate UINT16 Opcode;
6187c478bd9Sstevel@tonic-gate ACPI_INTERPRETER_MODE InterpreterMode;
6197c478bd9Sstevel@tonic-gate const ACPI_OPCODE_INFO *OpInfo;
6207c478bd9Sstevel@tonic-gate
6217c478bd9Sstevel@tonic-gate
62227f7c583Smyers ACPI_FUNCTION_TRACE_PTR (DsCreateOperand, Arg);
6237c478bd9Sstevel@tonic-gate
6247c478bd9Sstevel@tonic-gate
6257c478bd9Sstevel@tonic-gate /* A valid name must be looked up in the namespace */
6267c478bd9Sstevel@tonic-gate
6277c478bd9Sstevel@tonic-gate if ((Arg->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
628db2bae30SDana Myers (Arg->Common.Value.String) &&
629db2bae30SDana Myers !(Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
6307c478bd9Sstevel@tonic-gate {
6317c478bd9Sstevel@tonic-gate ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Getting a name: Arg=%p\n", Arg));
6327c478bd9Sstevel@tonic-gate
6337c478bd9Sstevel@tonic-gate /* Get the entire name string from the AML stream */
6347c478bd9Sstevel@tonic-gate
6357b1019a6SJerry Jelinek Status = AcpiExGetNameString (ACPI_TYPE_ANY,
6367b1019a6SJerry Jelinek Arg->Common.Value.Buffer, &NameString, &NameLength);
6377c478bd9Sstevel@tonic-gate
6387c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
6397c478bd9Sstevel@tonic-gate {
6407c478bd9Sstevel@tonic-gate return_ACPI_STATUS (Status);
6417c478bd9Sstevel@tonic-gate }
6427c478bd9Sstevel@tonic-gate
6437c478bd9Sstevel@tonic-gate /* All prefixes have been handled, and the name is in NameString */
6447c478bd9Sstevel@tonic-gate
6457c478bd9Sstevel@tonic-gate /*
6467b1019a6SJerry Jelinek * Special handling for BufferField declarations. This is a deferred
6477c478bd9Sstevel@tonic-gate * opcode that unfortunately defines the field name as the last
6487b1019a6SJerry Jelinek * parameter instead of the first. We get here when we are performing
6497c478bd9Sstevel@tonic-gate * the deferred execution, so the actual name of the field is already
6507b1019a6SJerry Jelinek * in the namespace. We don't want to attempt to look it up again
6517c478bd9Sstevel@tonic-gate * because we may be executing in a different scope than where the
6527c478bd9Sstevel@tonic-gate * actual opcode exists.
6537c478bd9Sstevel@tonic-gate */
6547c478bd9Sstevel@tonic-gate if ((WalkState->DeferredNode) &&
6557c478bd9Sstevel@tonic-gate (WalkState->DeferredNode->Type == ACPI_TYPE_BUFFER_FIELD) &&
6567b1019a6SJerry Jelinek (ArgIndex == (UINT32)
6577b1019a6SJerry Jelinek ((WalkState->Opcode == AML_CREATE_FIELD_OP) ? 3 : 2)))
6587c478bd9Sstevel@tonic-gate {
6597c478bd9Sstevel@tonic-gate ObjDesc = ACPI_CAST_PTR (
6607b1019a6SJerry Jelinek ACPI_OPERAND_OBJECT, WalkState->DeferredNode);
6617c478bd9Sstevel@tonic-gate Status = AE_OK;
6627c478bd9Sstevel@tonic-gate }
6637c478bd9Sstevel@tonic-gate else /* All other opcodes */
6647c478bd9Sstevel@tonic-gate {
6657c478bd9Sstevel@tonic-gate /*
6667c478bd9Sstevel@tonic-gate * Differentiate between a namespace "create" operation
6677c478bd9Sstevel@tonic-gate * versus a "lookup" operation (IMODE_LOAD_PASS2 vs.
6687c478bd9Sstevel@tonic-gate * IMODE_EXECUTE) in order to support the creation of
6697c478bd9Sstevel@tonic-gate * namespace objects during the execution of control methods.
6707c478bd9Sstevel@tonic-gate */
6717c478bd9Sstevel@tonic-gate ParentOp = Arg->Common.Parent;
6727c478bd9Sstevel@tonic-gate OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
6737b1019a6SJerry Jelinek
6747c478bd9Sstevel@tonic-gate if ((OpInfo->Flags & AML_NSNODE) &&
6757c478bd9Sstevel@tonic-gate (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
6767c478bd9Sstevel@tonic-gate (ParentOp->Common.AmlOpcode != AML_REGION_OP) &&
6777c478bd9Sstevel@tonic-gate (ParentOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP))
6787c478bd9Sstevel@tonic-gate {
6797c478bd9Sstevel@tonic-gate /* Enter name into namespace if not found */
6807c478bd9Sstevel@tonic-gate
6817c478bd9Sstevel@tonic-gate InterpreterMode = ACPI_IMODE_LOAD_PASS2;
6827c478bd9Sstevel@tonic-gate }
6837c478bd9Sstevel@tonic-gate else
6847c478bd9Sstevel@tonic-gate {
6857c478bd9Sstevel@tonic-gate /* Return a failure if name not found */
6867c478bd9Sstevel@tonic-gate
6877c478bd9Sstevel@tonic-gate InterpreterMode = ACPI_IMODE_EXECUTE;
6887c478bd9Sstevel@tonic-gate }
6897c478bd9Sstevel@tonic-gate
6907c478bd9Sstevel@tonic-gate Status = AcpiNsLookup (WalkState->ScopeInfo, NameString,
6917b1019a6SJerry Jelinek ACPI_TYPE_ANY, InterpreterMode,
6927b1019a6SJerry Jelinek ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, WalkState,
6937b1019a6SJerry Jelinek ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc));
6947c478bd9Sstevel@tonic-gate /*
6957c478bd9Sstevel@tonic-gate * The only case where we pass through (ignore) a NOT_FOUND
6967c478bd9Sstevel@tonic-gate * error is for the CondRefOf opcode.
6977c478bd9Sstevel@tonic-gate */
6987c478bd9Sstevel@tonic-gate if (Status == AE_NOT_FOUND)
6997c478bd9Sstevel@tonic-gate {
700*35786f68SRobert Mustacchi if (ParentOp->Common.AmlOpcode == AML_CONDITIONAL_REF_OF_OP)
7017c478bd9Sstevel@tonic-gate {
7027c478bd9Sstevel@tonic-gate /*
7037c478bd9Sstevel@tonic-gate * For the Conditional Reference op, it's OK if
7047c478bd9Sstevel@tonic-gate * the name is not found; We just need a way to
7057c478bd9Sstevel@tonic-gate * indicate this to the interpreter, set the
7067c478bd9Sstevel@tonic-gate * object to the root
7077c478bd9Sstevel@tonic-gate */
7087c478bd9Sstevel@tonic-gate ObjDesc = ACPI_CAST_PTR (
7097b1019a6SJerry Jelinek ACPI_OPERAND_OBJECT, AcpiGbl_RootNode);
7107c478bd9Sstevel@tonic-gate Status = AE_OK;
7117c478bd9Sstevel@tonic-gate }
7127b1019a6SJerry Jelinek else if (ParentOp->Common.AmlOpcode == AML_EXTERNAL_OP)
7137b1019a6SJerry Jelinek {
7147b1019a6SJerry Jelinek /*
7157b1019a6SJerry Jelinek * This opcode should never appear here. It is used only
7167b1019a6SJerry Jelinek * by AML disassemblers and is surrounded by an If(0)
7177b1019a6SJerry Jelinek * by the ASL compiler.
7187b1019a6SJerry Jelinek *
7197b1019a6SJerry Jelinek * Therefore, if we see it here, it is a serious error.
7207b1019a6SJerry Jelinek */
7217b1019a6SJerry Jelinek Status = AE_AML_BAD_OPCODE;
7227b1019a6SJerry Jelinek }
7237c478bd9Sstevel@tonic-gate else
7247c478bd9Sstevel@tonic-gate {
7257c478bd9Sstevel@tonic-gate /*
7267c478bd9Sstevel@tonic-gate * We just plain didn't find it -- which is a
7277c478bd9Sstevel@tonic-gate * very serious error at this point
7287c478bd9Sstevel@tonic-gate */
7297c478bd9Sstevel@tonic-gate Status = AE_AML_NAME_NOT_FOUND;
7307c478bd9Sstevel@tonic-gate }
7317c478bd9Sstevel@tonic-gate }
7327c478bd9Sstevel@tonic-gate
7337c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
7347c478bd9Sstevel@tonic-gate {
735*35786f68SRobert Mustacchi ACPI_ERROR_NAMESPACE (WalkState->ScopeInfo,
736*35786f68SRobert Mustacchi NameString, Status);
7377c478bd9Sstevel@tonic-gate }
7387c478bd9Sstevel@tonic-gate }
7397c478bd9Sstevel@tonic-gate
7407c478bd9Sstevel@tonic-gate /* Free the namestring created above */
7417c478bd9Sstevel@tonic-gate
74227f7c583Smyers ACPI_FREE (NameString);
7437c478bd9Sstevel@tonic-gate
7447c478bd9Sstevel@tonic-gate /* Check status from the lookup */
7457c478bd9Sstevel@tonic-gate
7467c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
7477c478bd9Sstevel@tonic-gate {
7487c478bd9Sstevel@tonic-gate return_ACPI_STATUS (Status);
7497c478bd9Sstevel@tonic-gate }
7507c478bd9Sstevel@tonic-gate
7517c478bd9Sstevel@tonic-gate /* Put the resulting object onto the current object stack */
7527c478bd9Sstevel@tonic-gate
7537c478bd9Sstevel@tonic-gate Status = AcpiDsObjStackPush (ObjDesc, WalkState);
7547c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
7557c478bd9Sstevel@tonic-gate {
7567c478bd9Sstevel@tonic-gate return_ACPI_STATUS (Status);
7577c478bd9Sstevel@tonic-gate }
7587b1019a6SJerry Jelinek
7597b1019a6SJerry Jelinek #ifdef ACPI_DEBUGGER
7607b1019a6SJerry Jelinek AcpiDbDisplayArgumentObject (ObjDesc, WalkState);
7617b1019a6SJerry Jelinek #endif
7627c478bd9Sstevel@tonic-gate }
7637c478bd9Sstevel@tonic-gate else
7647c478bd9Sstevel@tonic-gate {
7657c478bd9Sstevel@tonic-gate /* Check for null name case */
7667c478bd9Sstevel@tonic-gate
767db2bae30SDana Myers if ((Arg->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
768db2bae30SDana Myers !(Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
7697c478bd9Sstevel@tonic-gate {
7707c478bd9Sstevel@tonic-gate /*
7717c478bd9Sstevel@tonic-gate * If the name is null, this means that this is an
7727c478bd9Sstevel@tonic-gate * optional result parameter that was not specified
7737b1019a6SJerry Jelinek * in the original ASL. Create a Zero Constant for a
7747b1019a6SJerry Jelinek * placeholder. (Store to a constant is a Noop.)
7757c478bd9Sstevel@tonic-gate */
7767c478bd9Sstevel@tonic-gate Opcode = AML_ZERO_OP; /* Has no arguments! */
7777c478bd9Sstevel@tonic-gate
7787c478bd9Sstevel@tonic-gate ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
7797c478bd9Sstevel@tonic-gate "Null namepath: Arg=%p\n", Arg));
7807c478bd9Sstevel@tonic-gate }
7817c478bd9Sstevel@tonic-gate else
7827c478bd9Sstevel@tonic-gate {
7837c478bd9Sstevel@tonic-gate Opcode = Arg->Common.AmlOpcode;
7847c478bd9Sstevel@tonic-gate }
7857c478bd9Sstevel@tonic-gate
7867c478bd9Sstevel@tonic-gate /* Get the object type of the argument */
7877c478bd9Sstevel@tonic-gate
7887c478bd9Sstevel@tonic-gate OpInfo = AcpiPsGetOpcodeInfo (Opcode);
7897c478bd9Sstevel@tonic-gate if (OpInfo->ObjectType == ACPI_TYPE_INVALID)
7907c478bd9Sstevel@tonic-gate {
7917c478bd9Sstevel@tonic-gate return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
7927c478bd9Sstevel@tonic-gate }
7937c478bd9Sstevel@tonic-gate
7947b1019a6SJerry Jelinek if ((OpInfo->Flags & AML_HAS_RETVAL) ||
7957b1019a6SJerry Jelinek (Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
7967c478bd9Sstevel@tonic-gate {
7977c478bd9Sstevel@tonic-gate /*
7987c478bd9Sstevel@tonic-gate * Use value that was already previously returned
7997c478bd9Sstevel@tonic-gate * by the evaluation of this argument
8007c478bd9Sstevel@tonic-gate */
801db2bae30SDana Myers Status = AcpiDsResultPop (&ObjDesc, WalkState);
8027c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
8037c478bd9Sstevel@tonic-gate {
8047c478bd9Sstevel@tonic-gate /*
8057c478bd9Sstevel@tonic-gate * Only error is underflow, and this indicates
8067c478bd9Sstevel@tonic-gate * a missing or null operand!
8077c478bd9Sstevel@tonic-gate */
80830082d0cSmyers ACPI_EXCEPTION ((AE_INFO, Status,
80930082d0cSmyers "Missing or null operand"));
8107c478bd9Sstevel@tonic-gate return_ACPI_STATUS (Status);
8117c478bd9Sstevel@tonic-gate }
8127c478bd9Sstevel@tonic-gate }
8137c478bd9Sstevel@tonic-gate else
8147c478bd9Sstevel@tonic-gate {
8157c478bd9Sstevel@tonic-gate /* Create an ACPI_INTERNAL_OBJECT for the argument */
8167c478bd9Sstevel@tonic-gate
8177c478bd9Sstevel@tonic-gate ObjDesc = AcpiUtCreateInternalObject (OpInfo->ObjectType);
8187c478bd9Sstevel@tonic-gate if (!ObjDesc)
8197c478bd9Sstevel@tonic-gate {
8207c478bd9Sstevel@tonic-gate return_ACPI_STATUS (AE_NO_MEMORY);
8217c478bd9Sstevel@tonic-gate }
8227c478bd9Sstevel@tonic-gate
8237c478bd9Sstevel@tonic-gate /* Initialize the new object */
8247c478bd9Sstevel@tonic-gate
8257c478bd9Sstevel@tonic-gate Status = AcpiDsInitObjectFromOp (
8267b1019a6SJerry Jelinek WalkState, Arg, Opcode, &ObjDesc);
8277c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
8287c478bd9Sstevel@tonic-gate {
8297c478bd9Sstevel@tonic-gate AcpiUtDeleteObjectDesc (ObjDesc);
8307c478bd9Sstevel@tonic-gate return_ACPI_STATUS (Status);
8317c478bd9Sstevel@tonic-gate }
8327c478bd9Sstevel@tonic-gate }
8337c478bd9Sstevel@tonic-gate
8347c478bd9Sstevel@tonic-gate /* Put the operand object on the object stack */
8357c478bd9Sstevel@tonic-gate
8367c478bd9Sstevel@tonic-gate Status = AcpiDsObjStackPush (ObjDesc, WalkState);
8377c478bd9Sstevel@tonic-gate if (ACPI_FAILURE (Status))
8387c478bd9Sstevel@tonic-gate {
8397c478bd9Sstevel@tonic-gate return_ACPI_STATUS (Status);
8407c478bd9Sstevel@tonic-gate }
8417c478bd9Sstevel@tonic-gate
8427b1019a6SJerry Jelinek #ifdef ACPI_DEBUGGER
8437b1019a6SJerry Jelinek AcpiDbDisplayArgumentObject (ObjDesc, WalkState);
8447b1019a6SJerry Jelinek #endif
8457c478bd9Sstevel@tonic-gate }
8467c478bd9Sstevel@tonic-gate
8477c478bd9Sstevel@tonic-gate return_ACPI_STATUS (AE_OK);
8487c478bd9Sstevel@tonic-gate }
8497c478bd9Sstevel@tonic-gate
8507c478bd9Sstevel@tonic-gate
8517c478bd9Sstevel@tonic-gate /*******************************************************************************
8527c478bd9Sstevel@tonic-gate *
8537c478bd9Sstevel@tonic-gate * FUNCTION: AcpiDsCreateOperands
8547c478bd9Sstevel@tonic-gate *
8557c478bd9Sstevel@tonic-gate * PARAMETERS: WalkState - Current state
8567c478bd9Sstevel@tonic-gate * FirstArg - First argument of a parser argument tree
8577c478bd9Sstevel@tonic-gate *
8587c478bd9Sstevel@tonic-gate * RETURN: Status
8597c478bd9Sstevel@tonic-gate *
8607c478bd9Sstevel@tonic-gate * DESCRIPTION: Convert an operator's arguments from a parse tree format to
8617c478bd9Sstevel@tonic-gate * namespace objects and place those argument object on the object
8627c478bd9Sstevel@tonic-gate * stack in preparation for evaluation by the interpreter.
8637c478bd9Sstevel@tonic-gate *
8647c478bd9Sstevel@tonic-gate ******************************************************************************/
8657c478bd9Sstevel@tonic-gate
8667c478bd9Sstevel@tonic-gate ACPI_STATUS
AcpiDsCreateOperands(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * FirstArg)8677c478bd9Sstevel@tonic-gate AcpiDsCreateOperands (
8687c478bd9Sstevel@tonic-gate ACPI_WALK_STATE *WalkState,
8697c478bd9Sstevel@tonic-gate ACPI_PARSE_OBJECT *FirstArg)
8707c478bd9Sstevel@tonic-gate {
8717c478bd9Sstevel@tonic-gate ACPI_STATUS Status = AE_OK;
8727c478bd9Sstevel@tonic-gate ACPI_PARSE_OBJECT *Arg;
873db2bae30SDana Myers ACPI_PARSE_OBJECT *Arguments[ACPI_OBJ_NUM_OPERANDS];
8747c478bd9Sstevel@tonic-gate UINT32 ArgCount = 0;
875db2bae30SDana Myers UINT32 Index = WalkState->NumOperands;
876db2bae30SDana Myers UINT32 i;
8777c478bd9Sstevel@tonic-gate
8787c478bd9Sstevel@tonic-gate
87927f7c583Smyers ACPI_FUNCTION_TRACE_PTR (DsCreateOperands, FirstArg);
8807c478bd9Sstevel@tonic-gate
8817c478bd9Sstevel@tonic-gate
882db2bae30SDana Myers /* Get all arguments in the list */
8837c478bd9Sstevel@tonic-gate
8847c478bd9Sstevel@tonic-gate Arg = FirstArg;
8857c478bd9Sstevel@tonic-gate while (Arg)
8867c478bd9Sstevel@tonic-gate {
887db2bae30SDana Myers if (Index >= ACPI_OBJ_NUM_OPERANDS)
8887c478bd9Sstevel@tonic-gate {
889db2bae30SDana Myers return_ACPI_STATUS (AE_BAD_DATA);
8907c478bd9Sstevel@tonic-gate }
8917c478bd9Sstevel@tonic-gate
892db2bae30SDana Myers Arguments[Index] = Arg;
893db2bae30SDana Myers WalkState->Operands [Index] = NULL;
8947c478bd9Sstevel@tonic-gate
8957c478bd9Sstevel@tonic-gate /* Move on to next argument, if any */
8967c478bd9Sstevel@tonic-gate
8977c478bd9Sstevel@tonic-gate Arg = Arg->Common.Next;
8987c478bd9Sstevel@tonic-gate ArgCount++;
899db2bae30SDana Myers Index++;
900db2bae30SDana Myers }
901db2bae30SDana Myers
9027b1019a6SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
9037b1019a6SJerry Jelinek "NumOperands %d, ArgCount %d, Index %d\n",
9047b1019a6SJerry Jelinek WalkState->NumOperands, ArgCount, Index));
905db2bae30SDana Myers
9067b1019a6SJerry Jelinek /* Create the interpreter arguments, in reverse order */
907db2bae30SDana Myers
9087b1019a6SJerry Jelinek Index--;
909db2bae30SDana Myers for (i = 0; i < ArgCount; i++)
910db2bae30SDana Myers {
911db2bae30SDana Myers Arg = Arguments[Index];
912db2bae30SDana Myers WalkState->OperandIndex = (UINT8) Index;
913db2bae30SDana Myers
914db2bae30SDana Myers Status = AcpiDsCreateOperand (WalkState, Arg, Index);
915db2bae30SDana Myers if (ACPI_FAILURE (Status))
916db2bae30SDana Myers {
917db2bae30SDana Myers goto Cleanup;
918db2bae30SDana Myers }
919db2bae30SDana Myers
9207b1019a6SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
9217b1019a6SJerry Jelinek "Created Arg #%u (%p) %u args total\n",
9227b1019a6SJerry Jelinek Index, Arg, ArgCount));
923db2bae30SDana Myers Index--;
9247c478bd9Sstevel@tonic-gate }
9257c478bd9Sstevel@tonic-gate
9267c478bd9Sstevel@tonic-gate return_ACPI_STATUS (Status);
9277c478bd9Sstevel@tonic-gate
9287c478bd9Sstevel@tonic-gate
9297c478bd9Sstevel@tonic-gate Cleanup:
9307c478bd9Sstevel@tonic-gate /*
9317c478bd9Sstevel@tonic-gate * We must undo everything done above; meaning that we must
9327c478bd9Sstevel@tonic-gate * pop everything off of the operand stack and delete those
9337c478bd9Sstevel@tonic-gate * objects
9347c478bd9Sstevel@tonic-gate */
935db2bae30SDana Myers AcpiDsObjStackPopAndDelete (ArgCount, WalkState);
9367c478bd9Sstevel@tonic-gate
93726f3cdf0SGordon Ross ACPI_EXCEPTION ((AE_INFO, Status, "While creating Arg %u", Index));
9387c478bd9Sstevel@tonic-gate return_ACPI_STATUS (Status);
9397c478bd9Sstevel@tonic-gate }
9407c478bd9Sstevel@tonic-gate
9417c478bd9Sstevel@tonic-gate
942db2bae30SDana Myers /*****************************************************************************
943db2bae30SDana Myers *
944db2bae30SDana Myers * FUNCTION: AcpiDsEvaluateNamePath
945db2bae30SDana Myers *
946db2bae30SDana Myers * PARAMETERS: WalkState - Current state of the parse tree walk,
947db2bae30SDana Myers * the opcode of current operation should be
948db2bae30SDana Myers * AML_INT_NAMEPATH_OP
949db2bae30SDana Myers *
950db2bae30SDana Myers * RETURN: Status
951db2bae30SDana Myers *
952db2bae30SDana Myers * DESCRIPTION: Translate the -NamePath- parse tree object to the equivalent
953db2bae30SDana Myers * interpreter object, convert it to value, if needed, duplicate
954db2bae30SDana Myers * it, if needed, and push it onto the current result stack.
955db2bae30SDana Myers *
956db2bae30SDana Myers ****************************************************************************/
957db2bae30SDana Myers
958db2bae30SDana Myers ACPI_STATUS
AcpiDsEvaluateNamePath(ACPI_WALK_STATE * WalkState)959db2bae30SDana Myers AcpiDsEvaluateNamePath (
960db2bae30SDana Myers ACPI_WALK_STATE *WalkState)
961db2bae30SDana Myers {
962db2bae30SDana Myers ACPI_STATUS Status = AE_OK;
963db2bae30SDana Myers ACPI_PARSE_OBJECT *Op = WalkState->Op;
964db2bae30SDana Myers ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
965db2bae30SDana Myers ACPI_OPERAND_OBJECT *NewObjDesc;
966db2bae30SDana Myers UINT8 Type;
967db2bae30SDana Myers
968db2bae30SDana Myers
969db2bae30SDana Myers ACPI_FUNCTION_TRACE_PTR (DsEvaluateNamePath, WalkState);
970db2bae30SDana Myers
971db2bae30SDana Myers
972db2bae30SDana Myers if (!Op->Common.Parent)
973db2bae30SDana Myers {
974db2bae30SDana Myers /* This happens after certain exception processing */
975db2bae30SDana Myers
976db2bae30SDana Myers goto Exit;
977db2bae30SDana Myers }
978db2bae30SDana Myers
979db2bae30SDana Myers if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
980*35786f68SRobert Mustacchi (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP) ||
981db2bae30SDana Myers (Op->Common.Parent->Common.AmlOpcode == AML_REF_OF_OP))
982db2bae30SDana Myers {
983db2bae30SDana Myers /* TBD: Should we specify this feature as a bit of OpInfo->Flags of these opcodes? */
984db2bae30SDana Myers
985db2bae30SDana Myers goto Exit;
986db2bae30SDana Myers }
987db2bae30SDana Myers
988db2bae30SDana Myers Status = AcpiDsCreateOperand (WalkState, Op, 0);
989db2bae30SDana Myers if (ACPI_FAILURE (Status))
990db2bae30SDana Myers {
991db2bae30SDana Myers goto Exit;
992db2bae30SDana Myers }
993db2bae30SDana Myers
994db2bae30SDana Myers if (Op->Common.Flags & ACPI_PARSEOP_TARGET)
995db2bae30SDana Myers {
996db2bae30SDana Myers NewObjDesc = *Operand;
997db2bae30SDana Myers goto PushResult;
998db2bae30SDana Myers }
999db2bae30SDana Myers
1000aa2aa9a6SDana Myers Type = (*Operand)->Common.Type;
1001db2bae30SDana Myers
1002db2bae30SDana Myers Status = AcpiExResolveToValue (Operand, WalkState);
1003db2bae30SDana Myers if (ACPI_FAILURE (Status))
1004db2bae30SDana Myers {
1005db2bae30SDana Myers goto Exit;
1006db2bae30SDana Myers }
1007db2bae30SDana Myers
1008db2bae30SDana Myers if (Type == ACPI_TYPE_INTEGER)
1009db2bae30SDana Myers {
1010db2bae30SDana Myers /* It was incremented by AcpiExResolveToValue */
1011db2bae30SDana Myers
1012db2bae30SDana Myers AcpiUtRemoveReference (*Operand);
1013db2bae30SDana Myers
10147b1019a6SJerry Jelinek Status = AcpiUtCopyIobjectToIobject (
10157b1019a6SJerry Jelinek *Operand, &NewObjDesc, WalkState);
1016db2bae30SDana Myers if (ACPI_FAILURE (Status))
1017db2bae30SDana Myers {
1018db2bae30SDana Myers goto Exit;
1019db2bae30SDana Myers }
1020db2bae30SDana Myers }
1021db2bae30SDana Myers else
1022db2bae30SDana Myers {
1023db2bae30SDana Myers /*
1024db2bae30SDana Myers * The object either was anew created or is
1025db2bae30SDana Myers * a Namespace node - don't decrement it.
1026db2bae30SDana Myers */
1027db2bae30SDana Myers NewObjDesc = *Operand;
1028db2bae30SDana Myers }
1029db2bae30SDana Myers
1030db2bae30SDana Myers /* Cleanup for name-path operand */
1031db2bae30SDana Myers
1032db2bae30SDana Myers Status = AcpiDsObjStackPop (1, WalkState);
1033db2bae30SDana Myers if (ACPI_FAILURE (Status))
1034db2bae30SDana Myers {
1035db2bae30SDana Myers WalkState->ResultObj = NewObjDesc;
1036db2bae30SDana Myers goto Exit;
1037db2bae30SDana Myers }
1038db2bae30SDana Myers
1039db2bae30SDana Myers PushResult:
1040db2bae30SDana Myers
1041db2bae30SDana Myers WalkState->ResultObj = NewObjDesc;
1042db2bae30SDana Myers
1043db2bae30SDana Myers Status = AcpiDsResultPush (WalkState->ResultObj, WalkState);
1044db2bae30SDana Myers if (ACPI_SUCCESS (Status))
1045db2bae30SDana Myers {
1046db2bae30SDana Myers /* Force to take it from stack */
1047db2bae30SDana Myers
1048db2bae30SDana Myers Op->Common.Flags |= ACPI_PARSEOP_IN_STACK;
1049db2bae30SDana Myers }
1050db2bae30SDana Myers
1051db2bae30SDana Myers Exit:
1052db2bae30SDana Myers
1053db2bae30SDana Myers return_ACPI_STATUS (Status);
1054db2bae30SDana Myers }
1055