xref: /freebsd-src/sys/contrib/dev/acpica/compiler/aslload.c (revision f8146b882bc156c1d8ddf14bbea67253ebc064bb)
153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
353289f6aSNate Lawson  * Module Name: dswload - Dispatcher namespace load callbacks
453289f6aSNate Lawson  *
553289f6aSNate Lawson  *****************************************************************************/
653289f6aSNate Lawson 
7d244b227SJung-uk Kim /*
8*f8146b88SJung-uk Kim  * Copyright (C) 2000 - 2016, Intel Corp.
953289f6aSNate Lawson  * All rights reserved.
1053289f6aSNate Lawson  *
11d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
13d244b227SJung-uk Kim  * are met:
14d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16d244b227SJung-uk Kim  *    without modification.
17d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21d244b227SJung-uk Kim  *    binary redistribution.
22d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24d244b227SJung-uk Kim  *    from this software without specific prior written permission.
2553289f6aSNate Lawson  *
26d244b227SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28d244b227SJung-uk Kim  * Software Foundation.
2953289f6aSNate Lawson  *
30d244b227SJung-uk Kim  * NO WARRANTY
31d244b227SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32d244b227SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33d244b227SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34d244b227SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35d244b227SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36d244b227SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37d244b227SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38d244b227SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39d244b227SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40d244b227SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41d244b227SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42d244b227SJung-uk Kim  */
4353289f6aSNate Lawson 
44ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
45ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h>
47ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
4853289f6aSNate Lawson 
4953289f6aSNate Lawson #include "aslcompiler.y.h"
5053289f6aSNate Lawson 
5153289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
5253289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslload")
5353289f6aSNate Lawson 
54fba7fc7eSJung-uk Kim /* Local prototypes */
55fba7fc7eSJung-uk Kim 
56fba7fc7eSJung-uk Kim static ACPI_STATUS
57fba7fc7eSJung-uk Kim LdLoadFieldElements (
58fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
59fba7fc7eSJung-uk Kim     ACPI_WALK_STATE         *WalkState);
60fba7fc7eSJung-uk Kim 
61fba7fc7eSJung-uk Kim static ACPI_STATUS
62fba7fc7eSJung-uk Kim LdLoadResourceElements (
63fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
64fba7fc7eSJung-uk Kim     ACPI_WALK_STATE         *WalkState);
65fba7fc7eSJung-uk Kim 
66fba7fc7eSJung-uk Kim static ACPI_STATUS
67fba7fc7eSJung-uk Kim LdNamespace1Begin (
68fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
69fba7fc7eSJung-uk Kim     UINT32                  Level,
70fba7fc7eSJung-uk Kim     void                    *Context);
71fba7fc7eSJung-uk Kim 
72fba7fc7eSJung-uk Kim static ACPI_STATUS
73a9f12690SJung-uk Kim LdNamespace2Begin (
74a9f12690SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
75a9f12690SJung-uk Kim     UINT32                  Level,
76a9f12690SJung-uk Kim     void                    *Context);
77a9f12690SJung-uk Kim 
78a9f12690SJung-uk Kim static ACPI_STATUS
79a9f12690SJung-uk Kim LdCommonNamespaceEnd (
80fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
81fba7fc7eSJung-uk Kim     UINT32                  Level,
82fba7fc7eSJung-uk Kim     void                    *Context);
83fba7fc7eSJung-uk Kim 
8453289f6aSNate Lawson 
8553289f6aSNate Lawson /*******************************************************************************
8653289f6aSNate Lawson  *
8753289f6aSNate Lawson  * FUNCTION:    LdLoadNamespace
8853289f6aSNate Lawson  *
89fba7fc7eSJung-uk Kim  * PARAMETERS:  RootOp      - Root of the parse tree
9053289f6aSNate Lawson  *
9153289f6aSNate Lawson  * RETURN:      Status
9253289f6aSNate Lawson  *
9353289f6aSNate Lawson  * DESCRIPTION: Perform a walk of the parse tree that in turn loads all of the
9453289f6aSNate Lawson  *              named ASL/AML objects into the namespace. The namespace is
9553289f6aSNate Lawson  *              constructed in order to resolve named references and references
9653289f6aSNate Lawson  *              to named fields within resource templates/descriptors.
9753289f6aSNate Lawson  *
9853289f6aSNate Lawson  ******************************************************************************/
9953289f6aSNate Lawson 
10053289f6aSNate Lawson ACPI_STATUS
10153289f6aSNate Lawson LdLoadNamespace (
10253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *RootOp)
10353289f6aSNate Lawson {
10453289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState;
10553289f6aSNate Lawson 
10653289f6aSNate Lawson 
10753289f6aSNate Lawson     /* Create a new walk state */
10853289f6aSNate Lawson 
10953289f6aSNate Lawson     WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
11053289f6aSNate Lawson     if (!WalkState)
11153289f6aSNate Lawson     {
1128ef1a331SJung-uk Kim         return (AE_NO_MEMORY);
11353289f6aSNate Lawson     }
11453289f6aSNate Lawson 
115a9f12690SJung-uk Kim     /* Walk the entire parse tree, first pass */
11653289f6aSNate Lawson 
11753289f6aSNate Lawson     TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace1Begin,
118a9f12690SJung-uk Kim         LdCommonNamespaceEnd, WalkState);
119a9f12690SJung-uk Kim 
120a9f12690SJung-uk Kim     /* Second pass to handle forward references */
121a9f12690SJung-uk Kim 
122a9f12690SJung-uk Kim     TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace2Begin,
123a9f12690SJung-uk Kim         LdCommonNamespaceEnd, WalkState);
12453289f6aSNate Lawson 
12553289f6aSNate Lawson     /* Dump the namespace if debug is enabled */
12653289f6aSNate Lawson 
12753289f6aSNate Lawson     AcpiNsDumpTables (ACPI_NS_ALL, ACPI_UINT32_MAX);
128313a0c13SJung-uk Kim     ACPI_FREE (WalkState);
1298ef1a331SJung-uk Kim     return (AE_OK);
13053289f6aSNate Lawson }
13153289f6aSNate Lawson 
13253289f6aSNate Lawson 
13353289f6aSNate Lawson /*******************************************************************************
13453289f6aSNate Lawson  *
13553289f6aSNate Lawson  * FUNCTION:    LdLoadFieldElements
13653289f6aSNate Lawson  *
13753289f6aSNate Lawson  * PARAMETERS:  Op              - Parent node (Field)
13853289f6aSNate Lawson  *              WalkState       - Current walk state
13953289f6aSNate Lawson  *
14053289f6aSNate Lawson  * RETURN:      Status
14153289f6aSNate Lawson  *
14253289f6aSNate Lawson  * DESCRIPTION: Enter the named elements of the field (children of the parent)
14353289f6aSNate Lawson  *              into the namespace.
14453289f6aSNate Lawson  *
14553289f6aSNate Lawson  ******************************************************************************/
14653289f6aSNate Lawson 
147fba7fc7eSJung-uk Kim static ACPI_STATUS
14853289f6aSNate Lawson LdLoadFieldElements (
14953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
15053289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState)
15153289f6aSNate Lawson {
15253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Child = NULL;
15353289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node;
15453289f6aSNate Lawson     ACPI_STATUS             Status;
15553289f6aSNate Lawson 
15653289f6aSNate Lawson 
15753289f6aSNate Lawson     /* Get the first named field element */
15853289f6aSNate Lawson 
15953289f6aSNate Lawson     switch (Op->Asl.AmlOpcode)
16053289f6aSNate Lawson     {
16153289f6aSNate Lawson     case AML_BANK_FIELD_OP:
16253289f6aSNate Lawson 
16353289f6aSNate Lawson         Child = UtGetArg (Op, 6);
16453289f6aSNate Lawson         break;
16553289f6aSNate Lawson 
16653289f6aSNate Lawson     case AML_INDEX_FIELD_OP:
16753289f6aSNate Lawson 
16853289f6aSNate Lawson         Child = UtGetArg (Op, 5);
16953289f6aSNate Lawson         break;
17053289f6aSNate Lawson 
17153289f6aSNate Lawson     case AML_FIELD_OP:
17253289f6aSNate Lawson 
17353289f6aSNate Lawson         Child = UtGetArg (Op, 4);
17453289f6aSNate Lawson         break;
17553289f6aSNate Lawson 
17653289f6aSNate Lawson     default:
177a9d8d09cSJung-uk Kim 
17853289f6aSNate Lawson         /* No other opcodes should arrive here */
179a9d8d09cSJung-uk Kim 
18053289f6aSNate Lawson         return (AE_BAD_PARAMETER);
18153289f6aSNate Lawson     }
18253289f6aSNate Lawson 
18353289f6aSNate Lawson     /* Enter all elements into the namespace */
18453289f6aSNate Lawson 
18553289f6aSNate Lawson     while (Child)
18653289f6aSNate Lawson     {
18753289f6aSNate Lawson         switch (Child->Asl.AmlOpcode)
18853289f6aSNate Lawson         {
18953289f6aSNate Lawson         case AML_INT_RESERVEDFIELD_OP:
19053289f6aSNate Lawson         case AML_INT_ACCESSFIELD_OP:
1913f0275a0SJung-uk Kim         case AML_INT_CONNECTION_OP:
19253289f6aSNate Lawson             break;
19353289f6aSNate Lawson 
19453289f6aSNate Lawson         default:
19553289f6aSNate Lawson 
196fba7fc7eSJung-uk Kim             Status = AcpiNsLookup (WalkState->ScopeInfo,
197fba7fc7eSJung-uk Kim                 Child->Asl.Value.String,
198fba7fc7eSJung-uk Kim                 ACPI_TYPE_LOCAL_REGION_FIELD,
199fba7fc7eSJung-uk Kim                 ACPI_IMODE_LOAD_PASS1,
200fba7fc7eSJung-uk Kim                 ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
201*f8146b88SJung-uk Kim                     ACPI_NS_ERROR_IF_FOUND, NULL, &Node);
20253289f6aSNate Lawson             if (ACPI_FAILURE (Status))
20353289f6aSNate Lawson             {
20453289f6aSNate Lawson                 if (Status != AE_ALREADY_EXISTS)
20553289f6aSNate Lawson                 {
206fba7fc7eSJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Child,
207fba7fc7eSJung-uk Kim                         Child->Asl.Value.String);
20853289f6aSNate Lawson                     return (Status);
20953289f6aSNate Lawson                 }
21053289f6aSNate Lawson 
21153289f6aSNate Lawson                 /*
21253289f6aSNate Lawson                  * The name already exists in this scope
21353289f6aSNate Lawson                  * But continue processing the elements
21453289f6aSNate Lawson                  */
215fba7fc7eSJung-uk Kim                 AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child,
216fba7fc7eSJung-uk Kim                     Child->Asl.Value.String);
21753289f6aSNate Lawson             }
21853289f6aSNate Lawson             else
21953289f6aSNate Lawson             {
22053289f6aSNate Lawson                 Child->Asl.Node = Node;
221fba7fc7eSJung-uk Kim                 Node->Op = Child;
22253289f6aSNate Lawson             }
22353289f6aSNate Lawson             break;
22453289f6aSNate Lawson         }
2253f0275a0SJung-uk Kim 
22653289f6aSNate Lawson         Child = Child->Asl.Next;
22753289f6aSNate Lawson     }
2283f0275a0SJung-uk Kim 
22953289f6aSNate Lawson     return (AE_OK);
23053289f6aSNate Lawson }
23153289f6aSNate Lawson 
23253289f6aSNate Lawson 
23353289f6aSNate Lawson /*******************************************************************************
23453289f6aSNate Lawson  *
23553289f6aSNate Lawson  * FUNCTION:    LdLoadResourceElements
23653289f6aSNate Lawson  *
23753289f6aSNate Lawson  * PARAMETERS:  Op              - Parent node (Resource Descriptor)
23853289f6aSNate Lawson  *              WalkState       - Current walk state
23953289f6aSNate Lawson  *
24053289f6aSNate Lawson  * RETURN:      Status
24153289f6aSNate Lawson  *
24253289f6aSNate Lawson  * DESCRIPTION: Enter the named elements of the resource descriptor (children
24353289f6aSNate Lawson  *              of the parent) into the namespace.
24453289f6aSNate Lawson  *
24553289f6aSNate Lawson  * NOTE: In the real AML namespace, these named elements never exist. But
24653289f6aSNate Lawson  *       we simply use the namespace here as a symbol table so we can look
24753289f6aSNate Lawson  *       them up as they are referenced.
24853289f6aSNate Lawson  *
24953289f6aSNate Lawson  ******************************************************************************/
25053289f6aSNate Lawson 
251fba7fc7eSJung-uk Kim static ACPI_STATUS
25253289f6aSNate Lawson LdLoadResourceElements (
25353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
25453289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState)
25553289f6aSNate Lawson {
25653289f6aSNate Lawson     ACPI_PARSE_OBJECT       *InitializerOp = NULL;
25753289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node;
25853289f6aSNate Lawson     ACPI_STATUS             Status;
25953289f6aSNate Lawson 
26053289f6aSNate Lawson 
26153289f6aSNate Lawson     /*
262fba7fc7eSJung-uk Kim      * Enter the resource name into the namespace. Name must not already exist.
263fba7fc7eSJung-uk Kim      * This opens a scope, so later field names are guaranteed to be new/unique.
26453289f6aSNate Lawson      */
26553289f6aSNate Lawson     Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Asl.Namepath,
266fba7fc7eSJung-uk Kim         ACPI_TYPE_LOCAL_RESOURCE, ACPI_IMODE_LOAD_PASS1,
267fba7fc7eSJung-uk Kim         ACPI_NS_NO_UPSEARCH | ACPI_NS_ERROR_IF_FOUND,
26853289f6aSNate Lawson         WalkState, &Node);
26953289f6aSNate Lawson     if (ACPI_FAILURE (Status))
27053289f6aSNate Lawson     {
271fba7fc7eSJung-uk Kim         if (Status == AE_ALREADY_EXISTS)
272fba7fc7eSJung-uk Kim         {
273fba7fc7eSJung-uk Kim             /* Actual node causing the error was saved in ParentMethod */
274fba7fc7eSJung-uk Kim 
275fba7fc7eSJung-uk Kim             AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS,
276fba7fc7eSJung-uk Kim                 (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod, Op->Asl.Namepath);
277fba7fc7eSJung-uk Kim             return (AE_OK);
278fba7fc7eSJung-uk Kim         }
27953289f6aSNate Lawson         return (Status);
28053289f6aSNate Lawson     }
28153289f6aSNate Lawson 
2821a39cfb0SJung-uk Kim     Node->Value = (UINT32) Op->Asl.Value.Integer;
2831a39cfb0SJung-uk Kim     Node->Op = Op;
284d6dd1baeSJung-uk Kim     Op->Asl.Node = Node;
2851a39cfb0SJung-uk Kim 
28653289f6aSNate Lawson     /*
28753289f6aSNate Lawson      * Now enter the predefined fields, for easy lookup when referenced
28853289f6aSNate Lawson      * by the source ASL
28953289f6aSNate Lawson      */
29053289f6aSNate Lawson     InitializerOp = ASL_GET_CHILD_NODE (Op);
29153289f6aSNate Lawson     while (InitializerOp)
29253289f6aSNate Lawson     {
29353289f6aSNate Lawson         if (InitializerOp->Asl.ExternalName)
29453289f6aSNate Lawson         {
29553289f6aSNate Lawson             Status = AcpiNsLookup (WalkState->ScopeInfo,
29653289f6aSNate Lawson                 InitializerOp->Asl.ExternalName,
29753289f6aSNate Lawson                 ACPI_TYPE_LOCAL_RESOURCE_FIELD,
298fba7fc7eSJung-uk Kim                 ACPI_IMODE_LOAD_PASS1,
299fba7fc7eSJung-uk Kim                 ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE,
30053289f6aSNate Lawson                 NULL, &Node);
30153289f6aSNate Lawson             if (ACPI_FAILURE (Status))
30253289f6aSNate Lawson             {
30353289f6aSNate Lawson                 return (Status);
30453289f6aSNate Lawson             }
30553289f6aSNate Lawson 
30653289f6aSNate Lawson             /*
3073f0275a0SJung-uk Kim              * Store the field offset and length in the namespace node
3083f0275a0SJung-uk Kim              * so it can be used when the field is referenced
30953289f6aSNate Lawson              */
3103f0275a0SJung-uk Kim             Node->Value = InitializerOp->Asl.Value.Tag.BitOffset;
3113f0275a0SJung-uk Kim             Node->Length = InitializerOp->Asl.Value.Tag.BitLength;
31253289f6aSNate Lawson             InitializerOp->Asl.Node = Node;
313fba7fc7eSJung-uk Kim             Node->Op = InitializerOp;
31453289f6aSNate Lawson         }
3153f0275a0SJung-uk Kim 
31653289f6aSNate Lawson         InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
31753289f6aSNate Lawson     }
31853289f6aSNate Lawson 
31953289f6aSNate Lawson     return (AE_OK);
32053289f6aSNate Lawson }
32153289f6aSNate Lawson 
32253289f6aSNate Lawson 
32353289f6aSNate Lawson /*******************************************************************************
32453289f6aSNate Lawson  *
32553289f6aSNate Lawson  * FUNCTION:    LdNamespace1Begin
32653289f6aSNate Lawson  *
32753289f6aSNate Lawson  * PARAMETERS:  ASL_WALK_CALLBACK
32853289f6aSNate Lawson  *
32953289f6aSNate Lawson  * RETURN:      Status
33053289f6aSNate Lawson  *
33153289f6aSNate Lawson  * DESCRIPTION: Descending callback used during the parse tree walk. If this
33253289f6aSNate Lawson  *              is a named AML opcode, enter into the namespace
33353289f6aSNate Lawson  *
33453289f6aSNate Lawson  ******************************************************************************/
33553289f6aSNate Lawson 
336fba7fc7eSJung-uk Kim static ACPI_STATUS
33753289f6aSNate Lawson LdNamespace1Begin (
33853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
33953289f6aSNate Lawson     UINT32                  Level,
34053289f6aSNate Lawson     void                    *Context)
34153289f6aSNate Lawson {
34253289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
34353289f6aSNate Lawson     ACPI_NAMESPACE_NODE     *Node;
344*f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *MethodOp;
34553289f6aSNate Lawson     ACPI_STATUS             Status;
34653289f6aSNate Lawson     ACPI_OBJECT_TYPE        ObjectType;
34753289f6aSNate Lawson     ACPI_OBJECT_TYPE        ActualObjectType = ACPI_TYPE_ANY;
34853289f6aSNate Lawson     char                    *Path;
34953289f6aSNate Lawson     UINT32                  Flags = ACPI_NS_NO_UPSEARCH;
35053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Arg;
35153289f6aSNate Lawson     UINT32                  i;
3521a39cfb0SJung-uk Kim     BOOLEAN                 ForceNewScope = FALSE;
35353289f6aSNate Lawson 
35453289f6aSNate Lawson 
3551a39cfb0SJung-uk Kim     ACPI_FUNCTION_NAME (LdNamespace1Begin);
35653289f6aSNate Lawson     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n",
35753289f6aSNate Lawson         Op, Op->Asl.ParseOpName));
35853289f6aSNate Lawson 
35953289f6aSNate Lawson     /*
36053289f6aSNate Lawson      * We are only interested in opcodes that have an associated name
36153289f6aSNate Lawson      * (or multiple names)
36253289f6aSNate Lawson      */
36353289f6aSNate Lawson     switch (Op->Asl.AmlOpcode)
36453289f6aSNate Lawson     {
36553289f6aSNate Lawson     case AML_BANK_FIELD_OP:
36653289f6aSNate Lawson     case AML_INDEX_FIELD_OP:
36753289f6aSNate Lawson     case AML_FIELD_OP:
36853289f6aSNate Lawson 
36953289f6aSNate Lawson         Status = LdLoadFieldElements (Op, WalkState);
37053289f6aSNate Lawson         return (Status);
37153289f6aSNate Lawson 
372313a0c13SJung-uk Kim     case AML_INT_CONNECTION_OP:
373313a0c13SJung-uk Kim 
374313a0c13SJung-uk Kim 
375313a0c13SJung-uk Kim         if (Op->Asl.Child->Asl.AmlOpcode != AML_INT_NAMEPATH_OP)
376313a0c13SJung-uk Kim         {
377313a0c13SJung-uk Kim             break;
378313a0c13SJung-uk Kim         }
379313a0c13SJung-uk Kim         Arg = Op->Asl.Child;
380313a0c13SJung-uk Kim 
381313a0c13SJung-uk Kim         Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Asl.ExternalName,
382313a0c13SJung-uk Kim             ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
383313a0c13SJung-uk Kim             WalkState, &Node);
384313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
385313a0c13SJung-uk Kim         {
386313a0c13SJung-uk Kim             break;
387313a0c13SJung-uk Kim         }
388313a0c13SJung-uk Kim 
389313a0c13SJung-uk Kim         if (Node->Type == ACPI_TYPE_BUFFER)
390313a0c13SJung-uk Kim         {
391313a0c13SJung-uk Kim             Arg->Asl.Node = Node;
392313a0c13SJung-uk Kim 
393313a0c13SJung-uk Kim             Arg = Node->Op->Asl.Child;  /* Get namepath */
394313a0c13SJung-uk Kim             Arg = Arg->Asl.Next;        /* Get actual buffer */
395313a0c13SJung-uk Kim             Arg = Arg->Asl.Child;       /* Buffer length */
396313a0c13SJung-uk Kim             Arg = Arg->Asl.Next;        /* RAW_DATA buffer */
397313a0c13SJung-uk Kim         }
398313a0c13SJung-uk Kim         break;
399313a0c13SJung-uk Kim 
40053289f6aSNate Lawson     default:
40153289f6aSNate Lawson 
40253289f6aSNate Lawson         /* All other opcodes go below */
403a9d8d09cSJung-uk Kim 
40453289f6aSNate Lawson         break;
40553289f6aSNate Lawson     }
40653289f6aSNate Lawson 
40753289f6aSNate Lawson     /* Check if this object has already been installed in the namespace */
40853289f6aSNate Lawson 
40953289f6aSNate Lawson     if (Op->Asl.Node)
41053289f6aSNate Lawson     {
41153289f6aSNate Lawson         return (AE_OK);
41253289f6aSNate Lawson     }
41353289f6aSNate Lawson 
41453289f6aSNate Lawson     Path = Op->Asl.Namepath;
41553289f6aSNate Lawson     if (!Path)
41653289f6aSNate Lawson     {
41753289f6aSNate Lawson         return (AE_OK);
41853289f6aSNate Lawson     }
41953289f6aSNate Lawson 
42053289f6aSNate Lawson     /* Map the raw opcode into an internal object type */
42153289f6aSNate Lawson 
42253289f6aSNate Lawson     switch (Op->Asl.ParseOpcode)
42353289f6aSNate Lawson     {
42453289f6aSNate Lawson     case PARSEOP_NAME:
42553289f6aSNate Lawson 
42653289f6aSNate Lawson         Arg = Op->Asl.Child;  /* Get the NameSeg/NameString node */
42753289f6aSNate Lawson         Arg = Arg->Asl.Next;  /* First peer is the object to be associated with the name */
42853289f6aSNate Lawson 
4291a39cfb0SJung-uk Kim         /*
4301a39cfb0SJung-uk Kim          * If this name refers to a ResourceTemplate, we will need to open
4311a39cfb0SJung-uk Kim          * a new scope so that the resource subfield names can be entered into
4321a39cfb0SJung-uk Kim          * the namespace underneath this name
4331a39cfb0SJung-uk Kim          */
4341a39cfb0SJung-uk Kim         if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)
4351a39cfb0SJung-uk Kim         {
4361a39cfb0SJung-uk Kim             ForceNewScope = TRUE;
4371a39cfb0SJung-uk Kim         }
4381a39cfb0SJung-uk Kim 
43953289f6aSNate Lawson         /* Get the data type associated with the named object, not the name itself */
44053289f6aSNate Lawson 
44153289f6aSNate Lawson         /* Log2 loop to convert from Btype (binary) to Etype (encoded) */
44253289f6aSNate Lawson 
44353289f6aSNate Lawson         ObjectType = 1;
44453289f6aSNate Lawson         for (i = 1; i < Arg->Asl.AcpiBtype; i *= 2)
44553289f6aSNate Lawson         {
44653289f6aSNate Lawson             ObjectType++;
44753289f6aSNate Lawson         }
44853289f6aSNate Lawson         break;
44953289f6aSNate Lawson 
45053289f6aSNate Lawson 
45153289f6aSNate Lawson     case PARSEOP_EXTERNAL:
45253289f6aSNate Lawson         /*
45353289f6aSNate Lawson          * "External" simply enters a name and type into the namespace.
45453289f6aSNate Lawson          * We must be careful to not open a new scope, however, no matter
45553289f6aSNate Lawson          * what type the external name refers to (e.g., a method)
45653289f6aSNate Lawson          *
45753289f6aSNate Lawson          * first child is name, next child is ObjectType
45853289f6aSNate Lawson          */
45953289f6aSNate Lawson         ActualObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer;
46053289f6aSNate Lawson         ObjectType = ACPI_TYPE_ANY;
46153289f6aSNate Lawson 
4621a39cfb0SJung-uk Kim         /*
4631a39cfb0SJung-uk Kim          * We will mark every new node along the path as "External". This
4641a39cfb0SJung-uk Kim          * allows some or all of the nodes to be created later in the ASL
4651a39cfb0SJung-uk Kim          * code. Handles cases like this:
4661a39cfb0SJung-uk Kim          *
4671a39cfb0SJung-uk Kim          *   External (\_SB_.PCI0.ABCD, IntObj)
4681a39cfb0SJung-uk Kim          *   Scope (_SB_)
4691a39cfb0SJung-uk Kim          *   {
4701a39cfb0SJung-uk Kim          *       Device (PCI0)
4711a39cfb0SJung-uk Kim          *       {
4721a39cfb0SJung-uk Kim          *       }
4731a39cfb0SJung-uk Kim          *   }
4741a39cfb0SJung-uk Kim          *   Method (X)
4751a39cfb0SJung-uk Kim          *   {
4761a39cfb0SJung-uk Kim          *       Store (\_SB_.PCI0.ABCD, Local0)
4771a39cfb0SJung-uk Kim          *   }
4781a39cfb0SJung-uk Kim          */
4791a39cfb0SJung-uk Kim         Flags |= ACPI_NS_EXTERNAL;
4801a39cfb0SJung-uk Kim         break;
48153289f6aSNate Lawson 
48253289f6aSNate Lawson     case PARSEOP_DEFAULT_ARG:
48353289f6aSNate Lawson 
48453289f6aSNate Lawson         if (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC)
48553289f6aSNate Lawson         {
48653289f6aSNate Lawson             Status = LdLoadResourceElements (Op, WalkState);
4879a179dd8SJung-uk Kim             return_ACPI_STATUS (Status);
48853289f6aSNate Lawson         }
48953289f6aSNate Lawson 
49053289f6aSNate Lawson         ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
49153289f6aSNate Lawson         break;
49253289f6aSNate Lawson 
49353289f6aSNate Lawson     case PARSEOP_SCOPE:
49453289f6aSNate Lawson         /*
49553289f6aSNate Lawson          * The name referenced by Scope(Name) must already exist at this point.
49653289f6aSNate Lawson          * In other words, forward references for Scope() are not supported.
49753289f6aSNate Lawson          * The only real reason for this is that the MS interpreter cannot
49853289f6aSNate Lawson          * handle this case. Perhaps someday this case can go away.
49953289f6aSNate Lawson          */
50053289f6aSNate Lawson         Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
501fba7fc7eSJung-uk Kim             ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
502fba7fc7eSJung-uk Kim             WalkState, &(Node));
50353289f6aSNate Lawson         if (ACPI_FAILURE (Status))
50453289f6aSNate Lawson         {
50553289f6aSNate Lawson             if (Status == AE_NOT_FOUND)
50653289f6aSNate Lawson             {
50753289f6aSNate Lawson                 /* The name was not found, go ahead and create it */
50853289f6aSNate Lawson 
509fba7fc7eSJung-uk Kim                 Status = AcpiNsLookup (WalkState->ScopeInfo, Path,
510fba7fc7eSJung-uk Kim                     ACPI_TYPE_LOCAL_SCOPE,
511fba7fc7eSJung-uk Kim                     ACPI_IMODE_LOAD_PASS1, Flags,
512fba7fc7eSJung-uk Kim                     WalkState, &(Node));
51379c6d946SJung-uk Kim                 if (ACPI_FAILURE (Status))
51479c6d946SJung-uk Kim                 {
51579c6d946SJung-uk Kim                     return_ACPI_STATUS (Status);
51679c6d946SJung-uk Kim                 }
51753289f6aSNate Lawson 
51853289f6aSNate Lawson                 /*
51953289f6aSNate Lawson                  * However, this is an error -- primarily because the MS
52053289f6aSNate Lawson                  * interpreter can't handle a forward reference from the
52153289f6aSNate Lawson                  * Scope() operator.
52253289f6aSNate Lawson                  */
523fba7fc7eSJung-uk Kim                 AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op,
524fba7fc7eSJung-uk Kim                     Op->Asl.ExternalName);
525fba7fc7eSJung-uk Kim                 AslError (ASL_ERROR, ASL_MSG_SCOPE_FWD_REF, Op,
526fba7fc7eSJung-uk Kim                     Op->Asl.ExternalName);
52753289f6aSNate Lawson                 goto FinishNode;
52853289f6aSNate Lawson             }
52953289f6aSNate Lawson 
530f556842eSJung-uk Kim             AslCoreSubsystemError (Op, Status,
531f556842eSJung-uk Kim                 "Failure from namespace lookup", FALSE);
532f556842eSJung-uk Kim 
5339a179dd8SJung-uk Kim             return_ACPI_STATUS (Status);
53453289f6aSNate Lawson         }
535*f8146b88SJung-uk Kim         else /* Status AE_OK */
536*f8146b88SJung-uk Kim         {
537*f8146b88SJung-uk Kim             /*
538*f8146b88SJung-uk Kim              * Do not allow references to external scopes from the DSDT.
539*f8146b88SJung-uk Kim              * This is because the DSDT is always loaded first, and the
540*f8146b88SJung-uk Kim              * external reference cannot be resolved -- causing a runtime
541*f8146b88SJung-uk Kim              * error because Scope() must be resolved immediately.
542*f8146b88SJung-uk Kim              * 10/2015.
543*f8146b88SJung-uk Kim              */
544*f8146b88SJung-uk Kim             if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
545*f8146b88SJung-uk Kim                 (ACPI_COMPARE_NAME (Gbl_TableSignature, "DSDT")))
546*f8146b88SJung-uk Kim             {
547*f8146b88SJung-uk Kim                 /* However, allowed if the reference is within a method */
548*f8146b88SJung-uk Kim 
549*f8146b88SJung-uk Kim                 MethodOp = Op->Asl.Parent;
550*f8146b88SJung-uk Kim                 while (MethodOp &&
551*f8146b88SJung-uk Kim                       (MethodOp->Asl.ParseOpcode != PARSEOP_METHOD))
552*f8146b88SJung-uk Kim                 {
553*f8146b88SJung-uk Kim                     MethodOp = MethodOp->Asl.Parent;
554*f8146b88SJung-uk Kim                 }
555*f8146b88SJung-uk Kim 
556*f8146b88SJung-uk Kim                 if (!MethodOp)
557*f8146b88SJung-uk Kim                 {
558*f8146b88SJung-uk Kim                     /* Not in a control method, error */
559*f8146b88SJung-uk Kim 
560*f8146b88SJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_CROSS_TABLE_SCOPE, Op, NULL);
561*f8146b88SJung-uk Kim                 }
562*f8146b88SJung-uk Kim             }
563*f8146b88SJung-uk Kim         }
56453289f6aSNate Lawson 
56553289f6aSNate Lawson         /* We found a node with this name, now check the type */
56653289f6aSNate Lawson 
56753289f6aSNate Lawson         switch (Node->Type)
56853289f6aSNate Lawson         {
56953289f6aSNate Lawson         case ACPI_TYPE_LOCAL_SCOPE:
57053289f6aSNate Lawson         case ACPI_TYPE_DEVICE:
57153289f6aSNate Lawson         case ACPI_TYPE_POWER:
57253289f6aSNate Lawson         case ACPI_TYPE_PROCESSOR:
57353289f6aSNate Lawson         case ACPI_TYPE_THERMAL:
57453289f6aSNate Lawson 
57553289f6aSNate Lawson             /* These are acceptable types - they all open a new scope */
57653289f6aSNate Lawson             break;
57753289f6aSNate Lawson 
57853289f6aSNate Lawson         case ACPI_TYPE_INTEGER:
57953289f6aSNate Lawson         case ACPI_TYPE_STRING:
58053289f6aSNate Lawson         case ACPI_TYPE_BUFFER:
58153289f6aSNate Lawson             /*
582fba7fc7eSJung-uk Kim              * These types we will allow, but we will change the type.
583fba7fc7eSJung-uk Kim              * This enables some existing code of the form:
58453289f6aSNate Lawson              *
58553289f6aSNate Lawson              *  Name (DEB, 0)
58653289f6aSNate Lawson              *  Scope (DEB) { ... }
58753289f6aSNate Lawson              *
58853289f6aSNate Lawson              * Which is used to workaround the fact that the MS interpreter
58953289f6aSNate Lawson              * does not allow Scope() forward references.
59053289f6aSNate Lawson              */
591e0ef747bSNate Lawson             sprintf (MsgBuffer, "%s [%s], changing type to [Scope]",
59253289f6aSNate Lawson                 Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type));
59353289f6aSNate Lawson             AslError (ASL_REMARK, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer);
59453289f6aSNate Lawson 
595fba7fc7eSJung-uk Kim             /* Switch the type to scope, open the new scope */
596fba7fc7eSJung-uk Kim 
597e0ef747bSNate Lawson             Node->Type = ACPI_TYPE_LOCAL_SCOPE;
598fba7fc7eSJung-uk Kim             Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE,
599fba7fc7eSJung-uk Kim                 WalkState);
600e0ef747bSNate Lawson             if (ACPI_FAILURE (Status))
601e0ef747bSNate Lawson             {
602e0ef747bSNate Lawson                 return_ACPI_STATUS (Status);
603e0ef747bSNate Lawson             }
60453289f6aSNate Lawson             break;
60553289f6aSNate Lawson 
60653289f6aSNate Lawson         default:
60753289f6aSNate Lawson 
608fba7fc7eSJung-uk Kim             /* All other types are an error */
609fba7fc7eSJung-uk Kim 
610fba7fc7eSJung-uk Kim             sprintf (MsgBuffer, "%s [%s]", Op->Asl.ExternalName,
611fba7fc7eSJung-uk Kim                 AcpiUtGetTypeName (Node->Type));
61253289f6aSNate Lawson             AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer);
61353289f6aSNate Lawson 
61453289f6aSNate Lawson             /*
61553289f6aSNate Lawson              * However, switch the type to be an actual scope so
61653289f6aSNate Lawson              * that compilation can continue without generating a whole
617e0ef747bSNate Lawson              * cascade of additional errors. Open the new scope.
61853289f6aSNate Lawson              */
619e0ef747bSNate Lawson             Node->Type = ACPI_TYPE_LOCAL_SCOPE;
620fba7fc7eSJung-uk Kim             Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE,
621fba7fc7eSJung-uk Kim                 WalkState);
622e0ef747bSNate Lawson             if (ACPI_FAILURE (Status))
623e0ef747bSNate Lawson             {
624e0ef747bSNate Lawson                 return_ACPI_STATUS (Status);
625e0ef747bSNate Lawson             }
62653289f6aSNate Lawson             break;
62753289f6aSNate Lawson         }
62853289f6aSNate Lawson 
62953289f6aSNate Lawson         Status = AE_OK;
63053289f6aSNate Lawson         goto FinishNode;
63153289f6aSNate Lawson 
63253289f6aSNate Lawson 
63353289f6aSNate Lawson     default:
63453289f6aSNate Lawson 
63553289f6aSNate Lawson         ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
63653289f6aSNate Lawson         break;
63753289f6aSNate Lawson     }
63853289f6aSNate Lawson 
63953289f6aSNate Lawson 
64053289f6aSNate Lawson     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n",
64153289f6aSNate Lawson         Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType)));
64253289f6aSNate Lawson 
64353289f6aSNate Lawson     /* The name must not already exist */
64453289f6aSNate Lawson 
64553289f6aSNate Lawson     Flags |= ACPI_NS_ERROR_IF_FOUND;
64653289f6aSNate Lawson 
64753289f6aSNate Lawson     /*
64853289f6aSNate Lawson      * Enter the named type into the internal namespace. We enter the name
649fba7fc7eSJung-uk Kim      * as we go downward in the parse tree. Any necessary subobjects that
650fba7fc7eSJung-uk Kim      * involve arguments to the opcode must be created as we go back up the
651fba7fc7eSJung-uk Kim      * parse tree later.
65253289f6aSNate Lawson      */
65353289f6aSNate Lawson     Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
6541a39cfb0SJung-uk Kim         ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node);
65553289f6aSNate Lawson     if (ACPI_FAILURE (Status))
65653289f6aSNate Lawson     {
65753289f6aSNate Lawson         if (Status == AE_ALREADY_EXISTS)
65853289f6aSNate Lawson         {
65953289f6aSNate Lawson             /* The name already exists in this scope */
66053289f6aSNate Lawson 
66153289f6aSNate Lawson             if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
66253289f6aSNate Lawson             {
6631a39cfb0SJung-uk Kim                 /* Allow multiple references to the same scope */
6641a39cfb0SJung-uk Kim 
66553289f6aSNate Lawson                 Node->Type = (UINT8) ObjectType;
66653289f6aSNate Lawson                 Status = AE_OK;
66753289f6aSNate Lawson             }
668a9f12690SJung-uk Kim             else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
669a9f12690SJung-uk Kim                      (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))
6701a39cfb0SJung-uk Kim             {
6711a39cfb0SJung-uk Kim                 /*
6721a39cfb0SJung-uk Kim                  * Allow one create on an object or segment that was
6731a39cfb0SJung-uk Kim                  * previously declared External
6741a39cfb0SJung-uk Kim                  */
6751a39cfb0SJung-uk Kim                 Node->Flags &= ~ANOBJ_IS_EXTERNAL;
6761a39cfb0SJung-uk Kim                 Node->Type = (UINT8) ObjectType;
6771a39cfb0SJung-uk Kim 
6781a39cfb0SJung-uk Kim                 /* Just retyped a node, probably will need to open a scope */
6791a39cfb0SJung-uk Kim 
6801a39cfb0SJung-uk Kim                 if (AcpiNsOpensScope (ObjectType))
6811a39cfb0SJung-uk Kim                 {
6821a39cfb0SJung-uk Kim                     Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
6831a39cfb0SJung-uk Kim                     if (ACPI_FAILURE (Status))
6841a39cfb0SJung-uk Kim                     {
6851a39cfb0SJung-uk Kim                         return_ACPI_STATUS (Status);
6861a39cfb0SJung-uk Kim                     }
6871a39cfb0SJung-uk Kim                 }
688*f8146b88SJung-uk Kim 
6891a39cfb0SJung-uk Kim                 Status = AE_OK;
6901a39cfb0SJung-uk Kim             }
691*f8146b88SJung-uk Kim             else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) &&
692*f8146b88SJung-uk Kim                      (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
693*f8146b88SJung-uk Kim             {
694*f8146b88SJung-uk Kim                 /*
695*f8146b88SJung-uk Kim                  * Allow externals in same scope as the definition of the
696*f8146b88SJung-uk Kim                  * actual object. Similar to C. Allows multiple definition
697*f8146b88SJung-uk Kim                  * blocks that refer to each other in the same file.
698*f8146b88SJung-uk Kim                  */
699*f8146b88SJung-uk Kim                 Status = AE_OK;
700*f8146b88SJung-uk Kim             }
701*f8146b88SJung-uk Kim             else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
702*f8146b88SJung-uk Kim                      (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
703*f8146b88SJung-uk Kim                      (ObjectType == ACPI_TYPE_ANY))
704*f8146b88SJung-uk Kim             {
705*f8146b88SJung-uk Kim                 /* Allow update of externals of unknown type. */
706*f8146b88SJung-uk Kim 
707*f8146b88SJung-uk Kim                 if (AcpiNsOpensScope (ActualObjectType))
708*f8146b88SJung-uk Kim                 {
709*f8146b88SJung-uk Kim                     Node->Type = (UINT8) ActualObjectType;
710*f8146b88SJung-uk Kim                     Status = AE_OK;
711*f8146b88SJung-uk Kim                 }
712*f8146b88SJung-uk Kim                 else
713*f8146b88SJung-uk Kim                 {
714*f8146b88SJung-uk Kim                     sprintf (MsgBuffer, "%s [%s]", Op->Asl.ExternalName,
715*f8146b88SJung-uk Kim                         AcpiUtGetTypeName (Node->Type));
716*f8146b88SJung-uk Kim                     AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer);
717*f8146b88SJung-uk Kim                     return_ACPI_STATUS (AE_OK);
718*f8146b88SJung-uk Kim                 }
719*f8146b88SJung-uk Kim             }
72053289f6aSNate Lawson             else
72153289f6aSNate Lawson             {
7221a39cfb0SJung-uk Kim                 /* Valid error, object already exists */
7231a39cfb0SJung-uk Kim 
724fba7fc7eSJung-uk Kim                 AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
725fba7fc7eSJung-uk Kim                     Op->Asl.ExternalName);
7269a179dd8SJung-uk Kim                 return_ACPI_STATUS (AE_OK);
72753289f6aSNate Lawson             }
72853289f6aSNate Lawson         }
72953289f6aSNate Lawson         else
73053289f6aSNate Lawson         {
731fba7fc7eSJung-uk Kim             AslCoreSubsystemError (Op, Status,
732f556842eSJung-uk Kim                 "Failure from namespace lookup", FALSE);
7339a179dd8SJung-uk Kim             return_ACPI_STATUS (Status);
73453289f6aSNate Lawson         }
73553289f6aSNate Lawson     }
73653289f6aSNate Lawson 
7371a39cfb0SJung-uk Kim     if (ForceNewScope)
7381a39cfb0SJung-uk Kim     {
7391a39cfb0SJung-uk Kim         Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
7401a39cfb0SJung-uk Kim         if (ACPI_FAILURE (Status))
7411a39cfb0SJung-uk Kim         {
7421a39cfb0SJung-uk Kim             return_ACPI_STATUS (Status);
7431a39cfb0SJung-uk Kim         }
7441a39cfb0SJung-uk Kim     }
74553289f6aSNate Lawson 
74653289f6aSNate Lawson FinishNode:
74753289f6aSNate Lawson     /*
74853289f6aSNate Lawson      * Point the parse node to the new namespace node, and point
74953289f6aSNate Lawson      * the Node back to the original Parse node
75053289f6aSNate Lawson      */
75153289f6aSNate Lawson     Op->Asl.Node = Node;
752fba7fc7eSJung-uk Kim     Node->Op = Op;
75353289f6aSNate Lawson 
75453289f6aSNate Lawson     /* Set the actual data type if appropriate (EXTERNAL term only) */
75553289f6aSNate Lawson 
75653289f6aSNate Lawson     if (ActualObjectType != ACPI_TYPE_ANY)
75753289f6aSNate Lawson     {
75853289f6aSNate Lawson         Node->Type = (UINT8) ActualObjectType;
759fba7fc7eSJung-uk Kim         Node->Value = ASL_EXTERNAL_METHOD;
76053289f6aSNate Lawson     }
76153289f6aSNate Lawson 
76253289f6aSNate Lawson     if (Op->Asl.ParseOpcode == PARSEOP_METHOD)
76353289f6aSNate Lawson     {
76453289f6aSNate Lawson         /*
765fba7fc7eSJung-uk Kim          * Get the method argument count from "Extra" and save
766fba7fc7eSJung-uk Kim          * it in the namespace node
76753289f6aSNate Lawson          */
768fba7fc7eSJung-uk Kim         Node->Value = (UINT32) Op->Asl.Extra;
76953289f6aSNate Lawson     }
77053289f6aSNate Lawson 
7719a179dd8SJung-uk Kim     return_ACPI_STATUS (Status);
77253289f6aSNate Lawson }
77353289f6aSNate Lawson 
77453289f6aSNate Lawson 
77553289f6aSNate Lawson /*******************************************************************************
77653289f6aSNate Lawson  *
777a9f12690SJung-uk Kim  * FUNCTION:    LdNamespace2Begin
778a9f12690SJung-uk Kim  *
779a9f12690SJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
780a9f12690SJung-uk Kim  *
781a9f12690SJung-uk Kim  * RETURN:      Status
782a9f12690SJung-uk Kim  *
783a9f12690SJung-uk Kim  * DESCRIPTION: Descending callback used during the pass 2 parse tree walk.
784a9f12690SJung-uk Kim  *              Second pass resolves some forward references.
785a9f12690SJung-uk Kim  *
786a9f12690SJung-uk Kim  * Notes:
787a9f12690SJung-uk Kim  * Currently only needs to handle the Alias operator.
788a9f12690SJung-uk Kim  * Could be used to allow forward references from the Scope() operator, but
789a9f12690SJung-uk Kim  * the MS interpreter does not allow this, so this compiler does not either.
790a9f12690SJung-uk Kim  *
791a9f12690SJung-uk Kim  ******************************************************************************/
792a9f12690SJung-uk Kim 
793a9f12690SJung-uk Kim static ACPI_STATUS
794a9f12690SJung-uk Kim LdNamespace2Begin (
795a9f12690SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
796a9f12690SJung-uk Kim     UINT32                  Level,
797a9f12690SJung-uk Kim     void                    *Context)
798a9f12690SJung-uk Kim {
799a9f12690SJung-uk Kim     ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
800a9f12690SJung-uk Kim     ACPI_STATUS             Status;
801a9f12690SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
802a9f12690SJung-uk Kim     ACPI_OBJECT_TYPE        ObjectType;
803a9f12690SJung-uk Kim     BOOLEAN                 ForceNewScope = FALSE;
804a9f12690SJung-uk Kim     ACPI_PARSE_OBJECT       *Arg;
805a9f12690SJung-uk Kim     char                    *Path;
806a9f12690SJung-uk Kim     ACPI_NAMESPACE_NODE     *TargetNode;
807a9f12690SJung-uk Kim 
808a9f12690SJung-uk Kim 
809a9f12690SJung-uk Kim     ACPI_FUNCTION_NAME (LdNamespace2Begin);
810a9f12690SJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n",
811a9f12690SJung-uk Kim         Op, Op->Asl.ParseOpName));
812a9f12690SJung-uk Kim 
813a9f12690SJung-uk Kim 
814a9f12690SJung-uk Kim     /* Ignore Ops with no namespace node */
815a9f12690SJung-uk Kim 
816a9f12690SJung-uk Kim     Node = Op->Asl.Node;
817a9f12690SJung-uk Kim     if (!Node)
818a9f12690SJung-uk Kim     {
819a9f12690SJung-uk Kim         return (AE_OK);
820a9f12690SJung-uk Kim     }
821a9f12690SJung-uk Kim 
822a9f12690SJung-uk Kim     /* Get the type to determine if we should push the scope */
823a9f12690SJung-uk Kim 
824a9f12690SJung-uk Kim     if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) &&
825a9f12690SJung-uk Kim         (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC))
826a9f12690SJung-uk Kim     {
827a9f12690SJung-uk Kim         ObjectType = ACPI_TYPE_LOCAL_RESOURCE;
828a9f12690SJung-uk Kim     }
829a9f12690SJung-uk Kim     else
830a9f12690SJung-uk Kim     {
831a9f12690SJung-uk Kim         ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
832a9f12690SJung-uk Kim     }
833a9f12690SJung-uk Kim 
834a9f12690SJung-uk Kim     /* Push scope for Resource Templates */
835a9f12690SJung-uk Kim 
836a9f12690SJung-uk Kim     if (Op->Asl.ParseOpcode == PARSEOP_NAME)
837a9f12690SJung-uk Kim     {
838a9f12690SJung-uk Kim         if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)
839a9f12690SJung-uk Kim         {
840a9f12690SJung-uk Kim             ForceNewScope = TRUE;
841a9f12690SJung-uk Kim         }
842a9f12690SJung-uk Kim     }
843a9f12690SJung-uk Kim 
844a9f12690SJung-uk Kim     /* Push the scope stack */
845a9f12690SJung-uk Kim 
846a9f12690SJung-uk Kim     if (ForceNewScope || AcpiNsOpensScope (ObjectType))
847a9f12690SJung-uk Kim     {
848a9f12690SJung-uk Kim         Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
849a9f12690SJung-uk Kim         if (ACPI_FAILURE (Status))
850a9f12690SJung-uk Kim         {
851a9f12690SJung-uk Kim             return_ACPI_STATUS (Status);
852a9f12690SJung-uk Kim         }
853a9f12690SJung-uk Kim     }
854a9f12690SJung-uk Kim 
855a9f12690SJung-uk Kim     if (Op->Asl.ParseOpcode == PARSEOP_ALIAS)
856a9f12690SJung-uk Kim     {
857a9f12690SJung-uk Kim         /* Complete the alias node by getting and saving the target node */
858a9f12690SJung-uk Kim 
859a9f12690SJung-uk Kim         /* First child is the alias target */
860a9f12690SJung-uk Kim 
861a9f12690SJung-uk Kim         Arg = Op->Asl.Child;
862a9f12690SJung-uk Kim 
863a9f12690SJung-uk Kim         /* Get the target pathname */
864a9f12690SJung-uk Kim 
865a9f12690SJung-uk Kim         Path = Arg->Asl.Namepath;
866a9f12690SJung-uk Kim         if (!Path)
867a9f12690SJung-uk Kim         {
868a9f12690SJung-uk Kim             Status = UtInternalizeName (Arg->Asl.ExternalName, &Path);
869a9f12690SJung-uk Kim             if (ACPI_FAILURE (Status))
870a9f12690SJung-uk Kim             {
871a9f12690SJung-uk Kim                 return (Status);
872a9f12690SJung-uk Kim             }
873a9f12690SJung-uk Kim         }
874a9f12690SJung-uk Kim 
875a9f12690SJung-uk Kim         /* Get the NS node associated with the target. It must exist. */
876a9f12690SJung-uk Kim 
877a9f12690SJung-uk Kim         Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
878a9f12690SJung-uk Kim             ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
879a9f12690SJung-uk Kim             WalkState, &TargetNode);
880a9f12690SJung-uk Kim         if (ACPI_FAILURE (Status))
881a9f12690SJung-uk Kim         {
882a9f12690SJung-uk Kim             if (Status == AE_NOT_FOUND)
883a9f12690SJung-uk Kim             {
884a9f12690SJung-uk Kim                 AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op,
885a9f12690SJung-uk Kim                     Op->Asl.ExternalName);
886a9f12690SJung-uk Kim 
887a9f12690SJung-uk Kim                 /*
888a9f12690SJung-uk Kim                  * The name was not found, go ahead and create it.
889a9f12690SJung-uk Kim                  * This prevents more errors later.
890a9f12690SJung-uk Kim                  */
891a9f12690SJung-uk Kim                 Status = AcpiNsLookup (WalkState->ScopeInfo, Path,
892a9f12690SJung-uk Kim                     ACPI_TYPE_ANY,
893a9f12690SJung-uk Kim                     ACPI_IMODE_LOAD_PASS1, ACPI_NS_NO_UPSEARCH,
894a9f12690SJung-uk Kim                     WalkState, &(Node));
895a9f12690SJung-uk Kim                 return (AE_OK);
896a9f12690SJung-uk Kim             }
897a9f12690SJung-uk Kim 
898f556842eSJung-uk Kim             AslCoreSubsystemError (Op, Status,
899f556842eSJung-uk Kim                 "Failure from namespace lookup", FALSE);
900a9f12690SJung-uk Kim             return (AE_OK);
901a9f12690SJung-uk Kim         }
902a9f12690SJung-uk Kim 
903a9f12690SJung-uk Kim         /* Save the target node within the alias node */
904a9f12690SJung-uk Kim 
905a9f12690SJung-uk Kim         Node->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
906a9f12690SJung-uk Kim     }
907a9f12690SJung-uk Kim 
908a9f12690SJung-uk Kim     return (AE_OK);
909a9f12690SJung-uk Kim }
910a9f12690SJung-uk Kim 
911a9f12690SJung-uk Kim 
912a9f12690SJung-uk Kim /*******************************************************************************
913a9f12690SJung-uk Kim  *
914a9f12690SJung-uk Kim  * FUNCTION:    LdCommonNamespaceEnd
91553289f6aSNate Lawson  *
91653289f6aSNate Lawson  * PARAMETERS:  ASL_WALK_CALLBACK
91753289f6aSNate Lawson  *
91853289f6aSNate Lawson  * RETURN:      Status
91953289f6aSNate Lawson  *
92053289f6aSNate Lawson  * DESCRIPTION: Ascending callback used during the loading of the namespace,
92153289f6aSNate Lawson  *              We only need to worry about managing the scope stack here.
92253289f6aSNate Lawson  *
92353289f6aSNate Lawson  ******************************************************************************/
92453289f6aSNate Lawson 
925fba7fc7eSJung-uk Kim static ACPI_STATUS
926a9f12690SJung-uk Kim LdCommonNamespaceEnd (
92753289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
92853289f6aSNate Lawson     UINT32                  Level,
92953289f6aSNate Lawson     void                    *Context)
93053289f6aSNate Lawson {
93153289f6aSNate Lawson     ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
93253289f6aSNate Lawson     ACPI_OBJECT_TYPE        ObjectType;
9331a39cfb0SJung-uk Kim     BOOLEAN                 ForceNewScope = FALSE;
93453289f6aSNate Lawson 
93553289f6aSNate Lawson 
936a9f12690SJung-uk Kim     ACPI_FUNCTION_NAME (LdCommonNamespaceEnd);
93753289f6aSNate Lawson 
93853289f6aSNate Lawson 
93953289f6aSNate Lawson     /* We are only interested in opcodes that have an associated name */
94053289f6aSNate Lawson 
94153289f6aSNate Lawson     if (!Op->Asl.Namepath)
94253289f6aSNate Lawson     {
94353289f6aSNate Lawson         return (AE_OK);
94453289f6aSNate Lawson     }
94553289f6aSNate Lawson 
94653289f6aSNate Lawson     /* Get the type to determine if we should pop the scope */
94753289f6aSNate Lawson 
94853289f6aSNate Lawson     if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) &&
94953289f6aSNate Lawson         (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC))
95053289f6aSNate Lawson     {
95153289f6aSNate Lawson         /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */
95253289f6aSNate Lawson 
95353289f6aSNate Lawson         ObjectType = ACPI_TYPE_LOCAL_RESOURCE;
95453289f6aSNate Lawson     }
95553289f6aSNate Lawson     else
95653289f6aSNate Lawson     {
95753289f6aSNate Lawson         ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
95853289f6aSNate Lawson     }
95953289f6aSNate Lawson 
9601a39cfb0SJung-uk Kim     /* Pop scope that was pushed for Resource Templates */
9611a39cfb0SJung-uk Kim 
9621a39cfb0SJung-uk Kim     if (Op->Asl.ParseOpcode == PARSEOP_NAME)
9631a39cfb0SJung-uk Kim     {
9641a39cfb0SJung-uk Kim         if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)
9651a39cfb0SJung-uk Kim         {
9661a39cfb0SJung-uk Kim             ForceNewScope = TRUE;
9671a39cfb0SJung-uk Kim         }
9681a39cfb0SJung-uk Kim     }
9691a39cfb0SJung-uk Kim 
97053289f6aSNate Lawson     /* Pop the scope stack */
97153289f6aSNate Lawson 
9721a39cfb0SJung-uk Kim     if (ForceNewScope || AcpiNsOpensScope (ObjectType))
97353289f6aSNate Lawson     {
97453289f6aSNate Lawson         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
97553289f6aSNate Lawson             "(%s): Popping scope for Op [%s] %p\n",
97653289f6aSNate Lawson             AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op));
97753289f6aSNate Lawson 
978fba7fc7eSJung-uk Kim         (void) AcpiDsScopeStackPop (WalkState);
97953289f6aSNate Lawson     }
98053289f6aSNate Lawson 
98153289f6aSNate Lawson     return (AE_OK);
98253289f6aSNate Lawson }
983