1*53289f6aSNate Lawson /****************************************************************************** 2*53289f6aSNate Lawson * 3*53289f6aSNate Lawson * Module Name: dswload - Dispatcher namespace load callbacks 4*53289f6aSNate Lawson * $Revision: 59 $ 5*53289f6aSNate Lawson * 6*53289f6aSNate Lawson *****************************************************************************/ 7*53289f6aSNate Lawson 8*53289f6aSNate Lawson /****************************************************************************** 9*53289f6aSNate Lawson * 10*53289f6aSNate Lawson * 1. Copyright Notice 11*53289f6aSNate Lawson * 12*53289f6aSNate Lawson * Some or all of this work - Copyright (c) 1999 - 2003, Intel Corp. 13*53289f6aSNate Lawson * All rights reserved. 14*53289f6aSNate Lawson * 15*53289f6aSNate Lawson * 2. License 16*53289f6aSNate Lawson * 17*53289f6aSNate Lawson * 2.1. This is your license from Intel Corp. under its intellectual property 18*53289f6aSNate Lawson * rights. You may have additional license terms from the party that provided 19*53289f6aSNate Lawson * you this software, covering your right to use that party's intellectual 20*53289f6aSNate Lawson * property rights. 21*53289f6aSNate Lawson * 22*53289f6aSNate Lawson * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 23*53289f6aSNate Lawson * copy of the source code appearing in this file ("Covered Code") an 24*53289f6aSNate Lawson * irrevocable, perpetual, worldwide license under Intel's copyrights in the 25*53289f6aSNate Lawson * base code distributed originally by Intel ("Original Intel Code") to copy, 26*53289f6aSNate Lawson * make derivatives, distribute, use and display any portion of the Covered 27*53289f6aSNate Lawson * Code in any form, with the right to sublicense such rights; and 28*53289f6aSNate Lawson * 29*53289f6aSNate Lawson * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 30*53289f6aSNate Lawson * license (with the right to sublicense), under only those claims of Intel 31*53289f6aSNate Lawson * patents that are infringed by the Original Intel Code, to make, use, sell, 32*53289f6aSNate Lawson * offer to sell, and import the Covered Code and derivative works thereof 33*53289f6aSNate Lawson * solely to the minimum extent necessary to exercise the above copyright 34*53289f6aSNate Lawson * license, and in no event shall the patent license extend to any additions 35*53289f6aSNate Lawson * to or modifications of the Original Intel Code. No other license or right 36*53289f6aSNate Lawson * is granted directly or by implication, estoppel or otherwise; 37*53289f6aSNate Lawson * 38*53289f6aSNate Lawson * The above copyright and patent license is granted only if the following 39*53289f6aSNate Lawson * conditions are met: 40*53289f6aSNate Lawson * 41*53289f6aSNate Lawson * 3. Conditions 42*53289f6aSNate Lawson * 43*53289f6aSNate Lawson * 3.1. Redistribution of Source with Rights to Further Distribute Source. 44*53289f6aSNate Lawson * Redistribution of source code of any substantial portion of the Covered 45*53289f6aSNate Lawson * Code or modification with rights to further distribute source must include 46*53289f6aSNate Lawson * the above Copyright Notice, the above License, this list of Conditions, 47*53289f6aSNate Lawson * and the following Disclaimer and Export Compliance provision. In addition, 48*53289f6aSNate Lawson * Licensee must cause all Covered Code to which Licensee contributes to 49*53289f6aSNate Lawson * contain a file documenting the changes Licensee made to create that Covered 50*53289f6aSNate Lawson * Code and the date of any change. Licensee must include in that file the 51*53289f6aSNate Lawson * documentation of any changes made by any predecessor Licensee. Licensee 52*53289f6aSNate Lawson * must include a prominent statement that the modification is derived, 53*53289f6aSNate Lawson * directly or indirectly, from Original Intel Code. 54*53289f6aSNate Lawson * 55*53289f6aSNate Lawson * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 56*53289f6aSNate Lawson * Redistribution of source code of any substantial portion of the Covered 57*53289f6aSNate Lawson * Code or modification without rights to further distribute source must 58*53289f6aSNate Lawson * include the following Disclaimer and Export Compliance provision in the 59*53289f6aSNate Lawson * documentation and/or other materials provided with distribution. In 60*53289f6aSNate Lawson * addition, Licensee may not authorize further sublicense of source of any 61*53289f6aSNate Lawson * portion of the Covered Code, and must include terms to the effect that the 62*53289f6aSNate Lawson * license from Licensee to its licensee is limited to the intellectual 63*53289f6aSNate Lawson * property embodied in the software Licensee provides to its licensee, and 64*53289f6aSNate Lawson * not to intellectual property embodied in modifications its licensee may 65*53289f6aSNate Lawson * make. 66*53289f6aSNate Lawson * 67*53289f6aSNate Lawson * 3.3. Redistribution of Executable. Redistribution in executable form of any 68*53289f6aSNate Lawson * substantial portion of the Covered Code or modification must reproduce the 69*53289f6aSNate Lawson * above Copyright Notice, and the following Disclaimer and Export Compliance 70*53289f6aSNate Lawson * provision in the documentation and/or other materials provided with the 71*53289f6aSNate Lawson * distribution. 72*53289f6aSNate Lawson * 73*53289f6aSNate Lawson * 3.4. Intel retains all right, title, and interest in and to the Original 74*53289f6aSNate Lawson * Intel Code. 75*53289f6aSNate Lawson * 76*53289f6aSNate Lawson * 3.5. Neither the name Intel nor any other trademark owned or controlled by 77*53289f6aSNate Lawson * Intel shall be used in advertising or otherwise to promote the sale, use or 78*53289f6aSNate Lawson * other dealings in products derived from or relating to the Covered Code 79*53289f6aSNate Lawson * without prior written authorization from Intel. 80*53289f6aSNate Lawson * 81*53289f6aSNate Lawson * 4. Disclaimer and Export Compliance 82*53289f6aSNate Lawson * 83*53289f6aSNate Lawson * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 84*53289f6aSNate Lawson * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 85*53289f6aSNate Lawson * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 86*53289f6aSNate Lawson * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 87*53289f6aSNate Lawson * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 88*53289f6aSNate Lawson * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 89*53289f6aSNate Lawson * PARTICULAR PURPOSE. 90*53289f6aSNate Lawson * 91*53289f6aSNate Lawson * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 92*53289f6aSNate Lawson * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 93*53289f6aSNate Lawson * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 94*53289f6aSNate Lawson * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 95*53289f6aSNate Lawson * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 96*53289f6aSNate Lawson * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 97*53289f6aSNate Lawson * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 98*53289f6aSNate Lawson * LIMITED REMEDY. 99*53289f6aSNate Lawson * 100*53289f6aSNate Lawson * 4.3. Licensee shall not export, either directly or indirectly, any of this 101*53289f6aSNate Lawson * software or system incorporating such software without first obtaining any 102*53289f6aSNate Lawson * required license or other approval from the U. S. Department of Commerce or 103*53289f6aSNate Lawson * any other agency or department of the United States Government. In the 104*53289f6aSNate Lawson * event Licensee exports any such software from the United States or 105*53289f6aSNate Lawson * re-exports any such software from a foreign destination, Licensee shall 106*53289f6aSNate Lawson * ensure that the distribution and export/re-export of the software is in 107*53289f6aSNate Lawson * compliance with all laws, regulations, orders, or other restrictions of the 108*53289f6aSNate Lawson * U.S. Export Administration Regulations. Licensee agrees that neither it nor 109*53289f6aSNate Lawson * any of its subsidiaries will export/re-export any technical data, process, 110*53289f6aSNate Lawson * software, or service, directly or indirectly, to any country for which the 111*53289f6aSNate Lawson * United States government or any agency thereof requires an export license, 112*53289f6aSNate Lawson * other governmental approval, or letter of assurance, without first obtaining 113*53289f6aSNate Lawson * such license, approval or letter. 114*53289f6aSNate Lawson * 115*53289f6aSNate Lawson *****************************************************************************/ 116*53289f6aSNate Lawson 117*53289f6aSNate Lawson #define __ASLLOAD_C__ 118*53289f6aSNate Lawson 119*53289f6aSNate Lawson #include "aslcompiler.h" 120*53289f6aSNate Lawson #include "amlcode.h" 121*53289f6aSNate Lawson #include "acdispat.h" 122*53289f6aSNate Lawson #include "acnamesp.h" 123*53289f6aSNate Lawson 124*53289f6aSNate Lawson #include "aslcompiler.y.h" 125*53289f6aSNate Lawson 126*53289f6aSNate Lawson #define _COMPONENT ACPI_COMPILER 127*53289f6aSNate Lawson ACPI_MODULE_NAME ("aslload") 128*53289f6aSNate Lawson 129*53289f6aSNate Lawson 130*53289f6aSNate Lawson /******************************************************************************* 131*53289f6aSNate Lawson * 132*53289f6aSNate Lawson * FUNCTION: LdLoadNamespace 133*53289f6aSNate Lawson * 134*53289f6aSNate Lawson * PARAMETERS: None 135*53289f6aSNate Lawson * 136*53289f6aSNate Lawson * RETURN: Status 137*53289f6aSNate Lawson * 138*53289f6aSNate Lawson * DESCRIPTION: Perform a walk of the parse tree that in turn loads all of the 139*53289f6aSNate Lawson * named ASL/AML objects into the namespace. The namespace is 140*53289f6aSNate Lawson * constructed in order to resolve named references and references 141*53289f6aSNate Lawson * to named fields within resource templates/descriptors. 142*53289f6aSNate Lawson * 143*53289f6aSNate Lawson ******************************************************************************/ 144*53289f6aSNate Lawson 145*53289f6aSNate Lawson ACPI_STATUS 146*53289f6aSNate Lawson LdLoadNamespace ( 147*53289f6aSNate Lawson ACPI_PARSE_OBJECT *RootOp) 148*53289f6aSNate Lawson { 149*53289f6aSNate Lawson ACPI_WALK_STATE *WalkState; 150*53289f6aSNate Lawson 151*53289f6aSNate Lawson 152*53289f6aSNate Lawson DbgPrint (ASL_DEBUG_OUTPUT, "\nCreating namespace\n\n"); 153*53289f6aSNate Lawson 154*53289f6aSNate Lawson /* Create a new walk state */ 155*53289f6aSNate Lawson 156*53289f6aSNate Lawson WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); 157*53289f6aSNate Lawson if (!WalkState) 158*53289f6aSNate Lawson { 159*53289f6aSNate Lawson return AE_NO_MEMORY; 160*53289f6aSNate Lawson } 161*53289f6aSNate Lawson 162*53289f6aSNate Lawson /* Perform the walk of the parse tree */ 163*53289f6aSNate Lawson 164*53289f6aSNate Lawson TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace1Begin, 165*53289f6aSNate Lawson LdNamespace1End, WalkState); 166*53289f6aSNate Lawson 167*53289f6aSNate Lawson /* Dump the namespace if debug is enabled */ 168*53289f6aSNate Lawson 169*53289f6aSNate Lawson AcpiNsDumpTables (ACPI_NS_ALL, ACPI_UINT32_MAX); 170*53289f6aSNate Lawson return AE_OK; 171*53289f6aSNate Lawson } 172*53289f6aSNate Lawson 173*53289f6aSNate Lawson 174*53289f6aSNate Lawson /******************************************************************************* 175*53289f6aSNate Lawson * 176*53289f6aSNate Lawson * FUNCTION: LdLoadFieldElements 177*53289f6aSNate Lawson * 178*53289f6aSNate Lawson * PARAMETERS: Op - Parent node (Field) 179*53289f6aSNate Lawson * WalkState - Current walk state 180*53289f6aSNate Lawson * 181*53289f6aSNate Lawson * RETURN: Status 182*53289f6aSNate Lawson * 183*53289f6aSNate Lawson * DESCRIPTION: Enter the named elements of the field (children of the parent) 184*53289f6aSNate Lawson * into the namespace. 185*53289f6aSNate Lawson * 186*53289f6aSNate Lawson ******************************************************************************/ 187*53289f6aSNate Lawson 188*53289f6aSNate Lawson ACPI_STATUS 189*53289f6aSNate Lawson LdLoadFieldElements ( 190*53289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 191*53289f6aSNate Lawson ACPI_WALK_STATE *WalkState) 192*53289f6aSNate Lawson { 193*53289f6aSNate Lawson ACPI_PARSE_OBJECT *Child = NULL; 194*53289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node; 195*53289f6aSNate Lawson ACPI_STATUS Status; 196*53289f6aSNate Lawson 197*53289f6aSNate Lawson 198*53289f6aSNate Lawson /* Get the first named field element */ 199*53289f6aSNate Lawson 200*53289f6aSNate Lawson switch (Op->Asl.AmlOpcode) 201*53289f6aSNate Lawson { 202*53289f6aSNate Lawson case AML_BANK_FIELD_OP: 203*53289f6aSNate Lawson 204*53289f6aSNate Lawson Child = UtGetArg (Op, 6); 205*53289f6aSNate Lawson break; 206*53289f6aSNate Lawson 207*53289f6aSNate Lawson case AML_INDEX_FIELD_OP: 208*53289f6aSNate Lawson 209*53289f6aSNate Lawson Child = UtGetArg (Op, 5); 210*53289f6aSNate Lawson break; 211*53289f6aSNate Lawson 212*53289f6aSNate Lawson case AML_FIELD_OP: 213*53289f6aSNate Lawson 214*53289f6aSNate Lawson Child = UtGetArg (Op, 4); 215*53289f6aSNate Lawson break; 216*53289f6aSNate Lawson 217*53289f6aSNate Lawson default: 218*53289f6aSNate Lawson /* No other opcodes should arrive here */ 219*53289f6aSNate Lawson return (AE_BAD_PARAMETER); 220*53289f6aSNate Lawson } 221*53289f6aSNate Lawson 222*53289f6aSNate Lawson /* Enter all elements into the namespace */ 223*53289f6aSNate Lawson 224*53289f6aSNate Lawson while (Child) 225*53289f6aSNate Lawson { 226*53289f6aSNate Lawson switch (Child->Asl.AmlOpcode) 227*53289f6aSNate Lawson { 228*53289f6aSNate Lawson case AML_INT_RESERVEDFIELD_OP: 229*53289f6aSNate Lawson case AML_INT_ACCESSFIELD_OP: 230*53289f6aSNate Lawson 231*53289f6aSNate Lawson break; 232*53289f6aSNate Lawson 233*53289f6aSNate Lawson default: 234*53289f6aSNate Lawson 235*53289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Child->Asl.Value.String, 236*53289f6aSNate Lawson ACPI_TYPE_LOCAL_REGION_FIELD, ACPI_IMODE_LOAD_PASS1, 237*53289f6aSNate Lawson ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND, 238*53289f6aSNate Lawson NULL, &Node); 239*53289f6aSNate Lawson if (ACPI_FAILURE (Status)) 240*53289f6aSNate Lawson { 241*53289f6aSNate Lawson if (Status != AE_ALREADY_EXISTS) 242*53289f6aSNate Lawson { 243*53289f6aSNate Lawson return (Status); 244*53289f6aSNate Lawson } 245*53289f6aSNate Lawson 246*53289f6aSNate Lawson /* 247*53289f6aSNate Lawson * The name already exists in this scope 248*53289f6aSNate Lawson * But continue processing the elements 249*53289f6aSNate Lawson */ 250*53289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child, Child->Asl.Value.String); 251*53289f6aSNate Lawson } 252*53289f6aSNate Lawson else 253*53289f6aSNate Lawson { 254*53289f6aSNate Lawson Child->Asl.Node = Node; 255*53289f6aSNate Lawson Node->Object = (ACPI_OPERAND_OBJECT *) Child; 256*53289f6aSNate Lawson } 257*53289f6aSNate Lawson break; 258*53289f6aSNate Lawson } 259*53289f6aSNate Lawson Child = Child->Asl.Next; 260*53289f6aSNate Lawson } 261*53289f6aSNate Lawson return (AE_OK); 262*53289f6aSNate Lawson } 263*53289f6aSNate Lawson 264*53289f6aSNate Lawson 265*53289f6aSNate Lawson /******************************************************************************* 266*53289f6aSNate Lawson * 267*53289f6aSNate Lawson * FUNCTION: LdLoadResourceElements 268*53289f6aSNate Lawson * 269*53289f6aSNate Lawson * PARAMETERS: Op - Parent node (Resource Descriptor) 270*53289f6aSNate Lawson * WalkState - Current walk state 271*53289f6aSNate Lawson * 272*53289f6aSNate Lawson * RETURN: Status 273*53289f6aSNate Lawson * 274*53289f6aSNate Lawson * DESCRIPTION: Enter the named elements of the resource descriptor (children 275*53289f6aSNate Lawson * of the parent) into the namespace. 276*53289f6aSNate Lawson * 277*53289f6aSNate Lawson * NOTE: In the real AML namespace, these named elements never exist. But 278*53289f6aSNate Lawson * we simply use the namespace here as a symbol table so we can look 279*53289f6aSNate Lawson * them up as they are referenced. 280*53289f6aSNate Lawson * 281*53289f6aSNate Lawson ******************************************************************************/ 282*53289f6aSNate Lawson 283*53289f6aSNate Lawson ACPI_STATUS 284*53289f6aSNate Lawson LdLoadResourceElements ( 285*53289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 286*53289f6aSNate Lawson ACPI_WALK_STATE *WalkState) 287*53289f6aSNate Lawson { 288*53289f6aSNate Lawson ACPI_PARSE_OBJECT *InitializerOp = NULL; 289*53289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node; 290*53289f6aSNate Lawson ACPI_STATUS Status; 291*53289f6aSNate Lawson 292*53289f6aSNate Lawson 293*53289f6aSNate Lawson /* 294*53289f6aSNate Lawson * Enter the resouce name into the namespace 295*53289f6aSNate Lawson * This opens a scope 296*53289f6aSNate Lawson */ 297*53289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Asl.Namepath, 298*53289f6aSNate Lawson ACPI_TYPE_LOCAL_RESOURCE, ACPI_IMODE_LOAD_PASS1, ACPI_NS_NO_UPSEARCH, 299*53289f6aSNate Lawson WalkState, &Node); 300*53289f6aSNate Lawson if (ACPI_FAILURE (Status)) 301*53289f6aSNate Lawson { 302*53289f6aSNate Lawson return (Status); 303*53289f6aSNate Lawson } 304*53289f6aSNate Lawson 305*53289f6aSNate Lawson /* 306*53289f6aSNate Lawson * Now enter the predefined fields, for easy lookup when referenced 307*53289f6aSNate Lawson * by the source ASL 308*53289f6aSNate Lawson */ 309*53289f6aSNate Lawson InitializerOp = ASL_GET_CHILD_NODE (Op); 310*53289f6aSNate Lawson while (InitializerOp) 311*53289f6aSNate Lawson { 312*53289f6aSNate Lawson 313*53289f6aSNate Lawson if (InitializerOp->Asl.ExternalName) 314*53289f6aSNate Lawson { 315*53289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, 316*53289f6aSNate Lawson InitializerOp->Asl.ExternalName, 317*53289f6aSNate Lawson ACPI_TYPE_LOCAL_RESOURCE_FIELD, 318*53289f6aSNate Lawson ACPI_IMODE_LOAD_PASS1, ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, 319*53289f6aSNate Lawson NULL, &Node); 320*53289f6aSNate Lawson if (ACPI_FAILURE (Status)) 321*53289f6aSNate Lawson { 322*53289f6aSNate Lawson return (Status); 323*53289f6aSNate Lawson } 324*53289f6aSNate Lawson 325*53289f6aSNate Lawson /* 326*53289f6aSNate Lawson * Store the field offset in the namespace node so it 327*53289f6aSNate Lawson * can be used when the field is referenced 328*53289f6aSNate Lawson */ 329*53289f6aSNate Lawson Node->OwnerId = (UINT16) InitializerOp->Asl.Value.Integer; 330*53289f6aSNate Lawson InitializerOp->Asl.Node = Node; 331*53289f6aSNate Lawson Node->Object = (ACPI_OPERAND_OBJECT *) InitializerOp; 332*53289f6aSNate Lawson 333*53289f6aSNate Lawson /* Pass thru the field type (Bitfield or Bytefield) */ 334*53289f6aSNate Lawson 335*53289f6aSNate Lawson if (InitializerOp->Asl.CompileFlags & NODE_IS_BIT_OFFSET) 336*53289f6aSNate Lawson { 337*53289f6aSNate Lawson Node->Flags |= ANOBJ_IS_BIT_OFFSET; 338*53289f6aSNate Lawson } 339*53289f6aSNate Lawson } 340*53289f6aSNate Lawson InitializerOp = ASL_GET_PEER_NODE (InitializerOp); 341*53289f6aSNate Lawson } 342*53289f6aSNate Lawson 343*53289f6aSNate Lawson return (AE_OK); 344*53289f6aSNate Lawson } 345*53289f6aSNate Lawson 346*53289f6aSNate Lawson 347*53289f6aSNate Lawson /******************************************************************************* 348*53289f6aSNate Lawson * 349*53289f6aSNate Lawson * FUNCTION: LdNamespace1Begin 350*53289f6aSNate Lawson * 351*53289f6aSNate Lawson * PARAMETERS: ASL_WALK_CALLBACK 352*53289f6aSNate Lawson * 353*53289f6aSNate Lawson * RETURN: Status 354*53289f6aSNate Lawson * 355*53289f6aSNate Lawson * DESCRIPTION: Descending callback used during the parse tree walk. If this 356*53289f6aSNate Lawson * is a named AML opcode, enter into the namespace 357*53289f6aSNate Lawson * 358*53289f6aSNate Lawson ******************************************************************************/ 359*53289f6aSNate Lawson 360*53289f6aSNate Lawson ACPI_STATUS 361*53289f6aSNate Lawson LdNamespace1Begin ( 362*53289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 363*53289f6aSNate Lawson UINT32 Level, 364*53289f6aSNate Lawson void *Context) 365*53289f6aSNate Lawson { 366*53289f6aSNate Lawson ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 367*53289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node; 368*53289f6aSNate Lawson ACPI_STATUS Status; 369*53289f6aSNate Lawson ACPI_OBJECT_TYPE ObjectType; 370*53289f6aSNate Lawson ACPI_OBJECT_TYPE ActualObjectType = ACPI_TYPE_ANY; 371*53289f6aSNate Lawson char *Path; 372*53289f6aSNate Lawson UINT32 Flags = ACPI_NS_NO_UPSEARCH; 373*53289f6aSNate Lawson ACPI_PARSE_OBJECT *Arg; 374*53289f6aSNate Lawson UINT32 i; 375*53289f6aSNate Lawson 376*53289f6aSNate Lawson 377*53289f6aSNate Lawson ACPI_FUNCTION_NAME ("LdNamespace1Begin"); 378*53289f6aSNate Lawson ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 379*53289f6aSNate Lawson Op, Op->Asl.ParseOpName)); 380*53289f6aSNate Lawson 381*53289f6aSNate Lawson 382*53289f6aSNate Lawson /* 383*53289f6aSNate Lawson * We are only interested in opcodes that have an associated name 384*53289f6aSNate Lawson * (or multiple names) 385*53289f6aSNate Lawson */ 386*53289f6aSNate Lawson switch (Op->Asl.AmlOpcode) 387*53289f6aSNate Lawson { 388*53289f6aSNate Lawson case AML_BANK_FIELD_OP: 389*53289f6aSNate Lawson case AML_INDEX_FIELD_OP: 390*53289f6aSNate Lawson case AML_FIELD_OP: 391*53289f6aSNate Lawson 392*53289f6aSNate Lawson Status = LdLoadFieldElements (Op, WalkState); 393*53289f6aSNate Lawson return (Status); 394*53289f6aSNate Lawson 395*53289f6aSNate Lawson default: 396*53289f6aSNate Lawson 397*53289f6aSNate Lawson /* All other opcodes go below */ 398*53289f6aSNate Lawson break; 399*53289f6aSNate Lawson } 400*53289f6aSNate Lawson 401*53289f6aSNate Lawson /* Check if this object has already been installed in the namespace */ 402*53289f6aSNate Lawson 403*53289f6aSNate Lawson if (Op->Asl.Node) 404*53289f6aSNate Lawson { 405*53289f6aSNate Lawson return (AE_OK); 406*53289f6aSNate Lawson } 407*53289f6aSNate Lawson 408*53289f6aSNate Lawson Path = Op->Asl.Namepath; 409*53289f6aSNate Lawson if (!Path) 410*53289f6aSNate Lawson { 411*53289f6aSNate Lawson return (AE_OK); 412*53289f6aSNate Lawson } 413*53289f6aSNate Lawson 414*53289f6aSNate Lawson /* Map the raw opcode into an internal object type */ 415*53289f6aSNate Lawson 416*53289f6aSNate Lawson switch (Op->Asl.ParseOpcode) 417*53289f6aSNate Lawson { 418*53289f6aSNate Lawson case PARSEOP_NAME: 419*53289f6aSNate Lawson 420*53289f6aSNate Lawson Arg = Op->Asl.Child; /* Get the NameSeg/NameString node */ 421*53289f6aSNate Lawson Arg = Arg->Asl.Next; /* First peer is the object to be associated with the name */ 422*53289f6aSNate Lawson 423*53289f6aSNate Lawson /* Get the data type associated with the named object, not the name itself */ 424*53289f6aSNate Lawson 425*53289f6aSNate Lawson /* Log2 loop to convert from Btype (binary) to Etype (encoded) */ 426*53289f6aSNate Lawson 427*53289f6aSNate Lawson ObjectType = 1; 428*53289f6aSNate Lawson for (i = 1; i < Arg->Asl.AcpiBtype; i *= 2) 429*53289f6aSNate Lawson { 430*53289f6aSNate Lawson ObjectType++; 431*53289f6aSNate Lawson } 432*53289f6aSNate Lawson break; 433*53289f6aSNate Lawson 434*53289f6aSNate Lawson 435*53289f6aSNate Lawson case PARSEOP_EXTERNAL: 436*53289f6aSNate Lawson 437*53289f6aSNate Lawson /* 438*53289f6aSNate Lawson * "External" simply enters a name and type into the namespace. 439*53289f6aSNate Lawson * We must be careful to not open a new scope, however, no matter 440*53289f6aSNate Lawson * what type the external name refers to (e.g., a method) 441*53289f6aSNate Lawson * 442*53289f6aSNate Lawson * first child is name, next child is ObjectType 443*53289f6aSNate Lawson */ 444*53289f6aSNate Lawson ActualObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer; 445*53289f6aSNate Lawson ObjectType = ACPI_TYPE_ANY; 446*53289f6aSNate Lawson break; 447*53289f6aSNate Lawson 448*53289f6aSNate Lawson 449*53289f6aSNate Lawson case PARSEOP_DEFAULT_ARG: 450*53289f6aSNate Lawson 451*53289f6aSNate Lawson if(Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC) 452*53289f6aSNate Lawson { 453*53289f6aSNate Lawson Status = LdLoadResourceElements (Op, WalkState); 454*53289f6aSNate Lawson goto Exit; 455*53289f6aSNate Lawson } 456*53289f6aSNate Lawson 457*53289f6aSNate Lawson ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 458*53289f6aSNate Lawson break; 459*53289f6aSNate Lawson 460*53289f6aSNate Lawson 461*53289f6aSNate Lawson case PARSEOP_SCOPE: 462*53289f6aSNate Lawson 463*53289f6aSNate Lawson /* 464*53289f6aSNate Lawson * The name referenced by Scope(Name) must already exist at this point. 465*53289f6aSNate Lawson * In other words, forward references for Scope() are not supported. 466*53289f6aSNate Lawson * The only real reason for this is that the MS interpreter cannot 467*53289f6aSNate Lawson * handle this case. Perhaps someday this case can go away. 468*53289f6aSNate Lawson */ 469*53289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 470*53289f6aSNate Lawson ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &(Node)); 471*53289f6aSNate Lawson if (ACPI_FAILURE (Status)) 472*53289f6aSNate Lawson { 473*53289f6aSNate Lawson if (Status == AE_NOT_FOUND) 474*53289f6aSNate Lawson { 475*53289f6aSNate Lawson /* The name was not found, go ahead and create it */ 476*53289f6aSNate Lawson 477*53289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_LOCAL_SCOPE, 478*53289f6aSNate Lawson ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &(Node)); 479*53289f6aSNate Lawson 480*53289f6aSNate Lawson /* 481*53289f6aSNate Lawson * However, this is an error -- primarily because the MS 482*53289f6aSNate Lawson * interpreter can't handle a forward reference from the 483*53289f6aSNate Lawson * Scope() operator. 484*53289f6aSNate Lawson */ 485*53289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, Op->Asl.ExternalName); 486*53289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_SCOPE_FWD_REF, Op, Op->Asl.ExternalName); 487*53289f6aSNate Lawson goto FinishNode; 488*53289f6aSNate Lawson } 489*53289f6aSNate Lawson 490*53289f6aSNate Lawson AslCoreSubsystemError (Op, Status, "Failure from lookup\n", FALSE); 491*53289f6aSNate Lawson goto Exit; 492*53289f6aSNate Lawson } 493*53289f6aSNate Lawson 494*53289f6aSNate Lawson /* We found a node with this name, now check the type */ 495*53289f6aSNate Lawson 496*53289f6aSNate Lawson switch (Node->Type) 497*53289f6aSNate Lawson { 498*53289f6aSNate Lawson case ACPI_TYPE_LOCAL_SCOPE: 499*53289f6aSNate Lawson case ACPI_TYPE_DEVICE: 500*53289f6aSNate Lawson case ACPI_TYPE_POWER: 501*53289f6aSNate Lawson case ACPI_TYPE_PROCESSOR: 502*53289f6aSNate Lawson case ACPI_TYPE_THERMAL: 503*53289f6aSNate Lawson 504*53289f6aSNate Lawson /* These are acceptable types - they all open a new scope */ 505*53289f6aSNate Lawson break; 506*53289f6aSNate Lawson 507*53289f6aSNate Lawson case ACPI_TYPE_INTEGER: 508*53289f6aSNate Lawson case ACPI_TYPE_STRING: 509*53289f6aSNate Lawson case ACPI_TYPE_BUFFER: 510*53289f6aSNate Lawson 511*53289f6aSNate Lawson /* 512*53289f6aSNate Lawson * These types we will allow, but we will change the type. This 513*53289f6aSNate Lawson * enables some existing code of the form: 514*53289f6aSNate Lawson * 515*53289f6aSNate Lawson * Name (DEB, 0) 516*53289f6aSNate Lawson * Scope (DEB) { ... } 517*53289f6aSNate Lawson * 518*53289f6aSNate Lawson * Which is used to workaround the fact that the MS interpreter 519*53289f6aSNate Lawson * does not allow Scope() forward references. 520*53289f6aSNate Lawson */ 521*53289f6aSNate Lawson sprintf (MsgBuffer, "%s, %s, Changing type to (Scope)", 522*53289f6aSNate Lawson Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type)); 523*53289f6aSNate Lawson AslError (ASL_REMARK, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer); 524*53289f6aSNate Lawson 525*53289f6aSNate Lawson /* 526*53289f6aSNate Lawson * Switch the type 527*53289f6aSNate Lawson */ 528*53289f6aSNate Lawson Node->Type = ACPI_TYPE_ANY; 529*53289f6aSNate Lawson break; 530*53289f6aSNate Lawson 531*53289f6aSNate Lawson default: 532*53289f6aSNate Lawson 533*53289f6aSNate Lawson /* 534*53289f6aSNate Lawson * All other types are an error 535*53289f6aSNate Lawson */ 536*53289f6aSNate Lawson sprintf (MsgBuffer, "%s, %s", Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type)); 537*53289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer); 538*53289f6aSNate Lawson 539*53289f6aSNate Lawson /* 540*53289f6aSNate Lawson * However, switch the type to be an actual scope so 541*53289f6aSNate Lawson * that compilation can continue without generating a whole 542*53289f6aSNate Lawson * cascade of additional errors. 543*53289f6aSNate Lawson */ 544*53289f6aSNate Lawson Node->Type = ACPI_TYPE_ANY; 545*53289f6aSNate Lawson break; 546*53289f6aSNate Lawson } 547*53289f6aSNate Lawson 548*53289f6aSNate Lawson Status = AE_OK; 549*53289f6aSNate Lawson goto FinishNode; 550*53289f6aSNate Lawson 551*53289f6aSNate Lawson 552*53289f6aSNate Lawson default: 553*53289f6aSNate Lawson 554*53289f6aSNate Lawson ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 555*53289f6aSNate Lawson break; 556*53289f6aSNate Lawson } 557*53289f6aSNate Lawson 558*53289f6aSNate Lawson 559*53289f6aSNate Lawson ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n", 560*53289f6aSNate Lawson Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType))); 561*53289f6aSNate Lawson 562*53289f6aSNate Lawson /* The name must not already exist */ 563*53289f6aSNate Lawson 564*53289f6aSNate Lawson Flags |= ACPI_NS_ERROR_IF_FOUND; 565*53289f6aSNate Lawson 566*53289f6aSNate Lawson /* 567*53289f6aSNate Lawson * Enter the named type into the internal namespace. We enter the name 568*53289f6aSNate Lawson * as we go downward in the parse tree. Any necessary subobjects that involve 569*53289f6aSNate Lawson * arguments to the opcode must be created as we go back up the parse tree later. 570*53289f6aSNate Lawson */ 571*53289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 572*53289f6aSNate Lawson ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &(Node)); 573*53289f6aSNate Lawson if (ACPI_FAILURE (Status)) 574*53289f6aSNate Lawson { 575*53289f6aSNate Lawson if (Status == AE_ALREADY_EXISTS) 576*53289f6aSNate Lawson { 577*53289f6aSNate Lawson /* The name already exists in this scope */ 578*53289f6aSNate Lawson 579*53289f6aSNate Lawson if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) 580*53289f6aSNate Lawson { 581*53289f6aSNate Lawson Node->Type = (UINT8) ObjectType; 582*53289f6aSNate Lawson Status = AE_OK; 583*53289f6aSNate Lawson } 584*53289f6aSNate Lawson else 585*53289f6aSNate Lawson { 586*53289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, Op->Asl.ExternalName); 587*53289f6aSNate Lawson Status = AE_OK; 588*53289f6aSNate Lawson goto Exit; 589*53289f6aSNate Lawson } 590*53289f6aSNate Lawson } 591*53289f6aSNate Lawson else 592*53289f6aSNate Lawson { 593*53289f6aSNate Lawson AslCoreSubsystemError (Op, Status, "Failure from lookup %s\n", FALSE); 594*53289f6aSNate Lawson goto Exit; 595*53289f6aSNate Lawson } 596*53289f6aSNate Lawson } 597*53289f6aSNate Lawson 598*53289f6aSNate Lawson 599*53289f6aSNate Lawson FinishNode: 600*53289f6aSNate Lawson /* 601*53289f6aSNate Lawson * Point the parse node to the new namespace node, and point 602*53289f6aSNate Lawson * the Node back to the original Parse node 603*53289f6aSNate Lawson */ 604*53289f6aSNate Lawson Op->Asl.Node = Node; 605*53289f6aSNate Lawson Node->Object = (ACPI_OPERAND_OBJECT *) Op; 606*53289f6aSNate Lawson 607*53289f6aSNate Lawson /* Set the actual data type if appropriate (EXTERNAL term only) */ 608*53289f6aSNate Lawson 609*53289f6aSNate Lawson if (ActualObjectType != ACPI_TYPE_ANY) 610*53289f6aSNate Lawson { 611*53289f6aSNate Lawson Node->Type = (UINT8) ActualObjectType; 612*53289f6aSNate Lawson Node->OwnerId = ASL_EXTERNAL_METHOD; 613*53289f6aSNate Lawson } 614*53289f6aSNate Lawson 615*53289f6aSNate Lawson if (Op->Asl.ParseOpcode == PARSEOP_METHOD) 616*53289f6aSNate Lawson { 617*53289f6aSNate Lawson /* 618*53289f6aSNate Lawson * Get the method argument count from "Extra" and store 619*53289f6aSNate Lawson * it in the OwnerId field of the namespace node 620*53289f6aSNate Lawson */ 621*53289f6aSNate Lawson Node->OwnerId = (UINT16) Op->Asl.Extra; 622*53289f6aSNate Lawson } 623*53289f6aSNate Lawson 624*53289f6aSNate Lawson Exit: 625*53289f6aSNate Lawson return (Status); 626*53289f6aSNate Lawson } 627*53289f6aSNate Lawson 628*53289f6aSNate Lawson 629*53289f6aSNate Lawson /******************************************************************************* 630*53289f6aSNate Lawson * 631*53289f6aSNate Lawson * FUNCTION: LdNamespace1End 632*53289f6aSNate Lawson * 633*53289f6aSNate Lawson * PARAMETERS: ASL_WALK_CALLBACK 634*53289f6aSNate Lawson * 635*53289f6aSNate Lawson * RETURN: Status 636*53289f6aSNate Lawson * 637*53289f6aSNate Lawson * DESCRIPTION: Ascending callback used during the loading of the namespace, 638*53289f6aSNate Lawson * We only need to worry about managing the scope stack here. 639*53289f6aSNate Lawson * 640*53289f6aSNate Lawson ******************************************************************************/ 641*53289f6aSNate Lawson 642*53289f6aSNate Lawson ACPI_STATUS 643*53289f6aSNate Lawson LdNamespace1End ( 644*53289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 645*53289f6aSNate Lawson UINT32 Level, 646*53289f6aSNate Lawson void *Context) 647*53289f6aSNate Lawson { 648*53289f6aSNate Lawson ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 649*53289f6aSNate Lawson ACPI_OBJECT_TYPE ObjectType; 650*53289f6aSNate Lawson 651*53289f6aSNate Lawson 652*53289f6aSNate Lawson ACPI_FUNCTION_NAME ("LdNamespace1End"); 653*53289f6aSNate Lawson 654*53289f6aSNate Lawson 655*53289f6aSNate Lawson /* We are only interested in opcodes that have an associated name */ 656*53289f6aSNate Lawson 657*53289f6aSNate Lawson if (!Op->Asl.Namepath) 658*53289f6aSNate Lawson { 659*53289f6aSNate Lawson return (AE_OK); 660*53289f6aSNate Lawson } 661*53289f6aSNate Lawson 662*53289f6aSNate Lawson /* Get the type to determine if we should pop the scope */ 663*53289f6aSNate Lawson 664*53289f6aSNate Lawson if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 665*53289f6aSNate Lawson (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC)) 666*53289f6aSNate Lawson { 667*53289f6aSNate Lawson /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */ 668*53289f6aSNate Lawson 669*53289f6aSNate Lawson ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 670*53289f6aSNate Lawson } 671*53289f6aSNate Lawson else 672*53289f6aSNate Lawson { 673*53289f6aSNate Lawson ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 674*53289f6aSNate Lawson } 675*53289f6aSNate Lawson 676*53289f6aSNate Lawson /* Pop the scope stack */ 677*53289f6aSNate Lawson 678*53289f6aSNate Lawson if (AcpiNsOpensScope (ObjectType)) 679*53289f6aSNate Lawson { 680*53289f6aSNate Lawson 681*53289f6aSNate Lawson ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 682*53289f6aSNate Lawson "(%s): Popping scope for Op [%s] %p\n", 683*53289f6aSNate Lawson AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op)); 684*53289f6aSNate Lawson 685*53289f6aSNate Lawson AcpiDsScopeStackPop (WalkState); 686*53289f6aSNate Lawson } 687*53289f6aSNate Lawson 688*53289f6aSNate Lawson return (AE_OK); 689*53289f6aSNate Lawson } 690*53289f6aSNate Lawson 691*53289f6aSNate Lawson 692