exresnte.c revision 128212
167754Smsmith 267754Smsmith/****************************************************************************** 367754Smsmith * 477424Smsmith * Module Name: exresnte - AML Interpreter object resolution 5128212Snjl * $Revision: 65 $ 667754Smsmith * 767754Smsmith *****************************************************************************/ 867754Smsmith 967754Smsmith/****************************************************************************** 1067754Smsmith * 1167754Smsmith * 1. Copyright Notice 1267754Smsmith * 13126372Snjl * Some or all of this work - Copyright (c) 1999 - 2004, 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 __EXRESNTE_C__ 11967754Smsmith 12067754Smsmith#include "acpi.h" 12167754Smsmith#include "acdispat.h" 12267754Smsmith#include "acinterp.h" 12367754Smsmith#include "acnamesp.h" 124123315Snjl#include "acparser.h" 125123315Snjl#include "amlcode.h" 12667754Smsmith 12767754Smsmith 12877424Smsmith#define _COMPONENT ACPI_EXECUTER 12991116Smsmith ACPI_MODULE_NAME ("exresnte") 13067754Smsmith 13167754Smsmith 13267754Smsmith/******************************************************************************* 13367754Smsmith * 13477424Smsmith * FUNCTION: AcpiExResolveNodeToValue 13567754Smsmith * 13685756Smsmith * PARAMETERS: ObjectPtr - Pointer to a location that contains 13792388Smsmith * a pointer to a NS node, and will receive a 13885756Smsmith * pointer to the resolved object. 13985756Smsmith * WalkState - Current state. Valid only if executing AML 14085756Smsmith * code. NULL if simply resolving an object 14167754Smsmith * 14267754Smsmith * RETURN: Status 14367754Smsmith * 14485756Smsmith * DESCRIPTION: Resolve a Namespace node to a valued object 14567754Smsmith * 14667754Smsmith * Note: for some of the data types, the pointer attached to the Node 14767754Smsmith * can be either a pointer to an actual internal object or a pointer into the 14867754Smsmith * AML stream itself. These types are currently: 14967754Smsmith * 15071867Smsmith * ACPI_TYPE_INTEGER 15167754Smsmith * ACPI_TYPE_STRING 15267754Smsmith * ACPI_TYPE_BUFFER 15367754Smsmith * ACPI_TYPE_MUTEX 15467754Smsmith * ACPI_TYPE_PACKAGE 15567754Smsmith * 15667754Smsmith ******************************************************************************/ 15767754Smsmith 15867754SmsmithACPI_STATUS 15977424SmsmithAcpiExResolveNodeToValue ( 16085756Smsmith ACPI_NAMESPACE_NODE **ObjectPtr, 16169450Smsmith ACPI_WALK_STATE *WalkState) 16269450Smsmith 16367754Smsmith{ 16467754Smsmith ACPI_STATUS Status = AE_OK; 16585756Smsmith ACPI_OPERAND_OBJECT *SourceDesc; 16667754Smsmith ACPI_OPERAND_OBJECT *ObjDesc = NULL; 16767754Smsmith ACPI_NAMESPACE_NODE *Node; 16891116Smsmith ACPI_OBJECT_TYPE EntryType; 16967754Smsmith 17067754Smsmith 17191116Smsmith ACPI_FUNCTION_TRACE ("ExResolveNodeToValue"); 17267754Smsmith 17367754Smsmith 17467754Smsmith /* 17577424Smsmith * The stack pointer points to a ACPI_NAMESPACE_NODE (Node). Get the 17677424Smsmith * object that is attached to the Node. 17767754Smsmith */ 17887031Smsmith Node = *ObjectPtr; 17987031Smsmith SourceDesc = AcpiNsGetAttachedObject (Node); 18087031Smsmith EntryType = AcpiNsGetType ((ACPI_HANDLE) Node); 18167754Smsmith 182107325Siwasaki ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Entry=%p SourceDesc=%p [%s]\n", 183107325Siwasaki Node, SourceDesc, AcpiUtGetTypeName (EntryType))); 18467754Smsmith 185128212Snjl if ((EntryType == ACPI_TYPE_LOCAL_ALIAS) || 186128212Snjl (EntryType == ACPI_TYPE_LOCAL_METHOD_ALIAS)) 187104470Siwasaki { 188104470Siwasaki /* There is always exactly one level of indirection */ 189104470Siwasaki 190128212Snjl Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Node->Object); 191104470Siwasaki SourceDesc = AcpiNsGetAttachedObject (Node); 192104470Siwasaki EntryType = AcpiNsGetType ((ACPI_HANDLE) Node); 193104470Siwasaki *ObjectPtr = Node; 194104470Siwasaki } 195104470Siwasaki 19667754Smsmith /* 19782367Smsmith * Several object types require no further processing: 19882367Smsmith * 1) Devices rarely have an attached object, return the Node 19982367Smsmith * 2) Method locals and arguments have a pseudo-Node 20067754Smsmith */ 20167754Smsmith if (EntryType == ACPI_TYPE_DEVICE || 20269746Smsmith (Node->Flags & (ANOBJ_METHOD_ARG | ANOBJ_METHOD_LOCAL))) 20367754Smsmith { 20467754Smsmith return_ACPI_STATUS (AE_OK); 20567754Smsmith } 20667754Smsmith 20785756Smsmith if (!SourceDesc) 20867754Smsmith { 20982367Smsmith ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object attached to node %p\n", 21067754Smsmith Node)); 21167754Smsmith return_ACPI_STATUS (AE_AML_NO_OPERAND); 21267754Smsmith } 21367754Smsmith 21467754Smsmith /* 21567754Smsmith * Action is based on the type of the Node, which indicates the type 21667754Smsmith * of the attached object or pointer 21767754Smsmith */ 21867754Smsmith switch (EntryType) 21967754Smsmith { 22067754Smsmith case ACPI_TYPE_PACKAGE: 22167754Smsmith 22299679Siwasaki if (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_PACKAGE) 22367754Smsmith { 22484491Smsmith ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a Package, type %s\n", 22599679Siwasaki AcpiUtGetObjectTypeName (SourceDesc))); 22667754Smsmith return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 22767754Smsmith } 22867754Smsmith 22999146Siwasaki Status = AcpiDsGetPackageArguments (SourceDesc); 23099146Siwasaki if (ACPI_SUCCESS (Status)) 23199146Siwasaki { 23299146Siwasaki /* Return an additional reference to the object */ 23367754Smsmith 23499146Siwasaki ObjDesc = SourceDesc; 23599146Siwasaki AcpiUtAddReference (ObjDesc); 23699146Siwasaki } 23767754Smsmith break; 23867754Smsmith 23967754Smsmith 24067754Smsmith case ACPI_TYPE_BUFFER: 24167754Smsmith 24299679Siwasaki if (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_BUFFER) 24367754Smsmith { 24484491Smsmith ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a Buffer, type %s\n", 24599679Siwasaki AcpiUtGetObjectTypeName (SourceDesc))); 24667754Smsmith return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 24767754Smsmith } 24867754Smsmith 24999146Siwasaki Status = AcpiDsGetBufferArguments (SourceDesc); 25099146Siwasaki if (ACPI_SUCCESS (Status)) 25199146Siwasaki { 25299146Siwasaki /* Return an additional reference to the object */ 25367754Smsmith 25499146Siwasaki ObjDesc = SourceDesc; 25599146Siwasaki AcpiUtAddReference (ObjDesc); 25699146Siwasaki } 25767754Smsmith break; 25867754Smsmith 25967754Smsmith 26067754Smsmith case ACPI_TYPE_STRING: 26167754Smsmith 26299679Siwasaki if (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_STRING) 26367754Smsmith { 26484491Smsmith ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a String, type %s\n", 26599679Siwasaki AcpiUtGetObjectTypeName (SourceDesc))); 26682367Smsmith return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 26767754Smsmith } 26867754Smsmith 26982367Smsmith /* Return an additional reference to the object */ 27067754Smsmith 27185756Smsmith ObjDesc = SourceDesc; 27282367Smsmith AcpiUtAddReference (ObjDesc); 27367754Smsmith break; 27467754Smsmith 27567754Smsmith 27671867Smsmith case ACPI_TYPE_INTEGER: 27767754Smsmith 27899679Siwasaki if (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_INTEGER) 27967754Smsmith { 28084491Smsmith ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a Integer, type %s\n", 28199679Siwasaki AcpiUtGetObjectTypeName (SourceDesc))); 28267754Smsmith return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 28367754Smsmith } 28467754Smsmith 28567754Smsmith /* Return an additional reference to the object */ 28667754Smsmith 28785756Smsmith ObjDesc = SourceDesc; 28877424Smsmith AcpiUtAddReference (ObjDesc); 28967754Smsmith break; 29067754Smsmith 29167754Smsmith 29277424Smsmith case ACPI_TYPE_BUFFER_FIELD: 293107325Siwasaki case ACPI_TYPE_LOCAL_REGION_FIELD: 294107325Siwasaki case ACPI_TYPE_LOCAL_BANK_FIELD: 295107325Siwasaki case ACPI_TYPE_LOCAL_INDEX_FIELD: 29667754Smsmith 29785756Smsmith ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "FieldRead Node=%p SourceDesc=%p Type=%X\n", 29885756Smsmith Node, SourceDesc, EntryType)); 29967754Smsmith 30099146Siwasaki Status = AcpiExReadDataFromField (WalkState, SourceDesc, &ObjDesc); 30167754Smsmith break; 30267754Smsmith 30367754Smsmith /* 30467754Smsmith * For these objects, just return the object attached to the Node 30567754Smsmith */ 30667754Smsmith case ACPI_TYPE_MUTEX: 30767754Smsmith case ACPI_TYPE_METHOD: 30867754Smsmith case ACPI_TYPE_POWER: 30967754Smsmith case ACPI_TYPE_PROCESSOR: 31067754Smsmith case ACPI_TYPE_THERMAL: 31167754Smsmith case ACPI_TYPE_EVENT: 31267754Smsmith case ACPI_TYPE_REGION: 31367754Smsmith 31467754Smsmith /* Return an additional reference to the object */ 31567754Smsmith 31685756Smsmith ObjDesc = SourceDesc; 31777424Smsmith AcpiUtAddReference (ObjDesc); 31867754Smsmith break; 31967754Smsmith 32067754Smsmith 321104470Siwasaki /* TYPE_ANY is untyped, and thus there is no object associated with it */ 32267754Smsmith 32367754Smsmith case ACPI_TYPE_ANY: 32467754Smsmith 32582367Smsmith ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Untyped entry %p, no attached object!\n", 32667754Smsmith Node)); 32767754Smsmith 32867754Smsmith return_ACPI_STATUS (AE_AML_OPERAND_TYPE); /* Cannot be AE_TYPE */ 32967754Smsmith 33067754Smsmith 331107325Siwasaki case ACPI_TYPE_LOCAL_REFERENCE: 33267754Smsmith 333123315Snjl switch (SourceDesc->Reference.Opcode) 334123315Snjl { 335123315Snjl case AML_LOAD_OP: 33667754Smsmith 337123315Snjl /* This is a DdbHandle */ 338123315Snjl /* Return an additional reference to the object */ 33967754Smsmith 340123315Snjl ObjDesc = SourceDesc; 341123315Snjl AcpiUtAddReference (ObjDesc); 342123315Snjl break; 34367754Smsmith 344123315Snjl default: 345123315Snjl /* No named references are allowed here */ 34667754Smsmith 347123315Snjl ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unsupported Reference opcode %X (%s)\n", 348123315Snjl SourceDesc->Reference.Opcode, 349123315Snjl AcpiPsGetOpcodeName (SourceDesc->Reference.Opcode))); 350123315Snjl 351123315Snjl return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 352123315Snjl } 353123315Snjl break; 354123315Snjl 355123315Snjl 35667754Smsmith /* Default case is for unknown types */ 35767754Smsmith 35867754Smsmith default: 35967754Smsmith 36082367Smsmith ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Node %p - Unknown object type %X\n", 36167754Smsmith Node, EntryType)); 36267754Smsmith 36367754Smsmith return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 36467754Smsmith 36567754Smsmith } /* switch (EntryType) */ 36667754Smsmith 36767754Smsmith 36867754Smsmith /* Put the object descriptor on the stack */ 36967754Smsmith 37085756Smsmith *ObjectPtr = (void *) ObjDesc; 37167754Smsmith return_ACPI_STATUS (Status); 37267754Smsmith} 37367754Smsmith 37467754Smsmith 375