17c478bd9Sstevel@tonic-gate /*******************************************************************************
27c478bd9Sstevel@tonic-gate  *
37c478bd9Sstevel@tonic-gate  * Module Name: dsmthdat - control method arguments and local variables
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 "acdispat.h"
1557c478bd9Sstevel@tonic-gate #include "acnamesp.h"
1567c478bd9Sstevel@tonic-gate #include "acinterp.h"
1577c478bd9Sstevel@tonic-gate 
1587c478bd9Sstevel@tonic-gate 
1597c478bd9Sstevel@tonic-gate #define _COMPONENT          ACPI_DISPATCHER
1607c478bd9Sstevel@tonic-gate         ACPI_MODULE_NAME    ("dsmthdat")
1617c478bd9Sstevel@tonic-gate 
1627c478bd9Sstevel@tonic-gate /* Local prototypes */
1637c478bd9Sstevel@tonic-gate 
1647c478bd9Sstevel@tonic-gate static void
1657c478bd9Sstevel@tonic-gate AcpiDsMethodDataDeleteValue (
166db2bae30SDana Myers     UINT8                   Type,
1677c478bd9Sstevel@tonic-gate     UINT32                  Index,
1687c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState);
1697c478bd9Sstevel@tonic-gate 
1707c478bd9Sstevel@tonic-gate static ACPI_STATUS
1717c478bd9Sstevel@tonic-gate AcpiDsMethodDataSetValue (
172db2bae30SDana Myers     UINT8                   Type,
1737c478bd9Sstevel@tonic-gate     UINT32                  Index,
1747c478bd9Sstevel@tonic-gate     ACPI_OPERAND_OBJECT     *Object,
1757c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState);
1767c478bd9Sstevel@tonic-gate 
1777c478bd9Sstevel@tonic-gate #ifdef ACPI_OBSOLETE_FUNCTIONS
1787c478bd9Sstevel@tonic-gate ACPI_OBJECT_TYPE
1797c478bd9Sstevel@tonic-gate AcpiDsMethodDataGetType (
1807c478bd9Sstevel@tonic-gate     UINT16                  Opcode,
1817c478bd9Sstevel@tonic-gate     UINT32                  Index,
1827c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState);
1837c478bd9Sstevel@tonic-gate #endif
1847c478bd9Sstevel@tonic-gate 
1857c478bd9Sstevel@tonic-gate 
1867c478bd9Sstevel@tonic-gate /*******************************************************************************
1877c478bd9Sstevel@tonic-gate  *
1887c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiDsMethodDataInit
1897c478bd9Sstevel@tonic-gate  *
1907c478bd9Sstevel@tonic-gate  * PARAMETERS:  WalkState           - Current walk state object
1917c478bd9Sstevel@tonic-gate  *
1927c478bd9Sstevel@tonic-gate  * RETURN:      Status
1937c478bd9Sstevel@tonic-gate  *
1947c478bd9Sstevel@tonic-gate  * DESCRIPTION: Initialize the data structures that hold the method's arguments
1957b1019a6SJerry Jelinek  *              and locals. The data struct is an array of namespace nodes for
1967c478bd9Sstevel@tonic-gate  *              each - this allows RefOf and DeRefOf to work properly for these
1977c478bd9Sstevel@tonic-gate  *              special data types.
1987c478bd9Sstevel@tonic-gate  *
1997c478bd9Sstevel@tonic-gate  * NOTES:       WalkState fields are initialized to zero by the
20027f7c583Smyers  *              ACPI_ALLOCATE_ZEROED().
2017c478bd9Sstevel@tonic-gate  *
2027c478bd9Sstevel@tonic-gate  *              A pseudo-Namespace Node is assigned to each argument and local
2037c478bd9Sstevel@tonic-gate  *              so that RefOf() can return a pointer to the Node.
2047c478bd9Sstevel@tonic-gate  *
2057c478bd9Sstevel@tonic-gate  ******************************************************************************/
2067c478bd9Sstevel@tonic-gate 
2077c478bd9Sstevel@tonic-gate void
AcpiDsMethodDataInit(ACPI_WALK_STATE * WalkState)2087c478bd9Sstevel@tonic-gate AcpiDsMethodDataInit (
2097c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState)
2107c478bd9Sstevel@tonic-gate {
2117c478bd9Sstevel@tonic-gate     UINT32                  i;
2127c478bd9Sstevel@tonic-gate 
2137c478bd9Sstevel@tonic-gate 
21427f7c583Smyers     ACPI_FUNCTION_TRACE (DsMethodDataInit);
2157c478bd9Sstevel@tonic-gate 
2167c478bd9Sstevel@tonic-gate 
2177c478bd9Sstevel@tonic-gate     /* Init the method arguments */
2187c478bd9Sstevel@tonic-gate 
2197c478bd9Sstevel@tonic-gate     for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
2207c478bd9Sstevel@tonic-gate     {
2217b1019a6SJerry Jelinek         ACPI_MOVE_32_TO_32 (&WalkState->Arguments[i].Name,
2227b1019a6SJerry Jelinek             NAMEOF_ARG_NTE);
2237b1019a6SJerry Jelinek 
2247c478bd9Sstevel@tonic-gate         WalkState->Arguments[i].Name.Integer |= (i << 24);
22527f7c583Smyers         WalkState->Arguments[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
22627f7c583Smyers         WalkState->Arguments[i].Type = ACPI_TYPE_ANY;
22726f3cdf0SGordon Ross         WalkState->Arguments[i].Flags = ANOBJ_METHOD_ARG;
2287c478bd9Sstevel@tonic-gate     }
2297c478bd9Sstevel@tonic-gate 
2307c478bd9Sstevel@tonic-gate     /* Init the method locals */
2317c478bd9Sstevel@tonic-gate 
2327c478bd9Sstevel@tonic-gate     for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
2337c478bd9Sstevel@tonic-gate     {
2347b1019a6SJerry Jelinek         ACPI_MOVE_32_TO_32 (&WalkState->LocalVariables[i].Name,
2357b1019a6SJerry Jelinek             NAMEOF_LOCAL_NTE);
2367c478bd9Sstevel@tonic-gate 
2377c478bd9Sstevel@tonic-gate         WalkState->LocalVariables[i].Name.Integer |= (i << 24);
23827f7c583Smyers         WalkState->LocalVariables[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
23927f7c583Smyers         WalkState->LocalVariables[i].Type = ACPI_TYPE_ANY;
24026f3cdf0SGordon Ross         WalkState->LocalVariables[i].Flags = ANOBJ_METHOD_LOCAL;
2417c478bd9Sstevel@tonic-gate     }
2427c478bd9Sstevel@tonic-gate 
2437c478bd9Sstevel@tonic-gate     return_VOID;
2447c478bd9Sstevel@tonic-gate }
2457c478bd9Sstevel@tonic-gate 
2467c478bd9Sstevel@tonic-gate 
2477c478bd9Sstevel@tonic-gate /*******************************************************************************
2487c478bd9Sstevel@tonic-gate  *
2497c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiDsMethodDataDeleteAll
2507c478bd9Sstevel@tonic-gate  *
2517c478bd9Sstevel@tonic-gate  * PARAMETERS:  WalkState           - Current walk state object
2527c478bd9Sstevel@tonic-gate  *
2537c478bd9Sstevel@tonic-gate  * RETURN:      None
2547c478bd9Sstevel@tonic-gate  *
2557b1019a6SJerry Jelinek  * DESCRIPTION: Delete method locals and arguments. Arguments are only
2567c478bd9Sstevel@tonic-gate  *              deleted if this method was called from another method.
2577c478bd9Sstevel@tonic-gate  *
2587c478bd9Sstevel@tonic-gate  ******************************************************************************/
2597c478bd9Sstevel@tonic-gate 
2607c478bd9Sstevel@tonic-gate void
AcpiDsMethodDataDeleteAll(ACPI_WALK_STATE * WalkState)2617c478bd9Sstevel@tonic-gate AcpiDsMethodDataDeleteAll (
2627c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState)
2637c478bd9Sstevel@tonic-gate {
2647c478bd9Sstevel@tonic-gate     UINT32                  Index;
2657c478bd9Sstevel@tonic-gate 
2667c478bd9Sstevel@tonic-gate 
26727f7c583Smyers     ACPI_FUNCTION_TRACE (DsMethodDataDeleteAll);
2687c478bd9Sstevel@tonic-gate 
2697c478bd9Sstevel@tonic-gate 
2707c478bd9Sstevel@tonic-gate     /* Detach the locals */
2717c478bd9Sstevel@tonic-gate 
2727c478bd9Sstevel@tonic-gate     for (Index = 0; Index < ACPI_METHOD_NUM_LOCALS; Index++)
2737c478bd9Sstevel@tonic-gate     {
2747c478bd9Sstevel@tonic-gate         if (WalkState->LocalVariables[Index].Object)
2757c478bd9Sstevel@tonic-gate         {
27626f3cdf0SGordon Ross             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Local%u=%p\n",
2777b1019a6SJerry Jelinek                 Index, WalkState->LocalVariables[Index].Object));
2787c478bd9Sstevel@tonic-gate 
2797c478bd9Sstevel@tonic-gate             /* Detach object (if present) and remove a reference */
2807c478bd9Sstevel@tonic-gate 
2817c478bd9Sstevel@tonic-gate             AcpiNsDetachObject (&WalkState->LocalVariables[Index]);
2827c478bd9Sstevel@tonic-gate         }
2837c478bd9Sstevel@tonic-gate     }
2847c478bd9Sstevel@tonic-gate 
2857c478bd9Sstevel@tonic-gate     /* Detach the arguments */
2867c478bd9Sstevel@tonic-gate 
2877c478bd9Sstevel@tonic-gate     for (Index = 0; Index < ACPI_METHOD_NUM_ARGS; Index++)
2887c478bd9Sstevel@tonic-gate     {
2897c478bd9Sstevel@tonic-gate         if (WalkState->Arguments[Index].Object)
2907c478bd9Sstevel@tonic-gate         {
29126f3cdf0SGordon Ross             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Arg%u=%p\n",
2927b1019a6SJerry Jelinek                 Index, WalkState->Arguments[Index].Object));
2937c478bd9Sstevel@tonic-gate 
2947c478bd9Sstevel@tonic-gate             /* Detach object (if present) and remove a reference */
2957c478bd9Sstevel@tonic-gate 
2967c478bd9Sstevel@tonic-gate             AcpiNsDetachObject (&WalkState->Arguments[Index]);
2977c478bd9Sstevel@tonic-gate         }
2987c478bd9Sstevel@tonic-gate     }
2997c478bd9Sstevel@tonic-gate 
3007c478bd9Sstevel@tonic-gate     return_VOID;
3017c478bd9Sstevel@tonic-gate }
3027c478bd9Sstevel@tonic-gate 
3037c478bd9Sstevel@tonic-gate 
3047c478bd9Sstevel@tonic-gate /*******************************************************************************
3057c478bd9Sstevel@tonic-gate  *
3067c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiDsMethodDataInitArgs
3077c478bd9Sstevel@tonic-gate  *
3087c478bd9Sstevel@tonic-gate  * PARAMETERS:  *Params         - Pointer to a parameter list for the method
3097c478bd9Sstevel@tonic-gate  *              MaxParamCount   - The arg count for this method
3107c478bd9Sstevel@tonic-gate  *              WalkState       - Current walk state object
3117c478bd9Sstevel@tonic-gate  *
3127c478bd9Sstevel@tonic-gate  * RETURN:      Status
3137c478bd9Sstevel@tonic-gate  *
3147b1019a6SJerry Jelinek  * DESCRIPTION: Initialize arguments for a method. The parameter list is a list
3157c478bd9Sstevel@tonic-gate  *              of ACPI operand objects, either null terminated or whose length
3167c478bd9Sstevel@tonic-gate  *              is defined by MaxParamCount.
3177c478bd9Sstevel@tonic-gate  *
3187c478bd9Sstevel@tonic-gate  ******************************************************************************/
3197c478bd9Sstevel@tonic-gate 
3207c478bd9Sstevel@tonic-gate ACPI_STATUS
AcpiDsMethodDataInitArgs(ACPI_OPERAND_OBJECT ** Params,UINT32 MaxParamCount,ACPI_WALK_STATE * WalkState)3217c478bd9Sstevel@tonic-gate AcpiDsMethodDataInitArgs (
3227c478bd9Sstevel@tonic-gate     ACPI_OPERAND_OBJECT     **Params,
3237c478bd9Sstevel@tonic-gate     UINT32                  MaxParamCount,
3247c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState)
3257c478bd9Sstevel@tonic-gate {
3267c478bd9Sstevel@tonic-gate     ACPI_STATUS             Status;
3277c478bd9Sstevel@tonic-gate     UINT32                  Index = 0;
3287c478bd9Sstevel@tonic-gate 
3297c478bd9Sstevel@tonic-gate 
33027f7c583Smyers     ACPI_FUNCTION_TRACE_PTR (DsMethodDataInitArgs, Params);
3317c478bd9Sstevel@tonic-gate 
3327c478bd9Sstevel@tonic-gate 
3337c478bd9Sstevel@tonic-gate     if (!Params)
3347c478bd9Sstevel@tonic-gate     {
3357b1019a6SJerry Jelinek         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
3367b1019a6SJerry Jelinek             "No parameter list passed to method\n"));
3377c478bd9Sstevel@tonic-gate         return_ACPI_STATUS (AE_OK);
3387c478bd9Sstevel@tonic-gate     }
3397c478bd9Sstevel@tonic-gate 
3407c478bd9Sstevel@tonic-gate     /* Copy passed parameters into the new method stack frame */
3417c478bd9Sstevel@tonic-gate 
3427c478bd9Sstevel@tonic-gate     while ((Index < ACPI_METHOD_NUM_ARGS) &&
3437c478bd9Sstevel@tonic-gate            (Index < MaxParamCount)        &&
3447c478bd9Sstevel@tonic-gate             Params[Index])
3457c478bd9Sstevel@tonic-gate     {
3467c478bd9Sstevel@tonic-gate         /*
3477c478bd9Sstevel@tonic-gate          * A valid parameter.
3487c478bd9Sstevel@tonic-gate          * Store the argument in the method/walk descriptor.
3497c478bd9Sstevel@tonic-gate          * Do not copy the arg in order to implement call by reference
3507c478bd9Sstevel@tonic-gate          */
3517b1019a6SJerry Jelinek         Status = AcpiDsMethodDataSetValue (
3527b1019a6SJerry Jelinek             ACPI_REFCLASS_ARG, Index, Params[Index], WalkState);
3537c478bd9Sstevel@tonic-gate         if (ACPI_FAILURE (Status))
3547c478bd9Sstevel@tonic-gate         {
3557c478bd9Sstevel@tonic-gate             return_ACPI_STATUS (Status);
3567c478bd9Sstevel@tonic-gate         }
3577c478bd9Sstevel@tonic-gate 
3587c478bd9Sstevel@tonic-gate         Index++;
3597c478bd9Sstevel@tonic-gate     }
3607c478bd9Sstevel@tonic-gate 
36126f3cdf0SGordon Ross     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%u args passed to method\n", Index));
3627c478bd9Sstevel@tonic-gate     return_ACPI_STATUS (AE_OK);
3637c478bd9Sstevel@tonic-gate }
3647c478bd9Sstevel@tonic-gate 
3657c478bd9Sstevel@tonic-gate 
3667c478bd9Sstevel@tonic-gate /*******************************************************************************
3677c478bd9Sstevel@tonic-gate  *
3687c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiDsMethodDataGetNode
3697c478bd9Sstevel@tonic-gate  *
370db2bae30SDana Myers  * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
371db2bae30SDana Myers  *                                    ACPI_REFCLASS_ARG
3727c478bd9Sstevel@tonic-gate  *              Index               - Which Local or Arg whose type to get
3737c478bd9Sstevel@tonic-gate  *              WalkState           - Current walk state object
3747c478bd9Sstevel@tonic-gate  *              Node                - Where the node is returned.
3757c478bd9Sstevel@tonic-gate  *
3767c478bd9Sstevel@tonic-gate  * RETURN:      Status and node
3777c478bd9Sstevel@tonic-gate  *
3787c478bd9Sstevel@tonic-gate  * DESCRIPTION: Get the Node associated with a local or arg.
3797c478bd9Sstevel@tonic-gate  *
3807c478bd9Sstevel@tonic-gate  ******************************************************************************/
3817c478bd9Sstevel@tonic-gate 
3827c478bd9Sstevel@tonic-gate ACPI_STATUS
AcpiDsMethodDataGetNode(UINT8 Type,UINT32 Index,ACPI_WALK_STATE * WalkState,ACPI_NAMESPACE_NODE ** Node)3837c478bd9Sstevel@tonic-gate AcpiDsMethodDataGetNode (
384db2bae30SDana Myers     UINT8                   Type,
3857c478bd9Sstevel@tonic-gate     UINT32                  Index,
3867c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState,
3877c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     **Node)
3887c478bd9Sstevel@tonic-gate {
38927f7c583Smyers     ACPI_FUNCTION_TRACE (DsMethodDataGetNode);
3907c478bd9Sstevel@tonic-gate 
3917c478bd9Sstevel@tonic-gate 
3927c478bd9Sstevel@tonic-gate     /*
3937c478bd9Sstevel@tonic-gate      * Method Locals and Arguments are supported
3947c478bd9Sstevel@tonic-gate      */
395db2bae30SDana Myers     switch (Type)
3967c478bd9Sstevel@tonic-gate     {
397db2bae30SDana Myers     case ACPI_REFCLASS_LOCAL:
3987c478bd9Sstevel@tonic-gate 
3997c478bd9Sstevel@tonic-gate         if (Index > ACPI_METHOD_MAX_LOCAL)
4007c478bd9Sstevel@tonic-gate         {
40130082d0cSmyers             ACPI_ERROR ((AE_INFO,
40226f3cdf0SGordon Ross                 "Local index %u is invalid (max %u)",
4037c478bd9Sstevel@tonic-gate                 Index, ACPI_METHOD_MAX_LOCAL));
4047c478bd9Sstevel@tonic-gate             return_ACPI_STATUS (AE_AML_INVALID_INDEX);
4057c478bd9Sstevel@tonic-gate         }
4067c478bd9Sstevel@tonic-gate 
4077c478bd9Sstevel@tonic-gate         /* Return a pointer to the pseudo-node */
4087c478bd9Sstevel@tonic-gate 
4097c478bd9Sstevel@tonic-gate         *Node = &WalkState->LocalVariables[Index];
4107c478bd9Sstevel@tonic-gate         break;
4117c478bd9Sstevel@tonic-gate 
412db2bae30SDana Myers     case ACPI_REFCLASS_ARG:
4137c478bd9Sstevel@tonic-gate 
4147c478bd9Sstevel@tonic-gate         if (Index > ACPI_METHOD_MAX_ARG)
4157c478bd9Sstevel@tonic-gate         {
41630082d0cSmyers             ACPI_ERROR ((AE_INFO,
41726f3cdf0SGordon Ross                 "Arg index %u is invalid (max %u)",
4187c478bd9Sstevel@tonic-gate                 Index, ACPI_METHOD_MAX_ARG));
4197c478bd9Sstevel@tonic-gate             return_ACPI_STATUS (AE_AML_INVALID_INDEX);
4207c478bd9Sstevel@tonic-gate         }
4217c478bd9Sstevel@tonic-gate 
4227c478bd9Sstevel@tonic-gate         /* Return a pointer to the pseudo-node */
4237c478bd9Sstevel@tonic-gate 
4247c478bd9Sstevel@tonic-gate         *Node = &WalkState->Arguments[Index];
4257c478bd9Sstevel@tonic-gate         break;
4267c478bd9Sstevel@tonic-gate 
4277c478bd9Sstevel@tonic-gate     default:
4287b1019a6SJerry Jelinek 
42926f3cdf0SGordon Ross         ACPI_ERROR ((AE_INFO, "Type %u is invalid", Type));
430db2bae30SDana Myers         return_ACPI_STATUS (AE_TYPE);
4317c478bd9Sstevel@tonic-gate     }
4327c478bd9Sstevel@tonic-gate 
4337c478bd9Sstevel@tonic-gate     return_ACPI_STATUS (AE_OK);
4347c478bd9Sstevel@tonic-gate }
4357c478bd9Sstevel@tonic-gate 
4367c478bd9Sstevel@tonic-gate 
4377c478bd9Sstevel@tonic-gate /*******************************************************************************
4387c478bd9Sstevel@tonic-gate  *
4397c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiDsMethodDataSetValue
4407c478bd9Sstevel@tonic-gate  *
441db2bae30SDana Myers  * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
442db2bae30SDana Myers  *                                    ACPI_REFCLASS_ARG
4437c478bd9Sstevel@tonic-gate  *              Index               - Which Local or Arg to get
4447c478bd9Sstevel@tonic-gate  *              Object              - Object to be inserted into the stack entry
4457c478bd9Sstevel@tonic-gate  *              WalkState           - Current walk state object
4467c478bd9Sstevel@tonic-gate  *
4477c478bd9Sstevel@tonic-gate  * RETURN:      Status
4487c478bd9Sstevel@tonic-gate  *
4497c478bd9Sstevel@tonic-gate  * DESCRIPTION: Insert an object onto the method stack at entry Opcode:Index.
4507c478bd9Sstevel@tonic-gate  *              Note: There is no "implicit conversion" for locals.
4517c478bd9Sstevel@tonic-gate  *
4527c478bd9Sstevel@tonic-gate  ******************************************************************************/
4537c478bd9Sstevel@tonic-gate 
4547c478bd9Sstevel@tonic-gate static ACPI_STATUS
AcpiDsMethodDataSetValue(UINT8 Type,UINT32 Index,ACPI_OPERAND_OBJECT * Object,ACPI_WALK_STATE * WalkState)4557c478bd9Sstevel@tonic-gate AcpiDsMethodDataSetValue (
456db2bae30SDana Myers     UINT8                   Type,
4577c478bd9Sstevel@tonic-gate     UINT32                  Index,
4587c478bd9Sstevel@tonic-gate     ACPI_OPERAND_OBJECT     *Object,
4597c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState)
4607c478bd9Sstevel@tonic-gate {
4617c478bd9Sstevel@tonic-gate     ACPI_STATUS             Status;
4627c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *Node;
4637c478bd9Sstevel@tonic-gate 
4647c478bd9Sstevel@tonic-gate 
46527f7c583Smyers     ACPI_FUNCTION_TRACE (DsMethodDataSetValue);
4667c478bd9Sstevel@tonic-gate 
4677c478bd9Sstevel@tonic-gate 
4687c478bd9Sstevel@tonic-gate     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
46926f3cdf0SGordon Ross         "NewObj %p Type %2.2X, Refs=%u [%s]\n", Object,
470db2bae30SDana Myers         Type, Object->Common.ReferenceCount,
4717c478bd9Sstevel@tonic-gate         AcpiUtGetTypeName (Object->Common.Type)));
4727c478bd9Sstevel@tonic-gate 
4737c478bd9Sstevel@tonic-gate     /* Get the namespace node for the arg/local */
4747c478bd9Sstevel@tonic-gate 
475db2bae30SDana Myers     Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
4767c478bd9Sstevel@tonic-gate     if (ACPI_FAILURE (Status))
4777c478bd9Sstevel@tonic-gate     {
4787c478bd9Sstevel@tonic-gate         return_ACPI_STATUS (Status);
4797c478bd9Sstevel@tonic-gate     }
4807c478bd9Sstevel@tonic-gate 
4817c478bd9Sstevel@tonic-gate     /*
4827c478bd9Sstevel@tonic-gate      * Increment ref count so object can't be deleted while installed.
4837c478bd9Sstevel@tonic-gate      * NOTE: We do not copy the object in order to preserve the call by
4847c478bd9Sstevel@tonic-gate      * reference semantics of ACPI Control Method invocation.
4857c478bd9Sstevel@tonic-gate      * (See ACPI Specification 2.0C)
4867c478bd9Sstevel@tonic-gate      */
4877c478bd9Sstevel@tonic-gate     AcpiUtAddReference (Object);
4887c478bd9Sstevel@tonic-gate 
4897c478bd9Sstevel@tonic-gate     /* Install the object */
4907c478bd9Sstevel@tonic-gate 
4917c478bd9Sstevel@tonic-gate     Node->Object = Object;
4927c478bd9Sstevel@tonic-gate     return_ACPI_STATUS (Status);
4937c478bd9Sstevel@tonic-gate }
4947c478bd9Sstevel@tonic-gate 
4957c478bd9Sstevel@tonic-gate 
4967c478bd9Sstevel@tonic-gate /*******************************************************************************
4977c478bd9Sstevel@tonic-gate  *
4987c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiDsMethodDataGetValue
4997c478bd9Sstevel@tonic-gate  *
500db2bae30SDana Myers  * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
501db2bae30SDana Myers  *                                    ACPI_REFCLASS_ARG
5027c478bd9Sstevel@tonic-gate  *              Index               - Which localVar or argument to get
5037c478bd9Sstevel@tonic-gate  *              WalkState           - Current walk state object
5047c478bd9Sstevel@tonic-gate  *              DestDesc            - Where Arg or Local value is returned
5057c478bd9Sstevel@tonic-gate  *
5067c478bd9Sstevel@tonic-gate  * RETURN:      Status
5077c478bd9Sstevel@tonic-gate  *
5087c478bd9Sstevel@tonic-gate  * DESCRIPTION: Retrieve value of selected Arg or Local for this method
5097c478bd9Sstevel@tonic-gate  *              Used only in AcpiExResolveToValue().
5107c478bd9Sstevel@tonic-gate  *
5117c478bd9Sstevel@tonic-gate  ******************************************************************************/
5127c478bd9Sstevel@tonic-gate 
5137c478bd9Sstevel@tonic-gate ACPI_STATUS
AcpiDsMethodDataGetValue(UINT8 Type,UINT32 Index,ACPI_WALK_STATE * WalkState,ACPI_OPERAND_OBJECT ** DestDesc)5147c478bd9Sstevel@tonic-gate AcpiDsMethodDataGetValue (
515db2bae30SDana Myers     UINT8                   Type,
5167c478bd9Sstevel@tonic-gate     UINT32                  Index,
5177c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState,
5187c478bd9Sstevel@tonic-gate     ACPI_OPERAND_OBJECT     **DestDesc)
5197c478bd9Sstevel@tonic-gate {
5207c478bd9Sstevel@tonic-gate     ACPI_STATUS             Status;
5217c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *Node;
5227c478bd9Sstevel@tonic-gate     ACPI_OPERAND_OBJECT     *Object;
5237c478bd9Sstevel@tonic-gate 
5247c478bd9Sstevel@tonic-gate 
52527f7c583Smyers     ACPI_FUNCTION_TRACE (DsMethodDataGetValue);
5267c478bd9Sstevel@tonic-gate 
5277c478bd9Sstevel@tonic-gate 
5287c478bd9Sstevel@tonic-gate     /* Validate the object descriptor */
5297c478bd9Sstevel@tonic-gate 
5307c478bd9Sstevel@tonic-gate     if (!DestDesc)
5317c478bd9Sstevel@tonic-gate     {
53230082d0cSmyers         ACPI_ERROR ((AE_INFO, "Null object descriptor pointer"));
5337c478bd9Sstevel@tonic-gate         return_ACPI_STATUS (AE_BAD_PARAMETER);
5347c478bd9Sstevel@tonic-gate     }
5357c478bd9Sstevel@tonic-gate 
5367c478bd9Sstevel@tonic-gate     /* Get the namespace node for the arg/local */
5377c478bd9Sstevel@tonic-gate 
538db2bae30SDana Myers     Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
5397c478bd9Sstevel@tonic-gate     if (ACPI_FAILURE (Status))
5407c478bd9Sstevel@tonic-gate     {
5417c478bd9Sstevel@tonic-gate         return_ACPI_STATUS (Status);
5427c478bd9Sstevel@tonic-gate     }
5437c478bd9Sstevel@tonic-gate 
5447c478bd9Sstevel@tonic-gate     /* Get the object from the node */
5457c478bd9Sstevel@tonic-gate 
5467c478bd9Sstevel@tonic-gate     Object = Node->Object;
5477c478bd9Sstevel@tonic-gate 
5487c478bd9Sstevel@tonic-gate     /* Examine the returned object, it must be valid. */
5497c478bd9Sstevel@tonic-gate 
5507c478bd9Sstevel@tonic-gate     if (!Object)
5517c478bd9Sstevel@tonic-gate     {
5527c478bd9Sstevel@tonic-gate         /*
5537c478bd9Sstevel@tonic-gate          * Index points to uninitialized object.
5547c478bd9Sstevel@tonic-gate          * This means that either 1) The expected argument was
5557c478bd9Sstevel@tonic-gate          * not passed to the method, or 2) A local variable
5567c478bd9Sstevel@tonic-gate          * was referenced by the method (via the ASL)
5577b1019a6SJerry Jelinek          * before it was initialized. Either case is an error.
5587c478bd9Sstevel@tonic-gate          */
5597c478bd9Sstevel@tonic-gate 
5607c478bd9Sstevel@tonic-gate         /* If slack enabled, init the LocalX/ArgX to an Integer of value zero */
5617c478bd9Sstevel@tonic-gate 
5627c478bd9Sstevel@tonic-gate         if (AcpiGbl_EnableInterpreterSlack)
5637c478bd9Sstevel@tonic-gate         {
56457190917SDana Myers             Object = AcpiUtCreateIntegerObject ((UINT64) 0);
5657c478bd9Sstevel@tonic-gate             if (!Object)
5667c478bd9Sstevel@tonic-gate             {
5677c478bd9Sstevel@tonic-gate                 return_ACPI_STATUS (AE_NO_MEMORY);
5687c478bd9Sstevel@tonic-gate             }
5697c478bd9Sstevel@tonic-gate 
5707c478bd9Sstevel@tonic-gate             Node->Object = Object;
5717c478bd9Sstevel@tonic-gate         }
5727c478bd9Sstevel@tonic-gate 
5737c478bd9Sstevel@tonic-gate         /* Otherwise, return the error */
5747c478bd9Sstevel@tonic-gate 
575db2bae30SDana Myers         else switch (Type)
5767c478bd9Sstevel@tonic-gate         {
577db2bae30SDana Myers         case ACPI_REFCLASS_ARG:
5787c478bd9Sstevel@tonic-gate 
57930082d0cSmyers             ACPI_ERROR ((AE_INFO,
58026f3cdf0SGordon Ross                 "Uninitialized Arg[%u] at node %p",
5817c478bd9Sstevel@tonic-gate                 Index, Node));
5827c478bd9Sstevel@tonic-gate 
5837c478bd9Sstevel@tonic-gate             return_ACPI_STATUS (AE_AML_UNINITIALIZED_ARG);
5847c478bd9Sstevel@tonic-gate 
585db2bae30SDana Myers         case ACPI_REFCLASS_LOCAL:
58657190917SDana Myers             /*
58757190917SDana Myers              * No error message for this case, will be trapped again later to
58857190917SDana Myers              * detect and ignore cases of Store(LocalX,LocalX)
58957190917SDana Myers              */
5907c478bd9Sstevel@tonic-gate             return_ACPI_STATUS (AE_AML_UNINITIALIZED_LOCAL);
5917c478bd9Sstevel@tonic-gate 
5927c478bd9Sstevel@tonic-gate         default:
593db2bae30SDana Myers 
59426f3cdf0SGordon Ross             ACPI_ERROR ((AE_INFO, "Not a Arg/Local opcode: 0x%X", Type));
5957c478bd9Sstevel@tonic-gate             return_ACPI_STATUS (AE_AML_INTERNAL);
5967c478bd9Sstevel@tonic-gate         }
5977c478bd9Sstevel@tonic-gate     }
5987c478bd9Sstevel@tonic-gate 
5997c478bd9Sstevel@tonic-gate     /*
6007c478bd9Sstevel@tonic-gate      * The Index points to an initialized and valid object.
6017c478bd9Sstevel@tonic-gate      * Return an additional reference to the object
6027c478bd9Sstevel@tonic-gate      */
6037c478bd9Sstevel@tonic-gate     *DestDesc = Object;
6047c478bd9Sstevel@tonic-gate     AcpiUtAddReference (Object);
6057c478bd9Sstevel@tonic-gate 
6067c478bd9Sstevel@tonic-gate     return_ACPI_STATUS (AE_OK);
6077c478bd9Sstevel@tonic-gate }
6087c478bd9Sstevel@tonic-gate 
6097c478bd9Sstevel@tonic-gate 
6107c478bd9Sstevel@tonic-gate /*******************************************************************************
6117c478bd9Sstevel@tonic-gate  *
6127c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiDsMethodDataDeleteValue
6137c478bd9Sstevel@tonic-gate  *
614db2bae30SDana Myers  * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
615db2bae30SDana Myers  *                                    ACPI_REFCLASS_ARG
6167c478bd9Sstevel@tonic-gate  *              Index               - Which localVar or argument to delete
6177c478bd9Sstevel@tonic-gate  *              WalkState           - Current walk state object
6187c478bd9Sstevel@tonic-gate  *
6197c478bd9Sstevel@tonic-gate  * RETURN:      None
6207c478bd9Sstevel@tonic-gate  *
6217b1019a6SJerry Jelinek  * DESCRIPTION: Delete the entry at Opcode:Index. Inserts
6227c478bd9Sstevel@tonic-gate  *              a null into the stack slot after the object is deleted.
6237c478bd9Sstevel@tonic-gate  *
6247c478bd9Sstevel@tonic-gate  ******************************************************************************/
6257c478bd9Sstevel@tonic-gate 
6267c478bd9Sstevel@tonic-gate static void
AcpiDsMethodDataDeleteValue(UINT8 Type,UINT32 Index,ACPI_WALK_STATE * WalkState)6277c478bd9Sstevel@tonic-gate AcpiDsMethodDataDeleteValue (
628db2bae30SDana Myers     UINT8                   Type,
6297c478bd9Sstevel@tonic-gate     UINT32                  Index,
6307c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState)
6317c478bd9Sstevel@tonic-gate {
6327c478bd9Sstevel@tonic-gate     ACPI_STATUS             Status;
6337c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *Node;
6347c478bd9Sstevel@tonic-gate     ACPI_OPERAND_OBJECT     *Object;
6357c478bd9Sstevel@tonic-gate 
6367c478bd9Sstevel@tonic-gate 
63727f7c583Smyers     ACPI_FUNCTION_TRACE (DsMethodDataDeleteValue);
6387c478bd9Sstevel@tonic-gate 
6397c478bd9Sstevel@tonic-gate 
6407c478bd9Sstevel@tonic-gate     /* Get the namespace node for the arg/local */
6417c478bd9Sstevel@tonic-gate 
642db2bae30SDana Myers     Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
6437c478bd9Sstevel@tonic-gate     if (ACPI_FAILURE (Status))
6447c478bd9Sstevel@tonic-gate     {
6457c478bd9Sstevel@tonic-gate         return_VOID;
6467c478bd9Sstevel@tonic-gate     }
6477c478bd9Sstevel@tonic-gate 
6487c478bd9Sstevel@tonic-gate     /* Get the associated object */
6497c478bd9Sstevel@tonic-gate 
6507c478bd9Sstevel@tonic-gate     Object = AcpiNsGetAttachedObject (Node);
6517c478bd9Sstevel@tonic-gate 
6527c478bd9Sstevel@tonic-gate     /*
6537c478bd9Sstevel@tonic-gate      * Undefine the Arg or Local by setting its descriptor
6547c478bd9Sstevel@tonic-gate      * pointer to NULL. Locals/Args can contain both
6557c478bd9Sstevel@tonic-gate      * ACPI_OPERAND_OBJECTS and ACPI_NAMESPACE_NODEs
6567c478bd9Sstevel@tonic-gate      */
6577c478bd9Sstevel@tonic-gate     Node->Object = NULL;
6587c478bd9Sstevel@tonic-gate 
6597c478bd9Sstevel@tonic-gate     if ((Object) &&
6607c478bd9Sstevel@tonic-gate         (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_OPERAND))
6617c478bd9Sstevel@tonic-gate     {
6627c478bd9Sstevel@tonic-gate         /*
6637c478bd9Sstevel@tonic-gate          * There is a valid object.
6647c478bd9Sstevel@tonic-gate          * Decrement the reference count by one to balance the
6657c478bd9Sstevel@tonic-gate          * increment when the object was stored.
6667c478bd9Sstevel@tonic-gate          */
6677c478bd9Sstevel@tonic-gate         AcpiUtRemoveReference (Object);
6687c478bd9Sstevel@tonic-gate     }
6697c478bd9Sstevel@tonic-gate 
6707c478bd9Sstevel@tonic-gate     return_VOID;
6717c478bd9Sstevel@tonic-gate }
6727c478bd9Sstevel@tonic-gate 
6737c478bd9Sstevel@tonic-gate 
6747c478bd9Sstevel@tonic-gate /*******************************************************************************
6757c478bd9Sstevel@tonic-gate  *
6767c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiDsStoreObjectToLocal
6777c478bd9Sstevel@tonic-gate  *
678db2bae30SDana Myers  * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
679db2bae30SDana Myers  *                                    ACPI_REFCLASS_ARG
6807c478bd9Sstevel@tonic-gate  *              Index               - Which Local or Arg to set
6817c478bd9Sstevel@tonic-gate  *              ObjDesc             - Value to be stored
6827c478bd9Sstevel@tonic-gate  *              WalkState           - Current walk state
6837c478bd9Sstevel@tonic-gate  *
6847c478bd9Sstevel@tonic-gate  * RETURN:      Status
6857c478bd9Sstevel@tonic-gate  *
6867b1019a6SJerry Jelinek  * DESCRIPTION: Store a value in an Arg or Local. The ObjDesc is installed
6877c478bd9Sstevel@tonic-gate  *              as the new value for the Arg or Local and the reference count
6887c478bd9Sstevel@tonic-gate  *              for ObjDesc is incremented.
6897c478bd9Sstevel@tonic-gate  *
6907c478bd9Sstevel@tonic-gate  ******************************************************************************/
6917c478bd9Sstevel@tonic-gate 
6927c478bd9Sstevel@tonic-gate ACPI_STATUS
AcpiDsStoreObjectToLocal(UINT8 Type,UINT32 Index,ACPI_OPERAND_OBJECT * ObjDesc,ACPI_WALK_STATE * WalkState)6937c478bd9Sstevel@tonic-gate AcpiDsStoreObjectToLocal (
694db2bae30SDana Myers     UINT8                   Type,
6957c478bd9Sstevel@tonic-gate     UINT32                  Index,
6967c478bd9Sstevel@tonic-gate     ACPI_OPERAND_OBJECT     *ObjDesc,
6977c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState)
6987c478bd9Sstevel@tonic-gate {
6997c478bd9Sstevel@tonic-gate     ACPI_STATUS             Status;
7007c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *Node;
7017c478bd9Sstevel@tonic-gate     ACPI_OPERAND_OBJECT     *CurrentObjDesc;
7027c478bd9Sstevel@tonic-gate     ACPI_OPERAND_OBJECT     *NewObjDesc;
7037c478bd9Sstevel@tonic-gate 
7047c478bd9Sstevel@tonic-gate 
70527f7c583Smyers     ACPI_FUNCTION_TRACE (DsStoreObjectToLocal);
70626f3cdf0SGordon Ross     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Type=%2.2X Index=%u Obj=%p\n",
707db2bae30SDana Myers         Type, Index, ObjDesc));
7087c478bd9Sstevel@tonic-gate 
7097c478bd9Sstevel@tonic-gate     /* Parameter validation */
7107c478bd9Sstevel@tonic-gate 
7117c478bd9Sstevel@tonic-gate     if (!ObjDesc)
7127c478bd9Sstevel@tonic-gate     {
7137c478bd9Sstevel@tonic-gate         return_ACPI_STATUS (AE_BAD_PARAMETER);
7147c478bd9Sstevel@tonic-gate     }
7157c478bd9Sstevel@tonic-gate 
7167c478bd9Sstevel@tonic-gate     /* Get the namespace node for the arg/local */
7177c478bd9Sstevel@tonic-gate 
718db2bae30SDana Myers     Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
7197c478bd9Sstevel@tonic-gate     if (ACPI_FAILURE (Status))
7207c478bd9Sstevel@tonic-gate     {
7217c478bd9Sstevel@tonic-gate         return_ACPI_STATUS (Status);
7227c478bd9Sstevel@tonic-gate     }
7237c478bd9Sstevel@tonic-gate 
7247c478bd9Sstevel@tonic-gate     CurrentObjDesc = AcpiNsGetAttachedObject (Node);
7257c478bd9Sstevel@tonic-gate     if (CurrentObjDesc == ObjDesc)
7267c478bd9Sstevel@tonic-gate     {
7277c478bd9Sstevel@tonic-gate         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p already installed!\n",
7287c478bd9Sstevel@tonic-gate             ObjDesc));
7297c478bd9Sstevel@tonic-gate         return_ACPI_STATUS (Status);
7307c478bd9Sstevel@tonic-gate     }
7317c478bd9Sstevel@tonic-gate 
7327c478bd9Sstevel@tonic-gate     /*
7337c478bd9Sstevel@tonic-gate      * If the reference count on the object is more than one, we must
7347b1019a6SJerry Jelinek      * take a copy of the object before we store. A reference count
7357c478bd9Sstevel@tonic-gate      * of exactly 1 means that the object was just created during the
7367c478bd9Sstevel@tonic-gate      * evaluation of an expression, and we can safely use it since it
7377c478bd9Sstevel@tonic-gate      * is not used anywhere else.
7387c478bd9Sstevel@tonic-gate      */
7397c478bd9Sstevel@tonic-gate     NewObjDesc = ObjDesc;
7407c478bd9Sstevel@tonic-gate     if (ObjDesc->Common.ReferenceCount > 1)
7417c478bd9Sstevel@tonic-gate     {
7427b1019a6SJerry Jelinek         Status = AcpiUtCopyIobjectToIobject (
7437b1019a6SJerry Jelinek             ObjDesc, &NewObjDesc, WalkState);
7447c478bd9Sstevel@tonic-gate         if (ACPI_FAILURE (Status))
7457c478bd9Sstevel@tonic-gate         {
7467c478bd9Sstevel@tonic-gate             return_ACPI_STATUS (Status);
7477c478bd9Sstevel@tonic-gate         }
7487c478bd9Sstevel@tonic-gate     }
7497c478bd9Sstevel@tonic-gate 
7507c478bd9Sstevel@tonic-gate     /*
7517c478bd9Sstevel@tonic-gate      * If there is an object already in this slot, we either
7527c478bd9Sstevel@tonic-gate      * have to delete it, or if this is an argument and there
7537c478bd9Sstevel@tonic-gate      * is an object reference stored there, we have to do
7547c478bd9Sstevel@tonic-gate      * an indirect store!
7557c478bd9Sstevel@tonic-gate      */
7567c478bd9Sstevel@tonic-gate     if (CurrentObjDesc)
7577c478bd9Sstevel@tonic-gate     {
7587c478bd9Sstevel@tonic-gate         /*
7597c478bd9Sstevel@tonic-gate          * Check for an indirect store if an argument
7607c478bd9Sstevel@tonic-gate          * contains an object reference (stored as an Node).
7617c478bd9Sstevel@tonic-gate          * We don't allow this automatic dereferencing for
7627c478bd9Sstevel@tonic-gate          * locals, since a store to a local should overwrite
7637c478bd9Sstevel@tonic-gate          * anything there, including an object reference.
7647c478bd9Sstevel@tonic-gate          *
7657c478bd9Sstevel@tonic-gate          * If both Arg0 and Local0 contain RefOf (Local4):
7667c478bd9Sstevel@tonic-gate          *
7677c478bd9Sstevel@tonic-gate          * Store (1, Arg0)             - Causes indirect store to local4
7687c478bd9Sstevel@tonic-gate          * Store (1, Local0)           - Stores 1 in local0, overwriting
7697c478bd9Sstevel@tonic-gate          *                                  the reference to local4
7707c478bd9Sstevel@tonic-gate          * Store (1, DeRefof (Local0)) - Causes indirect store to local4
7717c478bd9Sstevel@tonic-gate          *
7727c478bd9Sstevel@tonic-gate          * Weird, but true.
7737c478bd9Sstevel@tonic-gate          */
774db2bae30SDana Myers         if (Type == ACPI_REFCLASS_ARG)
7757c478bd9Sstevel@tonic-gate         {
7767c478bd9Sstevel@tonic-gate             /*
7777c478bd9Sstevel@tonic-gate              * If we have a valid reference object that came from RefOf(),
7787c478bd9Sstevel@tonic-gate              * do the indirect store
7797c478bd9Sstevel@tonic-gate              */
7807b1019a6SJerry Jelinek             if ((ACPI_GET_DESCRIPTOR_TYPE (CurrentObjDesc) ==
7817b1019a6SJerry Jelinek                     ACPI_DESC_TYPE_OPERAND) &&
7827b1019a6SJerry Jelinek                 (CurrentObjDesc->Common.Type ==
7837b1019a6SJerry Jelinek                     ACPI_TYPE_LOCAL_REFERENCE) &&
7847b1019a6SJerry Jelinek                 (CurrentObjDesc->Reference.Class ==
7857b1019a6SJerry Jelinek                     ACPI_REFCLASS_REFOF))
7867c478bd9Sstevel@tonic-gate             {
7877c478bd9Sstevel@tonic-gate                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
7887b1019a6SJerry Jelinek                     "Arg (%p) is an ObjRef(Node), storing in node %p\n",
7897b1019a6SJerry Jelinek                     NewObjDesc, CurrentObjDesc));
7907c478bd9Sstevel@tonic-gate 
7917c478bd9Sstevel@tonic-gate                 /*
7927c478bd9Sstevel@tonic-gate                  * Store this object to the Node (perform the indirect store)
7937c478bd9Sstevel@tonic-gate                  * NOTE: No implicit conversion is performed, as per the ACPI
7947c478bd9Sstevel@tonic-gate                  * specification rules on storing to Locals/Args.
7957c478bd9Sstevel@tonic-gate                  */
7967c478bd9Sstevel@tonic-gate                 Status = AcpiExStoreObjectToNode (NewObjDesc,
7977b1019a6SJerry Jelinek                     CurrentObjDesc->Reference.Object, WalkState,
7987b1019a6SJerry Jelinek                     ACPI_NO_IMPLICIT_CONVERSION);
7997c478bd9Sstevel@tonic-gate 
8007c478bd9Sstevel@tonic-gate                 /* Remove local reference if we copied the object above */
8017c478bd9Sstevel@tonic-gate 
8027c478bd9Sstevel@tonic-gate                 if (NewObjDesc != ObjDesc)
8037c478bd9Sstevel@tonic-gate                 {
8047c478bd9Sstevel@tonic-gate                     AcpiUtRemoveReference (NewObjDesc);
8057c478bd9Sstevel@tonic-gate                 }
8067b1019a6SJerry Jelinek 
8077c478bd9Sstevel@tonic-gate                 return_ACPI_STATUS (Status);
8087c478bd9Sstevel@tonic-gate             }
8097c478bd9Sstevel@tonic-gate         }
8107c478bd9Sstevel@tonic-gate 
811db2bae30SDana Myers         /* Delete the existing object before storing the new one */
812db2bae30SDana Myers 
813db2bae30SDana Myers         AcpiDsMethodDataDeleteValue (Type, Index, WalkState);
8147c478bd9Sstevel@tonic-gate     }
8157c478bd9Sstevel@tonic-gate 
8167c478bd9Sstevel@tonic-gate     /*
8177c478bd9Sstevel@tonic-gate      * Install the Obj descriptor (*NewObjDesc) into
8187c478bd9Sstevel@tonic-gate      * the descriptor for the Arg or Local.
8197c478bd9Sstevel@tonic-gate      * (increments the object reference count by one)
8207c478bd9Sstevel@tonic-gate      */
821db2bae30SDana Myers     Status = AcpiDsMethodDataSetValue (Type, Index, NewObjDesc, WalkState);
8227c478bd9Sstevel@tonic-gate 
8237c478bd9Sstevel@tonic-gate     /* Remove local reference if we copied the object above */
8247c478bd9Sstevel@tonic-gate 
8257c478bd9Sstevel@tonic-gate     if (NewObjDesc != ObjDesc)
8267c478bd9Sstevel@tonic-gate     {
8277c478bd9Sstevel@tonic-gate         AcpiUtRemoveReference (NewObjDesc);
8287c478bd9Sstevel@tonic-gate     }
8297c478bd9Sstevel@tonic-gate 
8307c478bd9Sstevel@tonic-gate     return_ACPI_STATUS (Status);
8317c478bd9Sstevel@tonic-gate }
8327c478bd9Sstevel@tonic-gate 
8337c478bd9Sstevel@tonic-gate 
8347c478bd9Sstevel@tonic-gate #ifdef ACPI_OBSOLETE_FUNCTIONS
8357c478bd9Sstevel@tonic-gate /*******************************************************************************
8367c478bd9Sstevel@tonic-gate  *
8377c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiDsMethodDataGetType
8387c478bd9Sstevel@tonic-gate  *
839*35786f68SRobert Mustacchi  * PARAMETERS:  Opcode              - Either AML_FIRST LOCAL_OP or
840*35786f68SRobert Mustacchi  *                                    AML_FIRST_ARG_OP
8417c478bd9Sstevel@tonic-gate  *              Index               - Which Local or Arg whose type to get
8427c478bd9Sstevel@tonic-gate  *              WalkState           - Current walk state object
8437c478bd9Sstevel@tonic-gate  *
8447c478bd9Sstevel@tonic-gate  * RETURN:      Data type of current value of the selected Arg or Local
8457c478bd9Sstevel@tonic-gate  *
8467c478bd9Sstevel@tonic-gate  * DESCRIPTION: Get the type of the object stored in the Local or Arg
8477c478bd9Sstevel@tonic-gate  *
8487c478bd9Sstevel@tonic-gate  ******************************************************************************/
8497c478bd9Sstevel@tonic-gate 
8507c478bd9Sstevel@tonic-gate ACPI_OBJECT_TYPE
AcpiDsMethodDataGetType(UINT16 Opcode,UINT32 Index,ACPI_WALK_STATE * WalkState)8517c478bd9Sstevel@tonic-gate AcpiDsMethodDataGetType (
8527c478bd9Sstevel@tonic-gate     UINT16                  Opcode,
8537c478bd9Sstevel@tonic-gate     UINT32                  Index,
8547c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState)
8557c478bd9Sstevel@tonic-gate {
8567c478bd9Sstevel@tonic-gate     ACPI_STATUS             Status;
8577c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *Node;
8587c478bd9Sstevel@tonic-gate     ACPI_OPERAND_OBJECT     *Object;
8597c478bd9Sstevel@tonic-gate 
8607c478bd9Sstevel@tonic-gate 
86127f7c583Smyers     ACPI_FUNCTION_TRACE (DsMethodDataGetType);
8627c478bd9Sstevel@tonic-gate 
8637c478bd9Sstevel@tonic-gate 
8647c478bd9Sstevel@tonic-gate     /* Get the namespace node for the arg/local */
8657c478bd9Sstevel@tonic-gate 
8667c478bd9Sstevel@tonic-gate     Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);
8677c478bd9Sstevel@tonic-gate     if (ACPI_FAILURE (Status))
8687c478bd9Sstevel@tonic-gate     {
8697c478bd9Sstevel@tonic-gate         return_VALUE ((ACPI_TYPE_NOT_FOUND));
8707c478bd9Sstevel@tonic-gate     }
8717c478bd9Sstevel@tonic-gate 
8727c478bd9Sstevel@tonic-gate     /* Get the object */
8737c478bd9Sstevel@tonic-gate 
8747c478bd9Sstevel@tonic-gate     Object = AcpiNsGetAttachedObject (Node);
8757c478bd9Sstevel@tonic-gate     if (!Object)
8767c478bd9Sstevel@tonic-gate     {
8777c478bd9Sstevel@tonic-gate         /* Uninitialized local/arg, return TYPE_ANY */
8787c478bd9Sstevel@tonic-gate 
8797c478bd9Sstevel@tonic-gate         return_VALUE (ACPI_TYPE_ANY);
8807c478bd9Sstevel@tonic-gate     }
8817c478bd9Sstevel@tonic-gate 
8827c478bd9Sstevel@tonic-gate     /* Get the object type */
8837c478bd9Sstevel@tonic-gate 
884aa2aa9a6SDana Myers     return_VALUE (Object->Type);
8857c478bd9Sstevel@tonic-gate }
8867c478bd9Sstevel@tonic-gate #endif
887