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