exresolv.c revision 87031
1
2/******************************************************************************
3 *
4 * Module Name: exresolv - AML Interpreter object resolution
5 *              $Revision: 103 $
6 *
7 *****************************************************************************/
8
9/******************************************************************************
10 *
11 * 1. Copyright Notice
12 *
13 * Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp.
14 * All rights reserved.
15 *
16 * 2. License
17 *
18 * 2.1. This is your license from Intel Corp. under its intellectual property
19 * rights.  You may have additional license terms from the party that provided
20 * you this software, covering your right to use that party's intellectual
21 * property rights.
22 *
23 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
24 * copy of the source code appearing in this file ("Covered Code") an
25 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
26 * base code distributed originally by Intel ("Original Intel Code") to copy,
27 * make derivatives, distribute, use and display any portion of the Covered
28 * Code in any form, with the right to sublicense such rights; and
29 *
30 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
31 * license (with the right to sublicense), under only those claims of Intel
32 * patents that are infringed by the Original Intel Code, to make, use, sell,
33 * offer to sell, and import the Covered Code and derivative works thereof
34 * solely to the minimum extent necessary to exercise the above copyright
35 * license, and in no event shall the patent license extend to any additions
36 * to or modifications of the Original Intel Code.  No other license or right
37 * is granted directly or by implication, estoppel or otherwise;
38 *
39 * The above copyright and patent license is granted only if the following
40 * conditions are met:
41 *
42 * 3. Conditions
43 *
44 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
45 * Redistribution of source code of any substantial portion of the Covered
46 * Code or modification with rights to further distribute source must include
47 * the above Copyright Notice, the above License, this list of Conditions,
48 * and the following Disclaimer and Export Compliance provision.  In addition,
49 * Licensee must cause all Covered Code to which Licensee contributes to
50 * contain a file documenting the changes Licensee made to create that Covered
51 * Code and the date of any change.  Licensee must include in that file the
52 * documentation of any changes made by any predecessor Licensee.  Licensee
53 * must include a prominent statement that the modification is derived,
54 * directly or indirectly, from Original Intel Code.
55 *
56 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
57 * Redistribution of source code of any substantial portion of the Covered
58 * Code or modification without rights to further distribute source must
59 * include the following Disclaimer and Export Compliance provision in the
60 * documentation and/or other materials provided with distribution.  In
61 * addition, Licensee may not authorize further sublicense of source of any
62 * portion of the Covered Code, and must include terms to the effect that the
63 * license from Licensee to its licensee is limited to the intellectual
64 * property embodied in the software Licensee provides to its licensee, and
65 * not to intellectual property embodied in modifications its licensee may
66 * make.
67 *
68 * 3.3. Redistribution of Executable. Redistribution in executable form of any
69 * substantial portion of the Covered Code or modification must reproduce the
70 * above Copyright Notice, and the following Disclaimer and Export Compliance
71 * provision in the documentation and/or other materials provided with the
72 * distribution.
73 *
74 * 3.4. Intel retains all right, title, and interest in and to the Original
75 * Intel Code.
76 *
77 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
78 * Intel shall be used in advertising or otherwise to promote the sale, use or
79 * other dealings in products derived from or relating to the Covered Code
80 * without prior written authorization from Intel.
81 *
82 * 4. Disclaimer and Export Compliance
83 *
84 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
85 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
86 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
87 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
88 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
89 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
90 * PARTICULAR PURPOSE.
91 *
92 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
93 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
94 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
95 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
96 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
97 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
98 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
99 * LIMITED REMEDY.
100 *
101 * 4.3. Licensee shall not export, either directly or indirectly, any of this
102 * software or system incorporating such software without first obtaining any
103 * required license or other approval from the U. S. Department of Commerce or
104 * any other agency or department of the United States Government.  In the
105 * event Licensee exports any such software from the United States or
106 * re-exports any such software from a foreign destination, Licensee shall
107 * ensure that the distribution and export/re-export of the software is in
108 * compliance with all laws, regulations, orders, or other restrictions of the
109 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
110 * any of its subsidiaries will export/re-export any technical data, process,
111 * software, or service, directly or indirectly, to any country for which the
112 * United States government or any agency thereof requires an export license,
113 * other governmental approval, or letter of assurance, without first obtaining
114 * such license, approval or letter.
115 *
116 *****************************************************************************/
117
118#define __EXRESOLV_C__
119
120#include "acpi.h"
121#include "amlcode.h"
122#include "acparser.h"
123#include "acdispat.h"
124#include "acinterp.h"
125#include "acnamesp.h"
126#include "actables.h"
127#include "acevents.h"
128
129
130#define _COMPONENT          ACPI_EXECUTER
131        MODULE_NAME         ("exresolv")
132
133
134
135/*******************************************************************************
136 *
137 * FUNCTION:    AcpiExResolveToValue
138 *
139 * PARAMETERS:  **StackPtr          - Points to entry on ObjStack, which can
140 *                                    be either an (ACPI_OPERAND_OBJECT *)
141 *                                    or an ACPI_HANDLE.
142 *              WalkState           - Current method state
143 *
144 * RETURN:      Status
145 *
146 * DESCRIPTION: Convert Reference objects to values
147 *
148 ******************************************************************************/
149
150ACPI_STATUS
151AcpiExResolveToValue (
152    ACPI_OPERAND_OBJECT     **StackPtr,
153    ACPI_WALK_STATE         *WalkState)
154{
155    ACPI_STATUS             Status;
156
157
158    FUNCTION_TRACE_PTR ("ExResolveToValue", StackPtr);
159
160
161    if (!StackPtr || !*StackPtr)
162    {
163        ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null pointer\n"));
164        return_ACPI_STATUS (AE_AML_NO_OPERAND);
165    }
166
167    /*
168     * The entity pointed to by the StackPtr can be either
169     * 1) A valid ACPI_OPERAND_OBJECT, or
170     * 2) A ACPI_NAMESPACE_NODE (NamedObj)
171     */
172    if (VALID_DESCRIPTOR_TYPE (*StackPtr, ACPI_DESC_TYPE_INTERNAL))
173    {
174        Status = AcpiExResolveObjectToValue (StackPtr, WalkState);
175        if (ACPI_FAILURE (Status))
176        {
177            return_ACPI_STATUS (Status);
178        }
179    }
180
181    /*
182     * Object on the stack may have changed if AcpiExResolveObjectToValue()
183     * was called (i.e., we can't use an _else_ here.)
184     */
185    if (VALID_DESCRIPTOR_TYPE (*StackPtr, ACPI_DESC_TYPE_NAMED))
186    {
187        Status = AcpiExResolveNodeToValue ((ACPI_NAMESPACE_NODE **) StackPtr,
188                        WalkState);
189        if (ACPI_FAILURE (Status))
190        {
191            return_ACPI_STATUS (Status);
192        }
193    }
194
195    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Resolved object %p\n", *StackPtr));
196    return_ACPI_STATUS (AE_OK);
197}
198
199
200/*******************************************************************************
201 *
202 * FUNCTION:    AcpiExResolveObjectToValue
203 *
204 * PARAMETERS:  StackPtr        - Pointer to a stack location that contains a
205 *                                ptr to an internal object.
206 *              WalkState       - Current method state
207 *
208 * RETURN:      Status
209 *
210 * DESCRIPTION: Retrieve the value from an internal object.  The Reference type
211 *              uses the associated AML opcode to determine the value.
212 *
213 ******************************************************************************/
214
215ACPI_STATUS
216AcpiExResolveObjectToValue (
217    ACPI_OPERAND_OBJECT     **StackPtr,
218    ACPI_WALK_STATE         *WalkState)
219{
220    ACPI_STATUS             Status = AE_OK;
221    ACPI_OPERAND_OBJECT     *StackDesc;
222    void                    *TempNode;
223    ACPI_OPERAND_OBJECT     *ObjDesc;
224    UINT16                  Opcode;
225
226
227    FUNCTION_TRACE ("ExResolveObjectToValue");
228
229
230    StackDesc = *StackPtr;
231
232    /* This is an ACPI_OPERAND_OBJECT  */
233
234    switch (StackDesc->Common.Type)
235    {
236    case INTERNAL_TYPE_REFERENCE:
237
238        Opcode = StackDesc->Reference.Opcode;
239
240        switch (Opcode)
241        {
242        case AML_NAME_OP:
243
244            /*
245             * Convert indirect name ptr to a direct name ptr.
246             * Then, AcpiExResolveNodeToValue can be used to get the value
247             */
248            TempNode = StackDesc->Reference.Object;
249
250            /* Delete the Reference Object */
251
252            AcpiUtRemoveReference (StackDesc);
253
254            /* Put direct name pointer onto stack and exit */
255
256            (*StackPtr) = TempNode;
257            break;
258
259
260        case AML_LOCAL_OP:
261        case AML_ARG_OP:
262
263            /*
264             * Get the local from the method's state info
265             * Note: this increments the local's object reference count
266             */
267            Status = AcpiDsMethodDataGetValue (Opcode,
268                            StackDesc->Reference.Offset, WalkState, &ObjDesc);
269            if (ACPI_FAILURE (Status))
270            {
271                return_ACPI_STATUS (Status);
272            }
273
274            /*
275             * Now we can delete the original Reference Object and
276             * replace it with the resolve value
277             */
278            AcpiUtRemoveReference (StackDesc);
279            *StackPtr = ObjDesc;
280
281            ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "[Arg/Local %d] ValueObj is %p\n",
282                StackDesc->Reference.Offset, ObjDesc));
283            break;
284
285        /*
286         * For constants, we must change the reference/constant object
287         * to a real integer object
288         */
289        case AML_ZERO_OP:
290        case AML_ONE_OP:
291        case AML_ONES_OP:
292        case AML_REVISION_OP:
293
294            /* Create a new integer object */
295
296            ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
297            if (!ObjDesc)
298            {
299                return_ACPI_STATUS (AE_NO_MEMORY);
300            }
301
302            switch (Opcode)
303            {
304            case AML_ZERO_OP:
305                ObjDesc->Integer.Value = 0;
306                break;
307
308            case AML_ONE_OP:
309                ObjDesc->Integer.Value = 1;
310                break;
311
312            case AML_ONES_OP:
313                ObjDesc->Integer.Value = ACPI_INTEGER_MAX;
314
315                /* Truncate value if we are executing from a 32-bit ACPI table */
316
317                AcpiExTruncateFor32bitTable (ObjDesc, WalkState);
318                break;
319
320            case AML_REVISION_OP:
321                ObjDesc->Integer.Value = ACPI_CA_SUPPORT_LEVEL;
322                break;
323            }
324
325            /*
326             * Remove a reference from the original reference object
327             * and put the new object in its place
328             */
329            AcpiUtRemoveReference (StackDesc);
330            *StackPtr = ObjDesc;
331            break;
332
333
334        case AML_INDEX_OP:
335
336            switch (StackDesc->Reference.TargetType)
337            {
338            case ACPI_TYPE_BUFFER_FIELD:
339
340                /* Just return - leave the Reference on the stack */
341                break;
342
343
344            case ACPI_TYPE_PACKAGE:
345                ObjDesc = *StackDesc->Reference.Where;
346                if (ObjDesc)
347                {
348                    /*
349                     * Valid obj descriptor, copy pointer to return value
350                     * (i.e., dereference the package index)
351                     * Delete the ref object, increment the returned object
352                     */
353                    AcpiUtRemoveReference (StackDesc);
354                    AcpiUtAddReference (ObjDesc);
355                    *StackPtr = ObjDesc;
356                }
357                else
358                {
359                    /*
360                     * A NULL object descriptor means an unitialized element of
361                     * the package, can't dereference it
362                     */
363                    ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
364                        "Attempt to deref an Index to NULL pkg element Idx=%p\n",
365                        StackDesc));
366                    Status = AE_AML_UNINITIALIZED_ELEMENT;
367                }
368                break;
369
370            default:
371                /* Invalid reference object */
372
373                ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
374                    "Unknown TargetType %X in Index/Reference obj %p\n",
375                    StackDesc->Reference.TargetType, StackDesc));
376                Status = AE_AML_INTERNAL;
377                break;
378            }
379            break;
380
381
382        case AML_DEBUG_OP:
383
384            /* Just leave the object as-is */
385            break;
386
387
388        default:
389
390            ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Reference object subtype %02X in %p\n",
391                Opcode, StackDesc));
392            Status = AE_AML_INTERNAL;
393            break;
394
395        }   /* switch (Opcode) */
396
397        break; /* case INTERNAL_TYPE_REFERENCE */
398
399    /*
400     * These cases may never happen here, but just in case..
401     */
402    case ACPI_TYPE_BUFFER_FIELD:
403    case INTERNAL_TYPE_REGION_FIELD:
404    case INTERNAL_TYPE_BANK_FIELD:
405    case INTERNAL_TYPE_INDEX_FIELD:
406
407        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "FieldRead SourceDesc=%p Type=%X\n",
408            StackDesc, StackDesc->Common.Type));
409
410        Status = AcpiExReadDataFromField (StackDesc, &ObjDesc);
411        *StackPtr = (void *) ObjDesc;
412        break;
413
414    default:
415        break;
416    }
417
418    return_ACPI_STATUS (Status);
419}
420
421
422