xref: /onnv-gate/usr/src/uts/intel/io/acpica/dispatcher/dsmthdat.c (revision 7851:e828bbb1689c)
1*7851SDana.Myers@Sun.COM /*******************************************************************************
2*7851SDana.Myers@Sun.COM  *
3*7851SDana.Myers@Sun.COM  * Module Name: dsmthdat - control method arguments and local variables
4*7851SDana.Myers@Sun.COM  *              $Revision: 1.94 $
5*7851SDana.Myers@Sun.COM  *
6*7851SDana.Myers@Sun.COM  ******************************************************************************/
7*7851SDana.Myers@Sun.COM 
8*7851SDana.Myers@Sun.COM /******************************************************************************
9*7851SDana.Myers@Sun.COM  *
10*7851SDana.Myers@Sun.COM  * 1. Copyright Notice
11*7851SDana.Myers@Sun.COM  *
12*7851SDana.Myers@Sun.COM  * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp.
13*7851SDana.Myers@Sun.COM  * All rights reserved.
14*7851SDana.Myers@Sun.COM  *
15*7851SDana.Myers@Sun.COM  * 2. License
16*7851SDana.Myers@Sun.COM  *
17*7851SDana.Myers@Sun.COM  * 2.1. This is your license from Intel Corp. under its intellectual property
18*7851SDana.Myers@Sun.COM  * rights.  You may have additional license terms from the party that provided
19*7851SDana.Myers@Sun.COM  * you this software, covering your right to use that party's intellectual
20*7851SDana.Myers@Sun.COM  * property rights.
21*7851SDana.Myers@Sun.COM  *
22*7851SDana.Myers@Sun.COM  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23*7851SDana.Myers@Sun.COM  * copy of the source code appearing in this file ("Covered Code") an
24*7851SDana.Myers@Sun.COM  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25*7851SDana.Myers@Sun.COM  * base code distributed originally by Intel ("Original Intel Code") to copy,
26*7851SDana.Myers@Sun.COM  * make derivatives, distribute, use and display any portion of the Covered
27*7851SDana.Myers@Sun.COM  * Code in any form, with the right to sublicense such rights; and
28*7851SDana.Myers@Sun.COM  *
29*7851SDana.Myers@Sun.COM  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30*7851SDana.Myers@Sun.COM  * license (with the right to sublicense), under only those claims of Intel
31*7851SDana.Myers@Sun.COM  * patents that are infringed by the Original Intel Code, to make, use, sell,
32*7851SDana.Myers@Sun.COM  * offer to sell, and import the Covered Code and derivative works thereof
33*7851SDana.Myers@Sun.COM  * solely to the minimum extent necessary to exercise the above copyright
34*7851SDana.Myers@Sun.COM  * license, and in no event shall the patent license extend to any additions
35*7851SDana.Myers@Sun.COM  * to or modifications of the Original Intel Code.  No other license or right
36*7851SDana.Myers@Sun.COM  * is granted directly or by implication, estoppel or otherwise;
37*7851SDana.Myers@Sun.COM  *
38*7851SDana.Myers@Sun.COM  * The above copyright and patent license is granted only if the following
39*7851SDana.Myers@Sun.COM  * conditions are met:
40*7851SDana.Myers@Sun.COM  *
41*7851SDana.Myers@Sun.COM  * 3. Conditions
42*7851SDana.Myers@Sun.COM  *
43*7851SDana.Myers@Sun.COM  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44*7851SDana.Myers@Sun.COM  * Redistribution of source code of any substantial portion of the Covered
45*7851SDana.Myers@Sun.COM  * Code or modification with rights to further distribute source must include
46*7851SDana.Myers@Sun.COM  * the above Copyright Notice, the above License, this list of Conditions,
47*7851SDana.Myers@Sun.COM  * and the following Disclaimer and Export Compliance provision.  In addition,
48*7851SDana.Myers@Sun.COM  * Licensee must cause all Covered Code to which Licensee contributes to
49*7851SDana.Myers@Sun.COM  * contain a file documenting the changes Licensee made to create that Covered
50*7851SDana.Myers@Sun.COM  * Code and the date of any change.  Licensee must include in that file the
51*7851SDana.Myers@Sun.COM  * documentation of any changes made by any predecessor Licensee.  Licensee
52*7851SDana.Myers@Sun.COM  * must include a prominent statement that the modification is derived,
53*7851SDana.Myers@Sun.COM  * directly or indirectly, from Original Intel Code.
54*7851SDana.Myers@Sun.COM  *
55*7851SDana.Myers@Sun.COM  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56*7851SDana.Myers@Sun.COM  * Redistribution of source code of any substantial portion of the Covered
57*7851SDana.Myers@Sun.COM  * Code or modification without rights to further distribute source must
58*7851SDana.Myers@Sun.COM  * include the following Disclaimer and Export Compliance provision in the
59*7851SDana.Myers@Sun.COM  * documentation and/or other materials provided with distribution.  In
60*7851SDana.Myers@Sun.COM  * addition, Licensee may not authorize further sublicense of source of any
61*7851SDana.Myers@Sun.COM  * portion of the Covered Code, and must include terms to the effect that the
62*7851SDana.Myers@Sun.COM  * license from Licensee to its licensee is limited to the intellectual
63*7851SDana.Myers@Sun.COM  * property embodied in the software Licensee provides to its licensee, and
64*7851SDana.Myers@Sun.COM  * not to intellectual property embodied in modifications its licensee may
65*7851SDana.Myers@Sun.COM  * make.
66*7851SDana.Myers@Sun.COM  *
67*7851SDana.Myers@Sun.COM  * 3.3. Redistribution of Executable. Redistribution in executable form of any
68*7851SDana.Myers@Sun.COM  * substantial portion of the Covered Code or modification must reproduce the
69*7851SDana.Myers@Sun.COM  * above Copyright Notice, and the following Disclaimer and Export Compliance
70*7851SDana.Myers@Sun.COM  * provision in the documentation and/or other materials provided with the
71*7851SDana.Myers@Sun.COM  * distribution.
72*7851SDana.Myers@Sun.COM  *
73*7851SDana.Myers@Sun.COM  * 3.4. Intel retains all right, title, and interest in and to the Original
74*7851SDana.Myers@Sun.COM  * Intel Code.
75*7851SDana.Myers@Sun.COM  *
76*7851SDana.Myers@Sun.COM  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77*7851SDana.Myers@Sun.COM  * Intel shall be used in advertising or otherwise to promote the sale, use or
78*7851SDana.Myers@Sun.COM  * other dealings in products derived from or relating to the Covered Code
79*7851SDana.Myers@Sun.COM  * without prior written authorization from Intel.
80*7851SDana.Myers@Sun.COM  *
81*7851SDana.Myers@Sun.COM  * 4. Disclaimer and Export Compliance
82*7851SDana.Myers@Sun.COM  *
83*7851SDana.Myers@Sun.COM  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84*7851SDana.Myers@Sun.COM  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85*7851SDana.Myers@Sun.COM  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86*7851SDana.Myers@Sun.COM  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87*7851SDana.Myers@Sun.COM  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88*7851SDana.Myers@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89*7851SDana.Myers@Sun.COM  * PARTICULAR PURPOSE.
90*7851SDana.Myers@Sun.COM  *
91*7851SDana.Myers@Sun.COM  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92*7851SDana.Myers@Sun.COM  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93*7851SDana.Myers@Sun.COM  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94*7851SDana.Myers@Sun.COM  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95*7851SDana.Myers@Sun.COM  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96*7851SDana.Myers@Sun.COM  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97*7851SDana.Myers@Sun.COM  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98*7851SDana.Myers@Sun.COM  * LIMITED REMEDY.
99*7851SDana.Myers@Sun.COM  *
100*7851SDana.Myers@Sun.COM  * 4.3. Licensee shall not export, either directly or indirectly, any of this
101*7851SDana.Myers@Sun.COM  * software or system incorporating such software without first obtaining any
102*7851SDana.Myers@Sun.COM  * required license or other approval from the U. S. Department of Commerce or
103*7851SDana.Myers@Sun.COM  * any other agency or department of the United States Government.  In the
104*7851SDana.Myers@Sun.COM  * event Licensee exports any such software from the United States or
105*7851SDana.Myers@Sun.COM  * re-exports any such software from a foreign destination, Licensee shall
106*7851SDana.Myers@Sun.COM  * ensure that the distribution and export/re-export of the software is in
107*7851SDana.Myers@Sun.COM  * compliance with all laws, regulations, orders, or other restrictions of the
108*7851SDana.Myers@Sun.COM  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109*7851SDana.Myers@Sun.COM  * any of its subsidiaries will export/re-export any technical data, process,
110*7851SDana.Myers@Sun.COM  * software, or service, directly or indirectly, to any country for which the
111*7851SDana.Myers@Sun.COM  * United States government or any agency thereof requires an export license,
112*7851SDana.Myers@Sun.COM  * other governmental approval, or letter of assurance, without first obtaining
113*7851SDana.Myers@Sun.COM  * such license, approval or letter.
114*7851SDana.Myers@Sun.COM  *
115*7851SDana.Myers@Sun.COM  *****************************************************************************/
116*7851SDana.Myers@Sun.COM 
117*7851SDana.Myers@Sun.COM #define __DSMTHDAT_C__
118*7851SDana.Myers@Sun.COM 
119*7851SDana.Myers@Sun.COM #include "acpi.h"
120*7851SDana.Myers@Sun.COM #include "acdispat.h"
121*7851SDana.Myers@Sun.COM #include "acnamesp.h"
122*7851SDana.Myers@Sun.COM #include "acinterp.h"
123*7851SDana.Myers@Sun.COM 
124*7851SDana.Myers@Sun.COM 
125*7851SDana.Myers@Sun.COM #define _COMPONENT          ACPI_DISPATCHER
126*7851SDana.Myers@Sun.COM         ACPI_MODULE_NAME    ("dsmthdat")
127*7851SDana.Myers@Sun.COM 
128*7851SDana.Myers@Sun.COM /* Local prototypes */
129*7851SDana.Myers@Sun.COM 
130*7851SDana.Myers@Sun.COM static void
131*7851SDana.Myers@Sun.COM AcpiDsMethodDataDeleteValue (
132*7851SDana.Myers@Sun.COM     UINT8                   Type,
133*7851SDana.Myers@Sun.COM     UINT32                  Index,
134*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState);
135*7851SDana.Myers@Sun.COM 
136*7851SDana.Myers@Sun.COM static ACPI_STATUS
137*7851SDana.Myers@Sun.COM AcpiDsMethodDataSetValue (
138*7851SDana.Myers@Sun.COM     UINT8                   Type,
139*7851SDana.Myers@Sun.COM     UINT32                  Index,
140*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *Object,
141*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState);
142*7851SDana.Myers@Sun.COM 
143*7851SDana.Myers@Sun.COM #ifdef ACPI_OBSOLETE_FUNCTIONS
144*7851SDana.Myers@Sun.COM ACPI_OBJECT_TYPE
145*7851SDana.Myers@Sun.COM AcpiDsMethodDataGetType (
146*7851SDana.Myers@Sun.COM     UINT16                  Opcode,
147*7851SDana.Myers@Sun.COM     UINT32                  Index,
148*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState);
149*7851SDana.Myers@Sun.COM #endif
150*7851SDana.Myers@Sun.COM 
151*7851SDana.Myers@Sun.COM 
152*7851SDana.Myers@Sun.COM /*******************************************************************************
153*7851SDana.Myers@Sun.COM  *
154*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsMethodDataInit
155*7851SDana.Myers@Sun.COM  *
156*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState           - Current walk state object
157*7851SDana.Myers@Sun.COM  *
158*7851SDana.Myers@Sun.COM  * RETURN:      Status
159*7851SDana.Myers@Sun.COM  *
160*7851SDana.Myers@Sun.COM  * DESCRIPTION: Initialize the data structures that hold the method's arguments
161*7851SDana.Myers@Sun.COM  *              and locals.  The data struct is an array of namespace nodes for
162*7851SDana.Myers@Sun.COM  *              each - this allows RefOf and DeRefOf to work properly for these
163*7851SDana.Myers@Sun.COM  *              special data types.
164*7851SDana.Myers@Sun.COM  *
165*7851SDana.Myers@Sun.COM  * NOTES:       WalkState fields are initialized to zero by the
166*7851SDana.Myers@Sun.COM  *              ACPI_ALLOCATE_ZEROED().
167*7851SDana.Myers@Sun.COM  *
168*7851SDana.Myers@Sun.COM  *              A pseudo-Namespace Node is assigned to each argument and local
169*7851SDana.Myers@Sun.COM  *              so that RefOf() can return a pointer to the Node.
170*7851SDana.Myers@Sun.COM  *
171*7851SDana.Myers@Sun.COM  ******************************************************************************/
172*7851SDana.Myers@Sun.COM 
173*7851SDana.Myers@Sun.COM void
174*7851SDana.Myers@Sun.COM AcpiDsMethodDataInit (
175*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
176*7851SDana.Myers@Sun.COM {
177*7851SDana.Myers@Sun.COM     UINT32                  i;
178*7851SDana.Myers@Sun.COM 
179*7851SDana.Myers@Sun.COM 
180*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsMethodDataInit);
181*7851SDana.Myers@Sun.COM 
182*7851SDana.Myers@Sun.COM 
183*7851SDana.Myers@Sun.COM     /* Init the method arguments */
184*7851SDana.Myers@Sun.COM 
185*7851SDana.Myers@Sun.COM     for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
186*7851SDana.Myers@Sun.COM     {
187*7851SDana.Myers@Sun.COM         ACPI_MOVE_32_TO_32 (&WalkState->Arguments[i].Name, NAMEOF_ARG_NTE);
188*7851SDana.Myers@Sun.COM         WalkState->Arguments[i].Name.Integer |= (i << 24);
189*7851SDana.Myers@Sun.COM         WalkState->Arguments[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
190*7851SDana.Myers@Sun.COM         WalkState->Arguments[i].Type = ACPI_TYPE_ANY;
191*7851SDana.Myers@Sun.COM         WalkState->Arguments[i].Flags =
192*7851SDana.Myers@Sun.COM             ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_ARG;
193*7851SDana.Myers@Sun.COM     }
194*7851SDana.Myers@Sun.COM 
195*7851SDana.Myers@Sun.COM     /* Init the method locals */
196*7851SDana.Myers@Sun.COM 
197*7851SDana.Myers@Sun.COM     for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
198*7851SDana.Myers@Sun.COM     {
199*7851SDana.Myers@Sun.COM         ACPI_MOVE_32_TO_32 (&WalkState->LocalVariables[i].Name, NAMEOF_LOCAL_NTE);
200*7851SDana.Myers@Sun.COM 
201*7851SDana.Myers@Sun.COM         WalkState->LocalVariables[i].Name.Integer |= (i << 24);
202*7851SDana.Myers@Sun.COM         WalkState->LocalVariables[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
203*7851SDana.Myers@Sun.COM         WalkState->LocalVariables[i].Type = ACPI_TYPE_ANY;
204*7851SDana.Myers@Sun.COM         WalkState->LocalVariables[i].Flags =
205*7851SDana.Myers@Sun.COM             ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_LOCAL;
206*7851SDana.Myers@Sun.COM     }
207*7851SDana.Myers@Sun.COM 
208*7851SDana.Myers@Sun.COM     return_VOID;
209*7851SDana.Myers@Sun.COM }
210*7851SDana.Myers@Sun.COM 
211*7851SDana.Myers@Sun.COM 
212*7851SDana.Myers@Sun.COM /*******************************************************************************
213*7851SDana.Myers@Sun.COM  *
214*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsMethodDataDeleteAll
215*7851SDana.Myers@Sun.COM  *
216*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState           - Current walk state object
217*7851SDana.Myers@Sun.COM  *
218*7851SDana.Myers@Sun.COM  * RETURN:      None
219*7851SDana.Myers@Sun.COM  *
220*7851SDana.Myers@Sun.COM  * DESCRIPTION: Delete method locals and arguments.  Arguments are only
221*7851SDana.Myers@Sun.COM  *              deleted if this method was called from another method.
222*7851SDana.Myers@Sun.COM  *
223*7851SDana.Myers@Sun.COM  ******************************************************************************/
224*7851SDana.Myers@Sun.COM 
225*7851SDana.Myers@Sun.COM void
226*7851SDana.Myers@Sun.COM AcpiDsMethodDataDeleteAll (
227*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
228*7851SDana.Myers@Sun.COM {
229*7851SDana.Myers@Sun.COM     UINT32                  Index;
230*7851SDana.Myers@Sun.COM 
231*7851SDana.Myers@Sun.COM 
232*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsMethodDataDeleteAll);
233*7851SDana.Myers@Sun.COM 
234*7851SDana.Myers@Sun.COM 
235*7851SDana.Myers@Sun.COM     /* Detach the locals */
236*7851SDana.Myers@Sun.COM 
237*7851SDana.Myers@Sun.COM     for (Index = 0; Index < ACPI_METHOD_NUM_LOCALS; Index++)
238*7851SDana.Myers@Sun.COM     {
239*7851SDana.Myers@Sun.COM         if (WalkState->LocalVariables[Index].Object)
240*7851SDana.Myers@Sun.COM         {
241*7851SDana.Myers@Sun.COM             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Local%d=%p\n",
242*7851SDana.Myers@Sun.COM                     Index, WalkState->LocalVariables[Index].Object));
243*7851SDana.Myers@Sun.COM 
244*7851SDana.Myers@Sun.COM             /* Detach object (if present) and remove a reference */
245*7851SDana.Myers@Sun.COM 
246*7851SDana.Myers@Sun.COM             AcpiNsDetachObject (&WalkState->LocalVariables[Index]);
247*7851SDana.Myers@Sun.COM         }
248*7851SDana.Myers@Sun.COM     }
249*7851SDana.Myers@Sun.COM 
250*7851SDana.Myers@Sun.COM     /* Detach the arguments */
251*7851SDana.Myers@Sun.COM 
252*7851SDana.Myers@Sun.COM     for (Index = 0; Index < ACPI_METHOD_NUM_ARGS; Index++)
253*7851SDana.Myers@Sun.COM     {
254*7851SDana.Myers@Sun.COM         if (WalkState->Arguments[Index].Object)
255*7851SDana.Myers@Sun.COM         {
256*7851SDana.Myers@Sun.COM             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Arg%d=%p\n",
257*7851SDana.Myers@Sun.COM                     Index, WalkState->Arguments[Index].Object));
258*7851SDana.Myers@Sun.COM 
259*7851SDana.Myers@Sun.COM             /* Detach object (if present) and remove a reference */
260*7851SDana.Myers@Sun.COM 
261*7851SDana.Myers@Sun.COM             AcpiNsDetachObject (&WalkState->Arguments[Index]);
262*7851SDana.Myers@Sun.COM         }
263*7851SDana.Myers@Sun.COM     }
264*7851SDana.Myers@Sun.COM 
265*7851SDana.Myers@Sun.COM     AcpiDsClearImplicitReturn (WalkState);
266*7851SDana.Myers@Sun.COM 
267*7851SDana.Myers@Sun.COM     return_VOID;
268*7851SDana.Myers@Sun.COM }
269*7851SDana.Myers@Sun.COM 
270*7851SDana.Myers@Sun.COM 
271*7851SDana.Myers@Sun.COM /*******************************************************************************
272*7851SDana.Myers@Sun.COM  *
273*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsMethodDataInitArgs
274*7851SDana.Myers@Sun.COM  *
275*7851SDana.Myers@Sun.COM  * PARAMETERS:  *Params         - Pointer to a parameter list for the method
276*7851SDana.Myers@Sun.COM  *              MaxParamCount   - The arg count for this method
277*7851SDana.Myers@Sun.COM  *              WalkState       - Current walk state object
278*7851SDana.Myers@Sun.COM  *
279*7851SDana.Myers@Sun.COM  * RETURN:      Status
280*7851SDana.Myers@Sun.COM  *
281*7851SDana.Myers@Sun.COM  * DESCRIPTION: Initialize arguments for a method.  The parameter list is a list
282*7851SDana.Myers@Sun.COM  *              of ACPI operand objects, either null terminated or whose length
283*7851SDana.Myers@Sun.COM  *              is defined by MaxParamCount.
284*7851SDana.Myers@Sun.COM  *
285*7851SDana.Myers@Sun.COM  ******************************************************************************/
286*7851SDana.Myers@Sun.COM 
287*7851SDana.Myers@Sun.COM ACPI_STATUS
288*7851SDana.Myers@Sun.COM AcpiDsMethodDataInitArgs (
289*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **Params,
290*7851SDana.Myers@Sun.COM     UINT32                  MaxParamCount,
291*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
292*7851SDana.Myers@Sun.COM {
293*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
294*7851SDana.Myers@Sun.COM     UINT32                  Index = 0;
295*7851SDana.Myers@Sun.COM 
296*7851SDana.Myers@Sun.COM 
297*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsMethodDataInitArgs, Params);
298*7851SDana.Myers@Sun.COM 
299*7851SDana.Myers@Sun.COM 
300*7851SDana.Myers@Sun.COM     if (!Params)
301*7851SDana.Myers@Sun.COM     {
302*7851SDana.Myers@Sun.COM         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "No param list passed to method\n"));
303*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_OK);
304*7851SDana.Myers@Sun.COM     }
305*7851SDana.Myers@Sun.COM 
306*7851SDana.Myers@Sun.COM     /* Copy passed parameters into the new method stack frame */
307*7851SDana.Myers@Sun.COM 
308*7851SDana.Myers@Sun.COM     while ((Index < ACPI_METHOD_NUM_ARGS) &&
309*7851SDana.Myers@Sun.COM            (Index < MaxParamCount)        &&
310*7851SDana.Myers@Sun.COM             Params[Index])
311*7851SDana.Myers@Sun.COM     {
312*7851SDana.Myers@Sun.COM         /*
313*7851SDana.Myers@Sun.COM          * A valid parameter.
314*7851SDana.Myers@Sun.COM          * Store the argument in the method/walk descriptor.
315*7851SDana.Myers@Sun.COM          * Do not copy the arg in order to implement call by reference
316*7851SDana.Myers@Sun.COM          */
317*7851SDana.Myers@Sun.COM         Status = AcpiDsMethodDataSetValue (ACPI_REFCLASS_ARG, Index,
318*7851SDana.Myers@Sun.COM                     Params[Index], WalkState);
319*7851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
320*7851SDana.Myers@Sun.COM         {
321*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (Status);
322*7851SDana.Myers@Sun.COM         }
323*7851SDana.Myers@Sun.COM 
324*7851SDana.Myers@Sun.COM         Index++;
325*7851SDana.Myers@Sun.COM     }
326*7851SDana.Myers@Sun.COM 
327*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%d args passed to method\n", Index));
328*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (AE_OK);
329*7851SDana.Myers@Sun.COM }
330*7851SDana.Myers@Sun.COM 
331*7851SDana.Myers@Sun.COM 
332*7851SDana.Myers@Sun.COM /*******************************************************************************
333*7851SDana.Myers@Sun.COM  *
334*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsMethodDataGetNode
335*7851SDana.Myers@Sun.COM  *
336*7851SDana.Myers@Sun.COM  * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
337*7851SDana.Myers@Sun.COM  *                                    ACPI_REFCLASS_ARG
338*7851SDana.Myers@Sun.COM  *              Index               - Which Local or Arg whose type to get
339*7851SDana.Myers@Sun.COM  *              WalkState           - Current walk state object
340*7851SDana.Myers@Sun.COM  *              Node                - Where the node is returned.
341*7851SDana.Myers@Sun.COM  *
342*7851SDana.Myers@Sun.COM  * RETURN:      Status and node
343*7851SDana.Myers@Sun.COM  *
344*7851SDana.Myers@Sun.COM  * DESCRIPTION: Get the Node associated with a local or arg.
345*7851SDana.Myers@Sun.COM  *
346*7851SDana.Myers@Sun.COM  ******************************************************************************/
347*7851SDana.Myers@Sun.COM 
348*7851SDana.Myers@Sun.COM ACPI_STATUS
349*7851SDana.Myers@Sun.COM AcpiDsMethodDataGetNode (
350*7851SDana.Myers@Sun.COM     UINT8                   Type,
351*7851SDana.Myers@Sun.COM     UINT32                  Index,
352*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
353*7851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     **Node)
354*7851SDana.Myers@Sun.COM {
355*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsMethodDataGetNode);
356*7851SDana.Myers@Sun.COM 
357*7851SDana.Myers@Sun.COM 
358*7851SDana.Myers@Sun.COM     /*
359*7851SDana.Myers@Sun.COM      * Method Locals and Arguments are supported
360*7851SDana.Myers@Sun.COM      */
361*7851SDana.Myers@Sun.COM     switch (Type)
362*7851SDana.Myers@Sun.COM     {
363*7851SDana.Myers@Sun.COM     case ACPI_REFCLASS_LOCAL:
364*7851SDana.Myers@Sun.COM 
365*7851SDana.Myers@Sun.COM         if (Index > ACPI_METHOD_MAX_LOCAL)
366*7851SDana.Myers@Sun.COM         {
367*7851SDana.Myers@Sun.COM             ACPI_ERROR ((AE_INFO,
368*7851SDana.Myers@Sun.COM                 "Local index %d is invalid (max %d)",
369*7851SDana.Myers@Sun.COM                 Index, ACPI_METHOD_MAX_LOCAL));
370*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (AE_AML_INVALID_INDEX);
371*7851SDana.Myers@Sun.COM         }
372*7851SDana.Myers@Sun.COM 
373*7851SDana.Myers@Sun.COM         /* Return a pointer to the pseudo-node */
374*7851SDana.Myers@Sun.COM 
375*7851SDana.Myers@Sun.COM         *Node = &WalkState->LocalVariables[Index];
376*7851SDana.Myers@Sun.COM         break;
377*7851SDana.Myers@Sun.COM 
378*7851SDana.Myers@Sun.COM     case ACPI_REFCLASS_ARG:
379*7851SDana.Myers@Sun.COM 
380*7851SDana.Myers@Sun.COM         if (Index > ACPI_METHOD_MAX_ARG)
381*7851SDana.Myers@Sun.COM         {
382*7851SDana.Myers@Sun.COM             ACPI_ERROR ((AE_INFO,
383*7851SDana.Myers@Sun.COM                 "Arg index %d is invalid (max %d)",
384*7851SDana.Myers@Sun.COM                 Index, ACPI_METHOD_MAX_ARG));
385*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (AE_AML_INVALID_INDEX);
386*7851SDana.Myers@Sun.COM         }
387*7851SDana.Myers@Sun.COM 
388*7851SDana.Myers@Sun.COM         /* Return a pointer to the pseudo-node */
389*7851SDana.Myers@Sun.COM 
390*7851SDana.Myers@Sun.COM         *Node = &WalkState->Arguments[Index];
391*7851SDana.Myers@Sun.COM         break;
392*7851SDana.Myers@Sun.COM 
393*7851SDana.Myers@Sun.COM     default:
394*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Type %d is invalid", Type));
395*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_TYPE);
396*7851SDana.Myers@Sun.COM     }
397*7851SDana.Myers@Sun.COM 
398*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (AE_OK);
399*7851SDana.Myers@Sun.COM }
400*7851SDana.Myers@Sun.COM 
401*7851SDana.Myers@Sun.COM 
402*7851SDana.Myers@Sun.COM /*******************************************************************************
403*7851SDana.Myers@Sun.COM  *
404*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsMethodDataSetValue
405*7851SDana.Myers@Sun.COM  *
406*7851SDana.Myers@Sun.COM  * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
407*7851SDana.Myers@Sun.COM  *                                    ACPI_REFCLASS_ARG
408*7851SDana.Myers@Sun.COM  *              Index               - Which Local or Arg to get
409*7851SDana.Myers@Sun.COM  *              Object              - Object to be inserted into the stack entry
410*7851SDana.Myers@Sun.COM  *              WalkState           - Current walk state object
411*7851SDana.Myers@Sun.COM  *
412*7851SDana.Myers@Sun.COM  * RETURN:      Status
413*7851SDana.Myers@Sun.COM  *
414*7851SDana.Myers@Sun.COM  * DESCRIPTION: Insert an object onto the method stack at entry Opcode:Index.
415*7851SDana.Myers@Sun.COM  *              Note: There is no "implicit conversion" for locals.
416*7851SDana.Myers@Sun.COM  *
417*7851SDana.Myers@Sun.COM  ******************************************************************************/
418*7851SDana.Myers@Sun.COM 
419*7851SDana.Myers@Sun.COM static ACPI_STATUS
420*7851SDana.Myers@Sun.COM AcpiDsMethodDataSetValue (
421*7851SDana.Myers@Sun.COM     UINT8                   Type,
422*7851SDana.Myers@Sun.COM     UINT32                  Index,
423*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *Object,
424*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
425*7851SDana.Myers@Sun.COM {
426*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
427*7851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
428*7851SDana.Myers@Sun.COM 
429*7851SDana.Myers@Sun.COM 
430*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsMethodDataSetValue);
431*7851SDana.Myers@Sun.COM 
432*7851SDana.Myers@Sun.COM 
433*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
434*7851SDana.Myers@Sun.COM         "NewObj %p Type %2.2X, Refs=%d [%s]\n", Object,
435*7851SDana.Myers@Sun.COM         Type, Object->Common.ReferenceCount,
436*7851SDana.Myers@Sun.COM         AcpiUtGetTypeName (Object->Common.Type)));
437*7851SDana.Myers@Sun.COM 
438*7851SDana.Myers@Sun.COM     /* Get the namespace node for the arg/local */
439*7851SDana.Myers@Sun.COM 
440*7851SDana.Myers@Sun.COM     Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
441*7851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
442*7851SDana.Myers@Sun.COM     {
443*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
444*7851SDana.Myers@Sun.COM     }
445*7851SDana.Myers@Sun.COM 
446*7851SDana.Myers@Sun.COM     /*
447*7851SDana.Myers@Sun.COM      * Increment ref count so object can't be deleted while installed.
448*7851SDana.Myers@Sun.COM      * NOTE: We do not copy the object in order to preserve the call by
449*7851SDana.Myers@Sun.COM      * reference semantics of ACPI Control Method invocation.
450*7851SDana.Myers@Sun.COM      * (See ACPI Specification 2.0C)
451*7851SDana.Myers@Sun.COM      */
452*7851SDana.Myers@Sun.COM     AcpiUtAddReference (Object);
453*7851SDana.Myers@Sun.COM 
454*7851SDana.Myers@Sun.COM     /* Install the object */
455*7851SDana.Myers@Sun.COM 
456*7851SDana.Myers@Sun.COM     Node->Object = Object;
457*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
458*7851SDana.Myers@Sun.COM }
459*7851SDana.Myers@Sun.COM 
460*7851SDana.Myers@Sun.COM 
461*7851SDana.Myers@Sun.COM /*******************************************************************************
462*7851SDana.Myers@Sun.COM  *
463*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsMethodDataGetValue
464*7851SDana.Myers@Sun.COM  *
465*7851SDana.Myers@Sun.COM  * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
466*7851SDana.Myers@Sun.COM  *                                    ACPI_REFCLASS_ARG
467*7851SDana.Myers@Sun.COM  *              Index               - Which localVar or argument to get
468*7851SDana.Myers@Sun.COM  *              WalkState           - Current walk state object
469*7851SDana.Myers@Sun.COM  *              DestDesc            - Where Arg or Local value is returned
470*7851SDana.Myers@Sun.COM  *
471*7851SDana.Myers@Sun.COM  * RETURN:      Status
472*7851SDana.Myers@Sun.COM  *
473*7851SDana.Myers@Sun.COM  * DESCRIPTION: Retrieve value of selected Arg or Local for this method
474*7851SDana.Myers@Sun.COM  *              Used only in AcpiExResolveToValue().
475*7851SDana.Myers@Sun.COM  *
476*7851SDana.Myers@Sun.COM  ******************************************************************************/
477*7851SDana.Myers@Sun.COM 
478*7851SDana.Myers@Sun.COM ACPI_STATUS
479*7851SDana.Myers@Sun.COM AcpiDsMethodDataGetValue (
480*7851SDana.Myers@Sun.COM     UINT8                   Type,
481*7851SDana.Myers@Sun.COM     UINT32                  Index,
482*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
483*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **DestDesc)
484*7851SDana.Myers@Sun.COM {
485*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
486*7851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
487*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *Object;
488*7851SDana.Myers@Sun.COM 
489*7851SDana.Myers@Sun.COM 
490*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsMethodDataGetValue);
491*7851SDana.Myers@Sun.COM 
492*7851SDana.Myers@Sun.COM 
493*7851SDana.Myers@Sun.COM     /* Validate the object descriptor */
494*7851SDana.Myers@Sun.COM 
495*7851SDana.Myers@Sun.COM     if (!DestDesc)
496*7851SDana.Myers@Sun.COM     {
497*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Null object descriptor pointer"));
498*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_BAD_PARAMETER);
499*7851SDana.Myers@Sun.COM     }
500*7851SDana.Myers@Sun.COM 
501*7851SDana.Myers@Sun.COM     /* Get the namespace node for the arg/local */
502*7851SDana.Myers@Sun.COM 
503*7851SDana.Myers@Sun.COM     Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
504*7851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
505*7851SDana.Myers@Sun.COM     {
506*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
507*7851SDana.Myers@Sun.COM     }
508*7851SDana.Myers@Sun.COM 
509*7851SDana.Myers@Sun.COM     /* Get the object from the node */
510*7851SDana.Myers@Sun.COM 
511*7851SDana.Myers@Sun.COM     Object = Node->Object;
512*7851SDana.Myers@Sun.COM 
513*7851SDana.Myers@Sun.COM     /* Examine the returned object, it must be valid. */
514*7851SDana.Myers@Sun.COM 
515*7851SDana.Myers@Sun.COM     if (!Object)
516*7851SDana.Myers@Sun.COM     {
517*7851SDana.Myers@Sun.COM         /*
518*7851SDana.Myers@Sun.COM          * Index points to uninitialized object.
519*7851SDana.Myers@Sun.COM          * This means that either 1) The expected argument was
520*7851SDana.Myers@Sun.COM          * not passed to the method, or 2) A local variable
521*7851SDana.Myers@Sun.COM          * was referenced by the method (via the ASL)
522*7851SDana.Myers@Sun.COM          * before it was initialized.  Either case is an error.
523*7851SDana.Myers@Sun.COM          */
524*7851SDana.Myers@Sun.COM 
525*7851SDana.Myers@Sun.COM         /* If slack enabled, init the LocalX/ArgX to an Integer of value zero */
526*7851SDana.Myers@Sun.COM 
527*7851SDana.Myers@Sun.COM         if (AcpiGbl_EnableInterpreterSlack)
528*7851SDana.Myers@Sun.COM         {
529*7851SDana.Myers@Sun.COM             Object = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
530*7851SDana.Myers@Sun.COM             if (!Object)
531*7851SDana.Myers@Sun.COM             {
532*7851SDana.Myers@Sun.COM                 return_ACPI_STATUS (AE_NO_MEMORY);
533*7851SDana.Myers@Sun.COM             }
534*7851SDana.Myers@Sun.COM 
535*7851SDana.Myers@Sun.COM             Object->Integer.Value = 0;
536*7851SDana.Myers@Sun.COM             Node->Object = Object;
537*7851SDana.Myers@Sun.COM         }
538*7851SDana.Myers@Sun.COM 
539*7851SDana.Myers@Sun.COM         /* Otherwise, return the error */
540*7851SDana.Myers@Sun.COM 
541*7851SDana.Myers@Sun.COM         else switch (Type)
542*7851SDana.Myers@Sun.COM         {
543*7851SDana.Myers@Sun.COM         case ACPI_REFCLASS_ARG:
544*7851SDana.Myers@Sun.COM 
545*7851SDana.Myers@Sun.COM             ACPI_ERROR ((AE_INFO,
546*7851SDana.Myers@Sun.COM                 "Uninitialized Arg[%d] at node %p",
547*7851SDana.Myers@Sun.COM                 Index, Node));
548*7851SDana.Myers@Sun.COM 
549*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (AE_AML_UNINITIALIZED_ARG);
550*7851SDana.Myers@Sun.COM 
551*7851SDana.Myers@Sun.COM         case ACPI_REFCLASS_LOCAL:
552*7851SDana.Myers@Sun.COM 
553*7851SDana.Myers@Sun.COM             ACPI_ERROR ((AE_INFO,
554*7851SDana.Myers@Sun.COM                 "Uninitialized Local[%d] at node %p", Index, Node));
555*7851SDana.Myers@Sun.COM 
556*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (AE_AML_UNINITIALIZED_LOCAL);
557*7851SDana.Myers@Sun.COM 
558*7851SDana.Myers@Sun.COM         default:
559*7851SDana.Myers@Sun.COM 
560*7851SDana.Myers@Sun.COM             ACPI_ERROR ((AE_INFO, "Not a Arg/Local opcode: %X", Type));
561*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (AE_AML_INTERNAL);
562*7851SDana.Myers@Sun.COM         }
563*7851SDana.Myers@Sun.COM     }
564*7851SDana.Myers@Sun.COM 
565*7851SDana.Myers@Sun.COM     /*
566*7851SDana.Myers@Sun.COM      * The Index points to an initialized and valid object.
567*7851SDana.Myers@Sun.COM      * Return an additional reference to the object
568*7851SDana.Myers@Sun.COM      */
569*7851SDana.Myers@Sun.COM     *DestDesc = Object;
570*7851SDana.Myers@Sun.COM     AcpiUtAddReference (Object);
571*7851SDana.Myers@Sun.COM 
572*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (AE_OK);
573*7851SDana.Myers@Sun.COM }
574*7851SDana.Myers@Sun.COM 
575*7851SDana.Myers@Sun.COM 
576*7851SDana.Myers@Sun.COM /*******************************************************************************
577*7851SDana.Myers@Sun.COM  *
578*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsMethodDataDeleteValue
579*7851SDana.Myers@Sun.COM  *
580*7851SDana.Myers@Sun.COM  * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
581*7851SDana.Myers@Sun.COM  *                                    ACPI_REFCLASS_ARG
582*7851SDana.Myers@Sun.COM  *              Index               - Which localVar or argument to delete
583*7851SDana.Myers@Sun.COM  *              WalkState           - Current walk state object
584*7851SDana.Myers@Sun.COM  *
585*7851SDana.Myers@Sun.COM  * RETURN:      None
586*7851SDana.Myers@Sun.COM  *
587*7851SDana.Myers@Sun.COM  * DESCRIPTION: Delete the entry at Opcode:Index.  Inserts
588*7851SDana.Myers@Sun.COM  *              a null into the stack slot after the object is deleted.
589*7851SDana.Myers@Sun.COM  *
590*7851SDana.Myers@Sun.COM  ******************************************************************************/
591*7851SDana.Myers@Sun.COM 
592*7851SDana.Myers@Sun.COM static void
593*7851SDana.Myers@Sun.COM AcpiDsMethodDataDeleteValue (
594*7851SDana.Myers@Sun.COM     UINT8                   Type,
595*7851SDana.Myers@Sun.COM     UINT32                  Index,
596*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
597*7851SDana.Myers@Sun.COM {
598*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
599*7851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
600*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *Object;
601*7851SDana.Myers@Sun.COM 
602*7851SDana.Myers@Sun.COM 
603*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsMethodDataDeleteValue);
604*7851SDana.Myers@Sun.COM 
605*7851SDana.Myers@Sun.COM 
606*7851SDana.Myers@Sun.COM     /* Get the namespace node for the arg/local */
607*7851SDana.Myers@Sun.COM 
608*7851SDana.Myers@Sun.COM     Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
609*7851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
610*7851SDana.Myers@Sun.COM     {
611*7851SDana.Myers@Sun.COM         return_VOID;
612*7851SDana.Myers@Sun.COM     }
613*7851SDana.Myers@Sun.COM 
614*7851SDana.Myers@Sun.COM     /* Get the associated object */
615*7851SDana.Myers@Sun.COM 
616*7851SDana.Myers@Sun.COM     Object = AcpiNsGetAttachedObject (Node);
617*7851SDana.Myers@Sun.COM 
618*7851SDana.Myers@Sun.COM     /*
619*7851SDana.Myers@Sun.COM      * Undefine the Arg or Local by setting its descriptor
620*7851SDana.Myers@Sun.COM      * pointer to NULL. Locals/Args can contain both
621*7851SDana.Myers@Sun.COM      * ACPI_OPERAND_OBJECTS and ACPI_NAMESPACE_NODEs
622*7851SDana.Myers@Sun.COM      */
623*7851SDana.Myers@Sun.COM     Node->Object = NULL;
624*7851SDana.Myers@Sun.COM 
625*7851SDana.Myers@Sun.COM     if ((Object) &&
626*7851SDana.Myers@Sun.COM         (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_OPERAND))
627*7851SDana.Myers@Sun.COM     {
628*7851SDana.Myers@Sun.COM         /*
629*7851SDana.Myers@Sun.COM          * There is a valid object.
630*7851SDana.Myers@Sun.COM          * Decrement the reference count by one to balance the
631*7851SDana.Myers@Sun.COM          * increment when the object was stored.
632*7851SDana.Myers@Sun.COM          */
633*7851SDana.Myers@Sun.COM         AcpiUtRemoveReference (Object);
634*7851SDana.Myers@Sun.COM     }
635*7851SDana.Myers@Sun.COM 
636*7851SDana.Myers@Sun.COM     return_VOID;
637*7851SDana.Myers@Sun.COM }
638*7851SDana.Myers@Sun.COM 
639*7851SDana.Myers@Sun.COM 
640*7851SDana.Myers@Sun.COM /*******************************************************************************
641*7851SDana.Myers@Sun.COM  *
642*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsStoreObjectToLocal
643*7851SDana.Myers@Sun.COM  *
644*7851SDana.Myers@Sun.COM  * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
645*7851SDana.Myers@Sun.COM  *                                    ACPI_REFCLASS_ARG
646*7851SDana.Myers@Sun.COM  *              Index               - Which Local or Arg to set
647*7851SDana.Myers@Sun.COM  *              ObjDesc             - Value to be stored
648*7851SDana.Myers@Sun.COM  *              WalkState           - Current walk state
649*7851SDana.Myers@Sun.COM  *
650*7851SDana.Myers@Sun.COM  * RETURN:      Status
651*7851SDana.Myers@Sun.COM  *
652*7851SDana.Myers@Sun.COM  * DESCRIPTION: Store a value in an Arg or Local.  The ObjDesc is installed
653*7851SDana.Myers@Sun.COM  *              as the new value for the Arg or Local and the reference count
654*7851SDana.Myers@Sun.COM  *              for ObjDesc is incremented.
655*7851SDana.Myers@Sun.COM  *
656*7851SDana.Myers@Sun.COM  ******************************************************************************/
657*7851SDana.Myers@Sun.COM 
658*7851SDana.Myers@Sun.COM ACPI_STATUS
659*7851SDana.Myers@Sun.COM AcpiDsStoreObjectToLocal (
660*7851SDana.Myers@Sun.COM     UINT8                   Type,
661*7851SDana.Myers@Sun.COM     UINT32                  Index,
662*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc,
663*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
664*7851SDana.Myers@Sun.COM {
665*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
666*7851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
667*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *CurrentObjDesc;
668*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *NewObjDesc;
669*7851SDana.Myers@Sun.COM 
670*7851SDana.Myers@Sun.COM 
671*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsStoreObjectToLocal);
672*7851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Type=%2.2X Index=%d Obj=%p\n",
673*7851SDana.Myers@Sun.COM         Type, Index, ObjDesc));
674*7851SDana.Myers@Sun.COM 
675*7851SDana.Myers@Sun.COM     /* Parameter validation */
676*7851SDana.Myers@Sun.COM 
677*7851SDana.Myers@Sun.COM     if (!ObjDesc)
678*7851SDana.Myers@Sun.COM     {
679*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_BAD_PARAMETER);
680*7851SDana.Myers@Sun.COM     }
681*7851SDana.Myers@Sun.COM 
682*7851SDana.Myers@Sun.COM     /* Get the namespace node for the arg/local */
683*7851SDana.Myers@Sun.COM 
684*7851SDana.Myers@Sun.COM     Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
685*7851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
686*7851SDana.Myers@Sun.COM     {
687*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
688*7851SDana.Myers@Sun.COM     }
689*7851SDana.Myers@Sun.COM 
690*7851SDana.Myers@Sun.COM     CurrentObjDesc = AcpiNsGetAttachedObject (Node);
691*7851SDana.Myers@Sun.COM     if (CurrentObjDesc == ObjDesc)
692*7851SDana.Myers@Sun.COM     {
693*7851SDana.Myers@Sun.COM         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p already installed!\n",
694*7851SDana.Myers@Sun.COM             ObjDesc));
695*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
696*7851SDana.Myers@Sun.COM     }
697*7851SDana.Myers@Sun.COM 
698*7851SDana.Myers@Sun.COM     /*
699*7851SDana.Myers@Sun.COM      * If the reference count on the object is more than one, we must
700*7851SDana.Myers@Sun.COM      * take a copy of the object before we store.  A reference count
701*7851SDana.Myers@Sun.COM      * of exactly 1 means that the object was just created during the
702*7851SDana.Myers@Sun.COM      * evaluation of an expression, and we can safely use it since it
703*7851SDana.Myers@Sun.COM      * is not used anywhere else.
704*7851SDana.Myers@Sun.COM      */
705*7851SDana.Myers@Sun.COM     NewObjDesc = ObjDesc;
706*7851SDana.Myers@Sun.COM     if (ObjDesc->Common.ReferenceCount > 1)
707*7851SDana.Myers@Sun.COM     {
708*7851SDana.Myers@Sun.COM         Status = AcpiUtCopyIobjectToIobject (ObjDesc, &NewObjDesc, WalkState);
709*7851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
710*7851SDana.Myers@Sun.COM         {
711*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (Status);
712*7851SDana.Myers@Sun.COM         }
713*7851SDana.Myers@Sun.COM     }
714*7851SDana.Myers@Sun.COM 
715*7851SDana.Myers@Sun.COM     /*
716*7851SDana.Myers@Sun.COM      * If there is an object already in this slot, we either
717*7851SDana.Myers@Sun.COM      * have to delete it, or if this is an argument and there
718*7851SDana.Myers@Sun.COM      * is an object reference stored there, we have to do
719*7851SDana.Myers@Sun.COM      * an indirect store!
720*7851SDana.Myers@Sun.COM      */
721*7851SDana.Myers@Sun.COM     if (CurrentObjDesc)
722*7851SDana.Myers@Sun.COM     {
723*7851SDana.Myers@Sun.COM         /*
724*7851SDana.Myers@Sun.COM          * Check for an indirect store if an argument
725*7851SDana.Myers@Sun.COM          * contains an object reference (stored as an Node).
726*7851SDana.Myers@Sun.COM          * We don't allow this automatic dereferencing for
727*7851SDana.Myers@Sun.COM          * locals, since a store to a local should overwrite
728*7851SDana.Myers@Sun.COM          * anything there, including an object reference.
729*7851SDana.Myers@Sun.COM          *
730*7851SDana.Myers@Sun.COM          * If both Arg0 and Local0 contain RefOf (Local4):
731*7851SDana.Myers@Sun.COM          *
732*7851SDana.Myers@Sun.COM          * Store (1, Arg0)             - Causes indirect store to local4
733*7851SDana.Myers@Sun.COM          * Store (1, Local0)           - Stores 1 in local0, overwriting
734*7851SDana.Myers@Sun.COM          *                                  the reference to local4
735*7851SDana.Myers@Sun.COM          * Store (1, DeRefof (Local0)) - Causes indirect store to local4
736*7851SDana.Myers@Sun.COM          *
737*7851SDana.Myers@Sun.COM          * Weird, but true.
738*7851SDana.Myers@Sun.COM          */
739*7851SDana.Myers@Sun.COM         if (Type == ACPI_REFCLASS_ARG)
740*7851SDana.Myers@Sun.COM         {
741*7851SDana.Myers@Sun.COM             /*
742*7851SDana.Myers@Sun.COM              * If we have a valid reference object that came from RefOf(),
743*7851SDana.Myers@Sun.COM              * do the indirect store
744*7851SDana.Myers@Sun.COM              */
745*7851SDana.Myers@Sun.COM             if ((ACPI_GET_DESCRIPTOR_TYPE (CurrentObjDesc) == ACPI_DESC_TYPE_OPERAND) &&
746*7851SDana.Myers@Sun.COM                 (CurrentObjDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
747*7851SDana.Myers@Sun.COM                 (CurrentObjDesc->Reference.Class == ACPI_REFCLASS_REFOF))
748*7851SDana.Myers@Sun.COM             {
749*7851SDana.Myers@Sun.COM                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
750*7851SDana.Myers@Sun.COM                         "Arg (%p) is an ObjRef(Node), storing in node %p\n",
751*7851SDana.Myers@Sun.COM                         NewObjDesc, CurrentObjDesc));
752*7851SDana.Myers@Sun.COM 
753*7851SDana.Myers@Sun.COM                 /*
754*7851SDana.Myers@Sun.COM                  * Store this object to the Node (perform the indirect store)
755*7851SDana.Myers@Sun.COM                  * NOTE: No implicit conversion is performed, as per the ACPI
756*7851SDana.Myers@Sun.COM                  * specification rules on storing to Locals/Args.
757*7851SDana.Myers@Sun.COM                  */
758*7851SDana.Myers@Sun.COM                 Status = AcpiExStoreObjectToNode (NewObjDesc,
759*7851SDana.Myers@Sun.COM                             CurrentObjDesc->Reference.Object, WalkState,
760*7851SDana.Myers@Sun.COM                             ACPI_NO_IMPLICIT_CONVERSION);
761*7851SDana.Myers@Sun.COM 
762*7851SDana.Myers@Sun.COM                 /* Remove local reference if we copied the object above */
763*7851SDana.Myers@Sun.COM 
764*7851SDana.Myers@Sun.COM                 if (NewObjDesc != ObjDesc)
765*7851SDana.Myers@Sun.COM                 {
766*7851SDana.Myers@Sun.COM                     AcpiUtRemoveReference (NewObjDesc);
767*7851SDana.Myers@Sun.COM                 }
768*7851SDana.Myers@Sun.COM                 return_ACPI_STATUS (Status);
769*7851SDana.Myers@Sun.COM             }
770*7851SDana.Myers@Sun.COM         }
771*7851SDana.Myers@Sun.COM 
772*7851SDana.Myers@Sun.COM         /* Delete the existing object before storing the new one */
773*7851SDana.Myers@Sun.COM 
774*7851SDana.Myers@Sun.COM         AcpiDsMethodDataDeleteValue (Type, Index, WalkState);
775*7851SDana.Myers@Sun.COM     }
776*7851SDana.Myers@Sun.COM 
777*7851SDana.Myers@Sun.COM     /*
778*7851SDana.Myers@Sun.COM      * Install the Obj descriptor (*NewObjDesc) into
779*7851SDana.Myers@Sun.COM      * the descriptor for the Arg or Local.
780*7851SDana.Myers@Sun.COM      * (increments the object reference count by one)
781*7851SDana.Myers@Sun.COM      */
782*7851SDana.Myers@Sun.COM     Status = AcpiDsMethodDataSetValue (Type, Index, NewObjDesc, WalkState);
783*7851SDana.Myers@Sun.COM 
784*7851SDana.Myers@Sun.COM     /* Remove local reference if we copied the object above */
785*7851SDana.Myers@Sun.COM 
786*7851SDana.Myers@Sun.COM     if (NewObjDesc != ObjDesc)
787*7851SDana.Myers@Sun.COM     {
788*7851SDana.Myers@Sun.COM         AcpiUtRemoveReference (NewObjDesc);
789*7851SDana.Myers@Sun.COM     }
790*7851SDana.Myers@Sun.COM 
791*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
792*7851SDana.Myers@Sun.COM }
793*7851SDana.Myers@Sun.COM 
794*7851SDana.Myers@Sun.COM 
795*7851SDana.Myers@Sun.COM #ifdef ACPI_OBSOLETE_FUNCTIONS
796*7851SDana.Myers@Sun.COM /*******************************************************************************
797*7851SDana.Myers@Sun.COM  *
798*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsMethodDataGetType
799*7851SDana.Myers@Sun.COM  *
800*7851SDana.Myers@Sun.COM  * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP
801*7851SDana.Myers@Sun.COM  *              Index               - Which Local or Arg whose type to get
802*7851SDana.Myers@Sun.COM  *              WalkState           - Current walk state object
803*7851SDana.Myers@Sun.COM  *
804*7851SDana.Myers@Sun.COM  * RETURN:      Data type of current value of the selected Arg or Local
805*7851SDana.Myers@Sun.COM  *
806*7851SDana.Myers@Sun.COM  * DESCRIPTION: Get the type of the object stored in the Local or Arg
807*7851SDana.Myers@Sun.COM  *
808*7851SDana.Myers@Sun.COM  ******************************************************************************/
809*7851SDana.Myers@Sun.COM 
810*7851SDana.Myers@Sun.COM ACPI_OBJECT_TYPE
811*7851SDana.Myers@Sun.COM AcpiDsMethodDataGetType (
812*7851SDana.Myers@Sun.COM     UINT16                  Opcode,
813*7851SDana.Myers@Sun.COM     UINT32                  Index,
814*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
815*7851SDana.Myers@Sun.COM {
816*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
817*7851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
818*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *Object;
819*7851SDana.Myers@Sun.COM 
820*7851SDana.Myers@Sun.COM 
821*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsMethodDataGetType);
822*7851SDana.Myers@Sun.COM 
823*7851SDana.Myers@Sun.COM 
824*7851SDana.Myers@Sun.COM     /* Get the namespace node for the arg/local */
825*7851SDana.Myers@Sun.COM 
826*7851SDana.Myers@Sun.COM     Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);
827*7851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
828*7851SDana.Myers@Sun.COM     {
829*7851SDana.Myers@Sun.COM         return_VALUE ((ACPI_TYPE_NOT_FOUND));
830*7851SDana.Myers@Sun.COM     }
831*7851SDana.Myers@Sun.COM 
832*7851SDana.Myers@Sun.COM     /* Get the object */
833*7851SDana.Myers@Sun.COM 
834*7851SDana.Myers@Sun.COM     Object = AcpiNsGetAttachedObject (Node);
835*7851SDana.Myers@Sun.COM     if (!Object)
836*7851SDana.Myers@Sun.COM     {
837*7851SDana.Myers@Sun.COM         /* Uninitialized local/arg, return TYPE_ANY */
838*7851SDana.Myers@Sun.COM 
839*7851SDana.Myers@Sun.COM         return_VALUE (ACPI_TYPE_ANY);
840*7851SDana.Myers@Sun.COM     }
841*7851SDana.Myers@Sun.COM 
842*7851SDana.Myers@Sun.COM     /* Get the object type */
843*7851SDana.Myers@Sun.COM 
844*7851SDana.Myers@Sun.COM     return_VALUE (ACPI_GET_OBJECT_TYPE (Object));
845*7851SDana.Myers@Sun.COM }
846*7851SDana.Myers@Sun.COM #endif
847*7851SDana.Myers@Sun.COM 
848*7851SDana.Myers@Sun.COM 
849