1*28c506b8Sjruoho /****************************************************************************** 2*28c506b8Sjruoho * 3*28c506b8Sjruoho * Module Name: dswload - Dispatcher namespace load callbacks 4*28c506b8Sjruoho * 5*28c506b8Sjruoho *****************************************************************************/ 6*28c506b8Sjruoho 7*28c506b8Sjruoho /****************************************************************************** 8*28c506b8Sjruoho * 9*28c506b8Sjruoho * 1. Copyright Notice 10*28c506b8Sjruoho * 11*28c506b8Sjruoho * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. 12*28c506b8Sjruoho * All rights reserved. 13*28c506b8Sjruoho * 14*28c506b8Sjruoho * 2. License 15*28c506b8Sjruoho * 16*28c506b8Sjruoho * 2.1. This is your license from Intel Corp. under its intellectual property 17*28c506b8Sjruoho * rights. You may have additional license terms from the party that provided 18*28c506b8Sjruoho * you this software, covering your right to use that party's intellectual 19*28c506b8Sjruoho * property rights. 20*28c506b8Sjruoho * 21*28c506b8Sjruoho * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22*28c506b8Sjruoho * copy of the source code appearing in this file ("Covered Code") an 23*28c506b8Sjruoho * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24*28c506b8Sjruoho * base code distributed originally by Intel ("Original Intel Code") to copy, 25*28c506b8Sjruoho * make derivatives, distribute, use and display any portion of the Covered 26*28c506b8Sjruoho * Code in any form, with the right to sublicense such rights; and 27*28c506b8Sjruoho * 28*28c506b8Sjruoho * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29*28c506b8Sjruoho * license (with the right to sublicense), under only those claims of Intel 30*28c506b8Sjruoho * patents that are infringed by the Original Intel Code, to make, use, sell, 31*28c506b8Sjruoho * offer to sell, and import the Covered Code and derivative works thereof 32*28c506b8Sjruoho * solely to the minimum extent necessary to exercise the above copyright 33*28c506b8Sjruoho * license, and in no event shall the patent license extend to any additions 34*28c506b8Sjruoho * to or modifications of the Original Intel Code. No other license or right 35*28c506b8Sjruoho * is granted directly or by implication, estoppel or otherwise; 36*28c506b8Sjruoho * 37*28c506b8Sjruoho * The above copyright and patent license is granted only if the following 38*28c506b8Sjruoho * conditions are met: 39*28c506b8Sjruoho * 40*28c506b8Sjruoho * 3. Conditions 41*28c506b8Sjruoho * 42*28c506b8Sjruoho * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43*28c506b8Sjruoho * Redistribution of source code of any substantial portion of the Covered 44*28c506b8Sjruoho * Code or modification with rights to further distribute source must include 45*28c506b8Sjruoho * the above Copyright Notice, the above License, this list of Conditions, 46*28c506b8Sjruoho * and the following Disclaimer and Export Compliance provision. In addition, 47*28c506b8Sjruoho * Licensee must cause all Covered Code to which Licensee contributes to 48*28c506b8Sjruoho * contain a file documenting the changes Licensee made to create that Covered 49*28c506b8Sjruoho * Code and the date of any change. Licensee must include in that file the 50*28c506b8Sjruoho * documentation of any changes made by any predecessor Licensee. Licensee 51*28c506b8Sjruoho * must include a prominent statement that the modification is derived, 52*28c506b8Sjruoho * directly or indirectly, from Original Intel Code. 53*28c506b8Sjruoho * 54*28c506b8Sjruoho * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55*28c506b8Sjruoho * Redistribution of source code of any substantial portion of the Covered 56*28c506b8Sjruoho * Code or modification without rights to further distribute source must 57*28c506b8Sjruoho * include the following Disclaimer and Export Compliance provision in the 58*28c506b8Sjruoho * documentation and/or other materials provided with distribution. In 59*28c506b8Sjruoho * addition, Licensee may not authorize further sublicense of source of any 60*28c506b8Sjruoho * portion of the Covered Code, and must include terms to the effect that the 61*28c506b8Sjruoho * license from Licensee to its licensee is limited to the intellectual 62*28c506b8Sjruoho * property embodied in the software Licensee provides to its licensee, and 63*28c506b8Sjruoho * not to intellectual property embodied in modifications its licensee may 64*28c506b8Sjruoho * make. 65*28c506b8Sjruoho * 66*28c506b8Sjruoho * 3.3. Redistribution of Executable. Redistribution in executable form of any 67*28c506b8Sjruoho * substantial portion of the Covered Code or modification must reproduce the 68*28c506b8Sjruoho * above Copyright Notice, and the following Disclaimer and Export Compliance 69*28c506b8Sjruoho * provision in the documentation and/or other materials provided with the 70*28c506b8Sjruoho * distribution. 71*28c506b8Sjruoho * 72*28c506b8Sjruoho * 3.4. Intel retains all right, title, and interest in and to the Original 73*28c506b8Sjruoho * Intel Code. 74*28c506b8Sjruoho * 75*28c506b8Sjruoho * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76*28c506b8Sjruoho * Intel shall be used in advertising or otherwise to promote the sale, use or 77*28c506b8Sjruoho * other dealings in products derived from or relating to the Covered Code 78*28c506b8Sjruoho * without prior written authorization from Intel. 79*28c506b8Sjruoho * 80*28c506b8Sjruoho * 4. Disclaimer and Export Compliance 81*28c506b8Sjruoho * 82*28c506b8Sjruoho * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83*28c506b8Sjruoho * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84*28c506b8Sjruoho * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85*28c506b8Sjruoho * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86*28c506b8Sjruoho * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87*28c506b8Sjruoho * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88*28c506b8Sjruoho * PARTICULAR PURPOSE. 89*28c506b8Sjruoho * 90*28c506b8Sjruoho * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91*28c506b8Sjruoho * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92*28c506b8Sjruoho * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93*28c506b8Sjruoho * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94*28c506b8Sjruoho * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95*28c506b8Sjruoho * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96*28c506b8Sjruoho * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97*28c506b8Sjruoho * LIMITED REMEDY. 98*28c506b8Sjruoho * 99*28c506b8Sjruoho * 4.3. Licensee shall not export, either directly or indirectly, any of this 100*28c506b8Sjruoho * software or system incorporating such software without first obtaining any 101*28c506b8Sjruoho * required license or other approval from the U. S. Department of Commerce or 102*28c506b8Sjruoho * any other agency or department of the United States Government. In the 103*28c506b8Sjruoho * event Licensee exports any such software from the United States or 104*28c506b8Sjruoho * re-exports any such software from a foreign destination, Licensee shall 105*28c506b8Sjruoho * ensure that the distribution and export/re-export of the software is in 106*28c506b8Sjruoho * compliance with all laws, regulations, orders, or other restrictions of the 107*28c506b8Sjruoho * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108*28c506b8Sjruoho * any of its subsidiaries will export/re-export any technical data, process, 109*28c506b8Sjruoho * software, or service, directly or indirectly, to any country for which the 110*28c506b8Sjruoho * United States government or any agency thereof requires an export license, 111*28c506b8Sjruoho * other governmental approval, or letter of assurance, without first obtaining 112*28c506b8Sjruoho * such license, approval or letter. 113*28c506b8Sjruoho * 114*28c506b8Sjruoho *****************************************************************************/ 115*28c506b8Sjruoho 116*28c506b8Sjruoho #define __ASLLOAD_C__ 117*28c506b8Sjruoho 118*28c506b8Sjruoho #include "aslcompiler.h" 119*28c506b8Sjruoho #include "amlcode.h" 120*28c506b8Sjruoho #include "acdispat.h" 121*28c506b8Sjruoho #include "acnamesp.h" 122*28c506b8Sjruoho 123*28c506b8Sjruoho #include "aslcompiler.y.h" 124*28c506b8Sjruoho 125*28c506b8Sjruoho #define _COMPONENT ACPI_COMPILER 126*28c506b8Sjruoho ACPI_MODULE_NAME ("aslload") 127*28c506b8Sjruoho 128*28c506b8Sjruoho /* Local prototypes */ 129*28c506b8Sjruoho 130*28c506b8Sjruoho static ACPI_STATUS 131*28c506b8Sjruoho LdLoadFieldElements ( 132*28c506b8Sjruoho ACPI_PARSE_OBJECT *Op, 133*28c506b8Sjruoho ACPI_WALK_STATE *WalkState); 134*28c506b8Sjruoho 135*28c506b8Sjruoho static ACPI_STATUS 136*28c506b8Sjruoho LdLoadResourceElements ( 137*28c506b8Sjruoho ACPI_PARSE_OBJECT *Op, 138*28c506b8Sjruoho ACPI_WALK_STATE *WalkState); 139*28c506b8Sjruoho 140*28c506b8Sjruoho static ACPI_STATUS 141*28c506b8Sjruoho LdNamespace1Begin ( 142*28c506b8Sjruoho ACPI_PARSE_OBJECT *Op, 143*28c506b8Sjruoho UINT32 Level, 144*28c506b8Sjruoho void *Context); 145*28c506b8Sjruoho 146*28c506b8Sjruoho static ACPI_STATUS 147*28c506b8Sjruoho LdNamespace2Begin ( 148*28c506b8Sjruoho ACPI_PARSE_OBJECT *Op, 149*28c506b8Sjruoho UINT32 Level, 150*28c506b8Sjruoho void *Context); 151*28c506b8Sjruoho 152*28c506b8Sjruoho static ACPI_STATUS 153*28c506b8Sjruoho LdCommonNamespaceEnd ( 154*28c506b8Sjruoho ACPI_PARSE_OBJECT *Op, 155*28c506b8Sjruoho UINT32 Level, 156*28c506b8Sjruoho void *Context); 157*28c506b8Sjruoho 158*28c506b8Sjruoho 159*28c506b8Sjruoho /******************************************************************************* 160*28c506b8Sjruoho * 161*28c506b8Sjruoho * FUNCTION: LdLoadNamespace 162*28c506b8Sjruoho * 163*28c506b8Sjruoho * PARAMETERS: RootOp - Root of the parse tree 164*28c506b8Sjruoho * 165*28c506b8Sjruoho * RETURN: Status 166*28c506b8Sjruoho * 167*28c506b8Sjruoho * DESCRIPTION: Perform a walk of the parse tree that in turn loads all of the 168*28c506b8Sjruoho * named ASL/AML objects into the namespace. The namespace is 169*28c506b8Sjruoho * constructed in order to resolve named references and references 170*28c506b8Sjruoho * to named fields within resource templates/descriptors. 171*28c506b8Sjruoho * 172*28c506b8Sjruoho ******************************************************************************/ 173*28c506b8Sjruoho 174*28c506b8Sjruoho ACPI_STATUS 175*28c506b8Sjruoho LdLoadNamespace ( 176*28c506b8Sjruoho ACPI_PARSE_OBJECT *RootOp) 177*28c506b8Sjruoho { 178*28c506b8Sjruoho ACPI_WALK_STATE *WalkState; 179*28c506b8Sjruoho 180*28c506b8Sjruoho 181*28c506b8Sjruoho DbgPrint (ASL_DEBUG_OUTPUT, "\nCreating namespace\n\n"); 182*28c506b8Sjruoho 183*28c506b8Sjruoho /* Create a new walk state */ 184*28c506b8Sjruoho 185*28c506b8Sjruoho WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); 186*28c506b8Sjruoho if (!WalkState) 187*28c506b8Sjruoho { 188*28c506b8Sjruoho return AE_NO_MEMORY; 189*28c506b8Sjruoho } 190*28c506b8Sjruoho 191*28c506b8Sjruoho /* Walk the entire parse tree, first pass */ 192*28c506b8Sjruoho 193*28c506b8Sjruoho TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace1Begin, 194*28c506b8Sjruoho LdCommonNamespaceEnd, WalkState); 195*28c506b8Sjruoho 196*28c506b8Sjruoho /* Second pass to handle forward references */ 197*28c506b8Sjruoho 198*28c506b8Sjruoho TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace2Begin, 199*28c506b8Sjruoho LdCommonNamespaceEnd, WalkState); 200*28c506b8Sjruoho 201*28c506b8Sjruoho /* Dump the namespace if debug is enabled */ 202*28c506b8Sjruoho 203*28c506b8Sjruoho AcpiNsDumpTables (ACPI_NS_ALL, ACPI_UINT32_MAX); 204*28c506b8Sjruoho return AE_OK; 205*28c506b8Sjruoho } 206*28c506b8Sjruoho 207*28c506b8Sjruoho 208*28c506b8Sjruoho /******************************************************************************* 209*28c506b8Sjruoho * 210*28c506b8Sjruoho * FUNCTION: LdLoadFieldElements 211*28c506b8Sjruoho * 212*28c506b8Sjruoho * PARAMETERS: Op - Parent node (Field) 213*28c506b8Sjruoho * WalkState - Current walk state 214*28c506b8Sjruoho * 215*28c506b8Sjruoho * RETURN: Status 216*28c506b8Sjruoho * 217*28c506b8Sjruoho * DESCRIPTION: Enter the named elements of the field (children of the parent) 218*28c506b8Sjruoho * into the namespace. 219*28c506b8Sjruoho * 220*28c506b8Sjruoho ******************************************************************************/ 221*28c506b8Sjruoho 222*28c506b8Sjruoho static ACPI_STATUS 223*28c506b8Sjruoho LdLoadFieldElements ( 224*28c506b8Sjruoho ACPI_PARSE_OBJECT *Op, 225*28c506b8Sjruoho ACPI_WALK_STATE *WalkState) 226*28c506b8Sjruoho { 227*28c506b8Sjruoho ACPI_PARSE_OBJECT *Child = NULL; 228*28c506b8Sjruoho ACPI_NAMESPACE_NODE *Node; 229*28c506b8Sjruoho ACPI_STATUS Status; 230*28c506b8Sjruoho 231*28c506b8Sjruoho 232*28c506b8Sjruoho /* Get the first named field element */ 233*28c506b8Sjruoho 234*28c506b8Sjruoho switch (Op->Asl.AmlOpcode) 235*28c506b8Sjruoho { 236*28c506b8Sjruoho case AML_BANK_FIELD_OP: 237*28c506b8Sjruoho 238*28c506b8Sjruoho Child = UtGetArg (Op, 6); 239*28c506b8Sjruoho break; 240*28c506b8Sjruoho 241*28c506b8Sjruoho case AML_INDEX_FIELD_OP: 242*28c506b8Sjruoho 243*28c506b8Sjruoho Child = UtGetArg (Op, 5); 244*28c506b8Sjruoho break; 245*28c506b8Sjruoho 246*28c506b8Sjruoho case AML_FIELD_OP: 247*28c506b8Sjruoho 248*28c506b8Sjruoho Child = UtGetArg (Op, 4); 249*28c506b8Sjruoho break; 250*28c506b8Sjruoho 251*28c506b8Sjruoho default: 252*28c506b8Sjruoho /* No other opcodes should arrive here */ 253*28c506b8Sjruoho return (AE_BAD_PARAMETER); 254*28c506b8Sjruoho } 255*28c506b8Sjruoho 256*28c506b8Sjruoho /* Enter all elements into the namespace */ 257*28c506b8Sjruoho 258*28c506b8Sjruoho while (Child) 259*28c506b8Sjruoho { 260*28c506b8Sjruoho switch (Child->Asl.AmlOpcode) 261*28c506b8Sjruoho { 262*28c506b8Sjruoho case AML_INT_RESERVEDFIELD_OP: 263*28c506b8Sjruoho case AML_INT_ACCESSFIELD_OP: 264*28c506b8Sjruoho 265*28c506b8Sjruoho break; 266*28c506b8Sjruoho 267*28c506b8Sjruoho default: 268*28c506b8Sjruoho 269*28c506b8Sjruoho Status = AcpiNsLookup (WalkState->ScopeInfo, 270*28c506b8Sjruoho Child->Asl.Value.String, 271*28c506b8Sjruoho ACPI_TYPE_LOCAL_REGION_FIELD, 272*28c506b8Sjruoho ACPI_IMODE_LOAD_PASS1, 273*28c506b8Sjruoho ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | 274*28c506b8Sjruoho ACPI_NS_ERROR_IF_FOUND, 275*28c506b8Sjruoho NULL, &Node); 276*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 277*28c506b8Sjruoho { 278*28c506b8Sjruoho if (Status != AE_ALREADY_EXISTS) 279*28c506b8Sjruoho { 280*28c506b8Sjruoho AslError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Child, 281*28c506b8Sjruoho Child->Asl.Value.String); 282*28c506b8Sjruoho return (Status); 283*28c506b8Sjruoho } 284*28c506b8Sjruoho 285*28c506b8Sjruoho /* 286*28c506b8Sjruoho * The name already exists in this scope 287*28c506b8Sjruoho * But continue processing the elements 288*28c506b8Sjruoho */ 289*28c506b8Sjruoho AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child, 290*28c506b8Sjruoho Child->Asl.Value.String); 291*28c506b8Sjruoho } 292*28c506b8Sjruoho else 293*28c506b8Sjruoho { 294*28c506b8Sjruoho Child->Asl.Node = Node; 295*28c506b8Sjruoho Node->Op = Child; 296*28c506b8Sjruoho } 297*28c506b8Sjruoho break; 298*28c506b8Sjruoho } 299*28c506b8Sjruoho Child = Child->Asl.Next; 300*28c506b8Sjruoho } 301*28c506b8Sjruoho return (AE_OK); 302*28c506b8Sjruoho } 303*28c506b8Sjruoho 304*28c506b8Sjruoho 305*28c506b8Sjruoho /******************************************************************************* 306*28c506b8Sjruoho * 307*28c506b8Sjruoho * FUNCTION: LdLoadResourceElements 308*28c506b8Sjruoho * 309*28c506b8Sjruoho * PARAMETERS: Op - Parent node (Resource Descriptor) 310*28c506b8Sjruoho * WalkState - Current walk state 311*28c506b8Sjruoho * 312*28c506b8Sjruoho * RETURN: Status 313*28c506b8Sjruoho * 314*28c506b8Sjruoho * DESCRIPTION: Enter the named elements of the resource descriptor (children 315*28c506b8Sjruoho * of the parent) into the namespace. 316*28c506b8Sjruoho * 317*28c506b8Sjruoho * NOTE: In the real AML namespace, these named elements never exist. But 318*28c506b8Sjruoho * we simply use the namespace here as a symbol table so we can look 319*28c506b8Sjruoho * them up as they are referenced. 320*28c506b8Sjruoho * 321*28c506b8Sjruoho ******************************************************************************/ 322*28c506b8Sjruoho 323*28c506b8Sjruoho static ACPI_STATUS 324*28c506b8Sjruoho LdLoadResourceElements ( 325*28c506b8Sjruoho ACPI_PARSE_OBJECT *Op, 326*28c506b8Sjruoho ACPI_WALK_STATE *WalkState) 327*28c506b8Sjruoho { 328*28c506b8Sjruoho ACPI_PARSE_OBJECT *InitializerOp = NULL; 329*28c506b8Sjruoho ACPI_NAMESPACE_NODE *Node; 330*28c506b8Sjruoho ACPI_STATUS Status; 331*28c506b8Sjruoho 332*28c506b8Sjruoho 333*28c506b8Sjruoho /* 334*28c506b8Sjruoho * Enter the resource name into the namespace. Name must not already exist. 335*28c506b8Sjruoho * This opens a scope, so later field names are guaranteed to be new/unique. 336*28c506b8Sjruoho */ 337*28c506b8Sjruoho Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Asl.Namepath, 338*28c506b8Sjruoho ACPI_TYPE_LOCAL_RESOURCE, ACPI_IMODE_LOAD_PASS1, 339*28c506b8Sjruoho ACPI_NS_NO_UPSEARCH | ACPI_NS_ERROR_IF_FOUND, 340*28c506b8Sjruoho WalkState, &Node); 341*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 342*28c506b8Sjruoho { 343*28c506b8Sjruoho if (Status == AE_ALREADY_EXISTS) 344*28c506b8Sjruoho { 345*28c506b8Sjruoho /* Actual node causing the error was saved in ParentMethod */ 346*28c506b8Sjruoho 347*28c506b8Sjruoho AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, 348*28c506b8Sjruoho (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod, Op->Asl.Namepath); 349*28c506b8Sjruoho return (AE_OK); 350*28c506b8Sjruoho } 351*28c506b8Sjruoho return (Status); 352*28c506b8Sjruoho } 353*28c506b8Sjruoho 354*28c506b8Sjruoho Node->Value = (UINT32) Op->Asl.Value.Integer; 355*28c506b8Sjruoho Node->Op = Op; 356*28c506b8Sjruoho Op->Asl.Node = Node; 357*28c506b8Sjruoho 358*28c506b8Sjruoho /* 359*28c506b8Sjruoho * Now enter the predefined fields, for easy lookup when referenced 360*28c506b8Sjruoho * by the source ASL 361*28c506b8Sjruoho */ 362*28c506b8Sjruoho InitializerOp = ASL_GET_CHILD_NODE (Op); 363*28c506b8Sjruoho while (InitializerOp) 364*28c506b8Sjruoho { 365*28c506b8Sjruoho 366*28c506b8Sjruoho if (InitializerOp->Asl.ExternalName) 367*28c506b8Sjruoho { 368*28c506b8Sjruoho Status = AcpiNsLookup (WalkState->ScopeInfo, 369*28c506b8Sjruoho InitializerOp->Asl.ExternalName, 370*28c506b8Sjruoho ACPI_TYPE_LOCAL_RESOURCE_FIELD, 371*28c506b8Sjruoho ACPI_IMODE_LOAD_PASS1, 372*28c506b8Sjruoho ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, 373*28c506b8Sjruoho NULL, &Node); 374*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 375*28c506b8Sjruoho { 376*28c506b8Sjruoho return (Status); 377*28c506b8Sjruoho } 378*28c506b8Sjruoho 379*28c506b8Sjruoho /* 380*28c506b8Sjruoho * Store the field offset in the namespace node so it 381*28c506b8Sjruoho * can be used when the field is referenced 382*28c506b8Sjruoho */ 383*28c506b8Sjruoho Node->Value = (UINT32) InitializerOp->Asl.Value.Integer; 384*28c506b8Sjruoho InitializerOp->Asl.Node = Node; 385*28c506b8Sjruoho Node->Op = InitializerOp; 386*28c506b8Sjruoho 387*28c506b8Sjruoho /* Pass thru the field type (Bitfield or Bytefield) */ 388*28c506b8Sjruoho 389*28c506b8Sjruoho if (InitializerOp->Asl.CompileFlags & NODE_IS_BIT_OFFSET) 390*28c506b8Sjruoho { 391*28c506b8Sjruoho Node->Flags |= ANOBJ_IS_BIT_OFFSET; 392*28c506b8Sjruoho } 393*28c506b8Sjruoho } 394*28c506b8Sjruoho InitializerOp = ASL_GET_PEER_NODE (InitializerOp); 395*28c506b8Sjruoho } 396*28c506b8Sjruoho 397*28c506b8Sjruoho return (AE_OK); 398*28c506b8Sjruoho } 399*28c506b8Sjruoho 400*28c506b8Sjruoho 401*28c506b8Sjruoho /******************************************************************************* 402*28c506b8Sjruoho * 403*28c506b8Sjruoho * FUNCTION: LdNamespace1Begin 404*28c506b8Sjruoho * 405*28c506b8Sjruoho * PARAMETERS: ASL_WALK_CALLBACK 406*28c506b8Sjruoho * 407*28c506b8Sjruoho * RETURN: Status 408*28c506b8Sjruoho * 409*28c506b8Sjruoho * DESCRIPTION: Descending callback used during the parse tree walk. If this 410*28c506b8Sjruoho * is a named AML opcode, enter into the namespace 411*28c506b8Sjruoho * 412*28c506b8Sjruoho ******************************************************************************/ 413*28c506b8Sjruoho 414*28c506b8Sjruoho static ACPI_STATUS 415*28c506b8Sjruoho LdNamespace1Begin ( 416*28c506b8Sjruoho ACPI_PARSE_OBJECT *Op, 417*28c506b8Sjruoho UINT32 Level, 418*28c506b8Sjruoho void *Context) 419*28c506b8Sjruoho { 420*28c506b8Sjruoho ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 421*28c506b8Sjruoho ACPI_NAMESPACE_NODE *Node; 422*28c506b8Sjruoho ACPI_STATUS Status; 423*28c506b8Sjruoho ACPI_OBJECT_TYPE ObjectType; 424*28c506b8Sjruoho ACPI_OBJECT_TYPE ActualObjectType = ACPI_TYPE_ANY; 425*28c506b8Sjruoho char *Path; 426*28c506b8Sjruoho UINT32 Flags = ACPI_NS_NO_UPSEARCH; 427*28c506b8Sjruoho ACPI_PARSE_OBJECT *Arg; 428*28c506b8Sjruoho UINT32 i; 429*28c506b8Sjruoho BOOLEAN ForceNewScope = FALSE; 430*28c506b8Sjruoho 431*28c506b8Sjruoho 432*28c506b8Sjruoho ACPI_FUNCTION_NAME (LdNamespace1Begin); 433*28c506b8Sjruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 434*28c506b8Sjruoho Op, Op->Asl.ParseOpName)); 435*28c506b8Sjruoho 436*28c506b8Sjruoho 437*28c506b8Sjruoho /* 438*28c506b8Sjruoho * We are only interested in opcodes that have an associated name 439*28c506b8Sjruoho * (or multiple names) 440*28c506b8Sjruoho */ 441*28c506b8Sjruoho switch (Op->Asl.AmlOpcode) 442*28c506b8Sjruoho { 443*28c506b8Sjruoho case AML_BANK_FIELD_OP: 444*28c506b8Sjruoho case AML_INDEX_FIELD_OP: 445*28c506b8Sjruoho case AML_FIELD_OP: 446*28c506b8Sjruoho 447*28c506b8Sjruoho Status = LdLoadFieldElements (Op, WalkState); 448*28c506b8Sjruoho return (Status); 449*28c506b8Sjruoho 450*28c506b8Sjruoho default: 451*28c506b8Sjruoho 452*28c506b8Sjruoho /* All other opcodes go below */ 453*28c506b8Sjruoho break; 454*28c506b8Sjruoho } 455*28c506b8Sjruoho 456*28c506b8Sjruoho /* Check if this object has already been installed in the namespace */ 457*28c506b8Sjruoho 458*28c506b8Sjruoho if (Op->Asl.Node) 459*28c506b8Sjruoho { 460*28c506b8Sjruoho return (AE_OK); 461*28c506b8Sjruoho } 462*28c506b8Sjruoho 463*28c506b8Sjruoho Path = Op->Asl.Namepath; 464*28c506b8Sjruoho if (!Path) 465*28c506b8Sjruoho { 466*28c506b8Sjruoho return (AE_OK); 467*28c506b8Sjruoho } 468*28c506b8Sjruoho 469*28c506b8Sjruoho /* Map the raw opcode into an internal object type */ 470*28c506b8Sjruoho 471*28c506b8Sjruoho switch (Op->Asl.ParseOpcode) 472*28c506b8Sjruoho { 473*28c506b8Sjruoho case PARSEOP_NAME: 474*28c506b8Sjruoho 475*28c506b8Sjruoho Arg = Op->Asl.Child; /* Get the NameSeg/NameString node */ 476*28c506b8Sjruoho Arg = Arg->Asl.Next; /* First peer is the object to be associated with the name */ 477*28c506b8Sjruoho 478*28c506b8Sjruoho /* 479*28c506b8Sjruoho * If this name refers to a ResourceTemplate, we will need to open 480*28c506b8Sjruoho * a new scope so that the resource subfield names can be entered into 481*28c506b8Sjruoho * the namespace underneath this name 482*28c506b8Sjruoho */ 483*28c506b8Sjruoho if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 484*28c506b8Sjruoho { 485*28c506b8Sjruoho ForceNewScope = TRUE; 486*28c506b8Sjruoho } 487*28c506b8Sjruoho 488*28c506b8Sjruoho /* Get the data type associated with the named object, not the name itself */ 489*28c506b8Sjruoho 490*28c506b8Sjruoho /* Log2 loop to convert from Btype (binary) to Etype (encoded) */ 491*28c506b8Sjruoho 492*28c506b8Sjruoho ObjectType = 1; 493*28c506b8Sjruoho for (i = 1; i < Arg->Asl.AcpiBtype; i *= 2) 494*28c506b8Sjruoho { 495*28c506b8Sjruoho ObjectType++; 496*28c506b8Sjruoho } 497*28c506b8Sjruoho break; 498*28c506b8Sjruoho 499*28c506b8Sjruoho 500*28c506b8Sjruoho case PARSEOP_EXTERNAL: 501*28c506b8Sjruoho 502*28c506b8Sjruoho /* 503*28c506b8Sjruoho * "External" simply enters a name and type into the namespace. 504*28c506b8Sjruoho * We must be careful to not open a new scope, however, no matter 505*28c506b8Sjruoho * what type the external name refers to (e.g., a method) 506*28c506b8Sjruoho * 507*28c506b8Sjruoho * first child is name, next child is ObjectType 508*28c506b8Sjruoho */ 509*28c506b8Sjruoho ActualObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer; 510*28c506b8Sjruoho ObjectType = ACPI_TYPE_ANY; 511*28c506b8Sjruoho 512*28c506b8Sjruoho /* 513*28c506b8Sjruoho * We will mark every new node along the path as "External". This 514*28c506b8Sjruoho * allows some or all of the nodes to be created later in the ASL 515*28c506b8Sjruoho * code. Handles cases like this: 516*28c506b8Sjruoho * 517*28c506b8Sjruoho * External (\_SB_.PCI0.ABCD, IntObj) 518*28c506b8Sjruoho * Scope (_SB_) 519*28c506b8Sjruoho * { 520*28c506b8Sjruoho * Device (PCI0) 521*28c506b8Sjruoho * { 522*28c506b8Sjruoho * } 523*28c506b8Sjruoho * } 524*28c506b8Sjruoho * Method (X) 525*28c506b8Sjruoho * { 526*28c506b8Sjruoho * Store (\_SB_.PCI0.ABCD, Local0) 527*28c506b8Sjruoho * } 528*28c506b8Sjruoho */ 529*28c506b8Sjruoho Flags |= ACPI_NS_EXTERNAL; 530*28c506b8Sjruoho break; 531*28c506b8Sjruoho 532*28c506b8Sjruoho case PARSEOP_DEFAULT_ARG: 533*28c506b8Sjruoho 534*28c506b8Sjruoho if (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC) 535*28c506b8Sjruoho { 536*28c506b8Sjruoho Status = LdLoadResourceElements (Op, WalkState); 537*28c506b8Sjruoho return_ACPI_STATUS (Status); 538*28c506b8Sjruoho } 539*28c506b8Sjruoho 540*28c506b8Sjruoho ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 541*28c506b8Sjruoho break; 542*28c506b8Sjruoho 543*28c506b8Sjruoho 544*28c506b8Sjruoho case PARSEOP_SCOPE: 545*28c506b8Sjruoho 546*28c506b8Sjruoho /* 547*28c506b8Sjruoho * The name referenced by Scope(Name) must already exist at this point. 548*28c506b8Sjruoho * In other words, forward references for Scope() are not supported. 549*28c506b8Sjruoho * The only real reason for this is that the MS interpreter cannot 550*28c506b8Sjruoho * handle this case. Perhaps someday this case can go away. 551*28c506b8Sjruoho */ 552*28c506b8Sjruoho Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 553*28c506b8Sjruoho ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, 554*28c506b8Sjruoho WalkState, &(Node)); 555*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 556*28c506b8Sjruoho { 557*28c506b8Sjruoho if (Status == AE_NOT_FOUND) 558*28c506b8Sjruoho { 559*28c506b8Sjruoho /* The name was not found, go ahead and create it */ 560*28c506b8Sjruoho 561*28c506b8Sjruoho Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 562*28c506b8Sjruoho ACPI_TYPE_LOCAL_SCOPE, 563*28c506b8Sjruoho ACPI_IMODE_LOAD_PASS1, Flags, 564*28c506b8Sjruoho WalkState, &(Node)); 565*28c506b8Sjruoho 566*28c506b8Sjruoho /* 567*28c506b8Sjruoho * However, this is an error -- primarily because the MS 568*28c506b8Sjruoho * interpreter can't handle a forward reference from the 569*28c506b8Sjruoho * Scope() operator. 570*28c506b8Sjruoho */ 571*28c506b8Sjruoho AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 572*28c506b8Sjruoho Op->Asl.ExternalName); 573*28c506b8Sjruoho AslError (ASL_ERROR, ASL_MSG_SCOPE_FWD_REF, Op, 574*28c506b8Sjruoho Op->Asl.ExternalName); 575*28c506b8Sjruoho goto FinishNode; 576*28c506b8Sjruoho } 577*28c506b8Sjruoho 578*28c506b8Sjruoho AslCoreSubsystemError (Op, Status, 579*28c506b8Sjruoho "Failure from namespace lookup", FALSE); 580*28c506b8Sjruoho 581*28c506b8Sjruoho return_ACPI_STATUS (Status); 582*28c506b8Sjruoho } 583*28c506b8Sjruoho 584*28c506b8Sjruoho /* We found a node with this name, now check the type */ 585*28c506b8Sjruoho 586*28c506b8Sjruoho switch (Node->Type) 587*28c506b8Sjruoho { 588*28c506b8Sjruoho case ACPI_TYPE_LOCAL_SCOPE: 589*28c506b8Sjruoho case ACPI_TYPE_DEVICE: 590*28c506b8Sjruoho case ACPI_TYPE_POWER: 591*28c506b8Sjruoho case ACPI_TYPE_PROCESSOR: 592*28c506b8Sjruoho case ACPI_TYPE_THERMAL: 593*28c506b8Sjruoho 594*28c506b8Sjruoho /* These are acceptable types - they all open a new scope */ 595*28c506b8Sjruoho break; 596*28c506b8Sjruoho 597*28c506b8Sjruoho case ACPI_TYPE_INTEGER: 598*28c506b8Sjruoho case ACPI_TYPE_STRING: 599*28c506b8Sjruoho case ACPI_TYPE_BUFFER: 600*28c506b8Sjruoho 601*28c506b8Sjruoho /* 602*28c506b8Sjruoho * These types we will allow, but we will change the type. 603*28c506b8Sjruoho * This enables some existing code of the form: 604*28c506b8Sjruoho * 605*28c506b8Sjruoho * Name (DEB, 0) 606*28c506b8Sjruoho * Scope (DEB) { ... } 607*28c506b8Sjruoho * 608*28c506b8Sjruoho * Which is used to workaround the fact that the MS interpreter 609*28c506b8Sjruoho * does not allow Scope() forward references. 610*28c506b8Sjruoho */ 611*28c506b8Sjruoho sprintf (MsgBuffer, "%s [%s], changing type to [Scope]", 612*28c506b8Sjruoho Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type)); 613*28c506b8Sjruoho AslError (ASL_REMARK, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer); 614*28c506b8Sjruoho 615*28c506b8Sjruoho /* Switch the type to scope, open the new scope */ 616*28c506b8Sjruoho 617*28c506b8Sjruoho Node->Type = ACPI_TYPE_LOCAL_SCOPE; 618*28c506b8Sjruoho Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 619*28c506b8Sjruoho WalkState); 620*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 621*28c506b8Sjruoho { 622*28c506b8Sjruoho return_ACPI_STATUS (Status); 623*28c506b8Sjruoho } 624*28c506b8Sjruoho break; 625*28c506b8Sjruoho 626*28c506b8Sjruoho default: 627*28c506b8Sjruoho 628*28c506b8Sjruoho /* All other types are an error */ 629*28c506b8Sjruoho 630*28c506b8Sjruoho sprintf (MsgBuffer, "%s [%s]", Op->Asl.ExternalName, 631*28c506b8Sjruoho AcpiUtGetTypeName (Node->Type)); 632*28c506b8Sjruoho AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer); 633*28c506b8Sjruoho 634*28c506b8Sjruoho /* 635*28c506b8Sjruoho * However, switch the type to be an actual scope so 636*28c506b8Sjruoho * that compilation can continue without generating a whole 637*28c506b8Sjruoho * cascade of additional errors. Open the new scope. 638*28c506b8Sjruoho */ 639*28c506b8Sjruoho Node->Type = ACPI_TYPE_LOCAL_SCOPE; 640*28c506b8Sjruoho Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 641*28c506b8Sjruoho WalkState); 642*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 643*28c506b8Sjruoho { 644*28c506b8Sjruoho return_ACPI_STATUS (Status); 645*28c506b8Sjruoho } 646*28c506b8Sjruoho break; 647*28c506b8Sjruoho } 648*28c506b8Sjruoho 649*28c506b8Sjruoho Status = AE_OK; 650*28c506b8Sjruoho goto FinishNode; 651*28c506b8Sjruoho 652*28c506b8Sjruoho 653*28c506b8Sjruoho default: 654*28c506b8Sjruoho 655*28c506b8Sjruoho ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 656*28c506b8Sjruoho break; 657*28c506b8Sjruoho } 658*28c506b8Sjruoho 659*28c506b8Sjruoho 660*28c506b8Sjruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n", 661*28c506b8Sjruoho Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType))); 662*28c506b8Sjruoho 663*28c506b8Sjruoho /* The name must not already exist */ 664*28c506b8Sjruoho 665*28c506b8Sjruoho Flags |= ACPI_NS_ERROR_IF_FOUND; 666*28c506b8Sjruoho 667*28c506b8Sjruoho /* 668*28c506b8Sjruoho * Enter the named type into the internal namespace. We enter the name 669*28c506b8Sjruoho * as we go downward in the parse tree. Any necessary subobjects that 670*28c506b8Sjruoho * involve arguments to the opcode must be created as we go back up the 671*28c506b8Sjruoho * parse tree later. 672*28c506b8Sjruoho */ 673*28c506b8Sjruoho Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 674*28c506b8Sjruoho ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node); 675*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 676*28c506b8Sjruoho { 677*28c506b8Sjruoho if (Status == AE_ALREADY_EXISTS) 678*28c506b8Sjruoho { 679*28c506b8Sjruoho /* The name already exists in this scope */ 680*28c506b8Sjruoho 681*28c506b8Sjruoho if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) 682*28c506b8Sjruoho { 683*28c506b8Sjruoho /* Allow multiple references to the same scope */ 684*28c506b8Sjruoho 685*28c506b8Sjruoho Node->Type = (UINT8) ObjectType; 686*28c506b8Sjruoho Status = AE_OK; 687*28c506b8Sjruoho } 688*28c506b8Sjruoho else if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 689*28c506b8Sjruoho (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL)) 690*28c506b8Sjruoho { 691*28c506b8Sjruoho /* 692*28c506b8Sjruoho * Allow one create on an object or segment that was 693*28c506b8Sjruoho * previously declared External 694*28c506b8Sjruoho */ 695*28c506b8Sjruoho Node->Flags &= ~ANOBJ_IS_EXTERNAL; 696*28c506b8Sjruoho Node->Type = (UINT8) ObjectType; 697*28c506b8Sjruoho 698*28c506b8Sjruoho /* Just retyped a node, probably will need to open a scope */ 699*28c506b8Sjruoho 700*28c506b8Sjruoho if (AcpiNsOpensScope (ObjectType)) 701*28c506b8Sjruoho { 702*28c506b8Sjruoho Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 703*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 704*28c506b8Sjruoho { 705*28c506b8Sjruoho return_ACPI_STATUS (Status); 706*28c506b8Sjruoho } 707*28c506b8Sjruoho } 708*28c506b8Sjruoho Status = AE_OK; 709*28c506b8Sjruoho } 710*28c506b8Sjruoho else 711*28c506b8Sjruoho { 712*28c506b8Sjruoho /* Valid error, object already exists */ 713*28c506b8Sjruoho 714*28c506b8Sjruoho AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, 715*28c506b8Sjruoho Op->Asl.ExternalName); 716*28c506b8Sjruoho return_ACPI_STATUS (AE_OK); 717*28c506b8Sjruoho } 718*28c506b8Sjruoho } 719*28c506b8Sjruoho else 720*28c506b8Sjruoho { 721*28c506b8Sjruoho AslCoreSubsystemError (Op, Status, 722*28c506b8Sjruoho "Failure from namespace lookup", FALSE); 723*28c506b8Sjruoho return_ACPI_STATUS (Status); 724*28c506b8Sjruoho } 725*28c506b8Sjruoho } 726*28c506b8Sjruoho 727*28c506b8Sjruoho if (ForceNewScope) 728*28c506b8Sjruoho { 729*28c506b8Sjruoho Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 730*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 731*28c506b8Sjruoho { 732*28c506b8Sjruoho return_ACPI_STATUS (Status); 733*28c506b8Sjruoho } 734*28c506b8Sjruoho } 735*28c506b8Sjruoho 736*28c506b8Sjruoho FinishNode: 737*28c506b8Sjruoho /* 738*28c506b8Sjruoho * Point the parse node to the new namespace node, and point 739*28c506b8Sjruoho * the Node back to the original Parse node 740*28c506b8Sjruoho */ 741*28c506b8Sjruoho Op->Asl.Node = Node; 742*28c506b8Sjruoho Node->Op = Op; 743*28c506b8Sjruoho 744*28c506b8Sjruoho /* Set the actual data type if appropriate (EXTERNAL term only) */ 745*28c506b8Sjruoho 746*28c506b8Sjruoho if (ActualObjectType != ACPI_TYPE_ANY) 747*28c506b8Sjruoho { 748*28c506b8Sjruoho Node->Type = (UINT8) ActualObjectType; 749*28c506b8Sjruoho Node->Value = ASL_EXTERNAL_METHOD; 750*28c506b8Sjruoho } 751*28c506b8Sjruoho 752*28c506b8Sjruoho if (Op->Asl.ParseOpcode == PARSEOP_METHOD) 753*28c506b8Sjruoho { 754*28c506b8Sjruoho /* 755*28c506b8Sjruoho * Get the method argument count from "Extra" and save 756*28c506b8Sjruoho * it in the namespace node 757*28c506b8Sjruoho */ 758*28c506b8Sjruoho Node->Value = (UINT32) Op->Asl.Extra; 759*28c506b8Sjruoho } 760*28c506b8Sjruoho 761*28c506b8Sjruoho return_ACPI_STATUS (Status); 762*28c506b8Sjruoho } 763*28c506b8Sjruoho 764*28c506b8Sjruoho 765*28c506b8Sjruoho /******************************************************************************* 766*28c506b8Sjruoho * 767*28c506b8Sjruoho * FUNCTION: LdNamespace2Begin 768*28c506b8Sjruoho * 769*28c506b8Sjruoho * PARAMETERS: ASL_WALK_CALLBACK 770*28c506b8Sjruoho * 771*28c506b8Sjruoho * RETURN: Status 772*28c506b8Sjruoho * 773*28c506b8Sjruoho * DESCRIPTION: Descending callback used during the pass 2 parse tree walk. 774*28c506b8Sjruoho * Second pass resolves some forward references. 775*28c506b8Sjruoho * 776*28c506b8Sjruoho * Notes: 777*28c506b8Sjruoho * Currently only needs to handle the Alias operator. 778*28c506b8Sjruoho * Could be used to allow forward references from the Scope() operator, but 779*28c506b8Sjruoho * the MS interpreter does not allow this, so this compiler does not either. 780*28c506b8Sjruoho * 781*28c506b8Sjruoho ******************************************************************************/ 782*28c506b8Sjruoho 783*28c506b8Sjruoho static ACPI_STATUS 784*28c506b8Sjruoho LdNamespace2Begin ( 785*28c506b8Sjruoho ACPI_PARSE_OBJECT *Op, 786*28c506b8Sjruoho UINT32 Level, 787*28c506b8Sjruoho void *Context) 788*28c506b8Sjruoho { 789*28c506b8Sjruoho ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 790*28c506b8Sjruoho ACPI_STATUS Status; 791*28c506b8Sjruoho ACPI_NAMESPACE_NODE *Node; 792*28c506b8Sjruoho ACPI_OBJECT_TYPE ObjectType; 793*28c506b8Sjruoho BOOLEAN ForceNewScope = FALSE; 794*28c506b8Sjruoho ACPI_PARSE_OBJECT *Arg; 795*28c506b8Sjruoho char *Path; 796*28c506b8Sjruoho ACPI_NAMESPACE_NODE *TargetNode; 797*28c506b8Sjruoho 798*28c506b8Sjruoho 799*28c506b8Sjruoho ACPI_FUNCTION_NAME (LdNamespace2Begin); 800*28c506b8Sjruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 801*28c506b8Sjruoho Op, Op->Asl.ParseOpName)); 802*28c506b8Sjruoho 803*28c506b8Sjruoho 804*28c506b8Sjruoho /* Ignore Ops with no namespace node */ 805*28c506b8Sjruoho 806*28c506b8Sjruoho Node = Op->Asl.Node; 807*28c506b8Sjruoho if (!Node) 808*28c506b8Sjruoho { 809*28c506b8Sjruoho return (AE_OK); 810*28c506b8Sjruoho } 811*28c506b8Sjruoho 812*28c506b8Sjruoho /* Get the type to determine if we should push the scope */ 813*28c506b8Sjruoho 814*28c506b8Sjruoho if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 815*28c506b8Sjruoho (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC)) 816*28c506b8Sjruoho { 817*28c506b8Sjruoho ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 818*28c506b8Sjruoho } 819*28c506b8Sjruoho else 820*28c506b8Sjruoho { 821*28c506b8Sjruoho ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 822*28c506b8Sjruoho } 823*28c506b8Sjruoho 824*28c506b8Sjruoho /* Push scope for Resource Templates */ 825*28c506b8Sjruoho 826*28c506b8Sjruoho if (Op->Asl.ParseOpcode == PARSEOP_NAME) 827*28c506b8Sjruoho { 828*28c506b8Sjruoho if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 829*28c506b8Sjruoho { 830*28c506b8Sjruoho ForceNewScope = TRUE; 831*28c506b8Sjruoho } 832*28c506b8Sjruoho } 833*28c506b8Sjruoho 834*28c506b8Sjruoho /* Push the scope stack */ 835*28c506b8Sjruoho 836*28c506b8Sjruoho if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 837*28c506b8Sjruoho { 838*28c506b8Sjruoho Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 839*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 840*28c506b8Sjruoho { 841*28c506b8Sjruoho return_ACPI_STATUS (Status); 842*28c506b8Sjruoho } 843*28c506b8Sjruoho } 844*28c506b8Sjruoho 845*28c506b8Sjruoho if (Op->Asl.ParseOpcode == PARSEOP_ALIAS) 846*28c506b8Sjruoho { 847*28c506b8Sjruoho /* Complete the alias node by getting and saving the target node */ 848*28c506b8Sjruoho 849*28c506b8Sjruoho /* First child is the alias target */ 850*28c506b8Sjruoho 851*28c506b8Sjruoho Arg = Op->Asl.Child; 852*28c506b8Sjruoho 853*28c506b8Sjruoho /* Get the target pathname */ 854*28c506b8Sjruoho 855*28c506b8Sjruoho Path = Arg->Asl.Namepath; 856*28c506b8Sjruoho if (!Path) 857*28c506b8Sjruoho { 858*28c506b8Sjruoho Status = UtInternalizeName (Arg->Asl.ExternalName, &Path); 859*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 860*28c506b8Sjruoho { 861*28c506b8Sjruoho return (Status); 862*28c506b8Sjruoho } 863*28c506b8Sjruoho } 864*28c506b8Sjruoho 865*28c506b8Sjruoho /* Get the NS node associated with the target. It must exist. */ 866*28c506b8Sjruoho 867*28c506b8Sjruoho Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 868*28c506b8Sjruoho ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 869*28c506b8Sjruoho WalkState, &TargetNode); 870*28c506b8Sjruoho if (ACPI_FAILURE (Status)) 871*28c506b8Sjruoho { 872*28c506b8Sjruoho if (Status == AE_NOT_FOUND) 873*28c506b8Sjruoho { 874*28c506b8Sjruoho AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 875*28c506b8Sjruoho Op->Asl.ExternalName); 876*28c506b8Sjruoho 877*28c506b8Sjruoho /* 878*28c506b8Sjruoho * The name was not found, go ahead and create it. 879*28c506b8Sjruoho * This prevents more errors later. 880*28c506b8Sjruoho */ 881*28c506b8Sjruoho Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 882*28c506b8Sjruoho ACPI_TYPE_ANY, 883*28c506b8Sjruoho ACPI_IMODE_LOAD_PASS1, ACPI_NS_NO_UPSEARCH, 884*28c506b8Sjruoho WalkState, &(Node)); 885*28c506b8Sjruoho return (AE_OK); 886*28c506b8Sjruoho } 887*28c506b8Sjruoho 888*28c506b8Sjruoho AslCoreSubsystemError (Op, Status, 889*28c506b8Sjruoho "Failure from namespace lookup", FALSE); 890*28c506b8Sjruoho return (AE_OK); 891*28c506b8Sjruoho } 892*28c506b8Sjruoho 893*28c506b8Sjruoho /* Save the target node within the alias node */ 894*28c506b8Sjruoho 895*28c506b8Sjruoho Node->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode); 896*28c506b8Sjruoho } 897*28c506b8Sjruoho 898*28c506b8Sjruoho return (AE_OK); 899*28c506b8Sjruoho } 900*28c506b8Sjruoho 901*28c506b8Sjruoho 902*28c506b8Sjruoho /******************************************************************************* 903*28c506b8Sjruoho * 904*28c506b8Sjruoho * FUNCTION: LdCommonNamespaceEnd 905*28c506b8Sjruoho * 906*28c506b8Sjruoho * PARAMETERS: ASL_WALK_CALLBACK 907*28c506b8Sjruoho * 908*28c506b8Sjruoho * RETURN: Status 909*28c506b8Sjruoho * 910*28c506b8Sjruoho * DESCRIPTION: Ascending callback used during the loading of the namespace, 911*28c506b8Sjruoho * We only need to worry about managing the scope stack here. 912*28c506b8Sjruoho * 913*28c506b8Sjruoho ******************************************************************************/ 914*28c506b8Sjruoho 915*28c506b8Sjruoho static ACPI_STATUS 916*28c506b8Sjruoho LdCommonNamespaceEnd ( 917*28c506b8Sjruoho ACPI_PARSE_OBJECT *Op, 918*28c506b8Sjruoho UINT32 Level, 919*28c506b8Sjruoho void *Context) 920*28c506b8Sjruoho { 921*28c506b8Sjruoho ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 922*28c506b8Sjruoho ACPI_OBJECT_TYPE ObjectType; 923*28c506b8Sjruoho BOOLEAN ForceNewScope = FALSE; 924*28c506b8Sjruoho 925*28c506b8Sjruoho 926*28c506b8Sjruoho ACPI_FUNCTION_NAME (LdCommonNamespaceEnd); 927*28c506b8Sjruoho 928*28c506b8Sjruoho 929*28c506b8Sjruoho /* We are only interested in opcodes that have an associated name */ 930*28c506b8Sjruoho 931*28c506b8Sjruoho if (!Op->Asl.Namepath) 932*28c506b8Sjruoho { 933*28c506b8Sjruoho return (AE_OK); 934*28c506b8Sjruoho } 935*28c506b8Sjruoho 936*28c506b8Sjruoho /* Get the type to determine if we should pop the scope */ 937*28c506b8Sjruoho 938*28c506b8Sjruoho if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 939*28c506b8Sjruoho (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC)) 940*28c506b8Sjruoho { 941*28c506b8Sjruoho /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */ 942*28c506b8Sjruoho 943*28c506b8Sjruoho ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 944*28c506b8Sjruoho } 945*28c506b8Sjruoho else 946*28c506b8Sjruoho { 947*28c506b8Sjruoho ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 948*28c506b8Sjruoho } 949*28c506b8Sjruoho 950*28c506b8Sjruoho /* Pop scope that was pushed for Resource Templates */ 951*28c506b8Sjruoho 952*28c506b8Sjruoho if (Op->Asl.ParseOpcode == PARSEOP_NAME) 953*28c506b8Sjruoho { 954*28c506b8Sjruoho if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 955*28c506b8Sjruoho { 956*28c506b8Sjruoho ForceNewScope = TRUE; 957*28c506b8Sjruoho } 958*28c506b8Sjruoho } 959*28c506b8Sjruoho 960*28c506b8Sjruoho /* Pop the scope stack */ 961*28c506b8Sjruoho 962*28c506b8Sjruoho if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 963*28c506b8Sjruoho { 964*28c506b8Sjruoho ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 965*28c506b8Sjruoho "(%s): Popping scope for Op [%s] %p\n", 966*28c506b8Sjruoho AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op)); 967*28c506b8Sjruoho 968*28c506b8Sjruoho (void) AcpiDsScopeStackPop (WalkState); 969*28c506b8Sjruoho } 970*28c506b8Sjruoho 971*28c506b8Sjruoho return (AE_OK); 972*28c506b8Sjruoho } 973*28c506b8Sjruoho 974*28c506b8Sjruoho 975