10d02842fSSascha Wildner /****************************************************************************** 20d02842fSSascha Wildner * 30d02842fSSascha Wildner * Module Name: dswload - Dispatcher namespace load callbacks 40d02842fSSascha Wildner * 50d02842fSSascha Wildner *****************************************************************************/ 60d02842fSSascha Wildner 7b4315fc7SSascha Wildner /****************************************************************************** 8b4315fc7SSascha Wildner * 9b4315fc7SSascha Wildner * 1. Copyright Notice 10b4315fc7SSascha Wildner * 11ff4021a0SSascha Wildner * Some or all of this work - Copyright (c) 1999 - 2019, Intel Corp. 120d02842fSSascha Wildner * All rights reserved. 130d02842fSSascha Wildner * 14b4315fc7SSascha Wildner * 2. License 15b4315fc7SSascha Wildner * 16b4315fc7SSascha Wildner * 2.1. This is your license from Intel Corp. under its intellectual property 17b4315fc7SSascha Wildner * rights. You may have additional license terms from the party that provided 18b4315fc7SSascha Wildner * you this software, covering your right to use that party's intellectual 19b4315fc7SSascha Wildner * property rights. 20b4315fc7SSascha Wildner * 21b4315fc7SSascha Wildner * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22b4315fc7SSascha Wildner * copy of the source code appearing in this file ("Covered Code") an 23b4315fc7SSascha Wildner * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24b4315fc7SSascha Wildner * base code distributed originally by Intel ("Original Intel Code") to copy, 25b4315fc7SSascha Wildner * make derivatives, distribute, use and display any portion of the Covered 26b4315fc7SSascha Wildner * Code in any form, with the right to sublicense such rights; and 27b4315fc7SSascha Wildner * 28b4315fc7SSascha Wildner * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29b4315fc7SSascha Wildner * license (with the right to sublicense), under only those claims of Intel 30b4315fc7SSascha Wildner * patents that are infringed by the Original Intel Code, to make, use, sell, 31b4315fc7SSascha Wildner * offer to sell, and import the Covered Code and derivative works thereof 32b4315fc7SSascha Wildner * solely to the minimum extent necessary to exercise the above copyright 33b4315fc7SSascha Wildner * license, and in no event shall the patent license extend to any additions 34b4315fc7SSascha Wildner * to or modifications of the Original Intel Code. No other license or right 35b4315fc7SSascha Wildner * is granted directly or by implication, estoppel or otherwise; 36b4315fc7SSascha Wildner * 37b4315fc7SSascha Wildner * The above copyright and patent license is granted only if the following 38b4315fc7SSascha Wildner * conditions are met: 39b4315fc7SSascha Wildner * 40b4315fc7SSascha Wildner * 3. Conditions 41b4315fc7SSascha Wildner * 42b4315fc7SSascha Wildner * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43b4315fc7SSascha Wildner * Redistribution of source code of any substantial portion of the Covered 44b4315fc7SSascha Wildner * Code or modification with rights to further distribute source must include 45b4315fc7SSascha Wildner * the above Copyright Notice, the above License, this list of Conditions, 46b4315fc7SSascha Wildner * and the following Disclaimer and Export Compliance provision. In addition, 47b4315fc7SSascha Wildner * Licensee must cause all Covered Code to which Licensee contributes to 48b4315fc7SSascha Wildner * contain a file documenting the changes Licensee made to create that Covered 49b4315fc7SSascha Wildner * Code and the date of any change. Licensee must include in that file the 50b4315fc7SSascha Wildner * documentation of any changes made by any predecessor Licensee. Licensee 51b4315fc7SSascha Wildner * must include a prominent statement that the modification is derived, 52b4315fc7SSascha Wildner * directly or indirectly, from Original Intel Code. 53b4315fc7SSascha Wildner * 54b4315fc7SSascha Wildner * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55b4315fc7SSascha Wildner * Redistribution of source code of any substantial portion of the Covered 56b4315fc7SSascha Wildner * Code or modification without rights to further distribute source must 57b4315fc7SSascha Wildner * include the following Disclaimer and Export Compliance provision in the 58b4315fc7SSascha Wildner * documentation and/or other materials provided with distribution. In 59b4315fc7SSascha Wildner * addition, Licensee may not authorize further sublicense of source of any 60b4315fc7SSascha Wildner * portion of the Covered Code, and must include terms to the effect that the 61b4315fc7SSascha Wildner * license from Licensee to its licensee is limited to the intellectual 62b4315fc7SSascha Wildner * property embodied in the software Licensee provides to its licensee, and 63b4315fc7SSascha Wildner * not to intellectual property embodied in modifications its licensee may 64b4315fc7SSascha Wildner * make. 65b4315fc7SSascha Wildner * 66b4315fc7SSascha Wildner * 3.3. Redistribution of Executable. Redistribution in executable form of any 67b4315fc7SSascha Wildner * substantial portion of the Covered Code or modification must reproduce the 68b4315fc7SSascha Wildner * above Copyright Notice, and the following Disclaimer and Export Compliance 69b4315fc7SSascha Wildner * provision in the documentation and/or other materials provided with the 70b4315fc7SSascha Wildner * distribution. 71b4315fc7SSascha Wildner * 72b4315fc7SSascha Wildner * 3.4. Intel retains all right, title, and interest in and to the Original 73b4315fc7SSascha Wildner * Intel Code. 74b4315fc7SSascha Wildner * 75b4315fc7SSascha Wildner * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76b4315fc7SSascha Wildner * Intel shall be used in advertising or otherwise to promote the sale, use or 77b4315fc7SSascha Wildner * other dealings in products derived from or relating to the Covered Code 78b4315fc7SSascha Wildner * without prior written authorization from Intel. 79b4315fc7SSascha Wildner * 80b4315fc7SSascha Wildner * 4. Disclaimer and Export Compliance 81b4315fc7SSascha Wildner * 82b4315fc7SSascha Wildner * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83b4315fc7SSascha Wildner * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84b4315fc7SSascha Wildner * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85b4315fc7SSascha Wildner * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86b4315fc7SSascha Wildner * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87b4315fc7SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88b4315fc7SSascha Wildner * PARTICULAR PURPOSE. 89b4315fc7SSascha Wildner * 90b4315fc7SSascha Wildner * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91b4315fc7SSascha Wildner * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92b4315fc7SSascha Wildner * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93b4315fc7SSascha Wildner * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94b4315fc7SSascha Wildner * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95b4315fc7SSascha Wildner * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96b4315fc7SSascha Wildner * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97b4315fc7SSascha Wildner * LIMITED REMEDY. 98b4315fc7SSascha Wildner * 99b4315fc7SSascha Wildner * 4.3. Licensee shall not export, either directly or indirectly, any of this 100b4315fc7SSascha Wildner * software or system incorporating such software without first obtaining any 101b4315fc7SSascha Wildner * required license or other approval from the U. S. Department of Commerce or 102b4315fc7SSascha Wildner * any other agency or department of the United States Government. In the 103b4315fc7SSascha Wildner * event Licensee exports any such software from the United States or 104b4315fc7SSascha Wildner * re-exports any such software from a foreign destination, Licensee shall 105b4315fc7SSascha Wildner * ensure that the distribution and export/re-export of the software is in 106b4315fc7SSascha Wildner * compliance with all laws, regulations, orders, or other restrictions of the 107b4315fc7SSascha Wildner * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108b4315fc7SSascha Wildner * any of its subsidiaries will export/re-export any technical data, process, 109b4315fc7SSascha Wildner * software, or service, directly or indirectly, to any country for which the 110b4315fc7SSascha Wildner * United States government or any agency thereof requires an export license, 111b4315fc7SSascha Wildner * other governmental approval, or letter of assurance, without first obtaining 112b4315fc7SSascha Wildner * such license, approval or letter. 113b4315fc7SSascha Wildner * 114b4315fc7SSascha Wildner ***************************************************************************** 115b4315fc7SSascha Wildner * 116b4315fc7SSascha Wildner * Alternatively, you may choose to be licensed under the terms of the 117b4315fc7SSascha Wildner * following license: 118b4315fc7SSascha Wildner * 1190d02842fSSascha Wildner * Redistribution and use in source and binary forms, with or without 1200d02842fSSascha Wildner * modification, are permitted provided that the following conditions 1210d02842fSSascha Wildner * are met: 1220d02842fSSascha Wildner * 1. Redistributions of source code must retain the above copyright 1230d02842fSSascha Wildner * notice, this list of conditions, and the following disclaimer, 1240d02842fSSascha Wildner * without modification. 1250d02842fSSascha Wildner * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1260d02842fSSascha Wildner * substantially similar to the "NO WARRANTY" disclaimer below 1270d02842fSSascha Wildner * ("Disclaimer") and any redistribution must be conditioned upon 1280d02842fSSascha Wildner * including a substantially similar Disclaimer requirement for further 1290d02842fSSascha Wildner * binary redistribution. 1300d02842fSSascha Wildner * 3. Neither the names of the above-listed copyright holders nor the names 1310d02842fSSascha Wildner * of any contributors may be used to endorse or promote products derived 1320d02842fSSascha Wildner * from this software without specific prior written permission. 1330d02842fSSascha Wildner * 134b4315fc7SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135b4315fc7SSascha Wildner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136b4315fc7SSascha Wildner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137b4315fc7SSascha Wildner * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138b4315fc7SSascha Wildner * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139b4315fc7SSascha Wildner * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140b4315fc7SSascha Wildner * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141b4315fc7SSascha Wildner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142b4315fc7SSascha Wildner * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143b4315fc7SSascha Wildner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144b4315fc7SSascha Wildner * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145b4315fc7SSascha Wildner * 146b4315fc7SSascha Wildner * Alternatively, you may choose to be licensed under the terms of the 1470d02842fSSascha Wildner * GNU General Public License ("GPL") version 2 as published by the Free 1480d02842fSSascha Wildner * Software Foundation. 1490d02842fSSascha Wildner * 150b4315fc7SSascha Wildner *****************************************************************************/ 1510d02842fSSascha Wildner 1520d02842fSSascha Wildner #include "aslcompiler.h" 1530d02842fSSascha Wildner #include "amlcode.h" 1540d02842fSSascha Wildner #include "acdispat.h" 1550d02842fSSascha Wildner #include "acnamesp.h" 1567bcb6cafSSascha Wildner #include "acparser.h" 1570d02842fSSascha Wildner #include "aslcompiler.y.h" 1580d02842fSSascha Wildner 1597bcb6cafSSascha Wildner 1600d02842fSSascha Wildner #define _COMPONENT ACPI_COMPILER 1610d02842fSSascha Wildner ACPI_MODULE_NAME ("aslload") 1620d02842fSSascha Wildner 1630d02842fSSascha Wildner /* Local prototypes */ 1640d02842fSSascha Wildner 1650d02842fSSascha Wildner static ACPI_STATUS 1660d02842fSSascha Wildner LdLoadFieldElements ( 1670d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 1680d02842fSSascha Wildner ACPI_WALK_STATE *WalkState); 1690d02842fSSascha Wildner 1700d02842fSSascha Wildner static ACPI_STATUS 1710d02842fSSascha Wildner LdLoadResourceElements ( 1720d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 1730d02842fSSascha Wildner ACPI_WALK_STATE *WalkState); 1740d02842fSSascha Wildner 1750d02842fSSascha Wildner static ACPI_STATUS 1760d02842fSSascha Wildner LdNamespace1Begin ( 1770d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 1780d02842fSSascha Wildner UINT32 Level, 1790d02842fSSascha Wildner void *Context); 1800d02842fSSascha Wildner 1810d02842fSSascha Wildner static ACPI_STATUS 1820d02842fSSascha Wildner LdNamespace2Begin ( 1830d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 1840d02842fSSascha Wildner UINT32 Level, 1850d02842fSSascha Wildner void *Context); 1860d02842fSSascha Wildner 1870d02842fSSascha Wildner static ACPI_STATUS 1880d02842fSSascha Wildner LdCommonNamespaceEnd ( 1890d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 1900d02842fSSascha Wildner UINT32 Level, 1910d02842fSSascha Wildner void *Context); 1920d02842fSSascha Wildner 1930d02842fSSascha Wildner 1940d02842fSSascha Wildner /******************************************************************************* 1950d02842fSSascha Wildner * 1960d02842fSSascha Wildner * FUNCTION: LdLoadNamespace 1970d02842fSSascha Wildner * 1980d02842fSSascha Wildner * PARAMETERS: RootOp - Root of the parse tree 1990d02842fSSascha Wildner * 2000d02842fSSascha Wildner * RETURN: Status 2010d02842fSSascha Wildner * 2020d02842fSSascha Wildner * DESCRIPTION: Perform a walk of the parse tree that in turn loads all of the 2030d02842fSSascha Wildner * named ASL/AML objects into the namespace. The namespace is 2040d02842fSSascha Wildner * constructed in order to resolve named references and references 2050d02842fSSascha Wildner * to named fields within resource templates/descriptors. 2060d02842fSSascha Wildner * 2070d02842fSSascha Wildner ******************************************************************************/ 2080d02842fSSascha Wildner 2090d02842fSSascha Wildner ACPI_STATUS 2100d02842fSSascha Wildner LdLoadNamespace ( 2110d02842fSSascha Wildner ACPI_PARSE_OBJECT *RootOp) 2120d02842fSSascha Wildner { 2130d02842fSSascha Wildner ACPI_WALK_STATE *WalkState; 2140d02842fSSascha Wildner 2150d02842fSSascha Wildner 2160d02842fSSascha Wildner /* Create a new walk state */ 2170d02842fSSascha Wildner 2180d02842fSSascha Wildner WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); 2190d02842fSSascha Wildner if (!WalkState) 2200d02842fSSascha Wildner { 2210d02842fSSascha Wildner return (AE_NO_MEMORY); 2220d02842fSSascha Wildner } 2230d02842fSSascha Wildner 2240d02842fSSascha Wildner /* Walk the entire parse tree, first pass */ 2250d02842fSSascha Wildner 2260d02842fSSascha Wildner TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace1Begin, 2270d02842fSSascha Wildner LdCommonNamespaceEnd, WalkState); 2280d02842fSSascha Wildner 2290d02842fSSascha Wildner /* Second pass to handle forward references */ 2300d02842fSSascha Wildner 2310d02842fSSascha Wildner TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace2Begin, 2320d02842fSSascha Wildner LdCommonNamespaceEnd, WalkState); 2330d02842fSSascha Wildner 2340d02842fSSascha Wildner /* Dump the namespace if debug is enabled */ 2350d02842fSSascha Wildner 236e416ee21SSascha Wildner if (AcpiDbgLevel & ACPI_LV_TABLES) 237e416ee21SSascha Wildner { 2380d02842fSSascha Wildner AcpiNsDumpTables (ACPI_NS_ALL, ACPI_UINT32_MAX); 239e416ee21SSascha Wildner } 240e416ee21SSascha Wildner 24179eafdd7SSascha Wildner ACPI_FREE (WalkState); 2420d02842fSSascha Wildner return (AE_OK); 2430d02842fSSascha Wildner } 2440d02842fSSascha Wildner 2450d02842fSSascha Wildner 2460d02842fSSascha Wildner /******************************************************************************* 2470d02842fSSascha Wildner * 2480d02842fSSascha Wildner * FUNCTION: LdLoadFieldElements 2490d02842fSSascha Wildner * 2500d02842fSSascha Wildner * PARAMETERS: Op - Parent node (Field) 2510d02842fSSascha Wildner * WalkState - Current walk state 2520d02842fSSascha Wildner * 2530d02842fSSascha Wildner * RETURN: Status 2540d02842fSSascha Wildner * 2550d02842fSSascha Wildner * DESCRIPTION: Enter the named elements of the field (children of the parent) 2560d02842fSSascha Wildner * into the namespace. 2570d02842fSSascha Wildner * 2580d02842fSSascha Wildner ******************************************************************************/ 2590d02842fSSascha Wildner 2600d02842fSSascha Wildner static ACPI_STATUS 2610d02842fSSascha Wildner LdLoadFieldElements ( 2620d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 2630d02842fSSascha Wildner ACPI_WALK_STATE *WalkState) 2640d02842fSSascha Wildner { 2650d02842fSSascha Wildner ACPI_PARSE_OBJECT *Child = NULL; 2660d02842fSSascha Wildner ACPI_NAMESPACE_NODE *Node; 2670d02842fSSascha Wildner ACPI_STATUS Status; 2680d02842fSSascha Wildner 2690d02842fSSascha Wildner 2700d02842fSSascha Wildner /* Get the first named field element */ 2710d02842fSSascha Wildner 2720d02842fSSascha Wildner switch (Op->Asl.AmlOpcode) 2730d02842fSSascha Wildner { 2740d02842fSSascha Wildner case AML_BANK_FIELD_OP: 2750d02842fSSascha Wildner 2760d02842fSSascha Wildner Child = UtGetArg (Op, 6); 2770d02842fSSascha Wildner break; 2780d02842fSSascha Wildner 2790d02842fSSascha Wildner case AML_INDEX_FIELD_OP: 2800d02842fSSascha Wildner 2810d02842fSSascha Wildner Child = UtGetArg (Op, 5); 2820d02842fSSascha Wildner break; 2830d02842fSSascha Wildner 2840d02842fSSascha Wildner case AML_FIELD_OP: 2850d02842fSSascha Wildner 2860d02842fSSascha Wildner Child = UtGetArg (Op, 4); 2870d02842fSSascha Wildner break; 2880d02842fSSascha Wildner 2890d02842fSSascha Wildner default: 2900d02842fSSascha Wildner 2910d02842fSSascha Wildner /* No other opcodes should arrive here */ 2920d02842fSSascha Wildner 2930d02842fSSascha Wildner return (AE_BAD_PARAMETER); 2940d02842fSSascha Wildner } 2950d02842fSSascha Wildner 2960d02842fSSascha Wildner /* Enter all elements into the namespace */ 2970d02842fSSascha Wildner 2980d02842fSSascha Wildner while (Child) 2990d02842fSSascha Wildner { 3000d02842fSSascha Wildner switch (Child->Asl.AmlOpcode) 3010d02842fSSascha Wildner { 3020d02842fSSascha Wildner case AML_INT_RESERVEDFIELD_OP: 3030d02842fSSascha Wildner case AML_INT_ACCESSFIELD_OP: 3040d02842fSSascha Wildner case AML_INT_CONNECTION_OP: 3050d02842fSSascha Wildner break; 3060d02842fSSascha Wildner 3070d02842fSSascha Wildner default: 3080d02842fSSascha Wildner 3090d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, 3100d02842fSSascha Wildner Child->Asl.Value.String, 3110d02842fSSascha Wildner ACPI_TYPE_LOCAL_REGION_FIELD, 3120d02842fSSascha Wildner ACPI_IMODE_LOAD_PASS1, 3130d02842fSSascha Wildner ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | 314820c5b08SSascha Wildner ACPI_NS_ERROR_IF_FOUND, NULL, &Node); 3150d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 3160d02842fSSascha Wildner { 3170d02842fSSascha Wildner if (Status != AE_ALREADY_EXISTS) 3180d02842fSSascha Wildner { 3190d02842fSSascha Wildner AslError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Child, 3200d02842fSSascha Wildner Child->Asl.Value.String); 3210d02842fSSascha Wildner return (Status); 3220d02842fSSascha Wildner } 3231093ca81SSascha Wildner else if (Status == AE_ALREADY_EXISTS && 3246e376582SSascha Wildner (Node->Flags & ANOBJ_IS_EXTERNAL)) 3251093ca81SSascha Wildner { 3261093ca81SSascha Wildner Node->Type = (UINT8) ACPI_TYPE_LOCAL_REGION_FIELD; 3271093ca81SSascha Wildner } 3281093ca81SSascha Wildner else 3291093ca81SSascha Wildner { 3300d02842fSSascha Wildner /* 3310d02842fSSascha Wildner * The name already exists in this scope 3320d02842fSSascha Wildner * But continue processing the elements 3330d02842fSSascha Wildner */ 334*00ffa116SSascha Wildner AslDualParseOpError (ASL_WARNING, ASL_MSG_NAME_EXISTS, Child, 335*00ffa116SSascha Wildner Child->Asl.Value.String, ASL_MSG_FOUND_HERE, Node->Op, 3367bcb6cafSSascha Wildner Node->Op->Asl.ExternalName); 3370d02842fSSascha Wildner } 3381093ca81SSascha Wildner } 3390d02842fSSascha Wildner else 3400d02842fSSascha Wildner { 3410d02842fSSascha Wildner Child->Asl.Node = Node; 3420d02842fSSascha Wildner Node->Op = Child; 3430d02842fSSascha Wildner } 3440d02842fSSascha Wildner break; 3450d02842fSSascha Wildner } 3460d02842fSSascha Wildner 3470d02842fSSascha Wildner Child = Child->Asl.Next; 3480d02842fSSascha Wildner } 3490d02842fSSascha Wildner 3500d02842fSSascha Wildner return (AE_OK); 3510d02842fSSascha Wildner } 3520d02842fSSascha Wildner 3530d02842fSSascha Wildner 3540d02842fSSascha Wildner /******************************************************************************* 3550d02842fSSascha Wildner * 3560d02842fSSascha Wildner * FUNCTION: LdLoadResourceElements 3570d02842fSSascha Wildner * 3580d02842fSSascha Wildner * PARAMETERS: Op - Parent node (Resource Descriptor) 3590d02842fSSascha Wildner * WalkState - Current walk state 3600d02842fSSascha Wildner * 3610d02842fSSascha Wildner * RETURN: Status 3620d02842fSSascha Wildner * 3630d02842fSSascha Wildner * DESCRIPTION: Enter the named elements of the resource descriptor (children 3640d02842fSSascha Wildner * of the parent) into the namespace. 3650d02842fSSascha Wildner * 3660d02842fSSascha Wildner * NOTE: In the real AML namespace, these named elements never exist. But 3670d02842fSSascha Wildner * we simply use the namespace here as a symbol table so we can look 3680d02842fSSascha Wildner * them up as they are referenced. 3690d02842fSSascha Wildner * 3700d02842fSSascha Wildner ******************************************************************************/ 3710d02842fSSascha Wildner 3720d02842fSSascha Wildner static ACPI_STATUS 3730d02842fSSascha Wildner LdLoadResourceElements ( 3740d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 3750d02842fSSascha Wildner ACPI_WALK_STATE *WalkState) 3760d02842fSSascha Wildner { 3770d02842fSSascha Wildner ACPI_PARSE_OBJECT *InitializerOp = NULL; 3780d02842fSSascha Wildner ACPI_NAMESPACE_NODE *Node; 3790d02842fSSascha Wildner ACPI_STATUS Status; 3800d02842fSSascha Wildner 3810d02842fSSascha Wildner 3820d02842fSSascha Wildner /* 3830d02842fSSascha Wildner * Enter the resource name into the namespace. Name must not already exist. 3840d02842fSSascha Wildner * This opens a scope, so later field names are guaranteed to be new/unique. 3850d02842fSSascha Wildner */ 3860d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Asl.Namepath, 3870d02842fSSascha Wildner ACPI_TYPE_LOCAL_RESOURCE, ACPI_IMODE_LOAD_PASS1, 3880d02842fSSascha Wildner ACPI_NS_NO_UPSEARCH | ACPI_NS_ERROR_IF_FOUND, 3890d02842fSSascha Wildner WalkState, &Node); 3900d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 3910d02842fSSascha Wildner { 3920d02842fSSascha Wildner if (Status == AE_ALREADY_EXISTS) 3930d02842fSSascha Wildner { 3940d02842fSSascha Wildner /* Actual node causing the error was saved in ParentMethod */ 3950d02842fSSascha Wildner 3967bcb6cafSSascha Wildner AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, 3977bcb6cafSSascha Wildner (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod, 3987bcb6cafSSascha Wildner Op->Asl.Namepath, ASL_MSG_FOUND_HERE, Node->Op, 3997bcb6cafSSascha Wildner Node->Op->Asl.ExternalName); 4000d02842fSSascha Wildner return (AE_OK); 4010d02842fSSascha Wildner } 4020d02842fSSascha Wildner return (Status); 4030d02842fSSascha Wildner } 4040d02842fSSascha Wildner 4050d02842fSSascha Wildner Node->Value = (UINT32) Op->Asl.Value.Integer; 4060d02842fSSascha Wildner Node->Op = Op; 4070d02842fSSascha Wildner Op->Asl.Node = Node; 4080d02842fSSascha Wildner 4090d02842fSSascha Wildner /* 4100d02842fSSascha Wildner * Now enter the predefined fields, for easy lookup when referenced 4110d02842fSSascha Wildner * by the source ASL 4120d02842fSSascha Wildner */ 4130d02842fSSascha Wildner InitializerOp = ASL_GET_CHILD_NODE (Op); 4140d02842fSSascha Wildner while (InitializerOp) 4150d02842fSSascha Wildner { 4160d02842fSSascha Wildner if (InitializerOp->Asl.ExternalName) 4170d02842fSSascha Wildner { 4180d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, 4190d02842fSSascha Wildner InitializerOp->Asl.ExternalName, 4206721db86SSascha Wildner ACPI_TYPE_LOCAL_RESOURCE_FIELD, ACPI_IMODE_LOAD_PASS1, 4216721db86SSascha Wildner ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node); 4220d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 4230d02842fSSascha Wildner { 4240d02842fSSascha Wildner return (Status); 4250d02842fSSascha Wildner } 4260d02842fSSascha Wildner 4270d02842fSSascha Wildner /* 4280d02842fSSascha Wildner * Store the field offset and length in the namespace node 4290d02842fSSascha Wildner * so it can be used when the field is referenced 4300d02842fSSascha Wildner */ 4310d02842fSSascha Wildner Node->Value = InitializerOp->Asl.Value.Tag.BitOffset; 4320d02842fSSascha Wildner Node->Length = InitializerOp->Asl.Value.Tag.BitLength; 4330d02842fSSascha Wildner InitializerOp->Asl.Node = Node; 4340d02842fSSascha Wildner Node->Op = InitializerOp; 4350d02842fSSascha Wildner } 4360d02842fSSascha Wildner 4370d02842fSSascha Wildner InitializerOp = ASL_GET_PEER_NODE (InitializerOp); 4380d02842fSSascha Wildner } 4390d02842fSSascha Wildner 4400d02842fSSascha Wildner return (AE_OK); 4410d02842fSSascha Wildner } 4420d02842fSSascha Wildner 4430d02842fSSascha Wildner 4440d02842fSSascha Wildner /******************************************************************************* 4450d02842fSSascha Wildner * 4460d02842fSSascha Wildner * FUNCTION: LdNamespace1Begin 4470d02842fSSascha Wildner * 4480d02842fSSascha Wildner * PARAMETERS: ASL_WALK_CALLBACK 4490d02842fSSascha Wildner * 4500d02842fSSascha Wildner * RETURN: Status 4510d02842fSSascha Wildner * 4520d02842fSSascha Wildner * DESCRIPTION: Descending callback used during the parse tree walk. If this 4530d02842fSSascha Wildner * is a named AML opcode, enter into the namespace 4540d02842fSSascha Wildner * 4550d02842fSSascha Wildner ******************************************************************************/ 4560d02842fSSascha Wildner 4570d02842fSSascha Wildner static ACPI_STATUS 4580d02842fSSascha Wildner LdNamespace1Begin ( 4590d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 4600d02842fSSascha Wildner UINT32 Level, 4610d02842fSSascha Wildner void *Context) 4620d02842fSSascha Wildner { 4630d02842fSSascha Wildner ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 4640d02842fSSascha Wildner ACPI_NAMESPACE_NODE *Node; 465820c5b08SSascha Wildner ACPI_PARSE_OBJECT *MethodOp; 4660d02842fSSascha Wildner ACPI_STATUS Status; 4670d02842fSSascha Wildner ACPI_OBJECT_TYPE ObjectType; 4680d02842fSSascha Wildner ACPI_OBJECT_TYPE ActualObjectType = ACPI_TYPE_ANY; 4690d02842fSSascha Wildner char *Path; 4700d02842fSSascha Wildner UINT32 Flags = ACPI_NS_NO_UPSEARCH; 4710d02842fSSascha Wildner ACPI_PARSE_OBJECT *Arg; 4720d02842fSSascha Wildner UINT32 i; 4730d02842fSSascha Wildner BOOLEAN ForceNewScope = FALSE; 4747bcb6cafSSascha Wildner const ACPI_OPCODE_INFO *OpInfo; 4757bcb6cafSSascha Wildner ACPI_PARSE_OBJECT *ParentOp; 4760d02842fSSascha Wildner 4770d02842fSSascha Wildner 4780d02842fSSascha Wildner ACPI_FUNCTION_NAME (LdNamespace1Begin); 4797bcb6cafSSascha Wildner 4807bcb6cafSSascha Wildner 4810d02842fSSascha Wildner ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 4820d02842fSSascha Wildner Op, Op->Asl.ParseOpName)); 4830d02842fSSascha Wildner 4840d02842fSSascha Wildner /* 4850d02842fSSascha Wildner * We are only interested in opcodes that have an associated name 4860d02842fSSascha Wildner * (or multiple names) 4870d02842fSSascha Wildner */ 4880d02842fSSascha Wildner switch (Op->Asl.AmlOpcode) 4890d02842fSSascha Wildner { 4900d02842fSSascha Wildner case AML_BANK_FIELD_OP: 4910d02842fSSascha Wildner case AML_INDEX_FIELD_OP: 4920d02842fSSascha Wildner case AML_FIELD_OP: 4930d02842fSSascha Wildner 4940d02842fSSascha Wildner Status = LdLoadFieldElements (Op, WalkState); 4950d02842fSSascha Wildner return (Status); 4960d02842fSSascha Wildner 4972e2672b8SSascha Wildner case AML_INT_CONNECTION_OP: 4982e2672b8SSascha Wildner 4992e2672b8SSascha Wildner 5002e2672b8SSascha Wildner if (Op->Asl.Child->Asl.AmlOpcode != AML_INT_NAMEPATH_OP) 5012e2672b8SSascha Wildner { 5022e2672b8SSascha Wildner break; 5032e2672b8SSascha Wildner } 5042e2672b8SSascha Wildner Arg = Op->Asl.Child; 5052e2672b8SSascha Wildner 5062e2672b8SSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Asl.ExternalName, 5072e2672b8SSascha Wildner ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, 5082e2672b8SSascha Wildner WalkState, &Node); 5092e2672b8SSascha Wildner if (ACPI_FAILURE (Status)) 5102e2672b8SSascha Wildner { 5112e2672b8SSascha Wildner break; 5122e2672b8SSascha Wildner } 5132e2672b8SSascha Wildner 5142e2672b8SSascha Wildner if (Node->Type == ACPI_TYPE_BUFFER) 5152e2672b8SSascha Wildner { 5162e2672b8SSascha Wildner Arg->Asl.Node = Node; 5172e2672b8SSascha Wildner 5182e2672b8SSascha Wildner Arg = Node->Op->Asl.Child; /* Get namepath */ 5192e2672b8SSascha Wildner Arg = Arg->Asl.Next; /* Get actual buffer */ 5202e2672b8SSascha Wildner Arg = Arg->Asl.Child; /* Buffer length */ 5212e2672b8SSascha Wildner Arg = Arg->Asl.Next; /* RAW_DATA buffer */ 5222e2672b8SSascha Wildner } 5232e2672b8SSascha Wildner break; 5242e2672b8SSascha Wildner 5250d02842fSSascha Wildner default: 5260d02842fSSascha Wildner 5270d02842fSSascha Wildner /* All other opcodes go below */ 5280d02842fSSascha Wildner 5290d02842fSSascha Wildner break; 5300d02842fSSascha Wildner } 5310d02842fSSascha Wildner 5320d02842fSSascha Wildner /* Check if this object has already been installed in the namespace */ 5330d02842fSSascha Wildner 5340d02842fSSascha Wildner if (Op->Asl.Node) 5350d02842fSSascha Wildner { 5360d02842fSSascha Wildner return (AE_OK); 5370d02842fSSascha Wildner } 5380d02842fSSascha Wildner 5397bcb6cafSSascha Wildner /* Check for a possible illegal forward reference */ 5407bcb6cafSSascha Wildner 5417bcb6cafSSascha Wildner if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 5427bcb6cafSSascha Wildner (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)) 5437bcb6cafSSascha Wildner { 5447bcb6cafSSascha Wildner /* 5457bcb6cafSSascha Wildner * Op->Asl.Namepath will be NULL for these opcodes. 5467bcb6cafSSascha Wildner * These opcodes are guaranteed to have a parent. 5477bcb6cafSSascha Wildner * Examine the parent opcode. 5487bcb6cafSSascha Wildner */ 5497bcb6cafSSascha Wildner Status = AE_OK; 5507bcb6cafSSascha Wildner ParentOp = Op->Asl.Parent; 5517bcb6cafSSascha Wildner OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Asl.AmlOpcode); 5527bcb6cafSSascha Wildner 5537bcb6cafSSascha Wildner /* 5547bcb6cafSSascha Wildner * Exclude all operators that actually declare a new name: 5557bcb6cafSSascha Wildner * Name (ABCD, 1) -> Ignore (AML_CLASS_NAMED_OBJECT) 5567bcb6cafSSascha Wildner * We only want references to named objects: 5577bcb6cafSSascha Wildner * Store (2, WXYZ) -> Attempt to resolve the name 5587bcb6cafSSascha Wildner */ 5597bcb6cafSSascha Wildner if (OpInfo->Class == AML_CLASS_NAMED_OBJECT) 5607bcb6cafSSascha Wildner { 5617bcb6cafSSascha Wildner return (AE_OK); 5627bcb6cafSSascha Wildner } 5637bcb6cafSSascha Wildner 5647bcb6cafSSascha Wildner /* 5657bcb6cafSSascha Wildner * Check if the referenced object exists at this point during 5667bcb6cafSSascha Wildner * the load: 5677bcb6cafSSascha Wildner * 1) If it exists, then this cannot be a forward reference. 5687bcb6cafSSascha Wildner * 2) If it does not exist, it could be a forward reference or 5697bcb6cafSSascha Wildner * it truly does not exist (and no external declaration). 5707bcb6cafSSascha Wildner */ 5717bcb6cafSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, 5727bcb6cafSSascha Wildner Op->Asl.Value.Name, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, 5737bcb6cafSSascha Wildner ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 5747bcb6cafSSascha Wildner WalkState, &Node); 5757bcb6cafSSascha Wildner if (Status == AE_NOT_FOUND) 5767bcb6cafSSascha Wildner { 5777bcb6cafSSascha Wildner /* 578*00ffa116SSascha Wildner * This is either a forward reference or the object truly 5797bcb6cafSSascha Wildner * does not exist. The two cases can only be differentiated 5807bcb6cafSSascha Wildner * during the cross-reference stage later. Mark the Op/Name 5817bcb6cafSSascha Wildner * as not-found for now to indicate the need for further 5827bcb6cafSSascha Wildner * processing. 5837bcb6cafSSascha Wildner * 5847bcb6cafSSascha Wildner * Special case: Allow forward references from elements of 5857bcb6cafSSascha Wildner * Package objects. This provides compatibility with other 5867bcb6cafSSascha Wildner * ACPI implementations. To correctly implement this, the 5877bcb6cafSSascha Wildner * ACPICA table load defers package resolution until the entire 5887bcb6cafSSascha Wildner * namespace has been loaded. 5897bcb6cafSSascha Wildner */ 5907bcb6cafSSascha Wildner if ((ParentOp->Asl.ParseOpcode != PARSEOP_PACKAGE) && 5917bcb6cafSSascha Wildner (ParentOp->Asl.ParseOpcode != PARSEOP_VAR_PACKAGE)) 5927bcb6cafSSascha Wildner { 5937bcb6cafSSascha Wildner Op->Asl.CompileFlags |= OP_NOT_FOUND_DURING_LOAD; 5947bcb6cafSSascha Wildner } 5957bcb6cafSSascha Wildner 5967bcb6cafSSascha Wildner return (AE_OK); 5977bcb6cafSSascha Wildner } 5987bcb6cafSSascha Wildner 5997bcb6cafSSascha Wildner return (Status); 6007bcb6cafSSascha Wildner } 6017bcb6cafSSascha Wildner 6020d02842fSSascha Wildner Path = Op->Asl.Namepath; 6030d02842fSSascha Wildner if (!Path) 6040d02842fSSascha Wildner { 6050d02842fSSascha Wildner return (AE_OK); 6060d02842fSSascha Wildner } 6070d02842fSSascha Wildner 6080d02842fSSascha Wildner /* Map the raw opcode into an internal object type */ 6090d02842fSSascha Wildner 6100d02842fSSascha Wildner switch (Op->Asl.ParseOpcode) 6110d02842fSSascha Wildner { 6120d02842fSSascha Wildner case PARSEOP_NAME: 6130d02842fSSascha Wildner 6140d02842fSSascha Wildner Arg = Op->Asl.Child; /* Get the NameSeg/NameString node */ 6150d02842fSSascha Wildner Arg = Arg->Asl.Next; /* First peer is the object to be associated with the name */ 6160d02842fSSascha Wildner 6170d02842fSSascha Wildner /* 6180d02842fSSascha Wildner * If this name refers to a ResourceTemplate, we will need to open 6190d02842fSSascha Wildner * a new scope so that the resource subfield names can be entered into 6200d02842fSSascha Wildner * the namespace underneath this name 6210d02842fSSascha Wildner */ 6221093ca81SSascha Wildner if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC) 6230d02842fSSascha Wildner { 6240d02842fSSascha Wildner ForceNewScope = TRUE; 6250d02842fSSascha Wildner } 6260d02842fSSascha Wildner 6270d02842fSSascha Wildner /* Get the data type associated with the named object, not the name itself */ 6280d02842fSSascha Wildner 6290d02842fSSascha Wildner /* Log2 loop to convert from Btype (binary) to Etype (encoded) */ 6300d02842fSSascha Wildner 6310d02842fSSascha Wildner ObjectType = 1; 6320d02842fSSascha Wildner for (i = 1; i < Arg->Asl.AcpiBtype; i *= 2) 6330d02842fSSascha Wildner { 6340d02842fSSascha Wildner ObjectType++; 6350d02842fSSascha Wildner } 6360d02842fSSascha Wildner break; 6370d02842fSSascha Wildner 6380d02842fSSascha Wildner case PARSEOP_EXTERNAL: 6390d02842fSSascha Wildner /* 6400d02842fSSascha Wildner * "External" simply enters a name and type into the namespace. 6410d02842fSSascha Wildner * We must be careful to not open a new scope, however, no matter 6420d02842fSSascha Wildner * what type the external name refers to (e.g., a method) 6430d02842fSSascha Wildner * 6440d02842fSSascha Wildner * first child is name, next child is ObjectType 6450d02842fSSascha Wildner */ 6460d02842fSSascha Wildner ActualObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer; 6470d02842fSSascha Wildner ObjectType = ACPI_TYPE_ANY; 6480d02842fSSascha Wildner 6490d02842fSSascha Wildner /* 6500d02842fSSascha Wildner * We will mark every new node along the path as "External". This 6510d02842fSSascha Wildner * allows some or all of the nodes to be created later in the ASL 6520d02842fSSascha Wildner * code. Handles cases like this: 6530d02842fSSascha Wildner * 6540d02842fSSascha Wildner * External (\_SB_.PCI0.ABCD, IntObj) 6550d02842fSSascha Wildner * Scope (_SB_) 6560d02842fSSascha Wildner * { 6570d02842fSSascha Wildner * Device (PCI0) 6580d02842fSSascha Wildner * { 6590d02842fSSascha Wildner * } 6600d02842fSSascha Wildner * } 6610d02842fSSascha Wildner * Method (X) 6620d02842fSSascha Wildner * { 6630d02842fSSascha Wildner * Store (\_SB_.PCI0.ABCD, Local0) 6640d02842fSSascha Wildner * } 6650d02842fSSascha Wildner */ 6660d02842fSSascha Wildner Flags |= ACPI_NS_EXTERNAL; 6670d02842fSSascha Wildner break; 6680d02842fSSascha Wildner 6690d02842fSSascha Wildner case PARSEOP_DEFAULT_ARG: 6700d02842fSSascha Wildner 6711093ca81SSascha Wildner if (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC) 6720d02842fSSascha Wildner { 6730d02842fSSascha Wildner Status = LdLoadResourceElements (Op, WalkState); 6740d02842fSSascha Wildner return_ACPI_STATUS (Status); 6750d02842fSSascha Wildner } 6760d02842fSSascha Wildner 6770d02842fSSascha Wildner ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 6780d02842fSSascha Wildner break; 6790d02842fSSascha Wildner 6800d02842fSSascha Wildner case PARSEOP_SCOPE: 6810d02842fSSascha Wildner /* 6820d02842fSSascha Wildner * The name referenced by Scope(Name) must already exist at this point. 6830d02842fSSascha Wildner * In other words, forward references for Scope() are not supported. 6840d02842fSSascha Wildner * The only real reason for this is that the MS interpreter cannot 6850d02842fSSascha Wildner * handle this case. Perhaps someday this case can go away. 6860d02842fSSascha Wildner */ 6870d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 6886721db86SSascha Wildner ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &Node); 6890d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 6900d02842fSSascha Wildner { 6910d02842fSSascha Wildner if (Status == AE_NOT_FOUND) 6920d02842fSSascha Wildner { 6930d02842fSSascha Wildner /* The name was not found, go ahead and create it */ 6940d02842fSSascha Wildner 6950d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 6966721db86SSascha Wildner ACPI_TYPE_LOCAL_SCOPE, ACPI_IMODE_LOAD_PASS1, 6976721db86SSascha Wildner Flags, WalkState, &Node); 6980d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 6990d02842fSSascha Wildner { 7000d02842fSSascha Wildner return_ACPI_STATUS (Status); 7010d02842fSSascha Wildner } 7020d02842fSSascha Wildner 7036721db86SSascha Wildner /* However, this is an error -- operand to Scope must exist */ 7046721db86SSascha Wildner 7056721db86SSascha Wildner if (strlen (Op->Asl.ExternalName) == ACPI_NAME_SIZE) 7066721db86SSascha Wildner { 7070d02842fSSascha Wildner AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 7080d02842fSSascha Wildner Op->Asl.ExternalName); 7096721db86SSascha Wildner } 7106721db86SSascha Wildner else 7116721db86SSascha Wildner { 7126721db86SSascha Wildner AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, 7130d02842fSSascha Wildner Op->Asl.ExternalName); 7146721db86SSascha Wildner } 7156721db86SSascha Wildner 7160d02842fSSascha Wildner goto FinishNode; 7170d02842fSSascha Wildner } 7180d02842fSSascha Wildner 7190d02842fSSascha Wildner AslCoreSubsystemError (Op, Status, 7200d02842fSSascha Wildner "Failure from namespace lookup", FALSE); 7210d02842fSSascha Wildner 7220d02842fSSascha Wildner return_ACPI_STATUS (Status); 7230d02842fSSascha Wildner } 724820c5b08SSascha Wildner else /* Status AE_OK */ 725820c5b08SSascha Wildner { 726820c5b08SSascha Wildner /* 727820c5b08SSascha Wildner * Do not allow references to external scopes from the DSDT. 728820c5b08SSascha Wildner * This is because the DSDT is always loaded first, and the 729820c5b08SSascha Wildner * external reference cannot be resolved -- causing a runtime 730820c5b08SSascha Wildner * error because Scope() must be resolved immediately. 731820c5b08SSascha Wildner * 10/2015. 732820c5b08SSascha Wildner */ 733820c5b08SSascha Wildner if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 734806343b9SSascha Wildner (ACPI_COMPARE_NAME (AslGbl_TableSignature, "DSDT"))) 735820c5b08SSascha Wildner { 736820c5b08SSascha Wildner /* However, allowed if the reference is within a method */ 737820c5b08SSascha Wildner 738820c5b08SSascha Wildner MethodOp = Op->Asl.Parent; 739820c5b08SSascha Wildner while (MethodOp && 740820c5b08SSascha Wildner (MethodOp->Asl.ParseOpcode != PARSEOP_METHOD)) 741820c5b08SSascha Wildner { 742820c5b08SSascha Wildner MethodOp = MethodOp->Asl.Parent; 743820c5b08SSascha Wildner } 744820c5b08SSascha Wildner 745820c5b08SSascha Wildner if (!MethodOp) 746820c5b08SSascha Wildner { 747820c5b08SSascha Wildner /* Not in a control method, error */ 748820c5b08SSascha Wildner 749820c5b08SSascha Wildner AslError (ASL_ERROR, ASL_MSG_CROSS_TABLE_SCOPE, Op, NULL); 750820c5b08SSascha Wildner } 751820c5b08SSascha Wildner } 752820c5b08SSascha Wildner } 7530d02842fSSascha Wildner 7540d02842fSSascha Wildner /* We found a node with this name, now check the type */ 7550d02842fSSascha Wildner 7560d02842fSSascha Wildner switch (Node->Type) 7570d02842fSSascha Wildner { 7580d02842fSSascha Wildner case ACPI_TYPE_LOCAL_SCOPE: 7590d02842fSSascha Wildner case ACPI_TYPE_DEVICE: 7600d02842fSSascha Wildner case ACPI_TYPE_POWER: 7610d02842fSSascha Wildner case ACPI_TYPE_PROCESSOR: 7620d02842fSSascha Wildner case ACPI_TYPE_THERMAL: 7630d02842fSSascha Wildner 7640d02842fSSascha Wildner /* These are acceptable types - they all open a new scope */ 7650d02842fSSascha Wildner break; 7660d02842fSSascha Wildner 7670d02842fSSascha Wildner case ACPI_TYPE_INTEGER: 7680d02842fSSascha Wildner case ACPI_TYPE_STRING: 7690d02842fSSascha Wildner case ACPI_TYPE_BUFFER: 7700d02842fSSascha Wildner /* 7710d02842fSSascha Wildner * These types we will allow, but we will change the type. 7720d02842fSSascha Wildner * This enables some existing code of the form: 7730d02842fSSascha Wildner * 7740d02842fSSascha Wildner * Name (DEB, 0) 7750d02842fSSascha Wildner * Scope (DEB) { ... } 7760d02842fSSascha Wildner * 7770d02842fSSascha Wildner * Which is used to workaround the fact that the MS interpreter 7780d02842fSSascha Wildner * does not allow Scope() forward references. 7790d02842fSSascha Wildner */ 780806343b9SSascha Wildner sprintf (AslGbl_MsgBuffer, "%s [%s], changing type to [Scope]", 7810d02842fSSascha Wildner Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type)); 782806343b9SSascha Wildner AslError (ASL_REMARK, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer); 7830d02842fSSascha Wildner 7840d02842fSSascha Wildner /* Switch the type to scope, open the new scope */ 7850d02842fSSascha Wildner 7860d02842fSSascha Wildner Node->Type = ACPI_TYPE_LOCAL_SCOPE; 7870d02842fSSascha Wildner Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 7880d02842fSSascha Wildner WalkState); 7890d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 7900d02842fSSascha Wildner { 7910d02842fSSascha Wildner return_ACPI_STATUS (Status); 7920d02842fSSascha Wildner } 7930d02842fSSascha Wildner break; 7940d02842fSSascha Wildner 7950d02842fSSascha Wildner default: 7960d02842fSSascha Wildner 7970d02842fSSascha Wildner /* All other types are an error */ 7980d02842fSSascha Wildner 799806343b9SSascha Wildner sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName, 8000d02842fSSascha Wildner AcpiUtGetTypeName (Node->Type)); 801806343b9SSascha Wildner AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer); 8020d02842fSSascha Wildner 8030d02842fSSascha Wildner /* 8040d02842fSSascha Wildner * However, switch the type to be an actual scope so 8050d02842fSSascha Wildner * that compilation can continue without generating a whole 8060d02842fSSascha Wildner * cascade of additional errors. Open the new scope. 8070d02842fSSascha Wildner */ 8080d02842fSSascha Wildner Node->Type = ACPI_TYPE_LOCAL_SCOPE; 8090d02842fSSascha Wildner Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 8100d02842fSSascha Wildner WalkState); 8110d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 8120d02842fSSascha Wildner { 8130d02842fSSascha Wildner return_ACPI_STATUS (Status); 8140d02842fSSascha Wildner } 8150d02842fSSascha Wildner break; 8160d02842fSSascha Wildner } 8170d02842fSSascha Wildner 8180d02842fSSascha Wildner Status = AE_OK; 8190d02842fSSascha Wildner goto FinishNode; 8200d02842fSSascha Wildner 8210d02842fSSascha Wildner default: 8220d02842fSSascha Wildner 8230d02842fSSascha Wildner ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 8240d02842fSSascha Wildner break; 8250d02842fSSascha Wildner } 8260d02842fSSascha Wildner 8270d02842fSSascha Wildner ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n", 8280d02842fSSascha Wildner Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType))); 8290d02842fSSascha Wildner 8300d02842fSSascha Wildner /* The name must not already exist */ 8310d02842fSSascha Wildner 8320d02842fSSascha Wildner Flags |= ACPI_NS_ERROR_IF_FOUND; 8330d02842fSSascha Wildner 8340d02842fSSascha Wildner /* 8356721db86SSascha Wildner * For opcodes that enter new names into the namespace, 8366721db86SSascha Wildner * all prefix NameSegs must exist. 8376721db86SSascha Wildner */ 8386721db86SSascha Wildner WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); 8396721db86SSascha Wildner if (((WalkState->OpInfo->Flags & AML_NAMED) || 8406721db86SSascha Wildner (WalkState->OpInfo->Flags & AML_CREATE)) && 8416721db86SSascha Wildner (Op->Asl.AmlOpcode != AML_EXTERNAL_OP)) 8426721db86SSascha Wildner { 8436721db86SSascha Wildner Flags |= ACPI_NS_PREFIX_MUST_EXIST; 8446721db86SSascha Wildner } 8456721db86SSascha Wildner 8466721db86SSascha Wildner /* 8470d02842fSSascha Wildner * Enter the named type into the internal namespace. We enter the name 8480d02842fSSascha Wildner * as we go downward in the parse tree. Any necessary subobjects that 8490d02842fSSascha Wildner * involve arguments to the opcode must be created as we go back up the 8500d02842fSSascha Wildner * parse tree later. 8510d02842fSSascha Wildner */ 8520d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 8530d02842fSSascha Wildner ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node); 8540d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 8550d02842fSSascha Wildner { 8560d02842fSSascha Wildner if (Status == AE_ALREADY_EXISTS) 8570d02842fSSascha Wildner { 8580d02842fSSascha Wildner /* The name already exists in this scope */ 8590d02842fSSascha Wildner 8600d02842fSSascha Wildner if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) 8610d02842fSSascha Wildner { 8620d02842fSSascha Wildner /* Allow multiple references to the same scope */ 8630d02842fSSascha Wildner 8640d02842fSSascha Wildner Node->Type = (UINT8) ObjectType; 8650d02842fSSascha Wildner Status = AE_OK; 8660d02842fSSascha Wildner } 8670d02842fSSascha Wildner else if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 8680d02842fSSascha Wildner (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL)) 8690d02842fSSascha Wildner { 8700d02842fSSascha Wildner /* 8710d02842fSSascha Wildner * Allow one create on an object or segment that was 8726e376582SSascha Wildner * previously declared External 8730d02842fSSascha Wildner */ 8740d02842fSSascha Wildner Node->Flags &= ~ANOBJ_IS_EXTERNAL; 8750d02842fSSascha Wildner Node->Type = (UINT8) ObjectType; 8760d02842fSSascha Wildner 8770d02842fSSascha Wildner /* Just retyped a node, probably will need to open a scope */ 8780d02842fSSascha Wildner 8790d02842fSSascha Wildner if (AcpiNsOpensScope (ObjectType)) 8800d02842fSSascha Wildner { 8810d02842fSSascha Wildner Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 8820d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 8830d02842fSSascha Wildner { 8840d02842fSSascha Wildner return_ACPI_STATUS (Status); 8850d02842fSSascha Wildner } 8860d02842fSSascha Wildner } 887820c5b08SSascha Wildner 888820c5b08SSascha Wildner Status = AE_OK; 889820c5b08SSascha Wildner } 890820c5b08SSascha Wildner else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) && 891820c5b08SSascha Wildner (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)) 892820c5b08SSascha Wildner { 893820c5b08SSascha Wildner /* 894820c5b08SSascha Wildner * Allow externals in same scope as the definition of the 895820c5b08SSascha Wildner * actual object. Similar to C. Allows multiple definition 8966e376582SSascha Wildner * blocks that refer to each other in the same file. 897820c5b08SSascha Wildner */ 8980d02842fSSascha Wildner Status = AE_OK; 8990d02842fSSascha Wildner } 9002ffe9f16SSascha Wildner else if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 9012ffe9f16SSascha Wildner (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) && 9022ffe9f16SSascha Wildner (ObjectType == ACPI_TYPE_ANY)) 9032ffe9f16SSascha Wildner { 9046e376582SSascha Wildner /* Allow update of externals of unknown type. */ 9052ffe9f16SSascha Wildner 9062ffe9f16SSascha Wildner if (AcpiNsOpensScope (ActualObjectType)) 9072ffe9f16SSascha Wildner { 9082ffe9f16SSascha Wildner Node->Type = (UINT8) ActualObjectType; 9092ffe9f16SSascha Wildner Status = AE_OK; 9102ffe9f16SSascha Wildner } 9112ffe9f16SSascha Wildner else 9122ffe9f16SSascha Wildner { 913806343b9SSascha Wildner sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName, 9142ffe9f16SSascha Wildner AcpiUtGetTypeName (Node->Type)); 915806343b9SSascha Wildner AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer); 9162ffe9f16SSascha Wildner return_ACPI_STATUS (AE_OK); 9172ffe9f16SSascha Wildner } 9182ffe9f16SSascha Wildner } 9190d02842fSSascha Wildner else 9200d02842fSSascha Wildner { 9210d02842fSSascha Wildner /* Valid error, object already exists */ 9220d02842fSSascha Wildner 9237bcb6cafSSascha Wildner AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, 9247bcb6cafSSascha Wildner Op->Asl.ExternalName, ASL_MSG_FOUND_HERE, Node->Op, 9257bcb6cafSSascha Wildner Node->Op->Asl.ExternalName); 9260d02842fSSascha Wildner return_ACPI_STATUS (AE_OK); 9270d02842fSSascha Wildner } 9280d02842fSSascha Wildner } 9296721db86SSascha Wildner else if (AE_NOT_FOUND) 9306721db86SSascha Wildner { 9316721db86SSascha Wildner /* 9326721db86SSascha Wildner * One or more prefix NameSegs of the NamePath do not exist 9336721db86SSascha Wildner * (all of them must exist). Attempt to continue compilation 9346721db86SSascha Wildner * by setting the current scope to the root. 9356721db86SSascha Wildner */ 9366721db86SSascha Wildner Node = AcpiGbl_RootNode; 9376721db86SSascha Wildner Status = AE_OK; 9386721db86SSascha Wildner } 9390d02842fSSascha Wildner else 9400d02842fSSascha Wildner { 9416721db86SSascha Wildner /* Flag all other errors as coming from the ACPICA core */ 9426721db86SSascha Wildner 9430d02842fSSascha Wildner AslCoreSubsystemError (Op, Status, 9440d02842fSSascha Wildner "Failure from namespace lookup", FALSE); 9450d02842fSSascha Wildner return_ACPI_STATUS (Status); 9460d02842fSSascha Wildner } 9470d02842fSSascha Wildner } 9480d02842fSSascha Wildner 9490d02842fSSascha Wildner if (ForceNewScope) 9500d02842fSSascha Wildner { 9510d02842fSSascha Wildner Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 9520d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 9530d02842fSSascha Wildner { 9540d02842fSSascha Wildner return_ACPI_STATUS (Status); 9550d02842fSSascha Wildner } 9560d02842fSSascha Wildner } 9570d02842fSSascha Wildner 9580d02842fSSascha Wildner FinishNode: 9590d02842fSSascha Wildner /* 9600d02842fSSascha Wildner * Point the parse node to the new namespace node, and point 9610d02842fSSascha Wildner * the Node back to the original Parse node 9620d02842fSSascha Wildner */ 9630d02842fSSascha Wildner Op->Asl.Node = Node; 9640d02842fSSascha Wildner Node->Op = Op; 9650d02842fSSascha Wildner 9660d02842fSSascha Wildner /* Set the actual data type if appropriate (EXTERNAL term only) */ 9670d02842fSSascha Wildner 9680d02842fSSascha Wildner if (ActualObjectType != ACPI_TYPE_ANY) 9690d02842fSSascha Wildner { 9700d02842fSSascha Wildner Node->Type = (UINT8) ActualObjectType; 9710d02842fSSascha Wildner Node->Value = ASL_EXTERNAL_METHOD; 9720d02842fSSascha Wildner } 9730d02842fSSascha Wildner 9740d02842fSSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_METHOD) 9750d02842fSSascha Wildner { 9760d02842fSSascha Wildner /* 9770d02842fSSascha Wildner * Get the method argument count from "Extra" and save 9780d02842fSSascha Wildner * it in the namespace node 9790d02842fSSascha Wildner */ 9800d02842fSSascha Wildner Node->Value = (UINT32) Op->Asl.Extra; 9810d02842fSSascha Wildner } 9820d02842fSSascha Wildner 9830d02842fSSascha Wildner return_ACPI_STATUS (Status); 9840d02842fSSascha Wildner } 9850d02842fSSascha Wildner 9860d02842fSSascha Wildner 9870d02842fSSascha Wildner /******************************************************************************* 9880d02842fSSascha Wildner * 9890d02842fSSascha Wildner * FUNCTION: LdNamespace2Begin 9900d02842fSSascha Wildner * 9910d02842fSSascha Wildner * PARAMETERS: ASL_WALK_CALLBACK 9920d02842fSSascha Wildner * 9930d02842fSSascha Wildner * RETURN: Status 9940d02842fSSascha Wildner * 9950d02842fSSascha Wildner * DESCRIPTION: Descending callback used during the pass 2 parse tree walk. 9960d02842fSSascha Wildner * Second pass resolves some forward references. 9970d02842fSSascha Wildner * 9980d02842fSSascha Wildner * Notes: 9990d02842fSSascha Wildner * Currently only needs to handle the Alias operator. 10000d02842fSSascha Wildner * Could be used to allow forward references from the Scope() operator, but 10010d02842fSSascha Wildner * the MS interpreter does not allow this, so this compiler does not either. 10020d02842fSSascha Wildner * 10030d02842fSSascha Wildner ******************************************************************************/ 10040d02842fSSascha Wildner 10050d02842fSSascha Wildner static ACPI_STATUS 10060d02842fSSascha Wildner LdNamespace2Begin ( 10070d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 10080d02842fSSascha Wildner UINT32 Level, 10090d02842fSSascha Wildner void *Context) 10100d02842fSSascha Wildner { 10110d02842fSSascha Wildner ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 10120d02842fSSascha Wildner ACPI_STATUS Status; 10130d02842fSSascha Wildner ACPI_NAMESPACE_NODE *Node; 10140d02842fSSascha Wildner ACPI_OBJECT_TYPE ObjectType; 10150d02842fSSascha Wildner BOOLEAN ForceNewScope = FALSE; 10160d02842fSSascha Wildner ACPI_PARSE_OBJECT *Arg; 10170d02842fSSascha Wildner char *Path; 10180d02842fSSascha Wildner ACPI_NAMESPACE_NODE *TargetNode; 10190d02842fSSascha Wildner 10200d02842fSSascha Wildner 10210d02842fSSascha Wildner ACPI_FUNCTION_NAME (LdNamespace2Begin); 10220d02842fSSascha Wildner ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 10230d02842fSSascha Wildner Op, Op->Asl.ParseOpName)); 10240d02842fSSascha Wildner 10250d02842fSSascha Wildner 10260d02842fSSascha Wildner /* Ignore Ops with no namespace node */ 10270d02842fSSascha Wildner 10280d02842fSSascha Wildner Node = Op->Asl.Node; 10290d02842fSSascha Wildner if (!Node) 10300d02842fSSascha Wildner { 10310d02842fSSascha Wildner return (AE_OK); 10320d02842fSSascha Wildner } 10330d02842fSSascha Wildner 10340d02842fSSascha Wildner /* Get the type to determine if we should push the scope */ 10350d02842fSSascha Wildner 10360d02842fSSascha Wildner if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 10371093ca81SSascha Wildner (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC)) 10380d02842fSSascha Wildner { 10390d02842fSSascha Wildner ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 10400d02842fSSascha Wildner } 10410d02842fSSascha Wildner else 10420d02842fSSascha Wildner { 10430d02842fSSascha Wildner ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 10440d02842fSSascha Wildner } 10450d02842fSSascha Wildner 10460d02842fSSascha Wildner /* Push scope for Resource Templates */ 10470d02842fSSascha Wildner 10480d02842fSSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_NAME) 10490d02842fSSascha Wildner { 10501093ca81SSascha Wildner if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC) 10510d02842fSSascha Wildner { 10520d02842fSSascha Wildner ForceNewScope = TRUE; 10530d02842fSSascha Wildner } 10540d02842fSSascha Wildner } 10550d02842fSSascha Wildner 10560d02842fSSascha Wildner /* Push the scope stack */ 10570d02842fSSascha Wildner 10580d02842fSSascha Wildner if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 10590d02842fSSascha Wildner { 10600d02842fSSascha Wildner Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 10610d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 10620d02842fSSascha Wildner { 10630d02842fSSascha Wildner return_ACPI_STATUS (Status); 10640d02842fSSascha Wildner } 10650d02842fSSascha Wildner } 10660d02842fSSascha Wildner 10670d02842fSSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_ALIAS) 10680d02842fSSascha Wildner { 10696721db86SSascha Wildner /* 10706721db86SSascha Wildner * Complete the alias node by getting and saving the target node. 10716721db86SSascha Wildner * First child is the alias target 10726721db86SSascha Wildner */ 10730d02842fSSascha Wildner Arg = Op->Asl.Child; 10740d02842fSSascha Wildner 10750d02842fSSascha Wildner /* Get the target pathname */ 10760d02842fSSascha Wildner 10770d02842fSSascha Wildner Path = Arg->Asl.Namepath; 10780d02842fSSascha Wildner if (!Path) 10790d02842fSSascha Wildner { 10800d02842fSSascha Wildner Status = UtInternalizeName (Arg->Asl.ExternalName, &Path); 10810d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 10820d02842fSSascha Wildner { 10830d02842fSSascha Wildner return (Status); 10840d02842fSSascha Wildner } 10850d02842fSSascha Wildner } 10860d02842fSSascha Wildner 10870d02842fSSascha Wildner /* Get the NS node associated with the target. It must exist. */ 10880d02842fSSascha Wildner 10890d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 10900d02842fSSascha Wildner ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 10910d02842fSSascha Wildner WalkState, &TargetNode); 10920d02842fSSascha Wildner if (ACPI_FAILURE (Status)) 10930d02842fSSascha Wildner { 10940d02842fSSascha Wildner if (Status == AE_NOT_FOUND) 10950d02842fSSascha Wildner { 10966721db86SSascha Wildner /* Standalone NameSeg vs. NamePath */ 10970d02842fSSascha Wildner 10986721db86SSascha Wildner if (strlen (Arg->Asl.ExternalName) == ACPI_NAME_SIZE) 10996721db86SSascha Wildner { 11006721db86SSascha Wildner AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 11016721db86SSascha Wildner Arg->Asl.ExternalName); 11026721db86SSascha Wildner } 11036721db86SSascha Wildner else 11046721db86SSascha Wildner { 11056721db86SSascha Wildner AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, 11066721db86SSascha Wildner Arg->Asl.ExternalName); 11076721db86SSascha Wildner } 11086721db86SSascha Wildner 11096721db86SSascha Wildner #if 0 11106721db86SSascha Wildner /* 11116721db86SSascha Wildner * NOTE: Removed 10/2018 to enhance compiler error reporting. No 11126721db86SSascha Wildner * regressions seen. 11136721db86SSascha Wildner */ 11140d02842fSSascha Wildner /* 11150d02842fSSascha Wildner * The name was not found, go ahead and create it. 11160d02842fSSascha Wildner * This prevents more errors later. 11170d02842fSSascha Wildner */ 11180d02842fSSascha Wildner Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 11196721db86SSascha Wildner ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, 11206721db86SSascha Wildner ACPI_NS_NO_UPSEARCH, WalkState, &Node); 11216721db86SSascha Wildner #endif 11226721db86SSascha Wildner return (Status); 11236721db86SSascha Wildner /* Removed: return (AE_OK)*/ 11240d02842fSSascha Wildner } 11250d02842fSSascha Wildner 11260d02842fSSascha Wildner AslCoreSubsystemError (Op, Status, 11270d02842fSSascha Wildner "Failure from namespace lookup", FALSE); 11280d02842fSSascha Wildner return (AE_OK); 11290d02842fSSascha Wildner } 11300d02842fSSascha Wildner 11310d02842fSSascha Wildner /* Save the target node within the alias node */ 11320d02842fSSascha Wildner 11330d02842fSSascha Wildner Node->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode); 11340d02842fSSascha Wildner } 11350d02842fSSascha Wildner 11360d02842fSSascha Wildner return (AE_OK); 11370d02842fSSascha Wildner } 11380d02842fSSascha Wildner 11390d02842fSSascha Wildner 11400d02842fSSascha Wildner /******************************************************************************* 11410d02842fSSascha Wildner * 11420d02842fSSascha Wildner * FUNCTION: LdCommonNamespaceEnd 11430d02842fSSascha Wildner * 11440d02842fSSascha Wildner * PARAMETERS: ASL_WALK_CALLBACK 11450d02842fSSascha Wildner * 11460d02842fSSascha Wildner * RETURN: Status 11470d02842fSSascha Wildner * 11480d02842fSSascha Wildner * DESCRIPTION: Ascending callback used during the loading of the namespace, 11490d02842fSSascha Wildner * We only need to worry about managing the scope stack here. 11500d02842fSSascha Wildner * 11510d02842fSSascha Wildner ******************************************************************************/ 11520d02842fSSascha Wildner 11530d02842fSSascha Wildner static ACPI_STATUS 11540d02842fSSascha Wildner LdCommonNamespaceEnd ( 11550d02842fSSascha Wildner ACPI_PARSE_OBJECT *Op, 11560d02842fSSascha Wildner UINT32 Level, 11570d02842fSSascha Wildner void *Context) 11580d02842fSSascha Wildner { 11590d02842fSSascha Wildner ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 11600d02842fSSascha Wildner ACPI_OBJECT_TYPE ObjectType; 11610d02842fSSascha Wildner BOOLEAN ForceNewScope = FALSE; 11620d02842fSSascha Wildner 11630d02842fSSascha Wildner 11640d02842fSSascha Wildner ACPI_FUNCTION_NAME (LdCommonNamespaceEnd); 11650d02842fSSascha Wildner 11660d02842fSSascha Wildner 11670d02842fSSascha Wildner /* We are only interested in opcodes that have an associated name */ 11680d02842fSSascha Wildner 11690d02842fSSascha Wildner if (!Op->Asl.Namepath) 11700d02842fSSascha Wildner { 11710d02842fSSascha Wildner return (AE_OK); 11720d02842fSSascha Wildner } 11730d02842fSSascha Wildner 11740d02842fSSascha Wildner /* Get the type to determine if we should pop the scope */ 11750d02842fSSascha Wildner 11760d02842fSSascha Wildner if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 11771093ca81SSascha Wildner (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC)) 11780d02842fSSascha Wildner { 11790d02842fSSascha Wildner /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */ 11800d02842fSSascha Wildner 11810d02842fSSascha Wildner ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 11820d02842fSSascha Wildner } 11830d02842fSSascha Wildner else 11840d02842fSSascha Wildner { 11850d02842fSSascha Wildner ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 11860d02842fSSascha Wildner } 11870d02842fSSascha Wildner 11880d02842fSSascha Wildner /* Pop scope that was pushed for Resource Templates */ 11890d02842fSSascha Wildner 11900d02842fSSascha Wildner if (Op->Asl.ParseOpcode == PARSEOP_NAME) 11910d02842fSSascha Wildner { 11921093ca81SSascha Wildner if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC) 11930d02842fSSascha Wildner { 11940d02842fSSascha Wildner ForceNewScope = TRUE; 11950d02842fSSascha Wildner } 11960d02842fSSascha Wildner } 11970d02842fSSascha Wildner 11980d02842fSSascha Wildner /* Pop the scope stack */ 11990d02842fSSascha Wildner 12000d02842fSSascha Wildner if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 12010d02842fSSascha Wildner { 12020d02842fSSascha Wildner ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 12030d02842fSSascha Wildner "(%s): Popping scope for Op [%s] %p\n", 12040d02842fSSascha Wildner AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op)); 12050d02842fSSascha Wildner 12060d02842fSSascha Wildner (void) AcpiDsScopeStackPop (WalkState); 12070d02842fSSascha Wildner } 12080d02842fSSascha Wildner 12090d02842fSSascha Wildner return (AE_OK); 12100d02842fSSascha Wildner } 1211