Home | History | Annotate | Line # | Download | only in executer
exresolv.c revision 1.1.1.13
      1       1.1    jruoho /******************************************************************************
      2       1.1    jruoho  *
      3       1.1    jruoho  * Module Name: exresolv - AML Interpreter object resolution
      4       1.1    jruoho  *
      5       1.1    jruoho  *****************************************************************************/
      6       1.1    jruoho 
      7   1.1.1.2    jruoho /*
      8  1.1.1.13  christos  * Copyright (C) 2000 - 2021, Intel Corp.
      9       1.1    jruoho  * All rights reserved.
     10       1.1    jruoho  *
     11   1.1.1.2    jruoho  * Redistribution and use in source and binary forms, with or without
     12   1.1.1.2    jruoho  * modification, are permitted provided that the following conditions
     13   1.1.1.2    jruoho  * are met:
     14   1.1.1.2    jruoho  * 1. Redistributions of source code must retain the above copyright
     15   1.1.1.2    jruoho  *    notice, this list of conditions, and the following disclaimer,
     16   1.1.1.2    jruoho  *    without modification.
     17   1.1.1.2    jruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18   1.1.1.2    jruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
     19   1.1.1.2    jruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
     20   1.1.1.2    jruoho  *    including a substantially similar Disclaimer requirement for further
     21   1.1.1.2    jruoho  *    binary redistribution.
     22   1.1.1.2    jruoho  * 3. Neither the names of the above-listed copyright holders nor the names
     23   1.1.1.2    jruoho  *    of any contributors may be used to endorse or promote products derived
     24   1.1.1.2    jruoho  *    from this software without specific prior written permission.
     25   1.1.1.2    jruoho  *
     26   1.1.1.2    jruoho  * Alternatively, this software may be distributed under the terms of the
     27   1.1.1.2    jruoho  * GNU General Public License ("GPL") version 2 as published by the Free
     28   1.1.1.2    jruoho  * Software Foundation.
     29   1.1.1.2    jruoho  *
     30   1.1.1.2    jruoho  * NO WARRANTY
     31   1.1.1.2    jruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32   1.1.1.2    jruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  1.1.1.13  christos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     34   1.1.1.2    jruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35   1.1.1.2    jruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36   1.1.1.2    jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37   1.1.1.2    jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38   1.1.1.2    jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39   1.1.1.2    jruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40   1.1.1.2    jruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41   1.1.1.2    jruoho  * POSSIBILITY OF SUCH DAMAGES.
     42   1.1.1.2    jruoho  */
     43       1.1    jruoho 
     44       1.1    jruoho #include "acpi.h"
     45       1.1    jruoho #include "accommon.h"
     46       1.1    jruoho #include "amlcode.h"
     47       1.1    jruoho #include "acdispat.h"
     48       1.1    jruoho #include "acinterp.h"
     49       1.1    jruoho #include "acnamesp.h"
     50       1.1    jruoho 
     51       1.1    jruoho 
     52       1.1    jruoho #define _COMPONENT          ACPI_EXECUTER
     53       1.1    jruoho         ACPI_MODULE_NAME    ("exresolv")
     54       1.1    jruoho 
     55       1.1    jruoho /* Local prototypes */
     56       1.1    jruoho 
     57       1.1    jruoho static ACPI_STATUS
     58       1.1    jruoho AcpiExResolveObjectToValue (
     59       1.1    jruoho     ACPI_OPERAND_OBJECT     **StackPtr,
     60       1.1    jruoho     ACPI_WALK_STATE         *WalkState);
     61       1.1    jruoho 
     62       1.1    jruoho 
     63       1.1    jruoho /*******************************************************************************
     64       1.1    jruoho  *
     65       1.1    jruoho  * FUNCTION:    AcpiExResolveToValue
     66       1.1    jruoho  *
     67       1.1    jruoho  * PARAMETERS:  **StackPtr          - Points to entry on ObjStack, which can
     68       1.1    jruoho  *                                    be either an (ACPI_OPERAND_OBJECT *)
     69       1.1    jruoho  *                                    or an ACPI_HANDLE.
     70       1.1    jruoho  *              WalkState           - Current method state
     71       1.1    jruoho  *
     72       1.1    jruoho  * RETURN:      Status
     73       1.1    jruoho  *
     74       1.1    jruoho  * DESCRIPTION: Convert Reference objects to values
     75       1.1    jruoho  *
     76       1.1    jruoho  ******************************************************************************/
     77       1.1    jruoho 
     78       1.1    jruoho ACPI_STATUS
     79       1.1    jruoho AcpiExResolveToValue (
     80       1.1    jruoho     ACPI_OPERAND_OBJECT     **StackPtr,
     81       1.1    jruoho     ACPI_WALK_STATE         *WalkState)
     82       1.1    jruoho {
     83       1.1    jruoho     ACPI_STATUS             Status;
     84       1.1    jruoho 
     85       1.1    jruoho 
     86       1.1    jruoho     ACPI_FUNCTION_TRACE_PTR (ExResolveToValue, StackPtr);
     87       1.1    jruoho 
     88       1.1    jruoho 
     89       1.1    jruoho     if (!StackPtr || !*StackPtr)
     90       1.1    jruoho     {
     91       1.1    jruoho         ACPI_ERROR ((AE_INFO, "Internal - null pointer"));
     92       1.1    jruoho         return_ACPI_STATUS (AE_AML_NO_OPERAND);
     93       1.1    jruoho     }
     94       1.1    jruoho 
     95       1.1    jruoho     /*
     96       1.1    jruoho      * The entity pointed to by the StackPtr can be either
     97       1.1    jruoho      * 1) A valid ACPI_OPERAND_OBJECT, or
     98       1.1    jruoho      * 2) A ACPI_NAMESPACE_NODE (NamedObj)
     99       1.1    jruoho      */
    100       1.1    jruoho     if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_OPERAND)
    101       1.1    jruoho     {
    102       1.1    jruoho         Status = AcpiExResolveObjectToValue (StackPtr, WalkState);
    103       1.1    jruoho         if (ACPI_FAILURE (Status))
    104       1.1    jruoho         {
    105       1.1    jruoho             return_ACPI_STATUS (Status);
    106       1.1    jruoho         }
    107       1.1    jruoho 
    108       1.1    jruoho         if (!*StackPtr)
    109       1.1    jruoho         {
    110       1.1    jruoho             ACPI_ERROR ((AE_INFO, "Internal - null pointer"));
    111       1.1    jruoho             return_ACPI_STATUS (AE_AML_NO_OPERAND);
    112       1.1    jruoho         }
    113       1.1    jruoho     }
    114       1.1    jruoho 
    115       1.1    jruoho     /*
    116       1.1    jruoho      * Object on the stack may have changed if AcpiExResolveObjectToValue()
    117       1.1    jruoho      * was called (i.e., we can't use an _else_ here.)
    118       1.1    jruoho      */
    119       1.1    jruoho     if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_NAMED)
    120       1.1    jruoho     {
    121       1.1    jruoho         Status = AcpiExResolveNodeToValue (
    122   1.1.1.6  christos             ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, StackPtr),
    123   1.1.1.6  christos             WalkState);
    124       1.1    jruoho         if (ACPI_FAILURE (Status))
    125       1.1    jruoho         {
    126       1.1    jruoho             return_ACPI_STATUS (Status);
    127       1.1    jruoho         }
    128       1.1    jruoho     }
    129       1.1    jruoho 
    130       1.1    jruoho     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Resolved object %p\n", *StackPtr));
    131       1.1    jruoho     return_ACPI_STATUS (AE_OK);
    132       1.1    jruoho }
    133       1.1    jruoho 
    134       1.1    jruoho 
    135       1.1    jruoho /*******************************************************************************
    136       1.1    jruoho  *
    137       1.1    jruoho  * FUNCTION:    AcpiExResolveObjectToValue
    138       1.1    jruoho  *
    139       1.1    jruoho  * PARAMETERS:  StackPtr        - Pointer to an internal object
    140       1.1    jruoho  *              WalkState       - Current method state
    141       1.1    jruoho  *
    142       1.1    jruoho  * RETURN:      Status
    143       1.1    jruoho  *
    144       1.1    jruoho  * DESCRIPTION: Retrieve the value from an internal object. The Reference type
    145       1.1    jruoho  *              uses the associated AML opcode to determine the value.
    146       1.1    jruoho  *
    147       1.1    jruoho  ******************************************************************************/
    148       1.1    jruoho 
    149       1.1    jruoho static ACPI_STATUS
    150       1.1    jruoho AcpiExResolveObjectToValue (
    151       1.1    jruoho     ACPI_OPERAND_OBJECT     **StackPtr,
    152       1.1    jruoho     ACPI_WALK_STATE         *WalkState)
    153       1.1    jruoho {
    154       1.1    jruoho     ACPI_STATUS             Status = AE_OK;
    155       1.1    jruoho     ACPI_OPERAND_OBJECT     *StackDesc;
    156       1.1    jruoho     ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
    157       1.1    jruoho     UINT8                   RefType;
    158       1.1    jruoho 
    159       1.1    jruoho 
    160       1.1    jruoho     ACPI_FUNCTION_TRACE (ExResolveObjectToValue);
    161       1.1    jruoho 
    162       1.1    jruoho 
    163       1.1    jruoho     StackDesc = *StackPtr;
    164       1.1    jruoho 
    165   1.1.1.3  christos     /* This is an object of type ACPI_OPERAND_OBJECT */
    166       1.1    jruoho 
    167       1.1    jruoho     switch (StackDesc->Common.Type)
    168       1.1    jruoho     {
    169       1.1    jruoho     case ACPI_TYPE_LOCAL_REFERENCE:
    170       1.1    jruoho 
    171       1.1    jruoho         RefType = StackDesc->Reference.Class;
    172       1.1    jruoho 
    173       1.1    jruoho         switch (RefType)
    174       1.1    jruoho         {
    175       1.1    jruoho         case ACPI_REFCLASS_LOCAL:
    176       1.1    jruoho         case ACPI_REFCLASS_ARG:
    177       1.1    jruoho             /*
    178       1.1    jruoho              * Get the local from the method's state info
    179       1.1    jruoho              * Note: this increments the local's object reference count
    180       1.1    jruoho              */
    181       1.1    jruoho             Status = AcpiDsMethodDataGetValue (RefType,
    182   1.1.1.6  christos                 StackDesc->Reference.Value, WalkState, &ObjDesc);
    183       1.1    jruoho             if (ACPI_FAILURE (Status))
    184       1.1    jruoho             {
    185       1.1    jruoho                 return_ACPI_STATUS (Status);
    186       1.1    jruoho             }
    187       1.1    jruoho 
    188       1.1    jruoho             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Arg/Local %X] ValueObj is %p\n",
    189       1.1    jruoho                 StackDesc->Reference.Value, ObjDesc));
    190       1.1    jruoho 
    191       1.1    jruoho             /*
    192       1.1    jruoho              * Now we can delete the original Reference Object and
    193       1.1    jruoho              * replace it with the resolved value
    194       1.1    jruoho              */
    195       1.1    jruoho             AcpiUtRemoveReference (StackDesc);
    196       1.1    jruoho             *StackPtr = ObjDesc;
    197       1.1    jruoho             break;
    198       1.1    jruoho 
    199       1.1    jruoho         case ACPI_REFCLASS_INDEX:
    200       1.1    jruoho 
    201       1.1    jruoho             switch (StackDesc->Reference.TargetType)
    202       1.1    jruoho             {
    203       1.1    jruoho             case ACPI_TYPE_BUFFER_FIELD:
    204       1.1    jruoho 
    205       1.1    jruoho                 /* Just return - do not dereference */
    206       1.1    jruoho                 break;
    207       1.1    jruoho 
    208       1.1    jruoho             case ACPI_TYPE_PACKAGE:
    209       1.1    jruoho 
    210       1.1    jruoho                 /* If method call or CopyObject - do not dereference */
    211       1.1    jruoho 
    212       1.1    jruoho                 if ((WalkState->Opcode == AML_INT_METHODCALL_OP) ||
    213   1.1.1.8  christos                     (WalkState->Opcode == AML_COPY_OBJECT_OP))
    214       1.1    jruoho                 {
    215       1.1    jruoho                     break;
    216       1.1    jruoho                 }
    217       1.1    jruoho 
    218       1.1    jruoho                 /* Otherwise, dereference the PackageIndex to a package element */
    219       1.1    jruoho 
    220       1.1    jruoho                 ObjDesc = *StackDesc->Reference.Where;
    221       1.1    jruoho                 if (ObjDesc)
    222       1.1    jruoho                 {
    223       1.1    jruoho                     /*
    224       1.1    jruoho                      * Valid object descriptor, copy pointer to return value
    225       1.1    jruoho                      * (i.e., dereference the package index)
    226       1.1    jruoho                      * Delete the ref object, increment the returned object
    227       1.1    jruoho                      */
    228       1.1    jruoho                     AcpiUtAddReference (ObjDesc);
    229       1.1    jruoho                     *StackPtr = ObjDesc;
    230       1.1    jruoho                 }
    231       1.1    jruoho                 else
    232       1.1    jruoho                 {
    233       1.1    jruoho                     /*
    234       1.1    jruoho                      * A NULL object descriptor means an uninitialized element of
    235       1.1    jruoho                      * the package, can't dereference it
    236       1.1    jruoho                      */
    237       1.1    jruoho                     ACPI_ERROR ((AE_INFO,
    238   1.1.1.6  christos                         "Attempt to dereference an Index to "
    239   1.1.1.6  christos                         "NULL package element Idx=%p",
    240       1.1    jruoho                         StackDesc));
    241       1.1    jruoho                     Status = AE_AML_UNINITIALIZED_ELEMENT;
    242       1.1    jruoho                 }
    243       1.1    jruoho                 break;
    244       1.1    jruoho 
    245       1.1    jruoho             default:
    246       1.1    jruoho 
    247       1.1    jruoho                 /* Invalid reference object */
    248       1.1    jruoho 
    249       1.1    jruoho                 ACPI_ERROR ((AE_INFO,
    250       1.1    jruoho                     "Unknown TargetType 0x%X in Index/Reference object %p",
    251       1.1    jruoho                     StackDesc->Reference.TargetType, StackDesc));
    252       1.1    jruoho                 Status = AE_AML_INTERNAL;
    253       1.1    jruoho                 break;
    254       1.1    jruoho             }
    255       1.1    jruoho             break;
    256       1.1    jruoho 
    257       1.1    jruoho         case ACPI_REFCLASS_REFOF:
    258       1.1    jruoho         case ACPI_REFCLASS_DEBUG:
    259       1.1    jruoho         case ACPI_REFCLASS_TABLE:
    260       1.1    jruoho 
    261       1.1    jruoho             /* Just leave the object as-is, do not dereference */
    262       1.1    jruoho 
    263       1.1    jruoho             break;
    264       1.1    jruoho 
    265       1.1    jruoho         case ACPI_REFCLASS_NAME:   /* Reference to a named object */
    266       1.1    jruoho 
    267       1.1    jruoho             /* Dereference the name */
    268       1.1    jruoho 
    269       1.1    jruoho             if ((StackDesc->Reference.Node->Type == ACPI_TYPE_DEVICE) ||
    270       1.1    jruoho                 (StackDesc->Reference.Node->Type == ACPI_TYPE_THERMAL))
    271       1.1    jruoho             {
    272       1.1    jruoho                 /* These node types do not have 'real' subobjects */
    273       1.1    jruoho 
    274       1.1    jruoho                 *StackPtr = (void *) StackDesc->Reference.Node;
    275       1.1    jruoho             }
    276       1.1    jruoho             else
    277       1.1    jruoho             {
    278       1.1    jruoho                 /* Get the object pointed to by the namespace node */
    279       1.1    jruoho 
    280       1.1    jruoho                 *StackPtr = (StackDesc->Reference.Node)->Object;
    281       1.1    jruoho                 AcpiUtAddReference (*StackPtr);
    282       1.1    jruoho             }
    283       1.1    jruoho 
    284       1.1    jruoho             AcpiUtRemoveReference (StackDesc);
    285       1.1    jruoho             break;
    286       1.1    jruoho 
    287       1.1    jruoho         default:
    288       1.1    jruoho 
    289       1.1    jruoho             ACPI_ERROR ((AE_INFO,
    290   1.1.1.6  christos                 "Unknown Reference type 0x%X in %p",
    291   1.1.1.6  christos                 RefType, StackDesc));
    292       1.1    jruoho             Status = AE_AML_INTERNAL;
    293       1.1    jruoho             break;
    294       1.1    jruoho         }
    295       1.1    jruoho         break;
    296       1.1    jruoho 
    297       1.1    jruoho     case ACPI_TYPE_BUFFER:
    298       1.1    jruoho 
    299       1.1    jruoho         Status = AcpiDsGetBufferArguments (StackDesc);
    300       1.1    jruoho         break;
    301       1.1    jruoho 
    302       1.1    jruoho     case ACPI_TYPE_PACKAGE:
    303       1.1    jruoho 
    304       1.1    jruoho         Status = AcpiDsGetPackageArguments (StackDesc);
    305       1.1    jruoho         break;
    306       1.1    jruoho 
    307       1.1    jruoho     case ACPI_TYPE_BUFFER_FIELD:
    308       1.1    jruoho     case ACPI_TYPE_LOCAL_REGION_FIELD:
    309       1.1    jruoho     case ACPI_TYPE_LOCAL_BANK_FIELD:
    310       1.1    jruoho     case ACPI_TYPE_LOCAL_INDEX_FIELD:
    311       1.1    jruoho 
    312   1.1.1.6  christos         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
    313   1.1.1.6  christos             "FieldRead SourceDesc=%p Type=%X\n",
    314       1.1    jruoho             StackDesc, StackDesc->Common.Type));
    315       1.1    jruoho 
    316       1.1    jruoho         Status = AcpiExReadDataFromField (WalkState, StackDesc, &ObjDesc);
    317       1.1    jruoho 
    318       1.1    jruoho         /* Remove a reference to the original operand, then override */
    319       1.1    jruoho 
    320       1.1    jruoho         AcpiUtRemoveReference (*StackPtr);
    321       1.1    jruoho         *StackPtr = (void *) ObjDesc;
    322       1.1    jruoho         break;
    323       1.1    jruoho 
    324       1.1    jruoho     default:
    325   1.1.1.3  christos 
    326       1.1    jruoho         break;
    327       1.1    jruoho     }
    328       1.1    jruoho 
    329       1.1    jruoho     return_ACPI_STATUS (Status);
    330       1.1    jruoho }
    331       1.1    jruoho 
    332       1.1    jruoho 
    333       1.1    jruoho /*******************************************************************************
    334       1.1    jruoho  *
    335       1.1    jruoho  * FUNCTION:    AcpiExResolveMultiple
    336       1.1    jruoho  *
    337       1.1    jruoho  * PARAMETERS:  WalkState           - Current state (contains AML opcode)
    338       1.1    jruoho  *              Operand             - Starting point for resolution
    339       1.1    jruoho  *              ReturnType          - Where the object type is returned
    340       1.1    jruoho  *              ReturnDesc          - Where the resolved object is returned
    341       1.1    jruoho  *
    342       1.1    jruoho  * RETURN:      Status
    343       1.1    jruoho  *
    344   1.1.1.3  christos  * DESCRIPTION: Return the base object and type. Traverse a reference list if
    345       1.1    jruoho  *              necessary to get to the base object.
    346       1.1    jruoho  *
    347       1.1    jruoho  ******************************************************************************/
    348       1.1    jruoho 
    349       1.1    jruoho ACPI_STATUS
    350       1.1    jruoho AcpiExResolveMultiple (
    351       1.1    jruoho     ACPI_WALK_STATE         *WalkState,
    352       1.1    jruoho     ACPI_OPERAND_OBJECT     *Operand,
    353       1.1    jruoho     ACPI_OBJECT_TYPE        *ReturnType,
    354       1.1    jruoho     ACPI_OPERAND_OBJECT     **ReturnDesc)
    355       1.1    jruoho {
    356   1.1.1.6  christos     ACPI_OPERAND_OBJECT     *ObjDesc = ACPI_CAST_PTR (void, Operand);
    357   1.1.1.6  christos     ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Operand);
    358       1.1    jruoho     ACPI_OBJECT_TYPE        Type;
    359       1.1    jruoho     ACPI_STATUS             Status;
    360       1.1    jruoho 
    361       1.1    jruoho 
    362       1.1    jruoho     ACPI_FUNCTION_TRACE (AcpiExResolveMultiple);
    363       1.1    jruoho 
    364       1.1    jruoho 
    365       1.1    jruoho     /* Operand can be either a namespace node or an operand descriptor */
    366       1.1    jruoho 
    367       1.1    jruoho     switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
    368       1.1    jruoho     {
    369       1.1    jruoho     case ACPI_DESC_TYPE_OPERAND:
    370   1.1.1.3  christos 
    371       1.1    jruoho         Type = ObjDesc->Common.Type;
    372       1.1    jruoho         break;
    373       1.1    jruoho 
    374       1.1    jruoho     case ACPI_DESC_TYPE_NAMED:
    375   1.1.1.3  christos 
    376       1.1    jruoho         Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
    377   1.1.1.6  christos         ObjDesc = AcpiNsGetAttachedObject (Node);
    378       1.1    jruoho 
    379       1.1    jruoho         /* If we had an Alias node, use the attached object for type info */
    380       1.1    jruoho 
    381       1.1    jruoho         if (Type == ACPI_TYPE_LOCAL_ALIAS)
    382       1.1    jruoho         {
    383       1.1    jruoho             Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
    384   1.1.1.6  christos             ObjDesc = AcpiNsGetAttachedObject (
    385   1.1.1.6  christos                 (ACPI_NAMESPACE_NODE *) ObjDesc);
    386   1.1.1.6  christos         }
    387   1.1.1.6  christos 
    388   1.1.1.9  christos         switch (Type)
    389   1.1.1.6  christos         {
    390   1.1.1.9  christos         case ACPI_TYPE_DEVICE:
    391   1.1.1.9  christos         case ACPI_TYPE_THERMAL:
    392   1.1.1.9  christos 
    393   1.1.1.9  christos             /* These types have no attached subobject */
    394   1.1.1.9  christos             break;
    395   1.1.1.9  christos 
    396   1.1.1.9  christos         default:
    397   1.1.1.9  christos 
    398   1.1.1.9  christos             /* All other types require a subobject */
    399   1.1.1.9  christos 
    400   1.1.1.9  christos             if (!ObjDesc)
    401   1.1.1.9  christos             {
    402   1.1.1.9  christos                 ACPI_ERROR ((AE_INFO,
    403   1.1.1.9  christos                     "[%4.4s] Node is unresolved or uninitialized",
    404   1.1.1.9  christos                     AcpiUtGetNodeName (Node)));
    405   1.1.1.9  christos                 return_ACPI_STATUS (AE_AML_UNINITIALIZED_NODE);
    406   1.1.1.9  christos             }
    407   1.1.1.9  christos             break;
    408       1.1    jruoho         }
    409       1.1    jruoho         break;
    410       1.1    jruoho 
    411       1.1    jruoho     default:
    412       1.1    jruoho         return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
    413       1.1    jruoho     }
    414       1.1    jruoho 
    415       1.1    jruoho     /* If type is anything other than a reference, we are done */
    416       1.1    jruoho 
    417       1.1    jruoho     if (Type != ACPI_TYPE_LOCAL_REFERENCE)
    418       1.1    jruoho     {
    419       1.1    jruoho         goto Exit;
    420       1.1    jruoho     }
    421       1.1    jruoho 
    422       1.1    jruoho     /*
    423       1.1    jruoho      * For reference objects created via the RefOf, Index, or Load/LoadTable
    424       1.1    jruoho      * operators, we need to get to the base object (as per the ACPI
    425       1.1    jruoho      * specification of the ObjectType and SizeOf operators). This means
    426       1.1    jruoho      * traversing the list of possibly many nested references.
    427       1.1    jruoho      */
    428       1.1    jruoho     while (ObjDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)
    429       1.1    jruoho     {
    430       1.1    jruoho         switch (ObjDesc->Reference.Class)
    431       1.1    jruoho         {
    432       1.1    jruoho         case ACPI_REFCLASS_REFOF:
    433       1.1    jruoho         case ACPI_REFCLASS_NAME:
    434       1.1    jruoho 
    435       1.1    jruoho             /* Dereference the reference pointer */
    436       1.1    jruoho 
    437       1.1    jruoho             if (ObjDesc->Reference.Class == ACPI_REFCLASS_REFOF)
    438       1.1    jruoho             {
    439       1.1    jruoho                 Node = ObjDesc->Reference.Object;
    440       1.1    jruoho             }
    441       1.1    jruoho             else /* AML_INT_NAMEPATH_OP */
    442       1.1    jruoho             {
    443       1.1    jruoho                 Node = ObjDesc->Reference.Node;
    444       1.1    jruoho             }
    445       1.1    jruoho 
    446       1.1    jruoho             /* All "References" point to a NS node */
    447       1.1    jruoho 
    448       1.1    jruoho             if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
    449       1.1    jruoho             {
    450       1.1    jruoho                 ACPI_ERROR ((AE_INFO,
    451       1.1    jruoho                     "Not a namespace node %p [%s]",
    452       1.1    jruoho                     Node, AcpiUtGetDescriptorName (Node)));
    453       1.1    jruoho                 return_ACPI_STATUS (AE_AML_INTERNAL);
    454       1.1    jruoho             }
    455       1.1    jruoho 
    456       1.1    jruoho             /* Get the attached object */
    457       1.1    jruoho 
    458       1.1    jruoho             ObjDesc = AcpiNsGetAttachedObject (Node);
    459       1.1    jruoho             if (!ObjDesc)
    460       1.1    jruoho             {
    461       1.1    jruoho                 /* No object, use the NS node type */
    462       1.1    jruoho 
    463       1.1    jruoho                 Type = AcpiNsGetType (Node);
    464       1.1    jruoho                 goto Exit;
    465       1.1    jruoho             }
    466       1.1    jruoho 
    467       1.1    jruoho             /* Check for circular references */
    468       1.1    jruoho 
    469       1.1    jruoho             if (ObjDesc == Operand)
    470       1.1    jruoho             {
    471       1.1    jruoho                 return_ACPI_STATUS (AE_AML_CIRCULAR_REFERENCE);
    472       1.1    jruoho             }
    473       1.1    jruoho             break;
    474       1.1    jruoho 
    475       1.1    jruoho         case ACPI_REFCLASS_INDEX:
    476       1.1    jruoho 
    477       1.1    jruoho             /* Get the type of this reference (index into another object) */
    478       1.1    jruoho 
    479       1.1    jruoho             Type = ObjDesc->Reference.TargetType;
    480       1.1    jruoho             if (Type != ACPI_TYPE_PACKAGE)
    481       1.1    jruoho             {
    482       1.1    jruoho                 goto Exit;
    483       1.1    jruoho             }
    484       1.1    jruoho 
    485       1.1    jruoho             /*
    486       1.1    jruoho              * The main object is a package, we want to get the type
    487       1.1    jruoho              * of the individual package element that is referenced by
    488       1.1    jruoho              * the index.
    489       1.1    jruoho              *
    490       1.1    jruoho              * This could of course in turn be another reference object.
    491       1.1    jruoho              */
    492       1.1    jruoho             ObjDesc = *(ObjDesc->Reference.Where);
    493       1.1    jruoho             if (!ObjDesc)
    494       1.1    jruoho             {
    495       1.1    jruoho                 /* NULL package elements are allowed */
    496       1.1    jruoho 
    497       1.1    jruoho                 Type = 0; /* Uninitialized */
    498       1.1    jruoho                 goto Exit;
    499       1.1    jruoho             }
    500       1.1    jruoho             break;
    501       1.1    jruoho 
    502       1.1    jruoho         case ACPI_REFCLASS_TABLE:
    503       1.1    jruoho 
    504       1.1    jruoho             Type = ACPI_TYPE_DDB_HANDLE;
    505       1.1    jruoho             goto Exit;
    506       1.1    jruoho 
    507       1.1    jruoho         case ACPI_REFCLASS_LOCAL:
    508       1.1    jruoho         case ACPI_REFCLASS_ARG:
    509       1.1    jruoho 
    510       1.1    jruoho             if (ReturnDesc)
    511       1.1    jruoho             {
    512       1.1    jruoho                 Status = AcpiDsMethodDataGetValue (ObjDesc->Reference.Class,
    513   1.1.1.6  christos                     ObjDesc->Reference.Value, WalkState, &ObjDesc);
    514       1.1    jruoho                 if (ACPI_FAILURE (Status))
    515       1.1    jruoho                 {
    516       1.1    jruoho                     return_ACPI_STATUS (Status);
    517       1.1    jruoho                 }
    518       1.1    jruoho                 AcpiUtRemoveReference (ObjDesc);
    519       1.1    jruoho             }
    520       1.1    jruoho             else
    521       1.1    jruoho             {
    522       1.1    jruoho                 Status = AcpiDsMethodDataGetNode (ObjDesc->Reference.Class,
    523   1.1.1.6  christos                     ObjDesc->Reference.Value, WalkState, &Node);
    524       1.1    jruoho                 if (ACPI_FAILURE (Status))
    525       1.1    jruoho                 {
    526       1.1    jruoho                     return_ACPI_STATUS (Status);
    527       1.1    jruoho                 }
    528       1.1    jruoho 
    529       1.1    jruoho                 ObjDesc = AcpiNsGetAttachedObject (Node);
    530       1.1    jruoho                 if (!ObjDesc)
    531       1.1    jruoho                 {
    532       1.1    jruoho                     Type = ACPI_TYPE_ANY;
    533       1.1    jruoho                     goto Exit;
    534       1.1    jruoho                 }
    535       1.1    jruoho             }
    536       1.1    jruoho             break;
    537       1.1    jruoho 
    538       1.1    jruoho         case ACPI_REFCLASS_DEBUG:
    539       1.1    jruoho 
    540       1.1    jruoho             /* The Debug Object is of type "DebugObject" */
    541       1.1    jruoho 
    542       1.1    jruoho             Type = ACPI_TYPE_DEBUG_OBJECT;
    543       1.1    jruoho             goto Exit;
    544       1.1    jruoho 
    545       1.1    jruoho         default:
    546       1.1    jruoho 
    547       1.1    jruoho             ACPI_ERROR ((AE_INFO,
    548   1.1.1.6  christos                 "Unknown Reference Class 0x%2.2X",
    549   1.1.1.6  christos                 ObjDesc->Reference.Class));
    550       1.1    jruoho             return_ACPI_STATUS (AE_AML_INTERNAL);
    551       1.1    jruoho         }
    552       1.1    jruoho     }
    553       1.1    jruoho 
    554       1.1    jruoho     /*
    555       1.1    jruoho      * Now we are guaranteed to have an object that has not been created
    556       1.1    jruoho      * via the RefOf or Index operators.
    557       1.1    jruoho      */
    558       1.1    jruoho     Type = ObjDesc->Common.Type;
    559       1.1    jruoho 
    560       1.1    jruoho 
    561       1.1    jruoho Exit:
    562       1.1    jruoho     /* Convert internal types to external types */
    563       1.1    jruoho 
    564       1.1    jruoho     switch (Type)
    565       1.1    jruoho     {
    566       1.1    jruoho     case ACPI_TYPE_LOCAL_REGION_FIELD:
    567       1.1    jruoho     case ACPI_TYPE_LOCAL_BANK_FIELD:
    568       1.1    jruoho     case ACPI_TYPE_LOCAL_INDEX_FIELD:
    569       1.1    jruoho 
    570       1.1    jruoho         Type = ACPI_TYPE_FIELD_UNIT;
    571       1.1    jruoho         break;
    572       1.1    jruoho 
    573       1.1    jruoho     case ACPI_TYPE_LOCAL_SCOPE:
    574       1.1    jruoho 
    575       1.1    jruoho         /* Per ACPI Specification, Scope is untyped */
    576       1.1    jruoho 
    577       1.1    jruoho         Type = ACPI_TYPE_ANY;
    578       1.1    jruoho         break;
    579       1.1    jruoho 
    580       1.1    jruoho     default:
    581   1.1.1.3  christos 
    582       1.1    jruoho         /* No change to Type required */
    583   1.1.1.3  christos 
    584       1.1    jruoho         break;
    585       1.1    jruoho     }
    586       1.1    jruoho 
    587       1.1    jruoho     *ReturnType = Type;
    588       1.1    jruoho     if (ReturnDesc)
    589       1.1    jruoho     {
    590       1.1    jruoho         *ReturnDesc = ObjDesc;
    591       1.1    jruoho     }
    592       1.1    jruoho     return_ACPI_STATUS (AE_OK);
    593       1.1    jruoho }
    594