Blame source/compiler/aslload.c

Packit Service 1fb00e
/******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Module Name: dswload - Dispatcher namespace load callbacks
Packit Service 1fb00e
 *
Packit Service 1fb00e
 *****************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
/*
Packit Service 1fb00e
 * Copyright (C) 2000 - 2018, Intel Corp.
Packit Service 1fb00e
 * All rights reserved.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Redistribution and use in source and binary forms, with or without
Packit Service 1fb00e
 * modification, are permitted provided that the following conditions
Packit Service 1fb00e
 * are met:
Packit Service 1fb00e
 * 1. Redistributions of source code must retain the above copyright
Packit Service 1fb00e
 *    notice, this list of conditions, and the following disclaimer,
Packit Service 1fb00e
 *    without modification.
Packit Service 1fb00e
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
Packit Service 1fb00e
 *    substantially similar to the "NO WARRANTY" disclaimer below
Packit Service 1fb00e
 *    ("Disclaimer") and any redistribution must be conditioned upon
Packit Service 1fb00e
 *    including a substantially similar Disclaimer requirement for further
Packit Service 1fb00e
 *    binary redistribution.
Packit Service 1fb00e
 * 3. Neither the names of the above-listed copyright holders nor the names
Packit Service 1fb00e
 *    of any contributors may be used to endorse or promote products derived
Packit Service 1fb00e
 *    from this software without specific prior written permission.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Alternatively, this software may be distributed under the terms of the
Packit Service 1fb00e
 * GNU General Public License ("GPL") version 2 as published by the Free
Packit Service 1fb00e
 * Software Foundation.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * NO WARRANTY
Packit Service 1fb00e
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 1fb00e
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 1fb00e
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
Packit Service 1fb00e
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 1fb00e
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service 1fb00e
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service 1fb00e
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service 1fb00e
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
Packit Service 1fb00e
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
Packit Service 1fb00e
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Packit Service 1fb00e
 * POSSIBILITY OF SUCH DAMAGES.
Packit Service 1fb00e
 */
Packit Service 1fb00e
Packit Service 1fb00e
#include "aslcompiler.h"
Packit Service 1fb00e
#include "amlcode.h"
Packit Service 1fb00e
#include "acdispat.h"
Packit Service 1fb00e
#include "acnamesp.h"
Packit Service 1fb00e
#include "acparser.h"
Packit Service 1fb00e
#include "aslcompiler.y.h"
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
#define _COMPONENT          ACPI_COMPILER
Packit Service 1fb00e
        ACPI_MODULE_NAME    ("aslload")
Packit Service 1fb00e
Packit Service 1fb00e
/* Local prototypes */
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
LdLoadFieldElements (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState);
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
LdLoadResourceElements (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState);
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
LdNamespace1Begin (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    void                    *Context);
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
LdNamespace2Begin (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    void                    *Context);
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
LdCommonNamespaceEnd (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    void                    *Context);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    LdLoadNamespace
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  RootOp      - Root of the parse tree
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Perform a walk of the parse tree that in turn loads all of the
Packit Service 1fb00e
 *              named ASL/AML objects into the namespace. The namespace is
Packit Service 1fb00e
 *              constructed in order to resolve named references and references
Packit Service 1fb00e
 *              to named fields within resource templates/descriptors.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
LdLoadNamespace (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *RootOp)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create a new walk state */
Packit Service 1fb00e
Packit Service 1fb00e
    WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
Packit Service 1fb00e
    if (!WalkState)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (AE_NO_MEMORY);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Walk the entire parse tree, first pass */
Packit Service 1fb00e
Packit Service 1fb00e
    TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace1Begin,
Packit Service 1fb00e
        LdCommonNamespaceEnd, WalkState);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Second pass to handle forward references */
Packit Service 1fb00e
Packit Service 1fb00e
    TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace2Begin,
Packit Service 1fb00e
        LdCommonNamespaceEnd, WalkState);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Dump the namespace if debug is enabled */
Packit Service 1fb00e
Packit Service 1fb00e
    if (AcpiDbgLevel & ACPI_LV_TABLES)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AcpiNsDumpTables (ACPI_NS_ALL, ACPI_UINT32_MAX);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FREE (WalkState);
Packit Service 1fb00e
    return (AE_OK);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    LdLoadFieldElements
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op              - Parent node (Field)
Packit Service 1fb00e
 *              WalkState       - Current walk state
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Enter the named elements of the field (children of the parent)
Packit Service 1fb00e
 *              into the namespace.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
LdLoadFieldElements (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Child = NULL;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *Node;
Packit Service 1fb00e
    ACPI_STATUS             Status;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the first named field element */
Packit Service 1fb00e
Packit Service 1fb00e
    switch (Op->Asl.AmlOpcode)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case AML_BANK_FIELD_OP:
Packit Service 1fb00e
Packit Service 1fb00e
        Child = UtGetArg (Op, 6);
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_INDEX_FIELD_OP:
Packit Service 1fb00e
Packit Service 1fb00e
        Child = UtGetArg (Op, 5);
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_FIELD_OP:
Packit Service 1fb00e
Packit Service 1fb00e
        Child = UtGetArg (Op, 4);
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        /* No other opcodes should arrive here */
Packit Service 1fb00e
Packit Service 1fb00e
        return (AE_BAD_PARAMETER);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Enter all elements into the namespace */
Packit Service 1fb00e
Packit Service 1fb00e
    while (Child)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        switch (Child->Asl.AmlOpcode)
Packit Service 1fb00e
        {
Packit Service 1fb00e
        case AML_INT_RESERVEDFIELD_OP:
Packit Service 1fb00e
        case AML_INT_ACCESSFIELD_OP:
Packit Service 1fb00e
        case AML_INT_CONNECTION_OP:
Packit Service 1fb00e
            break;
Packit Service 1fb00e
Packit Service 1fb00e
        default:
Packit Service 1fb00e
Packit Service 1fb00e
            Status = AcpiNsLookup (WalkState->ScopeInfo,
Packit Service 1fb00e
                Child->Asl.Value.String,
Packit Service 1fb00e
                ACPI_TYPE_LOCAL_REGION_FIELD,
Packit Service 1fb00e
                ACPI_IMODE_LOAD_PASS1,
Packit Service 1fb00e
                ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
Packit Service 1fb00e
                    ACPI_NS_ERROR_IF_FOUND, NULL, &Node);
Packit Service 1fb00e
            if (ACPI_FAILURE (Status))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                if (Status != AE_ALREADY_EXISTS)
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    AslError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Child,
Packit Service 1fb00e
                        Child->Asl.Value.String);
Packit Service 1fb00e
                    return (Status);
Packit Service 1fb00e
                }
Packit Service 1fb00e
                else if (Status == AE_ALREADY_EXISTS &&
Packit Service 1fb00e
                    (Node->Flags & ANOBJ_IS_EXTERNAL))
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    Node->Type = (UINT8) ACPI_TYPE_LOCAL_REGION_FIELD;
Packit Service 1fb00e
                }
Packit Service 1fb00e
                else
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    /*
Packit Service 1fb00e
                     * The name already exists in this scope
Packit Service 1fb00e
                     * But continue processing the elements
Packit Service 1fb00e
                     */
Packit Service 1fb00e
                    AslDualParseOpError (ASL_WARNING, ASL_MSG_EXTERN_COLLISION, Child,
Packit Service 1fb00e
                        Child->Asl.Value.String, ASL_MSG_EXTERN_FOUND_HERE, Node->Op,
Packit Service 1fb00e
                        Node->Op->Asl.ExternalName);
Packit Service 1fb00e
                }
Packit Service 1fb00e
            }
Packit Service 1fb00e
            else
Packit Service 1fb00e
            {
Packit Service 1fb00e
                Child->Asl.Node = Node;
Packit Service 1fb00e
                Node->Op = Child;
Packit Service 1fb00e
            }
Packit Service 1fb00e
            break;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        Child = Child->Asl.Next;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return (AE_OK);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    LdLoadResourceElements
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op              - Parent node (Resource Descriptor)
Packit Service 1fb00e
 *              WalkState       - Current walk state
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Enter the named elements of the resource descriptor (children
Packit Service 1fb00e
 *              of the parent) into the namespace.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * NOTE: In the real AML namespace, these named elements never exist. But
Packit Service 1fb00e
 *       we simply use the namespace here as a symbol table so we can look
Packit Service 1fb00e
 *       them up as they are referenced.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
LdLoadResourceElements (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *InitializerOp = NULL;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *Node;
Packit Service 1fb00e
    ACPI_STATUS             Status;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Enter the resource name into the namespace. Name must not already exist.
Packit Service 1fb00e
     * This opens a scope, so later field names are guaranteed to be new/unique.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Asl.Namepath,
Packit Service 1fb00e
        ACPI_TYPE_LOCAL_RESOURCE, ACPI_IMODE_LOAD_PASS1,
Packit Service 1fb00e
        ACPI_NS_NO_UPSEARCH | ACPI_NS_ERROR_IF_FOUND,
Packit Service 1fb00e
        WalkState, &Node);
Packit Service 1fb00e
    if (ACPI_FAILURE (Status))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (Status == AE_ALREADY_EXISTS)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /* Actual node causing the error was saved in ParentMethod */
Packit Service 1fb00e
Packit Service 1fb00e
            AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS,
Packit Service 1fb00e
                (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod,
Packit Service 1fb00e
                Op->Asl.Namepath, ASL_MSG_FOUND_HERE, Node->Op,
Packit Service 1fb00e
                Node->Op->Asl.ExternalName);
Packit Service 1fb00e
            return (AE_OK);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        return (Status);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    Node->Value = (UINT32) Op->Asl.Value.Integer;
Packit Service 1fb00e
    Node->Op = Op;
Packit Service 1fb00e
    Op->Asl.Node = Node;
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Now enter the predefined fields, for easy lookup when referenced
Packit Service 1fb00e
     * by the source ASL
Packit Service 1fb00e
     */
Packit Service 1fb00e
    InitializerOp = ASL_GET_CHILD_NODE (Op);
Packit Service 1fb00e
    while (InitializerOp)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (InitializerOp->Asl.ExternalName)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Status = AcpiNsLookup (WalkState->ScopeInfo,
Packit Service 1fb00e
                InitializerOp->Asl.ExternalName,
Packit Service 1fb00e
                ACPI_TYPE_LOCAL_RESOURCE_FIELD,
Packit Service 1fb00e
                ACPI_IMODE_LOAD_PASS1,
Packit Service 1fb00e
                ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE,
Packit Service 1fb00e
                NULL, &Node);
Packit Service 1fb00e
            if (ACPI_FAILURE (Status))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                return (Status);
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * Store the field offset and length in the namespace node
Packit Service 1fb00e
             * so it can be used when the field is referenced
Packit Service 1fb00e
             */
Packit Service 1fb00e
            Node->Value = InitializerOp->Asl.Value.Tag.BitOffset;
Packit Service 1fb00e
            Node->Length = InitializerOp->Asl.Value.Tag.BitLength;
Packit Service 1fb00e
            InitializerOp->Asl.Node = Node;
Packit Service 1fb00e
            Node->Op = InitializerOp;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return (AE_OK);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    LdNamespace1Begin
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  ASL_WALK_CALLBACK
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Descending callback used during the parse tree walk. If this
Packit Service 1fb00e
 *              is a named AML opcode, enter into the namespace
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
LdNamespace1Begin (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    void                    *Context)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *Node;
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *MethodOp;
Packit Service 1fb00e
    ACPI_STATUS             Status;
Packit Service 1fb00e
    ACPI_OBJECT_TYPE        ObjectType;
Packit Service 1fb00e
    ACPI_OBJECT_TYPE        ActualObjectType = ACPI_TYPE_ANY;
Packit Service 1fb00e
    char                    *Path;
Packit Service 1fb00e
    UINT32                  Flags = ACPI_NS_NO_UPSEARCH;
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Arg;
Packit Service 1fb00e
    UINT32                  i;
Packit Service 1fb00e
    BOOLEAN                 ForceNewScope = FALSE;
Packit Service 1fb00e
    const ACPI_OPCODE_INFO  *OpInfo;
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *ParentOp;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FUNCTION_NAME (LdNamespace1Begin);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n",
Packit Service 1fb00e
        Op, Op->Asl.ParseOpName));
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * We are only interested in opcodes that have an associated name
Packit Service 1fb00e
     * (or multiple names)
Packit Service 1fb00e
     */
Packit Service 1fb00e
    switch (Op->Asl.AmlOpcode)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case AML_BANK_FIELD_OP:
Packit Service 1fb00e
    case AML_INDEX_FIELD_OP:
Packit Service 1fb00e
    case AML_FIELD_OP:
Packit Service 1fb00e
Packit Service 1fb00e
        Status = LdLoadFieldElements (Op, WalkState);
Packit Service 1fb00e
        return (Status);
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_INT_CONNECTION_OP:
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
        if (Op->Asl.Child->Asl.AmlOpcode != AML_INT_NAMEPATH_OP)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            break;
Packit Service 1fb00e
        }
Packit Service 1fb00e
        Arg = Op->Asl.Child;
Packit Service 1fb00e
Packit Service 1fb00e
        Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Asl.ExternalName,
Packit Service 1fb00e
            ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
Packit Service 1fb00e
            WalkState, &Node);
Packit Service 1fb00e
        if (ACPI_FAILURE (Status))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            break;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        if (Node->Type == ACPI_TYPE_BUFFER)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Arg->Asl.Node = Node;
Packit Service 1fb00e
Packit Service 1fb00e
            Arg = Node->Op->Asl.Child;  /* Get namepath */
Packit Service 1fb00e
            Arg = Arg->Asl.Next;        /* Get actual buffer */
Packit Service 1fb00e
            Arg = Arg->Asl.Child;       /* Buffer length */
Packit Service 1fb00e
            Arg = Arg->Asl.Next;        /* RAW_DATA buffer */
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        /* All other opcodes go below */
Packit Service 1fb00e
Packit Service 1fb00e
        break;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Check if this object has already been installed in the namespace */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Op->Asl.Node)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Check for a possible illegal forward reference */
Packit Service 1fb00e
Packit Service 1fb00e
    if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
Packit Service 1fb00e
        (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Op->Asl.Namepath will be NULL for these opcodes.
Packit Service 1fb00e
         * These opcodes are guaranteed to have a parent.
Packit Service 1fb00e
         * Examine the parent opcode.
Packit Service 1fb00e
         */
Packit Service 1fb00e
        Status = AE_OK;
Packit Service 1fb00e
        ParentOp = Op->Asl.Parent;
Packit Service 1fb00e
        OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Asl.AmlOpcode);
Packit Service 1fb00e
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Exclude all operators that actually declare a new name:
Packit Service 1fb00e
         *      Name (ABCD, 1) -> Ignore (AML_CLASS_NAMED_OBJECT)
Packit Service 1fb00e
         * We only want references to named objects:
Packit Service 1fb00e
         *      Store (2, WXYZ) -> Attempt to resolve the name
Packit Service 1fb00e
         */
Packit Service 1fb00e
        if (OpInfo->Class == AML_CLASS_NAMED_OBJECT)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            return (AE_OK);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Check if the referenced object exists at this point during
Packit Service 1fb00e
         * the load:
Packit Service 1fb00e
         * 1) If it exists, then this cannot be a forward reference.
Packit Service 1fb00e
         * 2) If it does not exist, it could be a forward reference or
Packit Service 1fb00e
         * it truly does not exist (and no external declaration).
Packit Service 1fb00e
         */
Packit Service 1fb00e
        Status = AcpiNsLookup (WalkState->ScopeInfo,
Packit Service 1fb00e
            Op->Asl.Value.Name, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
Packit Service 1fb00e
            ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
Packit Service 1fb00e
            WalkState, &Node);
Packit Service 1fb00e
        if (Status == AE_NOT_FOUND)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * This is either a foward reference or the object truly
Packit Service 1fb00e
             * does not exist. The two cases can only be differentiated
Packit Service 1fb00e
             * during the cross-reference stage later. Mark the Op/Name
Packit Service 1fb00e
             * as not-found for now to indicate the need for further
Packit Service 1fb00e
             * processing.
Packit Service 1fb00e
             *
Packit Service 1fb00e
             * Special case: Allow forward references from elements of
Packit Service 1fb00e
             * Package objects. This provides compatibility with other
Packit Service 1fb00e
             * ACPI implementations. To correctly implement this, the
Packit Service 1fb00e
             * ACPICA table load defers package resolution until the entire
Packit Service 1fb00e
             * namespace has been loaded.
Packit Service 1fb00e
             */
Packit Service 1fb00e
            if ((ParentOp->Asl.ParseOpcode != PARSEOP_PACKAGE) &&
Packit Service 1fb00e
                (ParentOp->Asl.ParseOpcode != PARSEOP_VAR_PACKAGE))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                Op->Asl.CompileFlags |= OP_NOT_FOUND_DURING_LOAD;
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            return (AE_OK);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        return (Status);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    Path = Op->Asl.Namepath;
Packit Service 1fb00e
    if (!Path)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Map the raw opcode into an internal object type */
Packit Service 1fb00e
Packit Service 1fb00e
    switch (Op->Asl.ParseOpcode)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case PARSEOP_NAME:
Packit Service 1fb00e
Packit Service 1fb00e
        Arg = Op->Asl.Child;  /* Get the NameSeg/NameString node */
Packit Service 1fb00e
        Arg = Arg->Asl.Next;  /* First peer is the object to be associated with the name */
Packit Service 1fb00e
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * If this name refers to a ResourceTemplate, we will need to open
Packit Service 1fb00e
         * a new scope so that the resource subfield names can be entered into
Packit Service 1fb00e
         * the namespace underneath this name
Packit Service 1fb00e
         */
Packit Service 1fb00e
        if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            ForceNewScope = TRUE;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Get the data type associated with the named object, not the name itself */
Packit Service 1fb00e
Packit Service 1fb00e
        /* Log2 loop to convert from Btype (binary) to Etype (encoded) */
Packit Service 1fb00e
Packit Service 1fb00e
        ObjectType = 1;
Packit Service 1fb00e
        for (i = 1; i < Arg->Asl.AcpiBtype; i *= 2)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            ObjectType++;
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case PARSEOP_EXTERNAL:
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * "External" simply enters a name and type into the namespace.
Packit Service 1fb00e
         * We must be careful to not open a new scope, however, no matter
Packit Service 1fb00e
         * what type the external name refers to (e.g., a method)
Packit Service 1fb00e
         *
Packit Service 1fb00e
         * first child is name, next child is ObjectType
Packit Service 1fb00e
         */
Packit Service 1fb00e
        ActualObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer;
Packit Service 1fb00e
        ObjectType = ACPI_TYPE_ANY;
Packit Service 1fb00e
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * We will mark every new node along the path as "External". This
Packit Service 1fb00e
         * allows some or all of the nodes to be created later in the ASL
Packit Service 1fb00e
         * code. Handles cases like this:
Packit Service 1fb00e
         *
Packit Service 1fb00e
         *   External (\_SB_.PCI0.ABCD, IntObj)
Packit Service 1fb00e
         *   Scope (_SB_)
Packit Service 1fb00e
         *   {
Packit Service 1fb00e
         *       Device (PCI0)
Packit Service 1fb00e
         *       {
Packit Service 1fb00e
         *       }
Packit Service 1fb00e
         *   }
Packit Service 1fb00e
         *   Method (X)
Packit Service 1fb00e
         *   {
Packit Service 1fb00e
         *       Store (\_SB_.PCI0.ABCD, Local0)
Packit Service 1fb00e
         *   }
Packit Service 1fb00e
         */
Packit Service 1fb00e
        Flags |= ACPI_NS_EXTERNAL;
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case PARSEOP_DEFAULT_ARG:
Packit Service 1fb00e
Packit Service 1fb00e
        if (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Status = LdLoadResourceElements (Op, WalkState);
Packit Service 1fb00e
            return_ACPI_STATUS (Status);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case PARSEOP_SCOPE:
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * The name referenced by Scope(Name) must already exist at this point.
Packit Service 1fb00e
         * In other words, forward references for Scope() are not supported.
Packit Service 1fb00e
         * The only real reason for this is that the MS interpreter cannot
Packit Service 1fb00e
         * handle this case. Perhaps someday this case can go away.
Packit Service 1fb00e
         */
Packit Service 1fb00e
        Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
Packit Service 1fb00e
            ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
Packit Service 1fb00e
            WalkState, &(Node));
Packit Service 1fb00e
        if (ACPI_FAILURE (Status))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            if (Status == AE_NOT_FOUND)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                /* The name was not found, go ahead and create it */
Packit Service 1fb00e
Packit Service 1fb00e
                Status = AcpiNsLookup (WalkState->ScopeInfo, Path,
Packit Service 1fb00e
                    ACPI_TYPE_LOCAL_SCOPE,
Packit Service 1fb00e
                    ACPI_IMODE_LOAD_PASS1, Flags,
Packit Service 1fb00e
                    WalkState, &(Node));
Packit Service 1fb00e
                if (ACPI_FAILURE (Status))
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    return_ACPI_STATUS (Status);
Packit Service 1fb00e
                }
Packit Service 1fb00e
Packit Service 1fb00e
                /*
Packit Service 1fb00e
                 * However, this is an error -- primarily because the MS
Packit Service 1fb00e
                 * interpreter can't handle a forward reference from the
Packit Service 1fb00e
                 * Scope() operator.
Packit Service 1fb00e
                 */
Packit Service 1fb00e
                AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op,
Packit Service 1fb00e
                    Op->Asl.ExternalName);
Packit Service 1fb00e
                AslError (ASL_ERROR, ASL_MSG_SCOPE_FWD_REF, Op,
Packit Service 1fb00e
                    Op->Asl.ExternalName);
Packit Service 1fb00e
                goto FinishNode;
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            AslCoreSubsystemError (Op, Status,
Packit Service 1fb00e
                "Failure from namespace lookup", FALSE);
Packit Service 1fb00e
Packit Service 1fb00e
            return_ACPI_STATUS (Status);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        else /* Status AE_OK */
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * Do not allow references to external scopes from the DSDT.
Packit Service 1fb00e
             * This is because the DSDT is always loaded first, and the
Packit Service 1fb00e
             * external reference cannot be resolved -- causing a runtime
Packit Service 1fb00e
             * error because Scope() must be resolved immediately.
Packit Service 1fb00e
             * 10/2015.
Packit Service 1fb00e
             */
Packit Service 1fb00e
            if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
Packit Service 1fb00e
                (ACPI_COMPARE_NAME (Gbl_TableSignature, "DSDT")))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                /* However, allowed if the reference is within a method */
Packit Service 1fb00e
Packit Service 1fb00e
                MethodOp = Op->Asl.Parent;
Packit Service 1fb00e
                while (MethodOp &&
Packit Service 1fb00e
                      (MethodOp->Asl.ParseOpcode != PARSEOP_METHOD))
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    MethodOp = MethodOp->Asl.Parent;
Packit Service 1fb00e
                }
Packit Service 1fb00e
Packit Service 1fb00e
                if (!MethodOp)
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    /* Not in a control method, error */
Packit Service 1fb00e
Packit Service 1fb00e
                    AslError (ASL_ERROR, ASL_MSG_CROSS_TABLE_SCOPE, Op, NULL);
Packit Service 1fb00e
                }
Packit Service 1fb00e
            }
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* We found a node with this name, now check the type */
Packit Service 1fb00e
Packit Service 1fb00e
        switch (Node->Type)
Packit Service 1fb00e
        {
Packit Service 1fb00e
        case ACPI_TYPE_LOCAL_SCOPE:
Packit Service 1fb00e
        case ACPI_TYPE_DEVICE:
Packit Service 1fb00e
        case ACPI_TYPE_POWER:
Packit Service 1fb00e
        case ACPI_TYPE_PROCESSOR:
Packit Service 1fb00e
        case ACPI_TYPE_THERMAL:
Packit Service 1fb00e
Packit Service 1fb00e
            /* These are acceptable types - they all open a new scope */
Packit Service 1fb00e
            break;
Packit Service 1fb00e
Packit Service 1fb00e
        case ACPI_TYPE_INTEGER:
Packit Service 1fb00e
        case ACPI_TYPE_STRING:
Packit Service 1fb00e
        case ACPI_TYPE_BUFFER:
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * These types we will allow, but we will change the type.
Packit Service 1fb00e
             * This enables some existing code of the form:
Packit Service 1fb00e
             *
Packit Service 1fb00e
             *  Name (DEB, 0)
Packit Service 1fb00e
             *  Scope (DEB) { ... }
Packit Service 1fb00e
             *
Packit Service 1fb00e
             * Which is used to workaround the fact that the MS interpreter
Packit Service 1fb00e
             * does not allow Scope() forward references.
Packit Service 1fb00e
             */
Packit Service 1fb00e
            sprintf (MsgBuffer, "%s [%s], changing type to [Scope]",
Packit Service 1fb00e
                Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type));
Packit Service 1fb00e
            AslError (ASL_REMARK, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer);
Packit Service 1fb00e
Packit Service 1fb00e
            /* Switch the type to scope, open the new scope */
Packit Service 1fb00e
Packit Service 1fb00e
            Node->Type = ACPI_TYPE_LOCAL_SCOPE;
Packit Service 1fb00e
            Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE,
Packit Service 1fb00e
                WalkState);
Packit Service 1fb00e
            if (ACPI_FAILURE (Status))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                return_ACPI_STATUS (Status);
Packit Service 1fb00e
            }
Packit Service 1fb00e
            break;
Packit Service 1fb00e
Packit Service 1fb00e
        default:
Packit Service 1fb00e
Packit Service 1fb00e
            /* All other types are an error */
Packit Service 1fb00e
Packit Service 1fb00e
            sprintf (MsgBuffer, "%s [%s]", Op->Asl.ExternalName,
Packit Service 1fb00e
                AcpiUtGetTypeName (Node->Type));
Packit Service 1fb00e
            AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer);
Packit Service 1fb00e
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * However, switch the type to be an actual scope so
Packit Service 1fb00e
             * that compilation can continue without generating a whole
Packit Service 1fb00e
             * cascade of additional errors. Open the new scope.
Packit Service 1fb00e
             */
Packit Service 1fb00e
            Node->Type = ACPI_TYPE_LOCAL_SCOPE;
Packit Service 1fb00e
            Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE,
Packit Service 1fb00e
                WalkState);
Packit Service 1fb00e
            if (ACPI_FAILURE (Status))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                return_ACPI_STATUS (Status);
Packit Service 1fb00e
            }
Packit Service 1fb00e
            break;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        Status = AE_OK;
Packit Service 1fb00e
        goto FinishNode;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
Packit Service 1fb00e
        break;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n",
Packit Service 1fb00e
        Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType)));
Packit Service 1fb00e
Packit Service 1fb00e
    /* The name must not already exist */
Packit Service 1fb00e
Packit Service 1fb00e
    Flags |= ACPI_NS_ERROR_IF_FOUND;
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Enter the named type into the internal namespace. We enter the name
Packit Service 1fb00e
     * as we go downward in the parse tree. Any necessary subobjects that
Packit Service 1fb00e
     * involve arguments to the opcode must be created as we go back up the
Packit Service 1fb00e
     * parse tree later.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
Packit Service 1fb00e
        ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node);
Packit Service 1fb00e
    if (ACPI_FAILURE (Status))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (Status == AE_ALREADY_EXISTS)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /* The name already exists in this scope */
Packit Service 1fb00e
Packit Service 1fb00e
            if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                /* Allow multiple references to the same scope */
Packit Service 1fb00e
Packit Service 1fb00e
                Node->Type = (UINT8) ObjectType;
Packit Service 1fb00e
                Status = AE_OK;
Packit Service 1fb00e
            }
Packit Service 1fb00e
            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
Packit Service 1fb00e
                     (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                /*
Packit Service 1fb00e
                 * Allow one create on an object or segment that was
Packit Service 1fb00e
                 * previously declared External
Packit Service 1fb00e
                 */
Packit Service 1fb00e
                Node->Flags &= ~ANOBJ_IS_EXTERNAL;
Packit Service 1fb00e
                Node->Type = (UINT8) ObjectType;
Packit Service 1fb00e
Packit Service 1fb00e
                /* Just retyped a node, probably will need to open a scope */
Packit Service 1fb00e
Packit Service 1fb00e
                if (AcpiNsOpensScope (ObjectType))
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
Packit Service 1fb00e
                    if (ACPI_FAILURE (Status))
Packit Service 1fb00e
                    {
Packit Service 1fb00e
                        return_ACPI_STATUS (Status);
Packit Service 1fb00e
                    }
Packit Service 1fb00e
                }
Packit Service 1fb00e
Packit Service 1fb00e
                Status = AE_OK;
Packit Service 1fb00e
            }
Packit Service 1fb00e
            else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) &&
Packit Service 1fb00e
                     (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                /*
Packit Service 1fb00e
                 * Allow externals in same scope as the definition of the
Packit Service 1fb00e
                 * actual object. Similar to C. Allows multiple definition
Packit Service 1fb00e
                 * blocks that refer to each other in the same file.
Packit Service 1fb00e
                 */
Packit Service 1fb00e
                Status = AE_OK;
Packit Service 1fb00e
            }
Packit Service 1fb00e
            else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
Packit Service 1fb00e
                     (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
Packit Service 1fb00e
                     (ObjectType == ACPI_TYPE_ANY))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                /* Allow update of externals of unknown type. */
Packit Service 1fb00e
Packit Service 1fb00e
                if (AcpiNsOpensScope (ActualObjectType))
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    Node->Type = (UINT8) ActualObjectType;
Packit Service 1fb00e
                    Status = AE_OK;
Packit Service 1fb00e
                }
Packit Service 1fb00e
                else
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    sprintf (MsgBuffer, "%s [%s]", Op->Asl.ExternalName,
Packit Service 1fb00e
                        AcpiUtGetTypeName (Node->Type));
Packit Service 1fb00e
                    AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer);
Packit Service 1fb00e
                    return_ACPI_STATUS (AE_OK);
Packit Service 1fb00e
                }
Packit Service 1fb00e
            }
Packit Service 1fb00e
            else
Packit Service 1fb00e
            {
Packit Service 1fb00e
                /* Valid error, object already exists */
Packit Service 1fb00e
Packit Service 1fb00e
                AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
Packit Service 1fb00e
                    Op->Asl.ExternalName, ASL_MSG_FOUND_HERE, Node->Op,
Packit Service 1fb00e
                    Node->Op->Asl.ExternalName);
Packit Service 1fb00e
                return_ACPI_STATUS (AE_OK);
Packit Service 1fb00e
            }
Packit Service 1fb00e
        }
Packit Service 1fb00e
        else
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCoreSubsystemError (Op, Status,
Packit Service 1fb00e
                "Failure from namespace lookup", FALSE);
Packit Service 1fb00e
            return_ACPI_STATUS (Status);
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (ForceNewScope)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
Packit Service 1fb00e
        if (ACPI_FAILURE (Status))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            return_ACPI_STATUS (Status);
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
FinishNode:
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Point the parse node to the new namespace node, and point
Packit Service 1fb00e
     * the Node back to the original Parse node
Packit Service 1fb00e
     */
Packit Service 1fb00e
    Op->Asl.Node = Node;
Packit Service 1fb00e
    Node->Op = Op;
Packit Service 1fb00e
Packit Service 1fb00e
    /* Set the actual data type if appropriate (EXTERNAL term only) */
Packit Service 1fb00e
Packit Service 1fb00e
    if (ActualObjectType != ACPI_TYPE_ANY)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Node->Type = (UINT8) ActualObjectType;
Packit Service 1fb00e
        Node->Value = ASL_EXTERNAL_METHOD;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (Op->Asl.ParseOpcode == PARSEOP_METHOD)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Get the method argument count from "Extra" and save
Packit Service 1fb00e
         * it in the namespace node
Packit Service 1fb00e
         */
Packit Service 1fb00e
        Node->Value = (UINT32) Op->Asl.Extra;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return_ACPI_STATUS (Status);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    LdNamespace2Begin
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  ASL_WALK_CALLBACK
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Descending callback used during the pass 2 parse tree walk.
Packit Service 1fb00e
 *              Second pass resolves some forward references.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Notes:
Packit Service 1fb00e
 * Currently only needs to handle the Alias operator.
Packit Service 1fb00e
 * Could be used to allow forward references from the Scope() operator, but
Packit Service 1fb00e
 * the MS interpreter does not allow this, so this compiler does not either.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
LdNamespace2Begin (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    void                    *Context)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
Packit Service 1fb00e
    ACPI_STATUS             Status;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *Node;
Packit Service 1fb00e
    ACPI_OBJECT_TYPE        ObjectType;
Packit Service 1fb00e
    BOOLEAN                 ForceNewScope = FALSE;
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Arg;
Packit Service 1fb00e
    char                    *Path;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *TargetNode;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FUNCTION_NAME (LdNamespace2Begin);
Packit Service 1fb00e
    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n",
Packit Service 1fb00e
        Op, Op->Asl.ParseOpName));
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Ignore Ops with no namespace node */
Packit Service 1fb00e
Packit Service 1fb00e
    Node = Op->Asl.Node;
Packit Service 1fb00e
    if (!Node)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the type to determine if we should push the scope */
Packit Service 1fb00e
Packit Service 1fb00e
    if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) &&
Packit Service 1fb00e
        (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        ObjectType = ACPI_TYPE_LOCAL_RESOURCE;
Packit Service 1fb00e
    }
Packit Service 1fb00e
    else
Packit Service 1fb00e
    {
Packit Service 1fb00e
        ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Push scope for Resource Templates */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Op->Asl.ParseOpcode == PARSEOP_NAME)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            ForceNewScope = TRUE;
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Push the scope stack */
Packit Service 1fb00e
Packit Service 1fb00e
    if (ForceNewScope || AcpiNsOpensScope (ObjectType))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
Packit Service 1fb00e
        if (ACPI_FAILURE (Status))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            return_ACPI_STATUS (Status);
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (Op->Asl.ParseOpcode == PARSEOP_ALIAS)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* Complete the alias node by getting and saving the target node */
Packit Service 1fb00e
Packit Service 1fb00e
        /* First child is the alias target */
Packit Service 1fb00e
Packit Service 1fb00e
        Arg = Op->Asl.Child;
Packit Service 1fb00e
Packit Service 1fb00e
        /* Get the target pathname */
Packit Service 1fb00e
Packit Service 1fb00e
        Path = Arg->Asl.Namepath;
Packit Service 1fb00e
        if (!Path)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Status = UtInternalizeName (Arg->Asl.ExternalName, &Path);
Packit Service 1fb00e
            if (ACPI_FAILURE (Status))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                return (Status);
Packit Service 1fb00e
            }
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Get the NS node associated with the target. It must exist. */
Packit Service 1fb00e
Packit Service 1fb00e
        Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
Packit Service 1fb00e
            ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
Packit Service 1fb00e
            WalkState, &TargetNode);
Packit Service 1fb00e
        if (ACPI_FAILURE (Status))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            if (Status == AE_NOT_FOUND)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op,
Packit Service 1fb00e
                    Op->Asl.ExternalName);
Packit Service 1fb00e
Packit Service 1fb00e
                /*
Packit Service 1fb00e
                 * The name was not found, go ahead and create it.
Packit Service 1fb00e
                 * This prevents more errors later.
Packit Service 1fb00e
                 */
Packit Service 1fb00e
                Status = AcpiNsLookup (WalkState->ScopeInfo, Path,
Packit Service 1fb00e
                    ACPI_TYPE_ANY,
Packit Service 1fb00e
                    ACPI_IMODE_LOAD_PASS1, ACPI_NS_NO_UPSEARCH,
Packit Service 1fb00e
                    WalkState, &(Node));
Packit Service 1fb00e
                return (AE_OK);
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            AslCoreSubsystemError (Op, Status,
Packit Service 1fb00e
                "Failure from namespace lookup", FALSE);
Packit Service 1fb00e
            return (AE_OK);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Save the target node within the alias node */
Packit Service 1fb00e
Packit Service 1fb00e
        Node->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return (AE_OK);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    LdCommonNamespaceEnd
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  ASL_WALK_CALLBACK
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Ascending callback used during the loading of the namespace,
Packit Service 1fb00e
 *              We only need to worry about managing the scope stack here.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
LdCommonNamespaceEnd (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    void                    *Context)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState = (ACPI_WALK_STATE *) Context;
Packit Service 1fb00e
    ACPI_OBJECT_TYPE        ObjectType;
Packit Service 1fb00e
    BOOLEAN                 ForceNewScope = FALSE;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FUNCTION_NAME (LdCommonNamespaceEnd);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* We are only interested in opcodes that have an associated name */
Packit Service 1fb00e
Packit Service 1fb00e
    if (!Op->Asl.Namepath)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the type to determine if we should pop the scope */
Packit Service 1fb00e
Packit Service 1fb00e
    if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) &&
Packit Service 1fb00e
        (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */
Packit Service 1fb00e
Packit Service 1fb00e
        ObjectType = ACPI_TYPE_LOCAL_RESOURCE;
Packit Service 1fb00e
    }
Packit Service 1fb00e
    else
Packit Service 1fb00e
    {
Packit Service 1fb00e
        ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Pop scope that was pushed for Resource Templates */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Op->Asl.ParseOpcode == PARSEOP_NAME)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            ForceNewScope = TRUE;
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Pop the scope stack */
Packit Service 1fb00e
Packit Service 1fb00e
    if (ForceNewScope || AcpiNsOpensScope (ObjectType))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
Packit Service 1fb00e
            "(%s): Popping scope for Op [%s] %p\n",
Packit Service 1fb00e
            AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op));
Packit Service 1fb00e
Packit Service 1fb00e
        (void) AcpiDsScopeStackPop (WalkState);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return (AE_OK);
Packit Service 1fb00e
}