Home | History | Annotate | Line # | Download | only in executer
exresnte.c revision 1.1.1.2.4.2
      1  1.1.1.2.4.2  rmind 
      2  1.1.1.2.4.2  rmind /******************************************************************************
      3  1.1.1.2.4.2  rmind  *
      4  1.1.1.2.4.2  rmind  * Module Name: exresnte - AML Interpreter object resolution
      5  1.1.1.2.4.2  rmind  *
      6  1.1.1.2.4.2  rmind  *****************************************************************************/
      7  1.1.1.2.4.2  rmind 
      8  1.1.1.2.4.2  rmind /*
      9  1.1.1.2.4.2  rmind  * Copyright (C) 2000 - 2011, Intel Corp.
     10  1.1.1.2.4.2  rmind  * All rights reserved.
     11  1.1.1.2.4.2  rmind  *
     12  1.1.1.2.4.2  rmind  * Redistribution and use in source and binary forms, with or without
     13  1.1.1.2.4.2  rmind  * modification, are permitted provided that the following conditions
     14  1.1.1.2.4.2  rmind  * are met:
     15  1.1.1.2.4.2  rmind  * 1. Redistributions of source code must retain the above copyright
     16  1.1.1.2.4.2  rmind  *    notice, this list of conditions, and the following disclaimer,
     17  1.1.1.2.4.2  rmind  *    without modification.
     18  1.1.1.2.4.2  rmind  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     19  1.1.1.2.4.2  rmind  *    substantially similar to the "NO WARRANTY" disclaimer below
     20  1.1.1.2.4.2  rmind  *    ("Disclaimer") and any redistribution must be conditioned upon
     21  1.1.1.2.4.2  rmind  *    including a substantially similar Disclaimer requirement for further
     22  1.1.1.2.4.2  rmind  *    binary redistribution.
     23  1.1.1.2.4.2  rmind  * 3. Neither the names of the above-listed copyright holders nor the names
     24  1.1.1.2.4.2  rmind  *    of any contributors may be used to endorse or promote products derived
     25  1.1.1.2.4.2  rmind  *    from this software without specific prior written permission.
     26  1.1.1.2.4.2  rmind  *
     27  1.1.1.2.4.2  rmind  * Alternatively, this software may be distributed under the terms of the
     28  1.1.1.2.4.2  rmind  * GNU General Public License ("GPL") version 2 as published by the Free
     29  1.1.1.2.4.2  rmind  * Software Foundation.
     30  1.1.1.2.4.2  rmind  *
     31  1.1.1.2.4.2  rmind  * NO WARRANTY
     32  1.1.1.2.4.2  rmind  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     33  1.1.1.2.4.2  rmind  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     34  1.1.1.2.4.2  rmind  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     35  1.1.1.2.4.2  rmind  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     36  1.1.1.2.4.2  rmind  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     37  1.1.1.2.4.2  rmind  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     38  1.1.1.2.4.2  rmind  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     39  1.1.1.2.4.2  rmind  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     40  1.1.1.2.4.2  rmind  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     41  1.1.1.2.4.2  rmind  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     42  1.1.1.2.4.2  rmind  * POSSIBILITY OF SUCH DAMAGES.
     43  1.1.1.2.4.2  rmind  */
     44  1.1.1.2.4.2  rmind 
     45  1.1.1.2.4.2  rmind #define __EXRESNTE_C__
     46  1.1.1.2.4.2  rmind 
     47  1.1.1.2.4.2  rmind #include "acpi.h"
     48  1.1.1.2.4.2  rmind #include "accommon.h"
     49  1.1.1.2.4.2  rmind #include "acdispat.h"
     50  1.1.1.2.4.2  rmind #include "acinterp.h"
     51  1.1.1.2.4.2  rmind #include "acnamesp.h"
     52  1.1.1.2.4.2  rmind 
     53  1.1.1.2.4.2  rmind 
     54  1.1.1.2.4.2  rmind #define _COMPONENT          ACPI_EXECUTER
     55  1.1.1.2.4.2  rmind         ACPI_MODULE_NAME    ("exresnte")
     56  1.1.1.2.4.2  rmind 
     57  1.1.1.2.4.2  rmind 
     58  1.1.1.2.4.2  rmind /*******************************************************************************
     59  1.1.1.2.4.2  rmind  *
     60  1.1.1.2.4.2  rmind  * FUNCTION:    AcpiExResolveNodeToValue
     61  1.1.1.2.4.2  rmind  *
     62  1.1.1.2.4.2  rmind  * PARAMETERS:  ObjectPtr       - Pointer to a location that contains
     63  1.1.1.2.4.2  rmind  *                                a pointer to a NS node, and will receive a
     64  1.1.1.2.4.2  rmind  *                                pointer to the resolved object.
     65  1.1.1.2.4.2  rmind  *              WalkState       - Current state.  Valid only if executing AML
     66  1.1.1.2.4.2  rmind  *                                code.  NULL if simply resolving an object
     67  1.1.1.2.4.2  rmind  *
     68  1.1.1.2.4.2  rmind  * RETURN:      Status
     69  1.1.1.2.4.2  rmind  *
     70  1.1.1.2.4.2  rmind  * DESCRIPTION: Resolve a Namespace node to a valued object
     71  1.1.1.2.4.2  rmind  *
     72  1.1.1.2.4.2  rmind  * Note: for some of the data types, the pointer attached to the Node
     73  1.1.1.2.4.2  rmind  * can be either a pointer to an actual internal object or a pointer into the
     74  1.1.1.2.4.2  rmind  * AML stream itself.  These types are currently:
     75  1.1.1.2.4.2  rmind  *
     76  1.1.1.2.4.2  rmind  *      ACPI_TYPE_INTEGER
     77  1.1.1.2.4.2  rmind  *      ACPI_TYPE_STRING
     78  1.1.1.2.4.2  rmind  *      ACPI_TYPE_BUFFER
     79  1.1.1.2.4.2  rmind  *      ACPI_TYPE_MUTEX
     80  1.1.1.2.4.2  rmind  *      ACPI_TYPE_PACKAGE
     81  1.1.1.2.4.2  rmind  *
     82  1.1.1.2.4.2  rmind  ******************************************************************************/
     83  1.1.1.2.4.2  rmind 
     84  1.1.1.2.4.2  rmind ACPI_STATUS
     85  1.1.1.2.4.2  rmind AcpiExResolveNodeToValue (
     86  1.1.1.2.4.2  rmind     ACPI_NAMESPACE_NODE     **ObjectPtr,
     87  1.1.1.2.4.2  rmind     ACPI_WALK_STATE         *WalkState)
     88  1.1.1.2.4.2  rmind 
     89  1.1.1.2.4.2  rmind {
     90  1.1.1.2.4.2  rmind     ACPI_STATUS             Status = AE_OK;
     91  1.1.1.2.4.2  rmind     ACPI_OPERAND_OBJECT     *SourceDesc;
     92  1.1.1.2.4.2  rmind     ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
     93  1.1.1.2.4.2  rmind     ACPI_NAMESPACE_NODE     *Node;
     94  1.1.1.2.4.2  rmind     ACPI_OBJECT_TYPE        EntryType;
     95  1.1.1.2.4.2  rmind 
     96  1.1.1.2.4.2  rmind 
     97  1.1.1.2.4.2  rmind     ACPI_FUNCTION_TRACE (ExResolveNodeToValue);
     98  1.1.1.2.4.2  rmind 
     99  1.1.1.2.4.2  rmind 
    100  1.1.1.2.4.2  rmind     /*
    101  1.1.1.2.4.2  rmind      * The stack pointer points to a ACPI_NAMESPACE_NODE (Node).  Get the
    102  1.1.1.2.4.2  rmind      * object that is attached to the Node.
    103  1.1.1.2.4.2  rmind      */
    104  1.1.1.2.4.2  rmind     Node       = *ObjectPtr;
    105  1.1.1.2.4.2  rmind     SourceDesc = AcpiNsGetAttachedObject (Node);
    106  1.1.1.2.4.2  rmind     EntryType  = AcpiNsGetType ((ACPI_HANDLE) Node);
    107  1.1.1.2.4.2  rmind 
    108  1.1.1.2.4.2  rmind     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Entry=%p SourceDesc=%p [%s]\n",
    109  1.1.1.2.4.2  rmind          Node, SourceDesc, AcpiUtGetTypeName (EntryType)));
    110  1.1.1.2.4.2  rmind 
    111  1.1.1.2.4.2  rmind     if ((EntryType == ACPI_TYPE_LOCAL_ALIAS) ||
    112  1.1.1.2.4.2  rmind         (EntryType == ACPI_TYPE_LOCAL_METHOD_ALIAS))
    113  1.1.1.2.4.2  rmind     {
    114  1.1.1.2.4.2  rmind         /* There is always exactly one level of indirection */
    115  1.1.1.2.4.2  rmind 
    116  1.1.1.2.4.2  rmind         Node       = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Node->Object);
    117  1.1.1.2.4.2  rmind         SourceDesc = AcpiNsGetAttachedObject (Node);
    118  1.1.1.2.4.2  rmind         EntryType  = AcpiNsGetType ((ACPI_HANDLE) Node);
    119  1.1.1.2.4.2  rmind         *ObjectPtr = Node;
    120  1.1.1.2.4.2  rmind     }
    121  1.1.1.2.4.2  rmind 
    122  1.1.1.2.4.2  rmind     /*
    123  1.1.1.2.4.2  rmind      * Several object types require no further processing:
    124  1.1.1.2.4.2  rmind      * 1) Device/Thermal objects don't have a "real" subobject, return the Node
    125  1.1.1.2.4.2  rmind      * 2) Method locals and arguments have a pseudo-Node
    126  1.1.1.2.4.2  rmind      * 3) 10/2007: Added method type to assist with Package construction.
    127  1.1.1.2.4.2  rmind      */
    128  1.1.1.2.4.2  rmind     if ((EntryType == ACPI_TYPE_DEVICE)  ||
    129  1.1.1.2.4.2  rmind         (EntryType == ACPI_TYPE_THERMAL) ||
    130  1.1.1.2.4.2  rmind         (EntryType == ACPI_TYPE_METHOD)  ||
    131  1.1.1.2.4.2  rmind         (Node->Flags & (ANOBJ_METHOD_ARG | ANOBJ_METHOD_LOCAL)))
    132  1.1.1.2.4.2  rmind     {
    133  1.1.1.2.4.2  rmind         return_ACPI_STATUS (AE_OK);
    134  1.1.1.2.4.2  rmind     }
    135  1.1.1.2.4.2  rmind 
    136  1.1.1.2.4.2  rmind     if (!SourceDesc)
    137  1.1.1.2.4.2  rmind     {
    138  1.1.1.2.4.2  rmind         ACPI_ERROR ((AE_INFO, "No object attached to node %p",
    139  1.1.1.2.4.2  rmind             Node));
    140  1.1.1.2.4.2  rmind         return_ACPI_STATUS (AE_AML_NO_OPERAND);
    141  1.1.1.2.4.2  rmind     }
    142  1.1.1.2.4.2  rmind 
    143  1.1.1.2.4.2  rmind     /*
    144  1.1.1.2.4.2  rmind      * Action is based on the type of the Node, which indicates the type
    145  1.1.1.2.4.2  rmind      * of the attached object or pointer
    146  1.1.1.2.4.2  rmind      */
    147  1.1.1.2.4.2  rmind     switch (EntryType)
    148  1.1.1.2.4.2  rmind     {
    149  1.1.1.2.4.2  rmind     case ACPI_TYPE_PACKAGE:
    150  1.1.1.2.4.2  rmind 
    151  1.1.1.2.4.2  rmind         if (SourceDesc->Common.Type != ACPI_TYPE_PACKAGE)
    152  1.1.1.2.4.2  rmind         {
    153  1.1.1.2.4.2  rmind             ACPI_ERROR ((AE_INFO, "Object not a Package, type %s",
    154  1.1.1.2.4.2  rmind                 AcpiUtGetObjectTypeName (SourceDesc)));
    155  1.1.1.2.4.2  rmind             return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
    156  1.1.1.2.4.2  rmind         }
    157  1.1.1.2.4.2  rmind 
    158  1.1.1.2.4.2  rmind         Status = AcpiDsGetPackageArguments (SourceDesc);
    159  1.1.1.2.4.2  rmind         if (ACPI_SUCCESS (Status))
    160  1.1.1.2.4.2  rmind         {
    161  1.1.1.2.4.2  rmind             /* Return an additional reference to the object */
    162  1.1.1.2.4.2  rmind 
    163  1.1.1.2.4.2  rmind             ObjDesc = SourceDesc;
    164  1.1.1.2.4.2  rmind             AcpiUtAddReference (ObjDesc);
    165  1.1.1.2.4.2  rmind         }
    166  1.1.1.2.4.2  rmind         break;
    167  1.1.1.2.4.2  rmind 
    168  1.1.1.2.4.2  rmind 
    169  1.1.1.2.4.2  rmind     case ACPI_TYPE_BUFFER:
    170  1.1.1.2.4.2  rmind 
    171  1.1.1.2.4.2  rmind         if (SourceDesc->Common.Type != ACPI_TYPE_BUFFER)
    172  1.1.1.2.4.2  rmind         {
    173  1.1.1.2.4.2  rmind             ACPI_ERROR ((AE_INFO, "Object not a Buffer, type %s",
    174  1.1.1.2.4.2  rmind                 AcpiUtGetObjectTypeName (SourceDesc)));
    175  1.1.1.2.4.2  rmind             return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
    176  1.1.1.2.4.2  rmind         }
    177  1.1.1.2.4.2  rmind 
    178  1.1.1.2.4.2  rmind         Status = AcpiDsGetBufferArguments (SourceDesc);
    179  1.1.1.2.4.2  rmind         if (ACPI_SUCCESS (Status))
    180  1.1.1.2.4.2  rmind         {
    181  1.1.1.2.4.2  rmind             /* Return an additional reference to the object */
    182  1.1.1.2.4.2  rmind 
    183  1.1.1.2.4.2  rmind             ObjDesc = SourceDesc;
    184  1.1.1.2.4.2  rmind             AcpiUtAddReference (ObjDesc);
    185  1.1.1.2.4.2  rmind         }
    186  1.1.1.2.4.2  rmind         break;
    187  1.1.1.2.4.2  rmind 
    188  1.1.1.2.4.2  rmind 
    189  1.1.1.2.4.2  rmind     case ACPI_TYPE_STRING:
    190  1.1.1.2.4.2  rmind 
    191  1.1.1.2.4.2  rmind         if (SourceDesc->Common.Type != ACPI_TYPE_STRING)
    192  1.1.1.2.4.2  rmind         {
    193  1.1.1.2.4.2  rmind             ACPI_ERROR ((AE_INFO, "Object not a String, type %s",
    194  1.1.1.2.4.2  rmind                 AcpiUtGetObjectTypeName (SourceDesc)));
    195  1.1.1.2.4.2  rmind             return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
    196  1.1.1.2.4.2  rmind         }
    197  1.1.1.2.4.2  rmind 
    198  1.1.1.2.4.2  rmind         /* Return an additional reference to the object */
    199  1.1.1.2.4.2  rmind 
    200  1.1.1.2.4.2  rmind         ObjDesc = SourceDesc;
    201  1.1.1.2.4.2  rmind         AcpiUtAddReference (ObjDesc);
    202  1.1.1.2.4.2  rmind         break;
    203  1.1.1.2.4.2  rmind 
    204  1.1.1.2.4.2  rmind 
    205  1.1.1.2.4.2  rmind     case ACPI_TYPE_INTEGER:
    206  1.1.1.2.4.2  rmind 
    207  1.1.1.2.4.2  rmind         if (SourceDesc->Common.Type != ACPI_TYPE_INTEGER)
    208  1.1.1.2.4.2  rmind         {
    209  1.1.1.2.4.2  rmind             ACPI_ERROR ((AE_INFO, "Object not a Integer, type %s",
    210  1.1.1.2.4.2  rmind                 AcpiUtGetObjectTypeName (SourceDesc)));
    211  1.1.1.2.4.2  rmind             return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
    212  1.1.1.2.4.2  rmind         }
    213  1.1.1.2.4.2  rmind 
    214  1.1.1.2.4.2  rmind         /* Return an additional reference to the object */
    215  1.1.1.2.4.2  rmind 
    216  1.1.1.2.4.2  rmind         ObjDesc = SourceDesc;
    217  1.1.1.2.4.2  rmind         AcpiUtAddReference (ObjDesc);
    218  1.1.1.2.4.2  rmind         break;
    219  1.1.1.2.4.2  rmind 
    220  1.1.1.2.4.2  rmind 
    221  1.1.1.2.4.2  rmind     case ACPI_TYPE_BUFFER_FIELD:
    222  1.1.1.2.4.2  rmind     case ACPI_TYPE_LOCAL_REGION_FIELD:
    223  1.1.1.2.4.2  rmind     case ACPI_TYPE_LOCAL_BANK_FIELD:
    224  1.1.1.2.4.2  rmind     case ACPI_TYPE_LOCAL_INDEX_FIELD:
    225  1.1.1.2.4.2  rmind 
    226  1.1.1.2.4.2  rmind         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
    227  1.1.1.2.4.2  rmind             "FieldRead Node=%p SourceDesc=%p Type=%X\n",
    228  1.1.1.2.4.2  rmind             Node, SourceDesc, EntryType));
    229  1.1.1.2.4.2  rmind 
    230  1.1.1.2.4.2  rmind         Status = AcpiExReadDataFromField (WalkState, SourceDesc, &ObjDesc);
    231  1.1.1.2.4.2  rmind         break;
    232  1.1.1.2.4.2  rmind 
    233  1.1.1.2.4.2  rmind     /* For these objects, just return the object attached to the Node */
    234  1.1.1.2.4.2  rmind 
    235  1.1.1.2.4.2  rmind     case ACPI_TYPE_MUTEX:
    236  1.1.1.2.4.2  rmind     case ACPI_TYPE_POWER:
    237  1.1.1.2.4.2  rmind     case ACPI_TYPE_PROCESSOR:
    238  1.1.1.2.4.2  rmind     case ACPI_TYPE_EVENT:
    239  1.1.1.2.4.2  rmind     case ACPI_TYPE_REGION:
    240  1.1.1.2.4.2  rmind 
    241  1.1.1.2.4.2  rmind         /* Return an additional reference to the object */
    242  1.1.1.2.4.2  rmind 
    243  1.1.1.2.4.2  rmind         ObjDesc = SourceDesc;
    244  1.1.1.2.4.2  rmind         AcpiUtAddReference (ObjDesc);
    245  1.1.1.2.4.2  rmind         break;
    246  1.1.1.2.4.2  rmind 
    247  1.1.1.2.4.2  rmind     /* TYPE_ANY is untyped, and thus there is no object associated with it */
    248  1.1.1.2.4.2  rmind 
    249  1.1.1.2.4.2  rmind     case ACPI_TYPE_ANY:
    250  1.1.1.2.4.2  rmind 
    251  1.1.1.2.4.2  rmind         ACPI_ERROR ((AE_INFO,
    252  1.1.1.2.4.2  rmind             "Untyped entry %p, no attached object!", Node));
    253  1.1.1.2.4.2  rmind 
    254  1.1.1.2.4.2  rmind         return_ACPI_STATUS (AE_AML_OPERAND_TYPE);  /* Cannot be AE_TYPE */
    255  1.1.1.2.4.2  rmind 
    256  1.1.1.2.4.2  rmind 
    257  1.1.1.2.4.2  rmind     case ACPI_TYPE_LOCAL_REFERENCE:
    258  1.1.1.2.4.2  rmind 
    259  1.1.1.2.4.2  rmind         switch (SourceDesc->Reference.Class)
    260  1.1.1.2.4.2  rmind         {
    261  1.1.1.2.4.2  rmind         case ACPI_REFCLASS_TABLE:   /* This is a DdbHandle */
    262  1.1.1.2.4.2  rmind         case ACPI_REFCLASS_REFOF:
    263  1.1.1.2.4.2  rmind         case ACPI_REFCLASS_INDEX:
    264  1.1.1.2.4.2  rmind 
    265  1.1.1.2.4.2  rmind             /* Return an additional reference to the object */
    266  1.1.1.2.4.2  rmind 
    267  1.1.1.2.4.2  rmind             ObjDesc = SourceDesc;
    268  1.1.1.2.4.2  rmind             AcpiUtAddReference (ObjDesc);
    269  1.1.1.2.4.2  rmind             break;
    270  1.1.1.2.4.2  rmind 
    271  1.1.1.2.4.2  rmind         default:
    272  1.1.1.2.4.2  rmind             /* No named references are allowed here */
    273  1.1.1.2.4.2  rmind 
    274  1.1.1.2.4.2  rmind             ACPI_ERROR ((AE_INFO,
    275  1.1.1.2.4.2  rmind                 "Unsupported Reference type 0x%X",
    276  1.1.1.2.4.2  rmind                 SourceDesc->Reference.Class));
    277  1.1.1.2.4.2  rmind 
    278  1.1.1.2.4.2  rmind             return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
    279  1.1.1.2.4.2  rmind         }
    280  1.1.1.2.4.2  rmind         break;
    281  1.1.1.2.4.2  rmind 
    282  1.1.1.2.4.2  rmind 
    283  1.1.1.2.4.2  rmind     default:
    284  1.1.1.2.4.2  rmind 
    285  1.1.1.2.4.2  rmind         /* Default case is for unknown types */
    286  1.1.1.2.4.2  rmind 
    287  1.1.1.2.4.2  rmind         ACPI_ERROR ((AE_INFO,
    288  1.1.1.2.4.2  rmind             "Node %p - Unknown object type 0x%X",
    289  1.1.1.2.4.2  rmind             Node, EntryType));
    290  1.1.1.2.4.2  rmind 
    291  1.1.1.2.4.2  rmind         return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
    292  1.1.1.2.4.2  rmind 
    293  1.1.1.2.4.2  rmind     } /* switch (EntryType) */
    294  1.1.1.2.4.2  rmind 
    295  1.1.1.2.4.2  rmind 
    296  1.1.1.2.4.2  rmind     /* Return the object descriptor */
    297  1.1.1.2.4.2  rmind 
    298  1.1.1.2.4.2  rmind     *ObjectPtr = (void *) ObjDesc;
    299  1.1.1.2.4.2  rmind     return_ACPI_STATUS (Status);
    300  1.1.1.2.4.2  rmind }
    301  1.1.1.2.4.2  rmind 
    302  1.1.1.2.4.2  rmind 
    303