exresnte.c revision 278970
1133819Stjr/****************************************************************************** 2133819Stjr * 3133819Stjr * Module Name: exresnte - AML Interpreter object resolution 4133819Stjr * 5133819Stjr *****************************************************************************/ 6276811Sdchagin 7133819Stjr/* 8133819Stjr * Copyright (C) 2000 - 2015, Intel Corp. 9156875Sru * All rights reserved. 10133819Stjr * 11133819Stjr * Redistribution and use in source and binary forms, with or without 12133819Stjr * modification, are permitted provided that the following conditions 13143198Ssobomax * are met: 14133819Stjr * 1. Redistributions of source code must retain the above copyright 15133819Stjr * notice, this list of conditions, and the following disclaimer, 16133819Stjr * without modification. 17133819Stjr * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18133819Stjr * substantially similar to the "NO WARRANTY" disclaimer below 19133819Stjr * ("Disclaimer") and any redistribution must be conditioned upon 20133819Stjr * including a substantially similar Disclaimer requirement for further 21143198Ssobomax * binary redistribution. 22209581Skib * 3. Neither the names of the above-listed copyright holders nor the names 23225618Skmacy * of any contributors may be used to endorse or promote products derived 24209581Skib * from this software without specific prior written permission. 25225618Skmacy * 26225618Skmacy * Alternatively, this software may be distributed under the terms of the 27209581Skib * GNU General Public License ("GPL") version 2 as published by the Free 28225618Skmacy * Software Foundation. 29209581Skib * 30209581Skib * NO WARRANTY 31209581Skib * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32209581Skib * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33209581Skib * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34209581Skib * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35209581Skib * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36209581Skib * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37209581Skib * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38209581Skib * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39209581Skib * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40209581Skib * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41209581Skib * POSSIBILITY OF SUCH DAMAGES. 42209581Skib */ 43209581Skib 44209581Skib#include <contrib/dev/acpica/include/acpi.h> 45209581Skib#include <contrib/dev/acpica/include/accommon.h> 46209581Skib#include <contrib/dev/acpica/include/acdispat.h> 47209581Skib#include <contrib/dev/acpica/include/acinterp.h> 48209581Skib#include <contrib/dev/acpica/include/acnamesp.h> 49209581Skib 50209581Skib 51209581Skib#define _COMPONENT ACPI_EXECUTER 52209581Skib ACPI_MODULE_NAME ("exresnte") 53209581Skib 54209581Skib 55209581Skib/******************************************************************************* 56209581Skib * 57209581Skib * FUNCTION: AcpiExResolveNodeToValue 58225618Skmacy * 59209581Skib * PARAMETERS: ObjectPtr - Pointer to a location that contains 60209581Skib * a pointer to a NS node, and will receive a 61209581Skib * pointer to the resolved object. 62209581Skib * WalkState - Current state. Valid only if executing AML 63225618Skmacy * code. NULL if simply resolving an object 64209581Skib * 65209581Skib * RETURN: Status 66209581Skib * 67209581Skib * DESCRIPTION: Resolve a Namespace node to a valued object 68209581Skib * 69209581Skib * Note: for some of the data types, the pointer attached to the Node 70209581Skib * can be either a pointer to an actual internal object or a pointer into the 71209581Skib * AML stream itself. These types are currently: 72209581Skib * 73225618Skmacy * ACPI_TYPE_INTEGER 74209581Skib * ACPI_TYPE_STRING 75209581Skib * ACPI_TYPE_BUFFER 76209581Skib * ACPI_TYPE_MUTEX 77209581Skib * ACPI_TYPE_PACKAGE 78209581Skib * 79225618Skmacy ******************************************************************************/ 80209581Skib 81209581SkibACPI_STATUS 82225618SkmacyAcpiExResolveNodeToValue ( 83225618Skmacy ACPI_NAMESPACE_NODE **ObjectPtr, 84209581Skib ACPI_WALK_STATE *WalkState) 85225618Skmacy 86209581Skib{ 87225618Skmacy ACPI_STATUS Status = AE_OK; 88225618Skmacy ACPI_OPERAND_OBJECT *SourceDesc; 89209581Skib ACPI_OPERAND_OBJECT *ObjDesc = NULL; 90209581Skib ACPI_NAMESPACE_NODE *Node; 91209581Skib ACPI_OBJECT_TYPE EntryType; 92209581Skib 93209581Skib 94209581Skib ACPI_FUNCTION_TRACE (ExResolveNodeToValue); 95209581Skib 96209581Skib 97209581Skib /* 98209581Skib * The stack pointer points to a ACPI_NAMESPACE_NODE (Node). Get the 99209581Skib * object that is attached to the Node. 100209581Skib */ 101209581Skib Node = *ObjectPtr; 102209581Skib SourceDesc = AcpiNsGetAttachedObject (Node); 103209581Skib EntryType = AcpiNsGetType ((ACPI_HANDLE) Node); 104209581Skib 105209581Skib ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Entry=%p SourceDesc=%p [%s]\n", 106209581Skib Node, SourceDesc, AcpiUtGetTypeName (EntryType))); 107209581Skib 108209581Skib if ((EntryType == ACPI_TYPE_LOCAL_ALIAS) || 109225618Skmacy (EntryType == ACPI_TYPE_LOCAL_METHOD_ALIAS)) 110209581Skib { 111209581Skib /* There is always exactly one level of indirection */ 112209581Skib 113225618Skmacy Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Node->Object); 114209581Skib SourceDesc = AcpiNsGetAttachedObject (Node); 115209581Skib EntryType = AcpiNsGetType ((ACPI_HANDLE) Node); 116225618Skmacy *ObjectPtr = Node; 117225618Skmacy } 118209581Skib 119225618Skmacy /* 120209581Skib * Several object types require no further processing: 121209581Skib * 1) Device/Thermal objects don't have a "real" subobject, return the Node 122209581Skib * 2) Method locals and arguments have a pseudo-Node 123209581Skib * 3) 10/2007: Added method type to assist with Package construction. 124209581Skib */ 125209581Skib if ((EntryType == ACPI_TYPE_DEVICE) || 126209581Skib (EntryType == ACPI_TYPE_THERMAL) || 127209581Skib (EntryType == ACPI_TYPE_METHOD) || 128209581Skib (Node->Flags & (ANOBJ_METHOD_ARG | ANOBJ_METHOD_LOCAL))) 129209581Skib { 130209581Skib return_ACPI_STATUS (AE_OK); 131209581Skib } 132209581Skib 133209581Skib if (!SourceDesc) 134209581Skib { 135209581Skib ACPI_ERROR ((AE_INFO, "No object attached to node [%4.4s] %p", 136209581Skib Node->Name.Ascii, Node)); 137209581Skib return_ACPI_STATUS (AE_AML_NO_OPERAND); 138209581Skib } 139209581Skib 140225618Skmacy /* 141209581Skib * Action is based on the type of the Node, which indicates the type 142209581Skib * of the attached object or pointer 143209581Skib */ 144209581Skib switch (EntryType) 145209581Skib { 146209581Skib case ACPI_TYPE_PACKAGE: 147209581Skib 148209581Skib if (SourceDesc->Common.Type != ACPI_TYPE_PACKAGE) 149209581Skib { 150209581Skib ACPI_ERROR ((AE_INFO, "Object not a Package, type %s", 151209581Skib AcpiUtGetObjectTypeName (SourceDesc))); 152209581Skib return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 153209581Skib } 154225618Skmacy 155225618Skmacy Status = AcpiDsGetPackageArguments (SourceDesc); 156209581Skib if (ACPI_SUCCESS (Status)) 157209581Skib { 158209581Skib /* Return an additional reference to the object */ 159209581Skib 160209581Skib ObjDesc = SourceDesc; 161209581Skib AcpiUtAddReference (ObjDesc); 162209581Skib } 163209581Skib break; 164209581Skib 165225618Skmacy case ACPI_TYPE_BUFFER: 166209581Skib 167209581Skib if (SourceDesc->Common.Type != ACPI_TYPE_BUFFER) 168209581Skib { 169209581Skib ACPI_ERROR ((AE_INFO, "Object not a Buffer, type %s", 170209581Skib AcpiUtGetObjectTypeName (SourceDesc))); 171209581Skib return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 172225618Skmacy } 173225618Skmacy 174225618Skmacy Status = AcpiDsGetBufferArguments (SourceDesc); 175225618Skmacy if (ACPI_SUCCESS (Status)) 176225618Skmacy { 177225618Skmacy /* Return an additional reference to the object */ 178209581Skib 179209581Skib ObjDesc = SourceDesc; 180225618Skmacy AcpiUtAddReference (ObjDesc); 181209581Skib } 182209581Skib break; 183209581Skib 184209581Skib case ACPI_TYPE_STRING: 185209581Skib 186209581Skib if (SourceDesc->Common.Type != ACPI_TYPE_STRING) 187209581Skib { 188209581Skib ACPI_ERROR ((AE_INFO, "Object not a String, type %s", 189209581Skib AcpiUtGetObjectTypeName (SourceDesc))); 190225618Skmacy return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 191209581Skib } 192209581Skib 193209581Skib /* Return an additional reference to the object */ 194209581Skib 195209581Skib ObjDesc = SourceDesc; 196209581Skib AcpiUtAddReference (ObjDesc); 197209581Skib break; 198209581Skib 199209581Skib case ACPI_TYPE_INTEGER: 200209581Skib 201209581Skib if (SourceDesc->Common.Type != ACPI_TYPE_INTEGER) 202209581Skib { 203209581Skib ACPI_ERROR ((AE_INFO, "Object not a Integer, type %s", 204209581Skib AcpiUtGetObjectTypeName (SourceDesc))); 205209581Skib return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 206220030Savg } 207220030Savg 208209581Skib /* Return an additional reference to the object */ 209209581Skib 210209581Skib ObjDesc = SourceDesc; 211209581Skib AcpiUtAddReference (ObjDesc); 212209581Skib break; 213209581Skib 214209581Skib case ACPI_TYPE_BUFFER_FIELD: 215209581Skib case ACPI_TYPE_LOCAL_REGION_FIELD: 216209581Skib case ACPI_TYPE_LOCAL_BANK_FIELD: 217209581Skib case ACPI_TYPE_LOCAL_INDEX_FIELD: 218209581Skib 219209581Skib ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 220209581Skib "FieldRead Node=%p SourceDesc=%p Type=%X\n", 221209581Skib Node, SourceDesc, EntryType)); 222209581Skib 223225618Skmacy Status = AcpiExReadDataFromField (WalkState, SourceDesc, &ObjDesc); 224225618Skmacy break; 225225618Skmacy 226225618Skmacy /* For these objects, just return the object attached to the Node */ 227209581Skib 228209581Skib case ACPI_TYPE_MUTEX: 229225618Skmacy case ACPI_TYPE_POWER: 230225618Skmacy case ACPI_TYPE_PROCESSOR: 231225618Skmacy case ACPI_TYPE_EVENT: 232225618Skmacy case ACPI_TYPE_REGION: 233225618Skmacy 234209581Skib /* Return an additional reference to the object */ 235225618Skmacy 236225618Skmacy ObjDesc = SourceDesc; 237209581Skib AcpiUtAddReference (ObjDesc); 238209581Skib break; 239209581Skib 240209581Skib /* TYPE_ANY is untyped, and thus there is no object associated with it */ 241225618Skmacy 242209581Skib case ACPI_TYPE_ANY: 243209581Skib 244209581Skib ACPI_ERROR ((AE_INFO, 245209581Skib "Untyped entry %p, no attached object!", Node)); 246209581Skib 247209581Skib return_ACPI_STATUS (AE_AML_OPERAND_TYPE); /* Cannot be AE_TYPE */ 248209581Skib 249209581Skib case ACPI_TYPE_LOCAL_REFERENCE: 250209581Skib 251209581Skib switch (SourceDesc->Reference.Class) 252209581Skib { 253209581Skib case ACPI_REFCLASS_TABLE: /* This is a DdbHandle */ 254209581Skib case ACPI_REFCLASS_REFOF: 255209581Skib case ACPI_REFCLASS_INDEX: 256209581Skib 257209581Skib /* Return an additional reference to the object */ 258209581Skib 259209581Skib ObjDesc = SourceDesc; 260209581Skib AcpiUtAddReference (ObjDesc); 261209581Skib break; 262209581Skib 263209581Skib default: 264209581Skib 265209581Skib /* No named references are allowed here */ 266209581Skib 267209581Skib ACPI_ERROR ((AE_INFO, 268209581Skib "Unsupported Reference type 0x%X", 269209581Skib SourceDesc->Reference.Class)); 270213545Skib 271209581Skib return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 272228958Sjhb } 273209581Skib break; 274209581Skib 275209581Skib default: 276255676Srdivacky 277255676Srdivacky /* Default case is for unknown types */ 278255676Srdivacky 279209581Skib ACPI_ERROR ((AE_INFO, 280209581Skib "Node %p - Unknown object type 0x%X", 281272021Sbz Node, EntryType)); 282272021Sbz 283272021Sbz return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 284272021Sbz 285272021Sbz } /* switch (EntryType) */ 286209581Skib 287209581Skib 288209581Skib /* Return the object descriptor */ 289209581Skib 290209581Skib *ObjectPtr = (void *) ObjDesc; 291209581Skib return_ACPI_STATUS (Status); 292209581Skib} 293209581Skib