10d02842fSSascha Wildner /****************************************************************************** 20d02842fSSascha Wildner * 30d02842fSSascha Wildner * Module Name: dswload - Dispatcher namespace load callbacks 40d02842fSSascha Wildner * 50d02842fSSascha Wildner *****************************************************************************/ 60d02842fSSascha Wildner 70d02842fSSascha Wildner /* 820294b7eSSascha Wildner * Copyright (C) 2000 - 2014, Intel Corp. 90d02842fSSascha Wildner * All rights reserved. 100d02842fSSascha Wildner * 110d02842fSSascha Wildner * Redistribution and use in source and binary forms, with or without 120d02842fSSascha Wildner * modification, are permitted provided that the following conditions 130d02842fSSascha Wildner * are met: 140d02842fSSascha Wildner * 1. Redistributions of source code must retain the above copyright 150d02842fSSascha Wildner * notice, this list of conditions, and the following disclaimer, 160d02842fSSascha Wildner * without modification. 170d02842fSSascha Wildner * 2. Redistributions in binary form must reproduce at minimum a disclaimer 180d02842fSSascha Wildner * substantially similar to the "NO WARRANTY" disclaimer below 190d02842fSSascha Wildner * ("Disclaimer") and any redistribution must be conditioned upon 200d02842fSSascha Wildner * including a substantially similar Disclaimer requirement for further 210d02842fSSascha Wildner * binary redistribution. 220d02842fSSascha Wildner * 3. Neither the names of the above-listed copyright holders nor the names 230d02842fSSascha Wildner * of any contributors may be used to endorse or promote products derived 240d02842fSSascha Wildner * from this software without specific prior written permission. 250d02842fSSascha Wildner * 260d02842fSSascha Wildner * Alternatively, this software may be distributed under the terms of the 270d02842fSSascha Wildner * GNU General Public License ("GPL") version 2 as published by the Free 280d02842fSSascha Wildner * Software Foundation. 290d02842fSSascha Wildner * 300d02842fSSascha Wildner * NO WARRANTY 310d02842fSSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 320d02842fSSascha Wildner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 330d02842fSSascha Wildner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 340d02842fSSascha Wildner * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 350d02842fSSascha Wildner * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 360d02842fSSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 370d02842fSSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 380d02842fSSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 390d02842fSSascha Wildner * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 400d02842fSSascha Wildner * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 410d02842fSSascha Wildner * POSSIBILITY OF SUCH DAMAGES. 420d02842fSSascha Wildner */ 430d02842fSSascha Wildner 440d02842fSSascha Wildner #include "aslcompiler.h" 450d02842fSSascha Wildner #include "amlcode.h" 460d02842fSSascha Wildner #include "acdispat.h" 470d02842fSSascha Wildner #include "acnamesp.h" 480d02842fSSascha Wildner 490d02842fSSascha Wildner #include "aslcompiler.y.h" 500d02842fSSascha Wildner 510d02842fSSascha Wildner #define _COMPONENT ACPI_COMPILER 520d02842fSSascha Wildner ACPI_MODULE_NAME ("aslload") 530d02842fSSascha Wildner 540d02842fSSascha Wildner /* Local prototypes */ 550d02842fSSascha Wildner 560d02842fSSascha Wildner static ACPI_STATUS 570d02842fSSascha Wildner LdLoadFieldElements ( 580d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 590d02842fSSascha Wildner ACPI_WALK_STATE *WalkState); 600d02842fSSascha Wildner 610d02842fSSascha Wildner static ACPI_STATUS 620d02842fSSascha Wildner LdLoadResourceElements ( 630d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 640d02842fSSascha Wildner ACPI_WALK_STATE *WalkState); 650d02842fSSascha Wildner 660d02842fSSascha Wildner static ACPI_STATUS 670d02842fSSascha Wildner LdNamespace1Begin ( 680d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 690d02842fSSascha Wildner UINT32 Level, 700d02842fSSascha Wildner void *Context); 710d02842fSSascha Wildner 720d02842fSSascha Wildner static ACPI_STATUS 730d02842fSSascha Wildner LdNamespace2Begin ( 740d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 750d02842fSSascha Wildner UINT32 Level, 760d02842fSSascha Wildner void *Context); 770d02842fSSascha Wildner 780d02842fSSascha Wildner static ACPI_STATUS 790d02842fSSascha Wildner LdCommonNamespaceEnd ( 800d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 810d02842fSSascha Wildner UINT32 Level, 820d02842fSSascha Wildner void *Context); 830d02842fSSascha Wildner 840d02842fSSascha Wildner 850d02842fSSascha Wildner /******************************************************************************* 860d02842fSSascha Wildner * 870d02842fSSascha Wildner * FUNCTION: LdLoadNamespace 880d02842fSSascha Wildner * 890d02842fSSascha Wildner * PARAMETERS: RootOp - Root of the parse tree 900d02842fSSascha Wildner * 910d02842fSSascha Wildner * RETURN: Status 920d02842fSSascha Wildner * 930d02842fSSascha Wildner * DESCRIPTION: Perform a walk of the parse tree that in turn loads all of the 940d02842fSSascha Wildner * named ASL/AML objects into the namespace. The namespace is 950d02842fSSascha Wildner * constructed in order to resolve named references and references 960d02842fSSascha Wildner * to named fields within resource templates/descriptors. 970d02842fSSascha Wildner * 980d02842fSSascha Wildner ******************************************************************************/ 990d02842fSSascha Wildner 1000d02842fSSascha Wildner ACPI_STATUS 1010d02842fSSascha Wildner LdLoadNamespace ( 1020d02842fSSascha Wildner ACPI_PARSE_OBJECT *RootOp) 1030d02842fSSascha Wildner { 1040d02842fSSascha Wildner ACPI_WALK_STATE *WalkState; 1050d02842fSSascha Wildner 1060d02842fSSascha Wildner 1070d02842fSSascha Wildner DbgPrint (ASL_DEBUG_OUTPUT, "\nCreating namespace\n\n"); 1080d02842fSSascha Wildner 1090d02842fSSascha Wildner /* Create a new walk state */ 1100d02842fSSascha Wildner 1110d02842fSSascha Wildner WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); 1120d02842fSSascha Wildner if (!WalkState) 1130d02842fSSascha Wildner { 1140d02842fSSascha Wildner return (AE_NO_MEMORY); 1150d02842fSSascha Wildner } 1160d02842fSSascha Wildner 1170d02842fSSascha Wildner /* Walk the entire parse tree, first pass */ 1180d02842fSSascha Wildner 1190d02842fSSascha Wildner TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace1Begin, 1200d02842fSSascha Wildner LdCommonNamespaceEnd, WalkState); 1210d02842fSSascha Wildner 1220d02842fSSascha Wildner /* Second pass to handle forward references */ 1230d02842fSSascha Wildner 1240d02842fSSascha Wildner TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace2Begin, 1250d02842fSSascha Wildner LdCommonNamespaceEnd, WalkState); 1260d02842fSSascha Wildner 1270d02842fSSascha Wildner /* Dump the namespace if debug is enabled */ 1280d02842fSSascha Wildner 1290d02842fSSascha Wildner AcpiNsDumpTables (ACPI_NS_ALL, ACPI_UINT32_MAX); 13079eafdd7SSascha Wildner ACPI_FREE (WalkState); 1310d02842fSSascha Wildner return (AE_OK); 1320d02842fSSascha Wildner } 1330d02842fSSascha Wildner 1340d02842fSSascha Wildner 1350d02842fSSascha Wildner /******************************************************************************* 1360d02842fSSascha Wildner * 1370d02842fSSascha Wildner * FUNCTION: LdLoadFieldElements 1380d02842fSSascha Wildner * 1390d02842fSSascha Wildner * PARAMETERS: Op - Parent node (Field) 1400d02842fSSascha Wildner * WalkState - Current walk state 1410d02842fSSascha Wildner * 1420d02842fSSascha Wildner * RETURN: Status 1430d02842fSSascha Wildner * 1440d02842fSSascha Wildner * DESCRIPTION: Enter the named elements of the field (children of the parent) 1450d02842fSSascha Wildner * into the namespace. 1460d02842fSSascha Wildner * 1470d02842fSSascha Wildner ******************************************************************************/ 1480d02842fSSascha Wildner 1490d02842fSSascha Wildner static ACPI_STATUS 1500d02842fSSascha Wildner LdLoadFieldElements ( 1510d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 1520d02842fSSascha Wildner ACPI_WALK_STATE *WalkState) 1530d02842fSSascha Wildner { 1540d02842fSSascha Wildner ACPI_PARSE_OBJECT *Child = NULL; 1550d02842fSSascha Wildner ACPI_NAMESPACE_NODE *Node; 1560d02842fSSascha Wildner ACPI_STATUS Status; 1570d02842fSSascha Wildner 1580d02842fSSascha Wildner 1590d02842fSSascha Wildner /* Get the first named field element */ 1600d02842fSSascha Wildner 1610d02842fSSascha Wildner switch (Op->Asl.AmlOpcode) 1620d02842fSSascha Wildner { 1630d02842fSSascha Wildner case AML_BANK_FIELD_OP: 1640d02842fSSascha Wildner 1650d02842fSSascha Wildner Child = UtGetArg (Op, 6); 1660d02842fSSascha Wildner break; 1670d02842fSSascha Wildner 1680d02842fSSascha Wildner case AML_INDEX_FIELD_OP: 1690d02842fSSascha Wildner 1700d02842fSSascha Wildner Child = UtGetArg (Op, 5); 1710d02842fSSascha Wildner break; 1720d02842fSSascha Wildner 1730d02842fSSascha Wildner case AML_FIELD_OP: 1740d02842fSSascha Wildner 1750d02842fSSascha Wildner Child = UtGetArg (Op, 4); 1760d02842fSSascha Wildner break; 1770d02842fSSascha Wildner 1780d02842fSSascha Wildner default: 1790d02842fSSascha Wildner 1800d02842fSSascha Wildner /* No other opcodes should arrive here */ 1810d02842fSSascha Wildner 1820d02842fSSascha Wildner return (AE_BAD_PARAMETER); 1830d02842fSSascha Wildner } 1840d02842fSSascha Wildner 1850d02842fSSascha Wildner /* Enter all elements into the namespace */ 1860d02842fSSascha Wildner 1870d02842fSSascha Wildner while (Child) 1880d02842fSSascha Wildner { 1890d02842fSSascha Wildner switch (Child->Asl.AmlOpcode) 1900d02842fSSascha Wildner { 1910d02842fSSascha Wildner case AML_INT_RESERVEDFIELD_OP: 1920d02842fSSascha Wildner case AML_INT_ACCESSFIELD_OP: 1930d02842fSSascha Wildner case AML_INT_CONNECTION_OP: 1940d02842fSSascha Wildner break; 1950d02842fSSascha Wildner 1960d02842fSSascha Wildner default: 1970d02842fSSascha Wildner 1980d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, 1990d02842fSSascha Wildner Child->Asl.Value.String, 2000d02842fSSascha Wildner ACPI_TYPE_LOCAL_REGION_FIELD, 2010d02842fSSascha Wildner ACPI_IMODE_LOAD_PASS1, 2020d02842fSSascha Wildner ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | 2030d02842fSSascha Wildner ACPI_NS_ERROR_IF_FOUND, 2040d02842fSSascha Wildner NULL, &Node); 2050d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 2060d02842fSSascha Wildner { 2070d02842fSSascha Wildner if (Status != AE_ALREADY_EXISTS) 2080d02842fSSascha Wildner { 2090d02842fSSascha Wildner AslError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Child, 2100d02842fSSascha Wildner Child->Asl.Value.String); 2110d02842fSSascha Wildner return (Status); 2120d02842fSSascha Wildner } 2130d02842fSSascha Wildner 2140d02842fSSascha Wildner /* 2150d02842fSSascha Wildner * The name already exists in this scope 2160d02842fSSascha Wildner * But continue processing the elements 2170d02842fSSascha Wildner */ 2180d02842fSSascha Wildner AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child, 2190d02842fSSascha Wildner Child->Asl.Value.String); 2200d02842fSSascha Wildner } 2210d02842fSSascha Wildner else 2220d02842fSSascha Wildner { 2230d02842fSSascha Wildner Child->Asl.Node = Node; 2240d02842fSSascha Wildner Node->Op = Child; 2250d02842fSSascha Wildner } 2260d02842fSSascha Wildner break; 2270d02842fSSascha Wildner } 2280d02842fSSascha Wildner 2290d02842fSSascha Wildner Child = Child->Asl.Next; 2300d02842fSSascha Wildner } 2310d02842fSSascha Wildner 2320d02842fSSascha Wildner return (AE_OK); 2330d02842fSSascha Wildner } 2340d02842fSSascha Wildner 2350d02842fSSascha Wildner 2360d02842fSSascha Wildner /******************************************************************************* 2370d02842fSSascha Wildner * 2380d02842fSSascha Wildner * FUNCTION: LdLoadResourceElements 2390d02842fSSascha Wildner * 2400d02842fSSascha Wildner * PARAMETERS: Op - Parent node (Resource Descriptor) 2410d02842fSSascha Wildner * WalkState - Current walk state 2420d02842fSSascha Wildner * 2430d02842fSSascha Wildner * RETURN: Status 2440d02842fSSascha Wildner * 2450d02842fSSascha Wildner * DESCRIPTION: Enter the named elements of the resource descriptor (children 2460d02842fSSascha Wildner * of the parent) into the namespace. 2470d02842fSSascha Wildner * 2480d02842fSSascha Wildner * NOTE: In the real AML namespace, these named elements never exist. But 2490d02842fSSascha Wildner * we simply use the namespace here as a symbol table so we can look 2500d02842fSSascha Wildner * them up as they are referenced. 2510d02842fSSascha Wildner * 2520d02842fSSascha Wildner ******************************************************************************/ 2530d02842fSSascha Wildner 2540d02842fSSascha Wildner static ACPI_STATUS 2550d02842fSSascha Wildner LdLoadResourceElements ( 2560d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 2570d02842fSSascha Wildner ACPI_WALK_STATE *WalkState) 2580d02842fSSascha Wildner { 2590d02842fSSascha Wildner ACPI_PARSE_OBJECT *InitializerOp = NULL; 2600d02842fSSascha Wildner ACPI_NAMESPACE_NODE *Node; 2610d02842fSSascha Wildner ACPI_STATUS Status; 2620d02842fSSascha Wildner 2630d02842fSSascha Wildner 2640d02842fSSascha Wildner /* 2650d02842fSSascha Wildner * Enter the resource name into the namespace. Name must not already exist. 2660d02842fSSascha Wildner * This opens a scope, so later field names are guaranteed to be new/unique. 2670d02842fSSascha Wildner */ 2680d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Asl.Namepath, 2690d02842fSSascha Wildner ACPI_TYPE_LOCAL_RESOURCE, ACPI_IMODE_LOAD_PASS1, 2700d02842fSSascha Wildner ACPI_NS_NO_UPSEARCH | ACPI_NS_ERROR_IF_FOUND, 2710d02842fSSascha Wildner WalkState, &Node); 2720d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 2730d02842fSSascha Wildner { 2740d02842fSSascha Wildner if (Status == AE_ALREADY_EXISTS) 2750d02842fSSascha Wildner { 2760d02842fSSascha Wildner /* Actual node causing the error was saved in ParentMethod */ 2770d02842fSSascha Wildner 2780d02842fSSascha Wildner AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, 2790d02842fSSascha Wildner (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod, Op->Asl.Namepath); 2800d02842fSSascha Wildner return (AE_OK); 2810d02842fSSascha Wildner } 2820d02842fSSascha Wildner return (Status); 2830d02842fSSascha Wildner } 2840d02842fSSascha Wildner 2850d02842fSSascha Wildner Node->Value = (UINT32) Op->Asl.Value.Integer; 2860d02842fSSascha Wildner Node->Op = Op; 2870d02842fSSascha Wildner Op->Asl.Node = Node; 2880d02842fSSascha Wildner 2890d02842fSSascha Wildner /* 2900d02842fSSascha Wildner * Now enter the predefined fields, for easy lookup when referenced 2910d02842fSSascha Wildner * by the source ASL 2920d02842fSSascha Wildner */ 2930d02842fSSascha Wildner InitializerOp = ASL_GET_CHILD_NODE (Op); 2940d02842fSSascha Wildner while (InitializerOp) 2950d02842fSSascha Wildner { 2960d02842fSSascha Wildner if (InitializerOp->Asl.ExternalName) 2970d02842fSSascha Wildner { 2980d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, 2990d02842fSSascha Wildner InitializerOp->Asl.ExternalName, 3000d02842fSSascha Wildner ACPI_TYPE_LOCAL_RESOURCE_FIELD, 3010d02842fSSascha Wildner ACPI_IMODE_LOAD_PASS1, 3020d02842fSSascha Wildner ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, 3030d02842fSSascha Wildner NULL, &Node); 3040d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 3050d02842fSSascha Wildner { 3060d02842fSSascha Wildner return (Status); 3070d02842fSSascha Wildner } 3080d02842fSSascha Wildner 3090d02842fSSascha Wildner /* 3100d02842fSSascha Wildner * Store the field offset and length in the namespace node 3110d02842fSSascha Wildner * so it can be used when the field is referenced 3120d02842fSSascha Wildner */ 3130d02842fSSascha Wildner Node->Value = InitializerOp->Asl.Value.Tag.BitOffset; 3140d02842fSSascha Wildner Node->Length = InitializerOp->Asl.Value.Tag.BitLength; 3150d02842fSSascha Wildner InitializerOp->Asl.Node = Node; 3160d02842fSSascha Wildner Node->Op = InitializerOp; 3170d02842fSSascha Wildner } 3180d02842fSSascha Wildner 3190d02842fSSascha Wildner InitializerOp = ASL_GET_PEER_NODE (InitializerOp); 3200d02842fSSascha Wildner } 3210d02842fSSascha Wildner 3220d02842fSSascha Wildner return (AE_OK); 3230d02842fSSascha Wildner } 3240d02842fSSascha Wildner 3250d02842fSSascha Wildner 3260d02842fSSascha Wildner /******************************************************************************* 3270d02842fSSascha Wildner * 3280d02842fSSascha Wildner * FUNCTION: LdNamespace1Begin 3290d02842fSSascha Wildner * 3300d02842fSSascha Wildner * PARAMETERS: ASL_WALK_CALLBACK 3310d02842fSSascha Wildner * 3320d02842fSSascha Wildner * RETURN: Status 3330d02842fSSascha Wildner * 3340d02842fSSascha Wildner * DESCRIPTION: Descending callback used during the parse tree walk. If this 3350d02842fSSascha Wildner * is a named AML opcode, enter into the namespace 3360d02842fSSascha Wildner * 3370d02842fSSascha Wildner ******************************************************************************/ 3380d02842fSSascha Wildner 3390d02842fSSascha Wildner static ACPI_STATUS 3400d02842fSSascha Wildner LdNamespace1Begin ( 3410d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 3420d02842fSSascha Wildner UINT32 Level, 3430d02842fSSascha Wildner void *Context) 3440d02842fSSascha Wildner { 3450d02842fSSascha Wildner ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 3460d02842fSSascha Wildner ACPI_NAMESPACE_NODE *Node; 3470d02842fSSascha Wildner ACPI_STATUS Status; 3480d02842fSSascha Wildner ACPI_OBJECT_TYPE ObjectType; 3490d02842fSSascha Wildner ACPI_OBJECT_TYPE ActualObjectType = ACPI_TYPE_ANY; 3500d02842fSSascha Wildner char *Path; 3510d02842fSSascha Wildner UINT32 Flags = ACPI_NS_NO_UPSEARCH; 3520d02842fSSascha Wildner ACPI_PARSE_OBJECT *Arg; 3530d02842fSSascha Wildner UINT32 i; 3540d02842fSSascha Wildner BOOLEAN ForceNewScope = FALSE; 3550d02842fSSascha Wildner 3560d02842fSSascha Wildner 3570d02842fSSascha Wildner ACPI_FUNCTION_NAME (LdNamespace1Begin); 3580d02842fSSascha Wildner ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 3590d02842fSSascha Wildner Op, Op->Asl.ParseOpName)); 3600d02842fSSascha Wildner 3610d02842fSSascha Wildner /* 3620d02842fSSascha Wildner * We are only interested in opcodes that have an associated name 3630d02842fSSascha Wildner * (or multiple names) 3640d02842fSSascha Wildner */ 3650d02842fSSascha Wildner switch (Op->Asl.AmlOpcode) 3660d02842fSSascha Wildner { 3670d02842fSSascha Wildner case AML_BANK_FIELD_OP: 3680d02842fSSascha Wildner case AML_INDEX_FIELD_OP: 3690d02842fSSascha Wildner case AML_FIELD_OP: 3700d02842fSSascha Wildner 3710d02842fSSascha Wildner Status = LdLoadFieldElements (Op, WalkState); 3720d02842fSSascha Wildner return (Status); 3730d02842fSSascha Wildner 374*2e2672b8SSascha Wildner case AML_INT_CONNECTION_OP: 375*2e2672b8SSascha Wildner 376*2e2672b8SSascha Wildner 377*2e2672b8SSascha Wildner if (Op->Asl.Child->Asl.AmlOpcode != AML_INT_NAMEPATH_OP) 378*2e2672b8SSascha Wildner { 379*2e2672b8SSascha Wildner break; 380*2e2672b8SSascha Wildner } 381*2e2672b8SSascha Wildner Arg = Op->Asl.Child; 382*2e2672b8SSascha Wildner 383*2e2672b8SSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Asl.ExternalName, 384*2e2672b8SSascha Wildner ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, 385*2e2672b8SSascha Wildner WalkState, &Node); 386*2e2672b8SSascha Wildner if (ACPI_FAILURE (Status)) 387*2e2672b8SSascha Wildner { 388*2e2672b8SSascha Wildner break; 389*2e2672b8SSascha Wildner } 390*2e2672b8SSascha Wildner 391*2e2672b8SSascha Wildner if (Node->Type == ACPI_TYPE_BUFFER) 392*2e2672b8SSascha Wildner { 393*2e2672b8SSascha Wildner Arg->Asl.Node = Node; 394*2e2672b8SSascha Wildner 395*2e2672b8SSascha Wildner Arg = Node->Op->Asl.Child; /* Get namepath */ 396*2e2672b8SSascha Wildner Arg = Arg->Asl.Next; /* Get actual buffer */ 397*2e2672b8SSascha Wildner Arg = Arg->Asl.Child; /* Buffer length */ 398*2e2672b8SSascha Wildner Arg = Arg->Asl.Next; /* RAW_DATA buffer */ 399*2e2672b8SSascha Wildner } 400*2e2672b8SSascha Wildner break; 401*2e2672b8SSascha Wildner 4020d02842fSSascha Wildner default: 4030d02842fSSascha Wildner 4040d02842fSSascha Wildner /* All other opcodes go below */ 4050d02842fSSascha Wildner 4060d02842fSSascha Wildner break; 4070d02842fSSascha Wildner } 4080d02842fSSascha Wildner 4090d02842fSSascha Wildner /* Check if this object has already been installed in the namespace */ 4100d02842fSSascha Wildner 4110d02842fSSascha Wildner if (Op->Asl.Node) 4120d02842fSSascha Wildner { 4130d02842fSSascha Wildner return (AE_OK); 4140d02842fSSascha Wildner } 4150d02842fSSascha Wildner 4160d02842fSSascha Wildner Path = Op->Asl.Namepath; 4170d02842fSSascha Wildner if (!Path) 4180d02842fSSascha Wildner { 4190d02842fSSascha Wildner return (AE_OK); 4200d02842fSSascha Wildner } 4210d02842fSSascha Wildner 4220d02842fSSascha Wildner /* Map the raw opcode into an internal object type */ 4230d02842fSSascha Wildner 4240d02842fSSascha Wildner switch (Op->Asl.ParseOpcode) 4250d02842fSSascha Wildner { 4260d02842fSSascha Wildner case PARSEOP_NAME: 4270d02842fSSascha Wildner 4280d02842fSSascha Wildner Arg = Op->Asl.Child; /* Get the NameSeg/NameString node */ 4290d02842fSSascha Wildner Arg = Arg->Asl.Next; /* First peer is the object to be associated with the name */ 4300d02842fSSascha Wildner 4310d02842fSSascha Wildner /* 4320d02842fSSascha Wildner * If this name refers to a ResourceTemplate, we will need to open 4330d02842fSSascha Wildner * a new scope so that the resource subfield names can be entered into 4340d02842fSSascha Wildner * the namespace underneath this name 4350d02842fSSascha Wildner */ 4360d02842fSSascha Wildner if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 4370d02842fSSascha Wildner { 4380d02842fSSascha Wildner ForceNewScope = TRUE; 4390d02842fSSascha Wildner } 4400d02842fSSascha Wildner 4410d02842fSSascha Wildner /* Get the data type associated with the named object, not the name itself */ 4420d02842fSSascha Wildner 4430d02842fSSascha Wildner /* Log2 loop to convert from Btype (binary) to Etype (encoded) */ 4440d02842fSSascha Wildner 4450d02842fSSascha Wildner ObjectType = 1; 4460d02842fSSascha Wildner for (i = 1; i < Arg->Asl.AcpiBtype; i *= 2) 4470d02842fSSascha Wildner { 4480d02842fSSascha Wildner ObjectType++; 4490d02842fSSascha Wildner } 4500d02842fSSascha Wildner break; 4510d02842fSSascha Wildner 4520d02842fSSascha Wildner 4530d02842fSSascha Wildner case PARSEOP_EXTERNAL: 4540d02842fSSascha Wildner /* 4550d02842fSSascha Wildner * "External" simply enters a name and type into the namespace. 4560d02842fSSascha Wildner * We must be careful to not open a new scope, however, no matter 4570d02842fSSascha Wildner * what type the external name refers to (e.g., a method) 4580d02842fSSascha Wildner * 4590d02842fSSascha Wildner * first child is name, next child is ObjectType 4600d02842fSSascha Wildner */ 4610d02842fSSascha Wildner ActualObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer; 4620d02842fSSascha Wildner ObjectType = ACPI_TYPE_ANY; 4630d02842fSSascha Wildner 4640d02842fSSascha Wildner /* 4650d02842fSSascha Wildner * We will mark every new node along the path as "External". This 4660d02842fSSascha Wildner * allows some or all of the nodes to be created later in the ASL 4670d02842fSSascha Wildner * code. Handles cases like this: 4680d02842fSSascha Wildner * 4690d02842fSSascha Wildner * External (\_SB_.PCI0.ABCD, IntObj) 4700d02842fSSascha Wildner * Scope (_SB_) 4710d02842fSSascha Wildner * { 4720d02842fSSascha Wildner * Device (PCI0) 4730d02842fSSascha Wildner * { 4740d02842fSSascha Wildner * } 4750d02842fSSascha Wildner * } 4760d02842fSSascha Wildner * Method (X) 4770d02842fSSascha Wildner * { 4780d02842fSSascha Wildner * Store (\_SB_.PCI0.ABCD, Local0) 4790d02842fSSascha Wildner * } 4800d02842fSSascha Wildner */ 4810d02842fSSascha Wildner Flags |= ACPI_NS_EXTERNAL; 4820d02842fSSascha Wildner break; 4830d02842fSSascha Wildner 4840d02842fSSascha Wildner case PARSEOP_DEFAULT_ARG: 4850d02842fSSascha Wildner 4860d02842fSSascha Wildner if (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC) 4870d02842fSSascha Wildner { 4880d02842fSSascha Wildner Status = LdLoadResourceElements (Op, WalkState); 4890d02842fSSascha Wildner return_ACPI_STATUS (Status); 4900d02842fSSascha Wildner } 4910d02842fSSascha Wildner 4920d02842fSSascha Wildner ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 4930d02842fSSascha Wildner break; 4940d02842fSSascha Wildner 4950d02842fSSascha Wildner case PARSEOP_SCOPE: 4960d02842fSSascha Wildner /* 4970d02842fSSascha Wildner * The name referenced by Scope(Name) must already exist at this point. 4980d02842fSSascha Wildner * In other words, forward references for Scope() are not supported. 4990d02842fSSascha Wildner * The only real reason for this is that the MS interpreter cannot 5000d02842fSSascha Wildner * handle this case. Perhaps someday this case can go away. 5010d02842fSSascha Wildner */ 5020d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 5030d02842fSSascha Wildner ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, 5040d02842fSSascha Wildner WalkState, &(Node)); 5050d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 5060d02842fSSascha Wildner { 5070d02842fSSascha Wildner if (Status == AE_NOT_FOUND) 5080d02842fSSascha Wildner { 5090d02842fSSascha Wildner /* The name was not found, go ahead and create it */ 5100d02842fSSascha Wildner 5110d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 5120d02842fSSascha Wildner ACPI_TYPE_LOCAL_SCOPE, 5130d02842fSSascha Wildner ACPI_IMODE_LOAD_PASS1, Flags, 5140d02842fSSascha Wildner WalkState, &(Node)); 5150d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 5160d02842fSSascha Wildner { 5170d02842fSSascha Wildner return_ACPI_STATUS (Status); 5180d02842fSSascha Wildner } 5190d02842fSSascha Wildner 5200d02842fSSascha Wildner /* 5210d02842fSSascha Wildner * However, this is an error -- primarily because the MS 5220d02842fSSascha Wildner * interpreter can't handle a forward reference from the 5230d02842fSSascha Wildner * Scope() operator. 5240d02842fSSascha Wildner */ 5250d02842fSSascha Wildner AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 5260d02842fSSascha Wildner Op->Asl.ExternalName); 5270d02842fSSascha Wildner AslError (ASL_ERROR, ASL_MSG_SCOPE_FWD_REF, Op, 5280d02842fSSascha Wildner Op->Asl.ExternalName); 5290d02842fSSascha Wildner goto FinishNode; 5300d02842fSSascha Wildner } 5310d02842fSSascha Wildner 5320d02842fSSascha Wildner AslCoreSubsystemError (Op, Status, 5330d02842fSSascha Wildner "Failure from namespace lookup", FALSE); 5340d02842fSSascha Wildner 5350d02842fSSascha Wildner return_ACPI_STATUS (Status); 5360d02842fSSascha Wildner } 5370d02842fSSascha Wildner 5380d02842fSSascha Wildner /* We found a node with this name, now check the type */ 5390d02842fSSascha Wildner 5400d02842fSSascha Wildner switch (Node->Type) 5410d02842fSSascha Wildner { 5420d02842fSSascha Wildner case ACPI_TYPE_LOCAL_SCOPE: 5430d02842fSSascha Wildner case ACPI_TYPE_DEVICE: 5440d02842fSSascha Wildner case ACPI_TYPE_POWER: 5450d02842fSSascha Wildner case ACPI_TYPE_PROCESSOR: 5460d02842fSSascha Wildner case ACPI_TYPE_THERMAL: 5470d02842fSSascha Wildner 5480d02842fSSascha Wildner /* These are acceptable types - they all open a new scope */ 5490d02842fSSascha Wildner break; 5500d02842fSSascha Wildner 5510d02842fSSascha Wildner case ACPI_TYPE_INTEGER: 5520d02842fSSascha Wildner case ACPI_TYPE_STRING: 5530d02842fSSascha Wildner case ACPI_TYPE_BUFFER: 5540d02842fSSascha Wildner /* 5550d02842fSSascha Wildner * These types we will allow, but we will change the type. 5560d02842fSSascha Wildner * This enables some existing code of the form: 5570d02842fSSascha Wildner * 5580d02842fSSascha Wildner * Name (DEB, 0) 5590d02842fSSascha Wildner * Scope (DEB) { ... } 5600d02842fSSascha Wildner * 5610d02842fSSascha Wildner * Which is used to workaround the fact that the MS interpreter 5620d02842fSSascha Wildner * does not allow Scope() forward references. 5630d02842fSSascha Wildner */ 5640d02842fSSascha Wildner sprintf (MsgBuffer, "%s [%s], changing type to [Scope]", 5650d02842fSSascha Wildner Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type)); 5660d02842fSSascha Wildner AslError (ASL_REMARK, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer); 5670d02842fSSascha Wildner 5680d02842fSSascha Wildner /* Switch the type to scope, open the new scope */ 5690d02842fSSascha Wildner 5700d02842fSSascha Wildner Node->Type = ACPI_TYPE_LOCAL_SCOPE; 5710d02842fSSascha Wildner Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 5720d02842fSSascha Wildner WalkState); 5730d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 5740d02842fSSascha Wildner { 5750d02842fSSascha Wildner return_ACPI_STATUS (Status); 5760d02842fSSascha Wildner } 5770d02842fSSascha Wildner break; 5780d02842fSSascha Wildner 5790d02842fSSascha Wildner default: 5800d02842fSSascha Wildner 5810d02842fSSascha Wildner /* All other types are an error */ 5820d02842fSSascha Wildner 5830d02842fSSascha Wildner sprintf (MsgBuffer, "%s [%s]", Op->Asl.ExternalName, 5840d02842fSSascha Wildner AcpiUtGetTypeName (Node->Type)); 5850d02842fSSascha Wildner AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer); 5860d02842fSSascha Wildner 5870d02842fSSascha Wildner /* 5880d02842fSSascha Wildner * However, switch the type to be an actual scope so 5890d02842fSSascha Wildner * that compilation can continue without generating a whole 5900d02842fSSascha Wildner * cascade of additional errors. Open the new scope. 5910d02842fSSascha Wildner */ 5920d02842fSSascha Wildner Node->Type = ACPI_TYPE_LOCAL_SCOPE; 5930d02842fSSascha Wildner Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 5940d02842fSSascha Wildner WalkState); 5950d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 5960d02842fSSascha Wildner { 5970d02842fSSascha Wildner return_ACPI_STATUS (Status); 5980d02842fSSascha Wildner } 5990d02842fSSascha Wildner break; 6000d02842fSSascha Wildner } 6010d02842fSSascha Wildner 6020d02842fSSascha Wildner Status = AE_OK; 6030d02842fSSascha Wildner goto FinishNode; 6040d02842fSSascha Wildner 6050d02842fSSascha Wildner 6060d02842fSSascha Wildner default: 6070d02842fSSascha Wildner 6080d02842fSSascha Wildner ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 6090d02842fSSascha Wildner break; 6100d02842fSSascha Wildner } 6110d02842fSSascha Wildner 6120d02842fSSascha Wildner 6130d02842fSSascha Wildner ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n", 6140d02842fSSascha Wildner Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType))); 6150d02842fSSascha Wildner 6160d02842fSSascha Wildner /* The name must not already exist */ 6170d02842fSSascha Wildner 6180d02842fSSascha Wildner Flags |= ACPI_NS_ERROR_IF_FOUND; 6190d02842fSSascha Wildner 6200d02842fSSascha Wildner /* 6210d02842fSSascha Wildner * Enter the named type into the internal namespace. We enter the name 6220d02842fSSascha Wildner * as we go downward in the parse tree. Any necessary subobjects that 6230d02842fSSascha Wildner * involve arguments to the opcode must be created as we go back up the 6240d02842fSSascha Wildner * parse tree later. 6250d02842fSSascha Wildner */ 6260d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 6270d02842fSSascha Wildner ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node); 6280d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 6290d02842fSSascha Wildner { 6300d02842fSSascha Wildner if (Status == AE_ALREADY_EXISTS) 6310d02842fSSascha Wildner { 6320d02842fSSascha Wildner /* The name already exists in this scope */ 6330d02842fSSascha Wildner 6340d02842fSSascha Wildner if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) 6350d02842fSSascha Wildner { 6360d02842fSSascha Wildner /* Allow multiple references to the same scope */ 6370d02842fSSascha Wildner 6380d02842fSSascha Wildner Node->Type = (UINT8) ObjectType; 6390d02842fSSascha Wildner Status = AE_OK; 6400d02842fSSascha Wildner } 6410d02842fSSascha Wildner else if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 6420d02842fSSascha Wildner (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL)) 6430d02842fSSascha Wildner { 6440d02842fSSascha Wildner /* 6450d02842fSSascha Wildner * Allow one create on an object or segment that was 6460d02842fSSascha Wildner * previously declared External 6470d02842fSSascha Wildner */ 6480d02842fSSascha Wildner Node->Flags &= ~ANOBJ_IS_EXTERNAL; 6490d02842fSSascha Wildner Node->Type = (UINT8) ObjectType; 6500d02842fSSascha Wildner 6510d02842fSSascha Wildner /* Just retyped a node, probably will need to open a scope */ 6520d02842fSSascha Wildner 6530d02842fSSascha Wildner if (AcpiNsOpensScope (ObjectType)) 6540d02842fSSascha Wildner { 6550d02842fSSascha Wildner Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 6560d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 6570d02842fSSascha Wildner { 6580d02842fSSascha Wildner return_ACPI_STATUS (Status); 6590d02842fSSascha Wildner } 6600d02842fSSascha Wildner } 6610d02842fSSascha Wildner Status = AE_OK; 6620d02842fSSascha Wildner } 6630d02842fSSascha Wildner else 6640d02842fSSascha Wildner { 6650d02842fSSascha Wildner /* Valid error, object already exists */ 6660d02842fSSascha Wildner 6670d02842fSSascha Wildner AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, 6680d02842fSSascha Wildner Op->Asl.ExternalName); 6690d02842fSSascha Wildner return_ACPI_STATUS (AE_OK); 6700d02842fSSascha Wildner } 6710d02842fSSascha Wildner } 6720d02842fSSascha Wildner else 6730d02842fSSascha Wildner { 6740d02842fSSascha Wildner AslCoreSubsystemError (Op, Status, 6750d02842fSSascha Wildner "Failure from namespace lookup", FALSE); 6760d02842fSSascha Wildner return_ACPI_STATUS (Status); 6770d02842fSSascha Wildner } 6780d02842fSSascha Wildner } 6790d02842fSSascha Wildner 6800d02842fSSascha Wildner if (ForceNewScope) 6810d02842fSSascha Wildner { 6820d02842fSSascha Wildner Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 6830d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 6840d02842fSSascha Wildner { 6850d02842fSSascha Wildner return_ACPI_STATUS (Status); 6860d02842fSSascha Wildner } 6870d02842fSSascha Wildner } 6880d02842fSSascha Wildner 6890d02842fSSascha Wildner FinishNode: 6900d02842fSSascha Wildner /* 6910d02842fSSascha Wildner * Point the parse node to the new namespace node, and point 6920d02842fSSascha Wildner * the Node back to the original Parse node 6930d02842fSSascha Wildner */ 6940d02842fSSascha Wildner Op->Asl.Node = Node; 6950d02842fSSascha Wildner Node->Op = Op; 6960d02842fSSascha Wildner 6970d02842fSSascha Wildner /* Set the actual data type if appropriate (EXTERNAL term only) */ 6980d02842fSSascha Wildner 6990d02842fSSascha Wildner if (ActualObjectType != ACPI_TYPE_ANY) 7000d02842fSSascha Wildner { 7010d02842fSSascha Wildner Node->Type = (UINT8) ActualObjectType; 7020d02842fSSascha Wildner Node->Value = ASL_EXTERNAL_METHOD; 7030d02842fSSascha Wildner } 7040d02842fSSascha Wildner 7050d02842fSSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_METHOD) 7060d02842fSSascha Wildner { 7070d02842fSSascha Wildner /* 7080d02842fSSascha Wildner * Get the method argument count from "Extra" and save 7090d02842fSSascha Wildner * it in the namespace node 7100d02842fSSascha Wildner */ 7110d02842fSSascha Wildner Node->Value = (UINT32) Op->Asl.Extra; 7120d02842fSSascha Wildner } 7130d02842fSSascha Wildner 7140d02842fSSascha Wildner return_ACPI_STATUS (Status); 7150d02842fSSascha Wildner } 7160d02842fSSascha Wildner 7170d02842fSSascha Wildner 7180d02842fSSascha Wildner /******************************************************************************* 7190d02842fSSascha Wildner * 7200d02842fSSascha Wildner * FUNCTION: LdNamespace2Begin 7210d02842fSSascha Wildner * 7220d02842fSSascha Wildner * PARAMETERS: ASL_WALK_CALLBACK 7230d02842fSSascha Wildner * 7240d02842fSSascha Wildner * RETURN: Status 7250d02842fSSascha Wildner * 7260d02842fSSascha Wildner * DESCRIPTION: Descending callback used during the pass 2 parse tree walk. 7270d02842fSSascha Wildner * Second pass resolves some forward references. 7280d02842fSSascha Wildner * 7290d02842fSSascha Wildner * Notes: 7300d02842fSSascha Wildner * Currently only needs to handle the Alias operator. 7310d02842fSSascha Wildner * Could be used to allow forward references from the Scope() operator, but 7320d02842fSSascha Wildner * the MS interpreter does not allow this, so this compiler does not either. 7330d02842fSSascha Wildner * 7340d02842fSSascha Wildner ******************************************************************************/ 7350d02842fSSascha Wildner 7360d02842fSSascha Wildner static ACPI_STATUS 7370d02842fSSascha Wildner LdNamespace2Begin ( 7380d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 7390d02842fSSascha Wildner UINT32 Level, 7400d02842fSSascha Wildner void *Context) 7410d02842fSSascha Wildner { 7420d02842fSSascha Wildner ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 7430d02842fSSascha Wildner ACPI_STATUS Status; 7440d02842fSSascha Wildner ACPI_NAMESPACE_NODE *Node; 7450d02842fSSascha Wildner ACPI_OBJECT_TYPE ObjectType; 7460d02842fSSascha Wildner BOOLEAN ForceNewScope = FALSE; 7470d02842fSSascha Wildner ACPI_PARSE_OBJECT *Arg; 7480d02842fSSascha Wildner char *Path; 7490d02842fSSascha Wildner ACPI_NAMESPACE_NODE *TargetNode; 7500d02842fSSascha Wildner 7510d02842fSSascha Wildner 7520d02842fSSascha Wildner ACPI_FUNCTION_NAME (LdNamespace2Begin); 7530d02842fSSascha Wildner ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 7540d02842fSSascha Wildner Op, Op->Asl.ParseOpName)); 7550d02842fSSascha Wildner 7560d02842fSSascha Wildner 7570d02842fSSascha Wildner /* Ignore Ops with no namespace node */ 7580d02842fSSascha Wildner 7590d02842fSSascha Wildner Node = Op->Asl.Node; 7600d02842fSSascha Wildner if (!Node) 7610d02842fSSascha Wildner { 7620d02842fSSascha Wildner return (AE_OK); 7630d02842fSSascha Wildner } 7640d02842fSSascha Wildner 7650d02842fSSascha Wildner /* Get the type to determine if we should push the scope */ 7660d02842fSSascha Wildner 7670d02842fSSascha Wildner if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 7680d02842fSSascha Wildner (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC)) 7690d02842fSSascha Wildner { 7700d02842fSSascha Wildner ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 7710d02842fSSascha Wildner } 7720d02842fSSascha Wildner else 7730d02842fSSascha Wildner { 7740d02842fSSascha Wildner ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 7750d02842fSSascha Wildner } 7760d02842fSSascha Wildner 7770d02842fSSascha Wildner /* Push scope for Resource Templates */ 7780d02842fSSascha Wildner 7790d02842fSSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_NAME) 7800d02842fSSascha Wildner { 7810d02842fSSascha Wildner if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 7820d02842fSSascha Wildner { 7830d02842fSSascha Wildner ForceNewScope = TRUE; 7840d02842fSSascha Wildner } 7850d02842fSSascha Wildner } 7860d02842fSSascha Wildner 7870d02842fSSascha Wildner /* Push the scope stack */ 7880d02842fSSascha Wildner 7890d02842fSSascha Wildner if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 7900d02842fSSascha Wildner { 7910d02842fSSascha Wildner Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 7920d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 7930d02842fSSascha Wildner { 7940d02842fSSascha Wildner return_ACPI_STATUS (Status); 7950d02842fSSascha Wildner } 7960d02842fSSascha Wildner } 7970d02842fSSascha Wildner 7980d02842fSSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_ALIAS) 7990d02842fSSascha Wildner { 8000d02842fSSascha Wildner /* Complete the alias node by getting and saving the target node */ 8010d02842fSSascha Wildner 8020d02842fSSascha Wildner /* First child is the alias target */ 8030d02842fSSascha Wildner 8040d02842fSSascha Wildner Arg = Op->Asl.Child; 8050d02842fSSascha Wildner 8060d02842fSSascha Wildner /* Get the target pathname */ 8070d02842fSSascha Wildner 8080d02842fSSascha Wildner Path = Arg->Asl.Namepath; 8090d02842fSSascha Wildner if (!Path) 8100d02842fSSascha Wildner { 8110d02842fSSascha Wildner Status = UtInternalizeName (Arg->Asl.ExternalName, &Path); 8120d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 8130d02842fSSascha Wildner { 8140d02842fSSascha Wildner return (Status); 8150d02842fSSascha Wildner } 8160d02842fSSascha Wildner } 8170d02842fSSascha Wildner 8180d02842fSSascha Wildner /* Get the NS node associated with the target. It must exist. */ 8190d02842fSSascha Wildner 8200d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 8210d02842fSSascha Wildner ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 8220d02842fSSascha Wildner WalkState, &TargetNode); 8230d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 8240d02842fSSascha Wildner { 8250d02842fSSascha Wildner if (Status == AE_NOT_FOUND) 8260d02842fSSascha Wildner { 8270d02842fSSascha Wildner AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 8280d02842fSSascha Wildner Op->Asl.ExternalName); 8290d02842fSSascha Wildner 8300d02842fSSascha Wildner /* 8310d02842fSSascha Wildner * The name was not found, go ahead and create it. 8320d02842fSSascha Wildner * This prevents more errors later. 8330d02842fSSascha Wildner */ 8340d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 8350d02842fSSascha Wildner ACPI_TYPE_ANY, 8360d02842fSSascha Wildner ACPI_IMODE_LOAD_PASS1, ACPI_NS_NO_UPSEARCH, 8370d02842fSSascha Wildner WalkState, &(Node)); 8380d02842fSSascha Wildner return (AE_OK); 8390d02842fSSascha Wildner } 8400d02842fSSascha Wildner 8410d02842fSSascha Wildner AslCoreSubsystemError (Op, Status, 8420d02842fSSascha Wildner "Failure from namespace lookup", FALSE); 8430d02842fSSascha Wildner return (AE_OK); 8440d02842fSSascha Wildner } 8450d02842fSSascha Wildner 8460d02842fSSascha Wildner /* Save the target node within the alias node */ 8470d02842fSSascha Wildner 8480d02842fSSascha Wildner Node->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode); 8490d02842fSSascha Wildner } 8500d02842fSSascha Wildner 8510d02842fSSascha Wildner return (AE_OK); 8520d02842fSSascha Wildner } 8530d02842fSSascha Wildner 8540d02842fSSascha Wildner 8550d02842fSSascha Wildner /******************************************************************************* 8560d02842fSSascha Wildner * 8570d02842fSSascha Wildner * FUNCTION: LdCommonNamespaceEnd 8580d02842fSSascha Wildner * 8590d02842fSSascha Wildner * PARAMETERS: ASL_WALK_CALLBACK 8600d02842fSSascha Wildner * 8610d02842fSSascha Wildner * RETURN: Status 8620d02842fSSascha Wildner * 8630d02842fSSascha Wildner * DESCRIPTION: Ascending callback used during the loading of the namespace, 8640d02842fSSascha Wildner * We only need to worry about managing the scope stack here. 8650d02842fSSascha Wildner * 8660d02842fSSascha Wildner ******************************************************************************/ 8670d02842fSSascha Wildner 8680d02842fSSascha Wildner static ACPI_STATUS 8690d02842fSSascha Wildner LdCommonNamespaceEnd ( 8700d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 8710d02842fSSascha Wildner UINT32 Level, 8720d02842fSSascha Wildner void *Context) 8730d02842fSSascha Wildner { 8740d02842fSSascha Wildner ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 8750d02842fSSascha Wildner ACPI_OBJECT_TYPE ObjectType; 8760d02842fSSascha Wildner BOOLEAN ForceNewScope = FALSE; 8770d02842fSSascha Wildner 8780d02842fSSascha Wildner 8790d02842fSSascha Wildner ACPI_FUNCTION_NAME (LdCommonNamespaceEnd); 8800d02842fSSascha Wildner 8810d02842fSSascha Wildner 8820d02842fSSascha Wildner /* We are only interested in opcodes that have an associated name */ 8830d02842fSSascha Wildner 8840d02842fSSascha Wildner if (!Op->Asl.Namepath) 8850d02842fSSascha Wildner { 8860d02842fSSascha Wildner return (AE_OK); 8870d02842fSSascha Wildner } 8880d02842fSSascha Wildner 8890d02842fSSascha Wildner /* Get the type to determine if we should pop the scope */ 8900d02842fSSascha Wildner 8910d02842fSSascha Wildner if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 8920d02842fSSascha Wildner (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC)) 8930d02842fSSascha Wildner { 8940d02842fSSascha Wildner /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */ 8950d02842fSSascha Wildner 8960d02842fSSascha Wildner ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 8970d02842fSSascha Wildner } 8980d02842fSSascha Wildner else 8990d02842fSSascha Wildner { 9000d02842fSSascha Wildner ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 9010d02842fSSascha Wildner } 9020d02842fSSascha Wildner 9030d02842fSSascha Wildner /* Pop scope that was pushed for Resource Templates */ 9040d02842fSSascha Wildner 9050d02842fSSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_NAME) 9060d02842fSSascha Wildner { 9070d02842fSSascha Wildner if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 9080d02842fSSascha Wildner { 9090d02842fSSascha Wildner ForceNewScope = TRUE; 9100d02842fSSascha Wildner } 9110d02842fSSascha Wildner } 9120d02842fSSascha Wildner 9130d02842fSSascha Wildner /* Pop the scope stack */ 9140d02842fSSascha Wildner 9150d02842fSSascha Wildner if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 9160d02842fSSascha Wildner { 9170d02842fSSascha Wildner ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 9180d02842fSSascha Wildner "(%s): Popping scope for Op [%s] %p\n", 9190d02842fSSascha Wildner AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op)); 9200d02842fSSascha Wildner 9210d02842fSSascha Wildner (void) AcpiDsScopeStackPop (WalkState); 9220d02842fSSascha Wildner } 9230d02842fSSascha Wildner 9240d02842fSSascha Wildner return (AE_OK); 9250d02842fSSascha Wildner } 926