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