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