exresolv.c revision 151937
167754Smsmith
267754Smsmith/******************************************************************************
367754Smsmith *
477424Smsmith * Module Name: exresolv - AML Interpreter object resolution
5151937Sjkim *              $Revision: 1.132 $
667754Smsmith *
767754Smsmith *****************************************************************************/
867754Smsmith
967754Smsmith/******************************************************************************
1067754Smsmith *
1167754Smsmith * 1. Copyright Notice
1267754Smsmith *
13151937Sjkim * Some or all of this work - Copyright (c) 1999 - 2005, Intel Corp.
1470243Smsmith * All rights reserved.
1567754Smsmith *
1667754Smsmith * 2. License
1767754Smsmith *
1867754Smsmith * 2.1. This is your license from Intel Corp. under its intellectual property
1967754Smsmith * rights.  You may have additional license terms from the party that provided
2067754Smsmith * you this software, covering your right to use that party's intellectual
2167754Smsmith * property rights.
2267754Smsmith *
2367754Smsmith * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
2467754Smsmith * copy of the source code appearing in this file ("Covered Code") an
2567754Smsmith * irrevocable, perpetual, worldwide license under Intel's copyrights in the
2667754Smsmith * base code distributed originally by Intel ("Original Intel Code") to copy,
2767754Smsmith * make derivatives, distribute, use and display any portion of the Covered
2867754Smsmith * Code in any form, with the right to sublicense such rights; and
2967754Smsmith *
3067754Smsmith * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
3167754Smsmith * license (with the right to sublicense), under only those claims of Intel
3267754Smsmith * patents that are infringed by the Original Intel Code, to make, use, sell,
3367754Smsmith * offer to sell, and import the Covered Code and derivative works thereof
3467754Smsmith * solely to the minimum extent necessary to exercise the above copyright
3567754Smsmith * license, and in no event shall the patent license extend to any additions
3667754Smsmith * to or modifications of the Original Intel Code.  No other license or right
3767754Smsmith * is granted directly or by implication, estoppel or otherwise;
3867754Smsmith *
3967754Smsmith * The above copyright and patent license is granted only if the following
4067754Smsmith * conditions are met:
4167754Smsmith *
4267754Smsmith * 3. Conditions
4367754Smsmith *
4467754Smsmith * 3.1. Redistribution of Source with Rights to Further Distribute Source.
4567754Smsmith * Redistribution of source code of any substantial portion of the Covered
4667754Smsmith * Code or modification with rights to further distribute source must include
4767754Smsmith * the above Copyright Notice, the above License, this list of Conditions,
4867754Smsmith * and the following Disclaimer and Export Compliance provision.  In addition,
4967754Smsmith * Licensee must cause all Covered Code to which Licensee contributes to
5067754Smsmith * contain a file documenting the changes Licensee made to create that Covered
5167754Smsmith * Code and the date of any change.  Licensee must include in that file the
5267754Smsmith * documentation of any changes made by any predecessor Licensee.  Licensee
5367754Smsmith * must include a prominent statement that the modification is derived,
5467754Smsmith * directly or indirectly, from Original Intel Code.
5567754Smsmith *
5667754Smsmith * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
5767754Smsmith * Redistribution of source code of any substantial portion of the Covered
5867754Smsmith * Code or modification without rights to further distribute source must
5967754Smsmith * include the following Disclaimer and Export Compliance provision in the
6067754Smsmith * documentation and/or other materials provided with distribution.  In
6167754Smsmith * addition, Licensee may not authorize further sublicense of source of any
6267754Smsmith * portion of the Covered Code, and must include terms to the effect that the
6367754Smsmith * license from Licensee to its licensee is limited to the intellectual
6467754Smsmith * property embodied in the software Licensee provides to its licensee, and
6567754Smsmith * not to intellectual property embodied in modifications its licensee may
6667754Smsmith * make.
6767754Smsmith *
6867754Smsmith * 3.3. Redistribution of Executable. Redistribution in executable form of any
6967754Smsmith * substantial portion of the Covered Code or modification must reproduce the
7067754Smsmith * above Copyright Notice, and the following Disclaimer and Export Compliance
7167754Smsmith * provision in the documentation and/or other materials provided with the
7267754Smsmith * distribution.
7367754Smsmith *
7467754Smsmith * 3.4. Intel retains all right, title, and interest in and to the Original
7567754Smsmith * Intel Code.
7667754Smsmith *
7767754Smsmith * 3.5. Neither the name Intel nor any other trademark owned or controlled by
7867754Smsmith * Intel shall be used in advertising or otherwise to promote the sale, use or
7967754Smsmith * other dealings in products derived from or relating to the Covered Code
8067754Smsmith * without prior written authorization from Intel.
8167754Smsmith *
8267754Smsmith * 4. Disclaimer and Export Compliance
8367754Smsmith *
8467754Smsmith * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
8567754Smsmith * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
8667754Smsmith * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
8767754Smsmith * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
8867754Smsmith * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
8967754Smsmith * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
9067754Smsmith * PARTICULAR PURPOSE.
9167754Smsmith *
9267754Smsmith * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
9367754Smsmith * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
9467754Smsmith * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
9567754Smsmith * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
9667754Smsmith * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
9767754Smsmith * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
9867754Smsmith * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
9967754Smsmith * LIMITED REMEDY.
10067754Smsmith *
10167754Smsmith * 4.3. Licensee shall not export, either directly or indirectly, any of this
10267754Smsmith * software or system incorporating such software without first obtaining any
10367754Smsmith * required license or other approval from the U. S. Department of Commerce or
10467754Smsmith * any other agency or department of the United States Government.  In the
10567754Smsmith * event Licensee exports any such software from the United States or
10667754Smsmith * re-exports any such software from a foreign destination, Licensee shall
10767754Smsmith * ensure that the distribution and export/re-export of the software is in
10867754Smsmith * compliance with all laws, regulations, orders, or other restrictions of the
10967754Smsmith * U.S. Export Administration Regulations. Licensee agrees that neither it nor
11067754Smsmith * any of its subsidiaries will export/re-export any technical data, process,
11167754Smsmith * software, or service, directly or indirectly, to any country for which the
11267754Smsmith * United States government or any agency thereof requires an export license,
11367754Smsmith * other governmental approval, or letter of assurance, without first obtaining
11467754Smsmith * such license, approval or letter.
11567754Smsmith *
11667754Smsmith *****************************************************************************/
11767754Smsmith
11877424Smsmith#define __EXRESOLV_C__
11967754Smsmith
120151600Sobrien#include <contrib/dev/acpica/acpi.h>
121151600Sobrien#include <contrib/dev/acpica/amlcode.h>
122151600Sobrien#include <contrib/dev/acpica/acdispat.h>
123151600Sobrien#include <contrib/dev/acpica/acinterp.h>
124151600Sobrien#include <contrib/dev/acpica/acnamesp.h>
125151600Sobrien#include <contrib/dev/acpica/acparser.h>
12667754Smsmith
12767754Smsmith
12877424Smsmith#define _COMPONENT          ACPI_EXECUTER
12991116Smsmith        ACPI_MODULE_NAME    ("exresolv")
13067754Smsmith
131151937Sjkim/* Local prototypes */
13267754Smsmith
133151937Sjkimstatic ACPI_STATUS
134151937SjkimAcpiExResolveObjectToValue (
135151937Sjkim    ACPI_OPERAND_OBJECT     **StackPtr,
136151937Sjkim    ACPI_WALK_STATE         *WalkState);
137151937Sjkim
138151937Sjkim
13967754Smsmith/*******************************************************************************
14067754Smsmith *
14177424Smsmith * FUNCTION:    AcpiExResolveToValue
14267754Smsmith *
14367754Smsmith * PARAMETERS:  **StackPtr          - Points to entry on ObjStack, which can
14477424Smsmith *                                    be either an (ACPI_OPERAND_OBJECT *)
14567754Smsmith *                                    or an ACPI_HANDLE.
14677424Smsmith *              WalkState           - Current method state
14767754Smsmith *
14867754Smsmith * RETURN:      Status
14967754Smsmith *
15071867Smsmith * DESCRIPTION: Convert Reference objects to values
15167754Smsmith *
15267754Smsmith ******************************************************************************/
15367754Smsmith
15467754SmsmithACPI_STATUS
15577424SmsmithAcpiExResolveToValue (
15667754Smsmith    ACPI_OPERAND_OBJECT     **StackPtr,
15767754Smsmith    ACPI_WALK_STATE         *WalkState)
15867754Smsmith{
15977424Smsmith    ACPI_STATUS             Status;
16067754Smsmith
16167754Smsmith
16291116Smsmith    ACPI_FUNCTION_TRACE_PTR ("ExResolveToValue", StackPtr);
16367754Smsmith
16467754Smsmith
16567754Smsmith    if (!StackPtr || !*StackPtr)
16667754Smsmith    {
16782367Smsmith        ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null pointer\n"));
16867754Smsmith        return_ACPI_STATUS (AE_AML_NO_OPERAND);
16967754Smsmith    }
17067754Smsmith
17167754Smsmith    /*
17267754Smsmith     * The entity pointed to by the StackPtr can be either
17367754Smsmith     * 1) A valid ACPI_OPERAND_OBJECT, or
17467754Smsmith     * 2) A ACPI_NAMESPACE_NODE (NamedObj)
17567754Smsmith     */
17699679Siwasaki    if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_OPERAND)
17767754Smsmith    {
17877424Smsmith        Status = AcpiExResolveObjectToValue (StackPtr, WalkState);
17967754Smsmith        if (ACPI_FAILURE (Status))
18067754Smsmith        {
18167754Smsmith            return_ACPI_STATUS (Status);
18267754Smsmith        }
183151937Sjkim
184151937Sjkim        if (!*StackPtr)
185151937Sjkim        {
186151937Sjkim            ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null pointer\n"));
187151937Sjkim            return_ACPI_STATUS (AE_AML_NO_OPERAND);
188151937Sjkim        }
18967754Smsmith    }
19067754Smsmith
19167754Smsmith    /*
19277424Smsmith     * Object on the stack may have changed if AcpiExResolveObjectToValue()
19367754Smsmith     * was called (i.e., we can't use an _else_ here.)
19467754Smsmith     */
19591116Smsmith    if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_NAMED)
19667754Smsmith    {
19799679Siwasaki        Status = AcpiExResolveNodeToValue (
19899679Siwasaki                        ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, StackPtr),
19977424Smsmith                        WalkState);
20077424Smsmith        if (ACPI_FAILURE (Status))
20177424Smsmith        {
20277424Smsmith            return_ACPI_STATUS (Status);
20377424Smsmith        }
20467754Smsmith    }
20567754Smsmith
20699146Siwasaki    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Resolved object %p\n", *StackPtr));
20777424Smsmith    return_ACPI_STATUS (AE_OK);
20867754Smsmith}
20967754Smsmith
21067754Smsmith
21167754Smsmith/*******************************************************************************
21267754Smsmith *
21377424Smsmith * FUNCTION:    AcpiExResolveObjectToValue
21467754Smsmith *
215151937Sjkim * PARAMETERS:  StackPtr        - Pointer to an internal object
21677424Smsmith *              WalkState       - Current method state
21767754Smsmith *
21867754Smsmith * RETURN:      Status
21967754Smsmith *
220151937Sjkim * DESCRIPTION: Retrieve the value from an internal object. The Reference type
22167754Smsmith *              uses the associated AML opcode to determine the value.
22267754Smsmith *
22367754Smsmith ******************************************************************************/
22467754Smsmith
225151937Sjkimstatic ACPI_STATUS
22677424SmsmithAcpiExResolveObjectToValue (
22767754Smsmith    ACPI_OPERAND_OBJECT     **StackPtr,
22867754Smsmith    ACPI_WALK_STATE         *WalkState)
22967754Smsmith{
23077424Smsmith    ACPI_STATUS             Status = AE_OK;
23167754Smsmith    ACPI_OPERAND_OBJECT     *StackDesc;
23277424Smsmith    void                    *TempNode;
23377424Smsmith    ACPI_OPERAND_OBJECT     *ObjDesc;
23467754Smsmith    UINT16                  Opcode;
23567754Smsmith
23667754Smsmith
23791116Smsmith    ACPI_FUNCTION_TRACE ("ExResolveObjectToValue");
23867754Smsmith
23967754Smsmith
24067754Smsmith    StackDesc = *StackPtr;
24167754Smsmith
24267754Smsmith    /* This is an ACPI_OPERAND_OBJECT  */
24367754Smsmith
24499679Siwasaki    switch (ACPI_GET_OBJECT_TYPE (StackDesc))
24567754Smsmith    {
246107325Siwasaki    case ACPI_TYPE_LOCAL_REFERENCE:
24767754Smsmith
24877424Smsmith        Opcode = StackDesc->Reference.Opcode;
24967754Smsmith
25067754Smsmith        switch (Opcode)
25167754Smsmith        {
25267754Smsmith        case AML_NAME_OP:
25367754Smsmith
25467754Smsmith            /*
255151937Sjkim             * Convert name reference to a namespace node
25677424Smsmith             * Then, AcpiExResolveNodeToValue can be used to get the value
25767754Smsmith             */
25877424Smsmith            TempNode = StackDesc->Reference.Object;
25967754Smsmith
26067754Smsmith            /* Delete the Reference Object */
26167754Smsmith
26277424Smsmith            AcpiUtRemoveReference (StackDesc);
26367754Smsmith
264151937Sjkim            /* Return the namespace node */
26567754Smsmith
26677424Smsmith            (*StackPtr) = TempNode;
26767754Smsmith            break;
26867754Smsmith
26967754Smsmith
27067754Smsmith        case AML_LOCAL_OP:
27177424Smsmith        case AML_ARG_OP:
27267754Smsmith
27367754Smsmith            /*
27467754Smsmith             * Get the local from the method's state info
27567754Smsmith             * Note: this increments the local's object reference count
27667754Smsmith             */
27777424Smsmith            Status = AcpiDsMethodDataGetValue (Opcode,
27877424Smsmith                            StackDesc->Reference.Offset, WalkState, &ObjDesc);
27967754Smsmith            if (ACPI_FAILURE (Status))
28067754Smsmith            {
28167754Smsmith                return_ACPI_STATUS (Status);
28267754Smsmith            }
28367754Smsmith
284129684Snjl            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Arg/Local %X] ValueObj is %p\n",
285129684Snjl                StackDesc->Reference.Offset, ObjDesc));
286129684Snjl
28767754Smsmith            /*
28867754Smsmith             * Now we can delete the original Reference Object and
289129684Snjl             * replace it with the resolved value
29067754Smsmith             */
29177424Smsmith            AcpiUtRemoveReference (StackDesc);
29267754Smsmith            *StackPtr = ObjDesc;
29367754Smsmith            break;
29467754Smsmith
29567754Smsmith
29667754Smsmith        case AML_INDEX_OP:
29767754Smsmith
29867754Smsmith            switch (StackDesc->Reference.TargetType)
29967754Smsmith            {
30067754Smsmith            case ACPI_TYPE_BUFFER_FIELD:
30167754Smsmith
30267754Smsmith                /* Just return - leave the Reference on the stack */
30367754Smsmith                break;
30467754Smsmith
30567754Smsmith
30667754Smsmith            case ACPI_TYPE_PACKAGE:
30799679Siwasaki
30867754Smsmith                ObjDesc = *StackDesc->Reference.Where;
30967754Smsmith                if (ObjDesc)
31067754Smsmith                {
31167754Smsmith                    /*
31267754Smsmith                     * Valid obj descriptor, copy pointer to return value
31367754Smsmith                     * (i.e., dereference the package index)
31467754Smsmith                     * Delete the ref object, increment the returned object
31567754Smsmith                     */
31677424Smsmith                    AcpiUtRemoveReference (StackDesc);
31777424Smsmith                    AcpiUtAddReference (ObjDesc);
31867754Smsmith                    *StackPtr = ObjDesc;
31967754Smsmith                }
32067754Smsmith                else
32167754Smsmith                {
32267754Smsmith                    /*
32367754Smsmith                     * A NULL object descriptor means an unitialized element of
32477424Smsmith                     * the package, can't dereference it
32567754Smsmith                     */
32682367Smsmith                    ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
32783174Smsmith                        "Attempt to deref an Index to NULL pkg element Idx=%p\n",
32877424Smsmith                        StackDesc));
32967754Smsmith                    Status = AE_AML_UNINITIALIZED_ELEMENT;
33067754Smsmith                }
33167754Smsmith                break;
33267754Smsmith
33399679Siwasaki
33467754Smsmith            default:
33599679Siwasaki
33677424Smsmith                /* Invalid reference object */
33767754Smsmith
338126372Snjl                ACPI_REPORT_ERROR ((
339126372Snjl                    "During resolve, Unknown TargetType %X in Index/Reference obj %p\n",
34067754Smsmith                    StackDesc->Reference.TargetType, StackDesc));
34167754Smsmith                Status = AE_AML_INTERNAL;
34267754Smsmith                break;
34367754Smsmith            }
34467754Smsmith            break;
34567754Smsmith
34667754Smsmith
347100966Siwasaki        case AML_REF_OF_OP:
34867754Smsmith        case AML_DEBUG_OP:
349123315Snjl        case AML_LOAD_OP:
35067754Smsmith
35167754Smsmith            /* Just leave the object as-is */
352100966Siwasaki
35367754Smsmith            break;
35467754Smsmith
355151937Sjkim        case AML_INT_NAMEPATH_OP:   /* Reference to a named object */
35667754Smsmith
357151937Sjkim            /* Get the object pointed to by the namespace node */
358151937Sjkim
359151937Sjkim            *StackPtr = (StackDesc->Reference.Node)->Object;
360151937Sjkim            AcpiUtAddReference (*StackPtr);
361151937Sjkim            AcpiUtRemoveReference (StackDesc);
362151937Sjkim            break;
363151937Sjkim
36467754Smsmith        default:
36567754Smsmith
366151937Sjkim            ACPI_REPORT_ERROR ((
367151937Sjkim                "During resolve, Unknown Reference opcode %X (%s) in %p\n",
368123315Snjl                Opcode, AcpiPsGetOpcodeName (Opcode), StackDesc));
36967754Smsmith            Status = AE_AML_INTERNAL;
37077424Smsmith            break;
37199679Siwasaki        }
37299679Siwasaki        break;
37367754Smsmith
37467754Smsmith
37599146Siwasaki    case ACPI_TYPE_BUFFER:
37699146Siwasaki
37799146Siwasaki        Status = AcpiDsGetBufferArguments (StackDesc);
37899146Siwasaki        break;
37999146Siwasaki
38099146Siwasaki
38199146Siwasaki    case ACPI_TYPE_PACKAGE:
38299146Siwasaki
38399146Siwasaki        Status = AcpiDsGetPackageArguments (StackDesc);
38499146Siwasaki        break;
38599146Siwasaki
38699146Siwasaki
387151937Sjkim    /* These cases may never happen here, but just in case.. */
388151937Sjkim
38977424Smsmith    case ACPI_TYPE_BUFFER_FIELD:
390107325Siwasaki    case ACPI_TYPE_LOCAL_REGION_FIELD:
391107325Siwasaki    case ACPI_TYPE_LOCAL_BANK_FIELD:
392107325Siwasaki    case ACPI_TYPE_LOCAL_INDEX_FIELD:
39367754Smsmith
39487031Smsmith        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "FieldRead SourceDesc=%p Type=%X\n",
39599679Siwasaki            StackDesc, ACPI_GET_OBJECT_TYPE (StackDesc)));
39667754Smsmith
39799146Siwasaki        Status = AcpiExReadDataFromField (WalkState, StackDesc, &ObjDesc);
39867754Smsmith        *StackPtr = (void *) ObjDesc;
39967754Smsmith        break;
40067754Smsmith
40167754Smsmith    default:
40267754Smsmith        break;
40387031Smsmith    }
40467754Smsmith
40567754Smsmith    return_ACPI_STATUS (Status);
40667754Smsmith}
40767754Smsmith
40867754Smsmith
409104470Siwasaki/*******************************************************************************
410104470Siwasaki *
411104470Siwasaki * FUNCTION:    AcpiExResolveMultiple
412104470Siwasaki *
413104470Siwasaki * PARAMETERS:  WalkState           - Current state (contains AML opcode)
414104470Siwasaki *              Operand             - Starting point for resolution
415104470Siwasaki *              ReturnType          - Where the object type is returned
416104470Siwasaki *              ReturnDesc          - Where the resolved object is returned
417104470Siwasaki *
418104470Siwasaki * RETURN:      Status
419104470Siwasaki *
420104470Siwasaki * DESCRIPTION: Return the base object and type.  Traverse a reference list if
421104470Siwasaki *              necessary to get to the base object.
422104470Siwasaki *
423104470Siwasaki ******************************************************************************/
424104470Siwasaki
425104470SiwasakiACPI_STATUS
426104470SiwasakiAcpiExResolveMultiple (
427104470Siwasaki    ACPI_WALK_STATE         *WalkState,
428104470Siwasaki    ACPI_OPERAND_OBJECT     *Operand,
429104470Siwasaki    ACPI_OBJECT_TYPE        *ReturnType,
430104470Siwasaki    ACPI_OPERAND_OBJECT     **ReturnDesc)
431104470Siwasaki{
432104470Siwasaki    ACPI_OPERAND_OBJECT     *ObjDesc = (void *) Operand;
433104470Siwasaki    ACPI_NAMESPACE_NODE     *Node;
434104470Siwasaki    ACPI_OBJECT_TYPE        Type;
435138287Smarks    ACPI_STATUS             Status;
436104470Siwasaki
437104470Siwasaki
438107325Siwasaki    ACPI_FUNCTION_TRACE ("AcpiExResolveMultiple");
439104470Siwasaki
440104470Siwasaki
441151937Sjkim    /* Operand can be either a namespace node or an operand descriptor */
442138287Smarks
443138287Smarks    switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
444138287Smarks    {
445138287Smarks    case ACPI_DESC_TYPE_OPERAND:
446138287Smarks        Type = ObjDesc->Common.Type;
447138287Smarks        break;
448138287Smarks
449138287Smarks    case ACPI_DESC_TYPE_NAMED:
450138287Smarks        Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
451138287Smarks        ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc);
452138287Smarks
453138287Smarks        /* If we had an Alias node, use the attached object for type info */
454138287Smarks
455138287Smarks        if (Type == ACPI_TYPE_LOCAL_ALIAS)
456138287Smarks        {
457138287Smarks            Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
458138287Smarks            ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc);
459138287Smarks        }
460138287Smarks        break;
461138287Smarks
462138287Smarks    default:
463138287Smarks        return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
464138287Smarks    }
465138287Smarks
466151937Sjkim    /* If type is anything other than a reference, we are done */
467138287Smarks
468138287Smarks    if (Type != ACPI_TYPE_LOCAL_REFERENCE)
469138287Smarks    {
470138287Smarks        goto Exit;
471138287Smarks    }
472138287Smarks
473138287Smarks    /*
474104470Siwasaki     * For reference objects created via the RefOf or Index operators,
475114237Snjl     * we need to get to the base object (as per the ACPI specification
476114237Snjl     * of the ObjectType and SizeOf operators).  This means traversing
477104470Siwasaki     * the list of possibly many nested references.
478104470Siwasaki     */
479107325Siwasaki    while (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_REFERENCE)
480104470Siwasaki    {
481104470Siwasaki        switch (ObjDesc->Reference.Opcode)
482104470Siwasaki        {
483104470Siwasaki        case AML_REF_OF_OP:
484104470Siwasaki
485104470Siwasaki            /* Dereference the reference pointer */
486104470Siwasaki
487104470Siwasaki            Node = ObjDesc->Reference.Object;
488104470Siwasaki
489104470Siwasaki            /* All "References" point to a NS node */
490104470Siwasaki
491104470Siwasaki            if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
492104470Siwasaki            {
493151937Sjkim                ACPI_REPORT_ERROR ((
494151937Sjkim                    "AcpiExResolveMultiple: Not a NS node %p [%s]\n",
495151937Sjkim                    Node, AcpiUtGetDescriptorName (Node)));
496104470Siwasaki                return_ACPI_STATUS (AE_AML_INTERNAL);
497104470Siwasaki            }
498104470Siwasaki
499104470Siwasaki            /* Get the attached object */
500104470Siwasaki
501104470Siwasaki            ObjDesc = AcpiNsGetAttachedObject (Node);
502104470Siwasaki            if (!ObjDesc)
503104470Siwasaki            {
504104470Siwasaki                /* No object, use the NS node type */
505104470Siwasaki
506104470Siwasaki                Type = AcpiNsGetType (Node);
507104470Siwasaki                goto Exit;
508104470Siwasaki            }
509104470Siwasaki
510104470Siwasaki            /* Check for circular references */
511104470Siwasaki
512104470Siwasaki            if (ObjDesc == Operand)
513104470Siwasaki            {
514104470Siwasaki                return_ACPI_STATUS (AE_AML_CIRCULAR_REFERENCE);
515104470Siwasaki            }
516104470Siwasaki            break;
517104470Siwasaki
518104470Siwasaki
519104470Siwasaki        case AML_INDEX_OP:
520104470Siwasaki
521104470Siwasaki            /* Get the type of this reference (index into another object) */
522104470Siwasaki
523104470Siwasaki            Type = ObjDesc->Reference.TargetType;
524104470Siwasaki            if (Type != ACPI_TYPE_PACKAGE)
525104470Siwasaki            {
526104470Siwasaki                goto Exit;
527104470Siwasaki            }
528104470Siwasaki
529104470Siwasaki            /*
530104470Siwasaki             * The main object is a package, we want to get the type
531104470Siwasaki             * of the individual package element that is referenced by
532104470Siwasaki             * the index.
533104470Siwasaki             *
534104470Siwasaki             * This could of course in turn be another reference object.
535104470Siwasaki             */
536104470Siwasaki            ObjDesc = *(ObjDesc->Reference.Where);
537151937Sjkim            if (!ObjDesc)
538151937Sjkim            {
539151937Sjkim                /* NULL package elements are allowed */
540151937Sjkim
541151937Sjkim                Type = 0; /* Uninitialized */
542151937Sjkim                goto Exit;
543151937Sjkim            }
544104470Siwasaki            break;
545104470Siwasaki
546104470Siwasaki
547104470Siwasaki        case AML_INT_NAMEPATH_OP:
548104470Siwasaki
549104470Siwasaki            /* Dereference the reference pointer */
550104470Siwasaki
551104470Siwasaki            Node = ObjDesc->Reference.Node;
552104470Siwasaki
553104470Siwasaki            /* All "References" point to a NS node */
554104470Siwasaki
555104470Siwasaki            if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
556104470Siwasaki            {
557151937Sjkim                ACPI_REPORT_ERROR ((
558151937Sjkim                    "AcpiExResolveMultiple: Not a NS node %p [%s]\n",
559151937Sjkim                    Node, AcpiUtGetDescriptorName (Node)));
560123315Snjl               return_ACPI_STATUS (AE_AML_INTERNAL);
561104470Siwasaki            }
562104470Siwasaki
563104470Siwasaki            /* Get the attached object */
564104470Siwasaki
565104470Siwasaki            ObjDesc = AcpiNsGetAttachedObject (Node);
566104470Siwasaki            if (!ObjDesc)
567104470Siwasaki            {
568104470Siwasaki                /* No object, use the NS node type */
569104470Siwasaki
570104470Siwasaki                Type = AcpiNsGetType (Node);
571104470Siwasaki                goto Exit;
572104470Siwasaki            }
573104470Siwasaki
574104470Siwasaki            /* Check for circular references */
575104470Siwasaki
576104470Siwasaki            if (ObjDesc == Operand)
577104470Siwasaki            {
578104470Siwasaki                return_ACPI_STATUS (AE_AML_CIRCULAR_REFERENCE);
579104470Siwasaki            }
580104470Siwasaki            break;
581104470Siwasaki
582104470Siwasaki
583138287Smarks        case AML_LOCAL_OP:
584138287Smarks        case AML_ARG_OP:
585138287Smarks
586138287Smarks            if (ReturnDesc)
587138287Smarks            {
588138287Smarks                Status = AcpiDsMethodDataGetValue (ObjDesc->Reference.Opcode,
589151937Sjkim                            ObjDesc->Reference.Offset, WalkState, &ObjDesc);
590138287Smarks                if (ACPI_FAILURE (Status))
591138287Smarks                {
592138287Smarks                    return_ACPI_STATUS (Status);
593138287Smarks                }
594138287Smarks                AcpiUtRemoveReference (ObjDesc);
595138287Smarks            }
596138287Smarks            else
597138287Smarks            {
598138287Smarks                Status = AcpiDsMethodDataGetNode (ObjDesc->Reference.Opcode,
599138287Smarks                            ObjDesc->Reference.Offset, WalkState, &Node);
600138287Smarks                if (ACPI_FAILURE (Status))
601138287Smarks                {
602138287Smarks                    return_ACPI_STATUS (Status);
603138287Smarks                }
604138287Smarks
605138287Smarks                ObjDesc = AcpiNsGetAttachedObject (Node);
606138287Smarks                if (!ObjDesc)
607138287Smarks                {
608138287Smarks                    Type = ACPI_TYPE_ANY;
609138287Smarks                    goto Exit;
610138287Smarks                }
611138287Smarks            }
612138287Smarks            break;
613138287Smarks
614138287Smarks
615104470Siwasaki        case AML_DEBUG_OP:
616104470Siwasaki
617104470Siwasaki            /* The Debug Object is of type "DebugObject" */
618104470Siwasaki
619104470Siwasaki            Type = ACPI_TYPE_DEBUG_OBJECT;
620104470Siwasaki            goto Exit;
621104470Siwasaki
622104470Siwasaki
623104470Siwasaki        default:
624104470Siwasaki
625151937Sjkim            ACPI_REPORT_ERROR ((
626151937Sjkim                "AcpiExResolveMultiple: Unknown Reference subtype %X\n",
627104470Siwasaki                ObjDesc->Reference.Opcode));
628104470Siwasaki            return_ACPI_STATUS (AE_AML_INTERNAL);
629104470Siwasaki        }
630104470Siwasaki    }
631104470Siwasaki
632104470Siwasaki    /*
633104470Siwasaki     * Now we are guaranteed to have an object that has not been created
634104470Siwasaki     * via the RefOf or Index operators.
635104470Siwasaki     */
636104470Siwasaki    Type = ACPI_GET_OBJECT_TYPE (ObjDesc);
637104470Siwasaki
638104470Siwasaki
639104470SiwasakiExit:
640104470Siwasaki    /* Convert internal types to external types */
641104470Siwasaki
642104470Siwasaki    switch (Type)
643104470Siwasaki    {
644107325Siwasaki    case ACPI_TYPE_LOCAL_REGION_FIELD:
645107325Siwasaki    case ACPI_TYPE_LOCAL_BANK_FIELD:
646107325Siwasaki    case ACPI_TYPE_LOCAL_INDEX_FIELD:
647104470Siwasaki
648104470Siwasaki        Type = ACPI_TYPE_FIELD_UNIT;
649104470Siwasaki        break;
650104470Siwasaki
651107325Siwasaki    case ACPI_TYPE_LOCAL_SCOPE:
652107325Siwasaki
653107325Siwasaki        /* Per ACPI Specification, Scope is untyped */
654107325Siwasaki
655107325Siwasaki        Type = ACPI_TYPE_ANY;
656107325Siwasaki        break;
657107325Siwasaki
658104470Siwasaki    default:
659104470Siwasaki        /* No change to Type required */
660104470Siwasaki        break;
661104470Siwasaki    }
662104470Siwasaki
663104470Siwasaki    *ReturnType = Type;
664104470Siwasaki    if (ReturnDesc)
665104470Siwasaki    {
666104470Siwasaki        *ReturnDesc = ObjDesc;
667104470Siwasaki    }
668104470Siwasaki    return_ACPI_STATUS (AE_OK);
669104470Siwasaki}
670104470Siwasaki
671104470Siwasaki
672