1*7851SDana.Myers@Sun.COM 2*7851SDana.Myers@Sun.COM /****************************************************************************** 3*7851SDana.Myers@Sun.COM * 4*7851SDana.Myers@Sun.COM * Module Name: exresolv - AML Interpreter object resolution 5*7851SDana.Myers@Sun.COM * $Revision: 1.146 $ 6*7851SDana.Myers@Sun.COM * 7*7851SDana.Myers@Sun.COM *****************************************************************************/ 8*7851SDana.Myers@Sun.COM 9*7851SDana.Myers@Sun.COM /****************************************************************************** 10*7851SDana.Myers@Sun.COM * 11*7851SDana.Myers@Sun.COM * 1. Copyright Notice 12*7851SDana.Myers@Sun.COM * 13*7851SDana.Myers@Sun.COM * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp. 14*7851SDana.Myers@Sun.COM * All rights reserved. 15*7851SDana.Myers@Sun.COM * 16*7851SDana.Myers@Sun.COM * 2. License 17*7851SDana.Myers@Sun.COM * 18*7851SDana.Myers@Sun.COM * 2.1. This is your license from Intel Corp. under its intellectual property 19*7851SDana.Myers@Sun.COM * rights. You may have additional license terms from the party that provided 20*7851SDana.Myers@Sun.COM * you this software, covering your right to use that party's intellectual 21*7851SDana.Myers@Sun.COM * property rights. 22*7851SDana.Myers@Sun.COM * 23*7851SDana.Myers@Sun.COM * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 24*7851SDana.Myers@Sun.COM * copy of the source code appearing in this file ("Covered Code") an 25*7851SDana.Myers@Sun.COM * irrevocable, perpetual, worldwide license under Intel's copyrights in the 26*7851SDana.Myers@Sun.COM * base code distributed originally by Intel ("Original Intel Code") to copy, 27*7851SDana.Myers@Sun.COM * make derivatives, distribute, use and display any portion of the Covered 28*7851SDana.Myers@Sun.COM * Code in any form, with the right to sublicense such rights; and 29*7851SDana.Myers@Sun.COM * 30*7851SDana.Myers@Sun.COM * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 31*7851SDana.Myers@Sun.COM * license (with the right to sublicense), under only those claims of Intel 32*7851SDana.Myers@Sun.COM * patents that are infringed by the Original Intel Code, to make, use, sell, 33*7851SDana.Myers@Sun.COM * offer to sell, and import the Covered Code and derivative works thereof 34*7851SDana.Myers@Sun.COM * solely to the minimum extent necessary to exercise the above copyright 35*7851SDana.Myers@Sun.COM * license, and in no event shall the patent license extend to any additions 36*7851SDana.Myers@Sun.COM * to or modifications of the Original Intel Code. No other license or right 37*7851SDana.Myers@Sun.COM * is granted directly or by implication, estoppel or otherwise; 38*7851SDana.Myers@Sun.COM * 39*7851SDana.Myers@Sun.COM * The above copyright and patent license is granted only if the following 40*7851SDana.Myers@Sun.COM * conditions are met: 41*7851SDana.Myers@Sun.COM * 42*7851SDana.Myers@Sun.COM * 3. Conditions 43*7851SDana.Myers@Sun.COM * 44*7851SDana.Myers@Sun.COM * 3.1. Redistribution of Source with Rights to Further Distribute Source. 45*7851SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 46*7851SDana.Myers@Sun.COM * Code or modification with rights to further distribute source must include 47*7851SDana.Myers@Sun.COM * the above Copyright Notice, the above License, this list of Conditions, 48*7851SDana.Myers@Sun.COM * and the following Disclaimer and Export Compliance provision. In addition, 49*7851SDana.Myers@Sun.COM * Licensee must cause all Covered Code to which Licensee contributes to 50*7851SDana.Myers@Sun.COM * contain a file documenting the changes Licensee made to create that Covered 51*7851SDana.Myers@Sun.COM * Code and the date of any change. Licensee must include in that file the 52*7851SDana.Myers@Sun.COM * documentation of any changes made by any predecessor Licensee. Licensee 53*7851SDana.Myers@Sun.COM * must include a prominent statement that the modification is derived, 54*7851SDana.Myers@Sun.COM * directly or indirectly, from Original Intel Code. 55*7851SDana.Myers@Sun.COM * 56*7851SDana.Myers@Sun.COM * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 57*7851SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 58*7851SDana.Myers@Sun.COM * Code or modification without rights to further distribute source must 59*7851SDana.Myers@Sun.COM * include the following Disclaimer and Export Compliance provision in the 60*7851SDana.Myers@Sun.COM * documentation and/or other materials provided with distribution. In 61*7851SDana.Myers@Sun.COM * addition, Licensee may not authorize further sublicense of source of any 62*7851SDana.Myers@Sun.COM * portion of the Covered Code, and must include terms to the effect that the 63*7851SDana.Myers@Sun.COM * license from Licensee to its licensee is limited to the intellectual 64*7851SDana.Myers@Sun.COM * property embodied in the software Licensee provides to its licensee, and 65*7851SDana.Myers@Sun.COM * not to intellectual property embodied in modifications its licensee may 66*7851SDana.Myers@Sun.COM * make. 67*7851SDana.Myers@Sun.COM * 68*7851SDana.Myers@Sun.COM * 3.3. Redistribution of Executable. Redistribution in executable form of any 69*7851SDana.Myers@Sun.COM * substantial portion of the Covered Code or modification must reproduce the 70*7851SDana.Myers@Sun.COM * above Copyright Notice, and the following Disclaimer and Export Compliance 71*7851SDana.Myers@Sun.COM * provision in the documentation and/or other materials provided with the 72*7851SDana.Myers@Sun.COM * distribution. 73*7851SDana.Myers@Sun.COM * 74*7851SDana.Myers@Sun.COM * 3.4. Intel retains all right, title, and interest in and to the Original 75*7851SDana.Myers@Sun.COM * Intel Code. 76*7851SDana.Myers@Sun.COM * 77*7851SDana.Myers@Sun.COM * 3.5. Neither the name Intel nor any other trademark owned or controlled by 78*7851SDana.Myers@Sun.COM * Intel shall be used in advertising or otherwise to promote the sale, use or 79*7851SDana.Myers@Sun.COM * other dealings in products derived from or relating to the Covered Code 80*7851SDana.Myers@Sun.COM * without prior written authorization from Intel. 81*7851SDana.Myers@Sun.COM * 82*7851SDana.Myers@Sun.COM * 4. Disclaimer and Export Compliance 83*7851SDana.Myers@Sun.COM * 84*7851SDana.Myers@Sun.COM * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 85*7851SDana.Myers@Sun.COM * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 86*7851SDana.Myers@Sun.COM * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 87*7851SDana.Myers@Sun.COM * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 88*7851SDana.Myers@Sun.COM * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 89*7851SDana.Myers@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 90*7851SDana.Myers@Sun.COM * PARTICULAR PURPOSE. 91*7851SDana.Myers@Sun.COM * 92*7851SDana.Myers@Sun.COM * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 93*7851SDana.Myers@Sun.COM * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 94*7851SDana.Myers@Sun.COM * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 95*7851SDana.Myers@Sun.COM * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 96*7851SDana.Myers@Sun.COM * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 97*7851SDana.Myers@Sun.COM * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 98*7851SDana.Myers@Sun.COM * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 99*7851SDana.Myers@Sun.COM * LIMITED REMEDY. 100*7851SDana.Myers@Sun.COM * 101*7851SDana.Myers@Sun.COM * 4.3. Licensee shall not export, either directly or indirectly, any of this 102*7851SDana.Myers@Sun.COM * software or system incorporating such software without first obtaining any 103*7851SDana.Myers@Sun.COM * required license or other approval from the U. S. Department of Commerce or 104*7851SDana.Myers@Sun.COM * any other agency or department of the United States Government. In the 105*7851SDana.Myers@Sun.COM * event Licensee exports any such software from the United States or 106*7851SDana.Myers@Sun.COM * re-exports any such software from a foreign destination, Licensee shall 107*7851SDana.Myers@Sun.COM * ensure that the distribution and export/re-export of the software is in 108*7851SDana.Myers@Sun.COM * compliance with all laws, regulations, orders, or other restrictions of the 109*7851SDana.Myers@Sun.COM * U.S. Export Administration Regulations. Licensee agrees that neither it nor 110*7851SDana.Myers@Sun.COM * any of its subsidiaries will export/re-export any technical data, process, 111*7851SDana.Myers@Sun.COM * software, or service, directly or indirectly, to any country for which the 112*7851SDana.Myers@Sun.COM * United States government or any agency thereof requires an export license, 113*7851SDana.Myers@Sun.COM * other governmental approval, or letter of assurance, without first obtaining 114*7851SDana.Myers@Sun.COM * such license, approval or letter. 115*7851SDana.Myers@Sun.COM * 116*7851SDana.Myers@Sun.COM *****************************************************************************/ 117*7851SDana.Myers@Sun.COM 118*7851SDana.Myers@Sun.COM #define __EXRESOLV_C__ 119*7851SDana.Myers@Sun.COM 120*7851SDana.Myers@Sun.COM #include "acpi.h" 121*7851SDana.Myers@Sun.COM #include "amlcode.h" 122*7851SDana.Myers@Sun.COM #include "acdispat.h" 123*7851SDana.Myers@Sun.COM #include "acinterp.h" 124*7851SDana.Myers@Sun.COM #include "acnamesp.h" 125*7851SDana.Myers@Sun.COM 126*7851SDana.Myers@Sun.COM 127*7851SDana.Myers@Sun.COM #define _COMPONENT ACPI_EXECUTER 128*7851SDana.Myers@Sun.COM ACPI_MODULE_NAME ("exresolv") 129*7851SDana.Myers@Sun.COM 130*7851SDana.Myers@Sun.COM /* Local prototypes */ 131*7851SDana.Myers@Sun.COM 132*7851SDana.Myers@Sun.COM static ACPI_STATUS 133*7851SDana.Myers@Sun.COM AcpiExResolveObjectToValue ( 134*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **StackPtr, 135*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState); 136*7851SDana.Myers@Sun.COM 137*7851SDana.Myers@Sun.COM 138*7851SDana.Myers@Sun.COM /******************************************************************************* 139*7851SDana.Myers@Sun.COM * 140*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExResolveToValue 141*7851SDana.Myers@Sun.COM * 142*7851SDana.Myers@Sun.COM * PARAMETERS: **StackPtr - Points to entry on ObjStack, which can 143*7851SDana.Myers@Sun.COM * be either an (ACPI_OPERAND_OBJECT *) 144*7851SDana.Myers@Sun.COM * or an ACPI_HANDLE. 145*7851SDana.Myers@Sun.COM * WalkState - Current method state 146*7851SDana.Myers@Sun.COM * 147*7851SDana.Myers@Sun.COM * RETURN: Status 148*7851SDana.Myers@Sun.COM * 149*7851SDana.Myers@Sun.COM * DESCRIPTION: Convert Reference objects to values 150*7851SDana.Myers@Sun.COM * 151*7851SDana.Myers@Sun.COM ******************************************************************************/ 152*7851SDana.Myers@Sun.COM 153*7851SDana.Myers@Sun.COM ACPI_STATUS 154*7851SDana.Myers@Sun.COM AcpiExResolveToValue ( 155*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **StackPtr, 156*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState) 157*7851SDana.Myers@Sun.COM { 158*7851SDana.Myers@Sun.COM ACPI_STATUS Status; 159*7851SDana.Myers@Sun.COM 160*7851SDana.Myers@Sun.COM 161*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE_PTR (ExResolveToValue, StackPtr); 162*7851SDana.Myers@Sun.COM 163*7851SDana.Myers@Sun.COM 164*7851SDana.Myers@Sun.COM if (!StackPtr || !*StackPtr) 165*7851SDana.Myers@Sun.COM { 166*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, "Internal - null pointer")); 167*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_NO_OPERAND); 168*7851SDana.Myers@Sun.COM } 169*7851SDana.Myers@Sun.COM 170*7851SDana.Myers@Sun.COM /* 171*7851SDana.Myers@Sun.COM * The entity pointed to by the StackPtr can be either 172*7851SDana.Myers@Sun.COM * 1) A valid ACPI_OPERAND_OBJECT, or 173*7851SDana.Myers@Sun.COM * 2) A ACPI_NAMESPACE_NODE (NamedObj) 174*7851SDana.Myers@Sun.COM */ 175*7851SDana.Myers@Sun.COM if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_OPERAND) 176*7851SDana.Myers@Sun.COM { 177*7851SDana.Myers@Sun.COM Status = AcpiExResolveObjectToValue (StackPtr, WalkState); 178*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 179*7851SDana.Myers@Sun.COM { 180*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 181*7851SDana.Myers@Sun.COM } 182*7851SDana.Myers@Sun.COM 183*7851SDana.Myers@Sun.COM if (!*StackPtr) 184*7851SDana.Myers@Sun.COM { 185*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, "Internal - null pointer")); 186*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_NO_OPERAND); 187*7851SDana.Myers@Sun.COM } 188*7851SDana.Myers@Sun.COM } 189*7851SDana.Myers@Sun.COM 190*7851SDana.Myers@Sun.COM /* 191*7851SDana.Myers@Sun.COM * Object on the stack may have changed if AcpiExResolveObjectToValue() 192*7851SDana.Myers@Sun.COM * was called (i.e., we can't use an _else_ here.) 193*7851SDana.Myers@Sun.COM */ 194*7851SDana.Myers@Sun.COM if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_NAMED) 195*7851SDana.Myers@Sun.COM { 196*7851SDana.Myers@Sun.COM Status = AcpiExResolveNodeToValue ( 197*7851SDana.Myers@Sun.COM ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, StackPtr), 198*7851SDana.Myers@Sun.COM WalkState); 199*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 200*7851SDana.Myers@Sun.COM { 201*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 202*7851SDana.Myers@Sun.COM } 203*7851SDana.Myers@Sun.COM } 204*7851SDana.Myers@Sun.COM 205*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Resolved object %p\n", *StackPtr)); 206*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 207*7851SDana.Myers@Sun.COM } 208*7851SDana.Myers@Sun.COM 209*7851SDana.Myers@Sun.COM 210*7851SDana.Myers@Sun.COM /******************************************************************************* 211*7851SDana.Myers@Sun.COM * 212*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExResolveObjectToValue 213*7851SDana.Myers@Sun.COM * 214*7851SDana.Myers@Sun.COM * PARAMETERS: StackPtr - Pointer to an internal object 215*7851SDana.Myers@Sun.COM * WalkState - Current method state 216*7851SDana.Myers@Sun.COM * 217*7851SDana.Myers@Sun.COM * RETURN: Status 218*7851SDana.Myers@Sun.COM * 219*7851SDana.Myers@Sun.COM * DESCRIPTION: Retrieve the value from an internal object. The Reference type 220*7851SDana.Myers@Sun.COM * uses the associated AML opcode to determine the value. 221*7851SDana.Myers@Sun.COM * 222*7851SDana.Myers@Sun.COM ******************************************************************************/ 223*7851SDana.Myers@Sun.COM 224*7851SDana.Myers@Sun.COM static ACPI_STATUS 225*7851SDana.Myers@Sun.COM AcpiExResolveObjectToValue ( 226*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **StackPtr, 227*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState) 228*7851SDana.Myers@Sun.COM { 229*7851SDana.Myers@Sun.COM ACPI_STATUS Status = AE_OK; 230*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *StackDesc; 231*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc = NULL; 232*7851SDana.Myers@Sun.COM UINT8 RefType; 233*7851SDana.Myers@Sun.COM 234*7851SDana.Myers@Sun.COM 235*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE (ExResolveObjectToValue); 236*7851SDana.Myers@Sun.COM 237*7851SDana.Myers@Sun.COM 238*7851SDana.Myers@Sun.COM StackDesc = *StackPtr; 239*7851SDana.Myers@Sun.COM 240*7851SDana.Myers@Sun.COM /* This is an ACPI_OPERAND_OBJECT */ 241*7851SDana.Myers@Sun.COM 242*7851SDana.Myers@Sun.COM switch (ACPI_GET_OBJECT_TYPE (StackDesc)) 243*7851SDana.Myers@Sun.COM { 244*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_REFERENCE: 245*7851SDana.Myers@Sun.COM 246*7851SDana.Myers@Sun.COM RefType = StackDesc->Reference.Class; 247*7851SDana.Myers@Sun.COM 248*7851SDana.Myers@Sun.COM switch (RefType) 249*7851SDana.Myers@Sun.COM { 250*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_LOCAL: 251*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_ARG: 252*7851SDana.Myers@Sun.COM 253*7851SDana.Myers@Sun.COM /* 254*7851SDana.Myers@Sun.COM * Get the local from the method's state info 255*7851SDana.Myers@Sun.COM * Note: this increments the local's object reference count 256*7851SDana.Myers@Sun.COM */ 257*7851SDana.Myers@Sun.COM Status = AcpiDsMethodDataGetValue (RefType, 258*7851SDana.Myers@Sun.COM StackDesc->Reference.Value, WalkState, &ObjDesc); 259*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 260*7851SDana.Myers@Sun.COM { 261*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 262*7851SDana.Myers@Sun.COM } 263*7851SDana.Myers@Sun.COM 264*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Arg/Local %X] ValueObj is %p\n", 265*7851SDana.Myers@Sun.COM StackDesc->Reference.Value, ObjDesc)); 266*7851SDana.Myers@Sun.COM 267*7851SDana.Myers@Sun.COM /* 268*7851SDana.Myers@Sun.COM * Now we can delete the original Reference Object and 269*7851SDana.Myers@Sun.COM * replace it with the resolved value 270*7851SDana.Myers@Sun.COM */ 271*7851SDana.Myers@Sun.COM AcpiUtRemoveReference (StackDesc); 272*7851SDana.Myers@Sun.COM *StackPtr = ObjDesc; 273*7851SDana.Myers@Sun.COM break; 274*7851SDana.Myers@Sun.COM 275*7851SDana.Myers@Sun.COM 276*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_INDEX: 277*7851SDana.Myers@Sun.COM 278*7851SDana.Myers@Sun.COM switch (StackDesc->Reference.TargetType) 279*7851SDana.Myers@Sun.COM { 280*7851SDana.Myers@Sun.COM case ACPI_TYPE_BUFFER_FIELD: 281*7851SDana.Myers@Sun.COM 282*7851SDana.Myers@Sun.COM /* Just return - do not dereference */ 283*7851SDana.Myers@Sun.COM break; 284*7851SDana.Myers@Sun.COM 285*7851SDana.Myers@Sun.COM 286*7851SDana.Myers@Sun.COM case ACPI_TYPE_PACKAGE: 287*7851SDana.Myers@Sun.COM 288*7851SDana.Myers@Sun.COM /* If method call or CopyObject - do not dereference */ 289*7851SDana.Myers@Sun.COM 290*7851SDana.Myers@Sun.COM if ((WalkState->Opcode == AML_INT_METHODCALL_OP) || 291*7851SDana.Myers@Sun.COM (WalkState->Opcode == AML_COPY_OP)) 292*7851SDana.Myers@Sun.COM { 293*7851SDana.Myers@Sun.COM break; 294*7851SDana.Myers@Sun.COM } 295*7851SDana.Myers@Sun.COM 296*7851SDana.Myers@Sun.COM /* Otherwise, dereference the PackageIndex to a package element */ 297*7851SDana.Myers@Sun.COM 298*7851SDana.Myers@Sun.COM ObjDesc = *StackDesc->Reference.Where; 299*7851SDana.Myers@Sun.COM if (ObjDesc) 300*7851SDana.Myers@Sun.COM { 301*7851SDana.Myers@Sun.COM /* 302*7851SDana.Myers@Sun.COM * Valid object descriptor, copy pointer to return value 303*7851SDana.Myers@Sun.COM * (i.e., dereference the package index) 304*7851SDana.Myers@Sun.COM * Delete the ref object, increment the returned object 305*7851SDana.Myers@Sun.COM */ 306*7851SDana.Myers@Sun.COM AcpiUtRemoveReference (StackDesc); 307*7851SDana.Myers@Sun.COM AcpiUtAddReference (ObjDesc); 308*7851SDana.Myers@Sun.COM *StackPtr = ObjDesc; 309*7851SDana.Myers@Sun.COM } 310*7851SDana.Myers@Sun.COM else 311*7851SDana.Myers@Sun.COM { 312*7851SDana.Myers@Sun.COM /* 313*7851SDana.Myers@Sun.COM * A NULL object descriptor means an uninitialized element of 314*7851SDana.Myers@Sun.COM * the package, can't dereference it 315*7851SDana.Myers@Sun.COM */ 316*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, 317*7851SDana.Myers@Sun.COM "Attempt to dereference an Index to NULL package element Idx=%p", 318*7851SDana.Myers@Sun.COM StackDesc)); 319*7851SDana.Myers@Sun.COM Status = AE_AML_UNINITIALIZED_ELEMENT; 320*7851SDana.Myers@Sun.COM } 321*7851SDana.Myers@Sun.COM break; 322*7851SDana.Myers@Sun.COM 323*7851SDana.Myers@Sun.COM 324*7851SDana.Myers@Sun.COM default: 325*7851SDana.Myers@Sun.COM 326*7851SDana.Myers@Sun.COM /* Invalid reference object */ 327*7851SDana.Myers@Sun.COM 328*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, 329*7851SDana.Myers@Sun.COM "Unknown TargetType %X in Index/Reference object %p", 330*7851SDana.Myers@Sun.COM StackDesc->Reference.TargetType, StackDesc)); 331*7851SDana.Myers@Sun.COM Status = AE_AML_INTERNAL; 332*7851SDana.Myers@Sun.COM break; 333*7851SDana.Myers@Sun.COM } 334*7851SDana.Myers@Sun.COM break; 335*7851SDana.Myers@Sun.COM 336*7851SDana.Myers@Sun.COM 337*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_REFOF: 338*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_DEBUG: 339*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_TABLE: 340*7851SDana.Myers@Sun.COM 341*7851SDana.Myers@Sun.COM /* Just leave the object as-is, do not dereference */ 342*7851SDana.Myers@Sun.COM 343*7851SDana.Myers@Sun.COM break; 344*7851SDana.Myers@Sun.COM 345*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_NAME: /* Reference to a named object */ 346*7851SDana.Myers@Sun.COM 347*7851SDana.Myers@Sun.COM /* Dereference the name */ 348*7851SDana.Myers@Sun.COM 349*7851SDana.Myers@Sun.COM if ((StackDesc->Reference.Node->Type == ACPI_TYPE_DEVICE) || 350*7851SDana.Myers@Sun.COM (StackDesc->Reference.Node->Type == ACPI_TYPE_THERMAL)) 351*7851SDana.Myers@Sun.COM { 352*7851SDana.Myers@Sun.COM /* These node types do not have 'real' subobjects */ 353*7851SDana.Myers@Sun.COM 354*7851SDana.Myers@Sun.COM *StackPtr = (void *) StackDesc->Reference.Node; 355*7851SDana.Myers@Sun.COM } 356*7851SDana.Myers@Sun.COM else 357*7851SDana.Myers@Sun.COM { 358*7851SDana.Myers@Sun.COM /* Get the object pointed to by the namespace node */ 359*7851SDana.Myers@Sun.COM 360*7851SDana.Myers@Sun.COM *StackPtr = (StackDesc->Reference.Node)->Object; 361*7851SDana.Myers@Sun.COM AcpiUtAddReference (*StackPtr); 362*7851SDana.Myers@Sun.COM } 363*7851SDana.Myers@Sun.COM 364*7851SDana.Myers@Sun.COM AcpiUtRemoveReference (StackDesc); 365*7851SDana.Myers@Sun.COM break; 366*7851SDana.Myers@Sun.COM 367*7851SDana.Myers@Sun.COM default: 368*7851SDana.Myers@Sun.COM 369*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, 370*7851SDana.Myers@Sun.COM "Unknown Reference type %X in %p", RefType, StackDesc)); 371*7851SDana.Myers@Sun.COM Status = AE_AML_INTERNAL; 372*7851SDana.Myers@Sun.COM break; 373*7851SDana.Myers@Sun.COM } 374*7851SDana.Myers@Sun.COM break; 375*7851SDana.Myers@Sun.COM 376*7851SDana.Myers@Sun.COM 377*7851SDana.Myers@Sun.COM case ACPI_TYPE_BUFFER: 378*7851SDana.Myers@Sun.COM 379*7851SDana.Myers@Sun.COM Status = AcpiDsGetBufferArguments (StackDesc); 380*7851SDana.Myers@Sun.COM break; 381*7851SDana.Myers@Sun.COM 382*7851SDana.Myers@Sun.COM 383*7851SDana.Myers@Sun.COM case ACPI_TYPE_PACKAGE: 384*7851SDana.Myers@Sun.COM 385*7851SDana.Myers@Sun.COM Status = AcpiDsGetPackageArguments (StackDesc); 386*7851SDana.Myers@Sun.COM break; 387*7851SDana.Myers@Sun.COM 388*7851SDana.Myers@Sun.COM 389*7851SDana.Myers@Sun.COM case ACPI_TYPE_BUFFER_FIELD: 390*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_REGION_FIELD: 391*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_BANK_FIELD: 392*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_INDEX_FIELD: 393*7851SDana.Myers@Sun.COM 394*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "FieldRead SourceDesc=%p Type=%X\n", 395*7851SDana.Myers@Sun.COM StackDesc, ACPI_GET_OBJECT_TYPE (StackDesc))); 396*7851SDana.Myers@Sun.COM 397*7851SDana.Myers@Sun.COM Status = AcpiExReadDataFromField (WalkState, StackDesc, &ObjDesc); 398*7851SDana.Myers@Sun.COM 399*7851SDana.Myers@Sun.COM /* Remove a reference to the original operand, then override */ 400*7851SDana.Myers@Sun.COM 401*7851SDana.Myers@Sun.COM AcpiUtRemoveReference (*StackPtr); 402*7851SDana.Myers@Sun.COM *StackPtr = (void *) ObjDesc; 403*7851SDana.Myers@Sun.COM break; 404*7851SDana.Myers@Sun.COM 405*7851SDana.Myers@Sun.COM default: 406*7851SDana.Myers@Sun.COM break; 407*7851SDana.Myers@Sun.COM } 408*7851SDana.Myers@Sun.COM 409*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 410*7851SDana.Myers@Sun.COM } 411*7851SDana.Myers@Sun.COM 412*7851SDana.Myers@Sun.COM 413*7851SDana.Myers@Sun.COM /******************************************************************************* 414*7851SDana.Myers@Sun.COM * 415*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExResolveMultiple 416*7851SDana.Myers@Sun.COM * 417*7851SDana.Myers@Sun.COM * PARAMETERS: WalkState - Current state (contains AML opcode) 418*7851SDana.Myers@Sun.COM * Operand - Starting point for resolution 419*7851SDana.Myers@Sun.COM * ReturnType - Where the object type is returned 420*7851SDana.Myers@Sun.COM * ReturnDesc - Where the resolved object is returned 421*7851SDana.Myers@Sun.COM * 422*7851SDana.Myers@Sun.COM * RETURN: Status 423*7851SDana.Myers@Sun.COM * 424*7851SDana.Myers@Sun.COM * DESCRIPTION: Return the base object and type. Traverse a reference list if 425*7851SDana.Myers@Sun.COM * necessary to get to the base object. 426*7851SDana.Myers@Sun.COM * 427*7851SDana.Myers@Sun.COM ******************************************************************************/ 428*7851SDana.Myers@Sun.COM 429*7851SDana.Myers@Sun.COM ACPI_STATUS 430*7851SDana.Myers@Sun.COM AcpiExResolveMultiple ( 431*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState, 432*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *Operand, 433*7851SDana.Myers@Sun.COM ACPI_OBJECT_TYPE *ReturnType, 434*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnDesc) 435*7851SDana.Myers@Sun.COM { 436*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc = (void *) Operand; 437*7851SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *Node; 438*7851SDana.Myers@Sun.COM ACPI_OBJECT_TYPE Type; 439*7851SDana.Myers@Sun.COM ACPI_STATUS Status; 440*7851SDana.Myers@Sun.COM 441*7851SDana.Myers@Sun.COM 442*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE (AcpiExResolveMultiple); 443*7851SDana.Myers@Sun.COM 444*7851SDana.Myers@Sun.COM 445*7851SDana.Myers@Sun.COM /* Operand can be either a namespace node or an operand descriptor */ 446*7851SDana.Myers@Sun.COM 447*7851SDana.Myers@Sun.COM switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc)) 448*7851SDana.Myers@Sun.COM { 449*7851SDana.Myers@Sun.COM case ACPI_DESC_TYPE_OPERAND: 450*7851SDana.Myers@Sun.COM Type = ObjDesc->Common.Type; 451*7851SDana.Myers@Sun.COM break; 452*7851SDana.Myers@Sun.COM 453*7851SDana.Myers@Sun.COM case ACPI_DESC_TYPE_NAMED: 454*7851SDana.Myers@Sun.COM Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type; 455*7851SDana.Myers@Sun.COM ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc); 456*7851SDana.Myers@Sun.COM 457*7851SDana.Myers@Sun.COM /* If we had an Alias node, use the attached object for type info */ 458*7851SDana.Myers@Sun.COM 459*7851SDana.Myers@Sun.COM if (Type == ACPI_TYPE_LOCAL_ALIAS) 460*7851SDana.Myers@Sun.COM { 461*7851SDana.Myers@Sun.COM Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type; 462*7851SDana.Myers@Sun.COM ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc); 463*7851SDana.Myers@Sun.COM } 464*7851SDana.Myers@Sun.COM break; 465*7851SDana.Myers@Sun.COM 466*7851SDana.Myers@Sun.COM default: 467*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 468*7851SDana.Myers@Sun.COM } 469*7851SDana.Myers@Sun.COM 470*7851SDana.Myers@Sun.COM /* If type is anything other than a reference, we are done */ 471*7851SDana.Myers@Sun.COM 472*7851SDana.Myers@Sun.COM if (Type != ACPI_TYPE_LOCAL_REFERENCE) 473*7851SDana.Myers@Sun.COM { 474*7851SDana.Myers@Sun.COM goto Exit; 475*7851SDana.Myers@Sun.COM } 476*7851SDana.Myers@Sun.COM 477*7851SDana.Myers@Sun.COM /* 478*7851SDana.Myers@Sun.COM * For reference objects created via the RefOf, Index, or Load/LoadTable 479*7851SDana.Myers@Sun.COM * operators, we need to get to the base object (as per the ACPI 480*7851SDana.Myers@Sun.COM * specification of the ObjectType and SizeOf operators). This means 481*7851SDana.Myers@Sun.COM * traversing the list of possibly many nested references. 482*7851SDana.Myers@Sun.COM */ 483*7851SDana.Myers@Sun.COM while (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_REFERENCE) 484*7851SDana.Myers@Sun.COM { 485*7851SDana.Myers@Sun.COM switch (ObjDesc->Reference.Class) 486*7851SDana.Myers@Sun.COM { 487*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_REFOF: 488*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_NAME: 489*7851SDana.Myers@Sun.COM 490*7851SDana.Myers@Sun.COM /* Dereference the reference pointer */ 491*7851SDana.Myers@Sun.COM 492*7851SDana.Myers@Sun.COM if (ObjDesc->Reference.Class == ACPI_REFCLASS_REFOF) 493*7851SDana.Myers@Sun.COM { 494*7851SDana.Myers@Sun.COM Node = ObjDesc->Reference.Object; 495*7851SDana.Myers@Sun.COM } 496*7851SDana.Myers@Sun.COM else /* AML_INT_NAMEPATH_OP */ 497*7851SDana.Myers@Sun.COM { 498*7851SDana.Myers@Sun.COM Node = ObjDesc->Reference.Node; 499*7851SDana.Myers@Sun.COM } 500*7851SDana.Myers@Sun.COM 501*7851SDana.Myers@Sun.COM /* All "References" point to a NS node */ 502*7851SDana.Myers@Sun.COM 503*7851SDana.Myers@Sun.COM if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED) 504*7851SDana.Myers@Sun.COM { 505*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, 506*7851SDana.Myers@Sun.COM "Not a NS node %p [%s]", 507*7851SDana.Myers@Sun.COM Node, AcpiUtGetDescriptorName (Node))); 508*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_INTERNAL); 509*7851SDana.Myers@Sun.COM } 510*7851SDana.Myers@Sun.COM 511*7851SDana.Myers@Sun.COM /* Get the attached object */ 512*7851SDana.Myers@Sun.COM 513*7851SDana.Myers@Sun.COM ObjDesc = AcpiNsGetAttachedObject (Node); 514*7851SDana.Myers@Sun.COM if (!ObjDesc) 515*7851SDana.Myers@Sun.COM { 516*7851SDana.Myers@Sun.COM /* No object, use the NS node type */ 517*7851SDana.Myers@Sun.COM 518*7851SDana.Myers@Sun.COM Type = AcpiNsGetType (Node); 519*7851SDana.Myers@Sun.COM goto Exit; 520*7851SDana.Myers@Sun.COM } 521*7851SDana.Myers@Sun.COM 522*7851SDana.Myers@Sun.COM /* Check for circular references */ 523*7851SDana.Myers@Sun.COM 524*7851SDana.Myers@Sun.COM if (ObjDesc == Operand) 525*7851SDana.Myers@Sun.COM { 526*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_CIRCULAR_REFERENCE); 527*7851SDana.Myers@Sun.COM } 528*7851SDana.Myers@Sun.COM break; 529*7851SDana.Myers@Sun.COM 530*7851SDana.Myers@Sun.COM 531*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_INDEX: 532*7851SDana.Myers@Sun.COM 533*7851SDana.Myers@Sun.COM /* Get the type of this reference (index into another object) */ 534*7851SDana.Myers@Sun.COM 535*7851SDana.Myers@Sun.COM Type = ObjDesc->Reference.TargetType; 536*7851SDana.Myers@Sun.COM if (Type != ACPI_TYPE_PACKAGE) 537*7851SDana.Myers@Sun.COM { 538*7851SDana.Myers@Sun.COM goto Exit; 539*7851SDana.Myers@Sun.COM } 540*7851SDana.Myers@Sun.COM 541*7851SDana.Myers@Sun.COM /* 542*7851SDana.Myers@Sun.COM * The main object is a package, we want to get the type 543*7851SDana.Myers@Sun.COM * of the individual package element that is referenced by 544*7851SDana.Myers@Sun.COM * the index. 545*7851SDana.Myers@Sun.COM * 546*7851SDana.Myers@Sun.COM * This could of course in turn be another reference object. 547*7851SDana.Myers@Sun.COM */ 548*7851SDana.Myers@Sun.COM ObjDesc = *(ObjDesc->Reference.Where); 549*7851SDana.Myers@Sun.COM if (!ObjDesc) 550*7851SDana.Myers@Sun.COM { 551*7851SDana.Myers@Sun.COM /* NULL package elements are allowed */ 552*7851SDana.Myers@Sun.COM 553*7851SDana.Myers@Sun.COM Type = 0; /* Uninitialized */ 554*7851SDana.Myers@Sun.COM goto Exit; 555*7851SDana.Myers@Sun.COM } 556*7851SDana.Myers@Sun.COM break; 557*7851SDana.Myers@Sun.COM 558*7851SDana.Myers@Sun.COM 559*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_TABLE: 560*7851SDana.Myers@Sun.COM 561*7851SDana.Myers@Sun.COM Type = ACPI_TYPE_DDB_HANDLE; 562*7851SDana.Myers@Sun.COM goto Exit; 563*7851SDana.Myers@Sun.COM 564*7851SDana.Myers@Sun.COM 565*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_LOCAL: 566*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_ARG: 567*7851SDana.Myers@Sun.COM 568*7851SDana.Myers@Sun.COM if (ReturnDesc) 569*7851SDana.Myers@Sun.COM { 570*7851SDana.Myers@Sun.COM Status = AcpiDsMethodDataGetValue (ObjDesc->Reference.Class, 571*7851SDana.Myers@Sun.COM ObjDesc->Reference.Value, WalkState, &ObjDesc); 572*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 573*7851SDana.Myers@Sun.COM { 574*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 575*7851SDana.Myers@Sun.COM } 576*7851SDana.Myers@Sun.COM AcpiUtRemoveReference (ObjDesc); 577*7851SDana.Myers@Sun.COM } 578*7851SDana.Myers@Sun.COM else 579*7851SDana.Myers@Sun.COM { 580*7851SDana.Myers@Sun.COM Status = AcpiDsMethodDataGetNode (ObjDesc->Reference.Class, 581*7851SDana.Myers@Sun.COM ObjDesc->Reference.Value, WalkState, &Node); 582*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 583*7851SDana.Myers@Sun.COM { 584*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 585*7851SDana.Myers@Sun.COM } 586*7851SDana.Myers@Sun.COM 587*7851SDana.Myers@Sun.COM ObjDesc = AcpiNsGetAttachedObject (Node); 588*7851SDana.Myers@Sun.COM if (!ObjDesc) 589*7851SDana.Myers@Sun.COM { 590*7851SDana.Myers@Sun.COM Type = ACPI_TYPE_ANY; 591*7851SDana.Myers@Sun.COM goto Exit; 592*7851SDana.Myers@Sun.COM } 593*7851SDana.Myers@Sun.COM } 594*7851SDana.Myers@Sun.COM break; 595*7851SDana.Myers@Sun.COM 596*7851SDana.Myers@Sun.COM 597*7851SDana.Myers@Sun.COM case ACPI_REFCLASS_DEBUG: 598*7851SDana.Myers@Sun.COM 599*7851SDana.Myers@Sun.COM /* The Debug Object is of type "DebugObject" */ 600*7851SDana.Myers@Sun.COM 601*7851SDana.Myers@Sun.COM Type = ACPI_TYPE_DEBUG_OBJECT; 602*7851SDana.Myers@Sun.COM goto Exit; 603*7851SDana.Myers@Sun.COM 604*7851SDana.Myers@Sun.COM 605*7851SDana.Myers@Sun.COM default: 606*7851SDana.Myers@Sun.COM 607*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, 608*7851SDana.Myers@Sun.COM "Unknown Reference Class %2.2X", ObjDesc->Reference.Class)); 609*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_INTERNAL); 610*7851SDana.Myers@Sun.COM } 611*7851SDana.Myers@Sun.COM } 612*7851SDana.Myers@Sun.COM 613*7851SDana.Myers@Sun.COM /* 614*7851SDana.Myers@Sun.COM * Now we are guaranteed to have an object that has not been created 615*7851SDana.Myers@Sun.COM * via the RefOf or Index operators. 616*7851SDana.Myers@Sun.COM */ 617*7851SDana.Myers@Sun.COM Type = ACPI_GET_OBJECT_TYPE (ObjDesc); 618*7851SDana.Myers@Sun.COM 619*7851SDana.Myers@Sun.COM 620*7851SDana.Myers@Sun.COM Exit: 621*7851SDana.Myers@Sun.COM /* Convert internal types to external types */ 622*7851SDana.Myers@Sun.COM 623*7851SDana.Myers@Sun.COM switch (Type) 624*7851SDana.Myers@Sun.COM { 625*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_REGION_FIELD: 626*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_BANK_FIELD: 627*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_INDEX_FIELD: 628*7851SDana.Myers@Sun.COM 629*7851SDana.Myers@Sun.COM Type = ACPI_TYPE_FIELD_UNIT; 630*7851SDana.Myers@Sun.COM break; 631*7851SDana.Myers@Sun.COM 632*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_SCOPE: 633*7851SDana.Myers@Sun.COM 634*7851SDana.Myers@Sun.COM /* Per ACPI Specification, Scope is untyped */ 635*7851SDana.Myers@Sun.COM 636*7851SDana.Myers@Sun.COM Type = ACPI_TYPE_ANY; 637*7851SDana.Myers@Sun.COM break; 638*7851SDana.Myers@Sun.COM 639*7851SDana.Myers@Sun.COM default: 640*7851SDana.Myers@Sun.COM /* No change to Type required */ 641*7851SDana.Myers@Sun.COM break; 642*7851SDana.Myers@Sun.COM } 643*7851SDana.Myers@Sun.COM 644*7851SDana.Myers@Sun.COM *ReturnType = Type; 645*7851SDana.Myers@Sun.COM if (ReturnDesc) 646*7851SDana.Myers@Sun.COM { 647*7851SDana.Myers@Sun.COM *ReturnDesc = ObjDesc; 648*7851SDana.Myers@Sun.COM } 649*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 650*7851SDana.Myers@Sun.COM } 651*7851SDana.Myers@Sun.COM 652*7851SDana.Myers@Sun.COM 653