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