xref: /dflybsd-src/sys/contrib/dev/acpica/source/compiler/aslload.c (revision 2e2672b8ac84e7b2eabb70df2699316280b75ff5)
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