Blame source/compiler/aslwalks.c

Packit Service 1fb00e
/******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Module Name: aslwalks.c - Miscellaneous analytical parse tree walks
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 "aslcompiler.y.h"
Packit Service 1fb00e
#include "acparser.h"
Packit Service 1fb00e
#include "amlcode.h"
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
#define _COMPONENT          ACPI_COMPILER
Packit Service 1fb00e
        ACPI_MODULE_NAME    ("aslwalks")
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/* Local prototypes */
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
AnAnalyzeStoreOperator (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AnMethodTypingWalkEnd
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 for typing walk. Complete the method
Packit Service 1fb00e
 *              return analysis. Check methods for:
Packit Service 1fb00e
 *              1) Initialized local variables
Packit Service 1fb00e
 *              2) Valid arguments
Packit Service 1fb00e
 *              3) Return types
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
AnMethodTypingWalkEnd (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    void                    *Context)
Packit Service 1fb00e
{
Packit Service 1fb00e
    UINT32                  ThisOpBtype;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    switch (Op->Asl.ParseOpcode)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case PARSEOP_METHOD:
Packit Service 1fb00e
Packit Service 1fb00e
        Op->Asl.CompileFlags |= OP_METHOD_TYPED;
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case PARSEOP_RETURN:
Packit Service 1fb00e
Packit Service 1fb00e
        if ((Op->Asl.Child) &&
Packit Service 1fb00e
            (Op->Asl.Child->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            ThisOpBtype = AnGetBtype (Op->Asl.Child);
Packit Service 1fb00e
Packit Service 1fb00e
            if ((Op->Asl.Child->Asl.ParseOpcode == PARSEOP_METHODCALL) &&
Packit Service 1fb00e
                (ThisOpBtype == (ACPI_UINT32_MAX -1)))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                /*
Packit Service 1fb00e
                 * The called method is untyped at this time (typically a
Packit Service 1fb00e
                 * forward reference).
Packit Service 1fb00e
                 *
Packit Service 1fb00e
                 * Check for a recursive method call first. Note: the
Packit Service 1fb00e
                 * Child->Node will be null if the method has not been
Packit Service 1fb00e
                 * resolved.
Packit Service 1fb00e
                 */
Packit Service 1fb00e
                if (Op->Asl.Child->Asl.Node &&
Packit Service 1fb00e
                    (Op->Asl.ParentMethod != Op->Asl.Child->Asl.Node->Op))
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    /* We must type the method here */
Packit Service 1fb00e
Packit Service 1fb00e
                    TrWalkParseTree (Op->Asl.Child->Asl.Node->Op,
Packit Service 1fb00e
                        ASL_WALK_VISIT_UPWARD, NULL,
Packit Service 1fb00e
                        AnMethodTypingWalkEnd, NULL);
Packit Service 1fb00e
Packit Service 1fb00e
                    ThisOpBtype = AnGetBtype (Op->Asl.Child);
Packit Service 1fb00e
                }
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            /* Returns a value, save the value type */
Packit Service 1fb00e
Packit Service 1fb00e
            if (Op->Asl.ParentMethod)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                Op->Asl.ParentMethod->Asl.AcpiBtype |= ThisOpBtype;
Packit Service 1fb00e
            }
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        break;
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:    AnOperandTypecheckWalkEnd
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 for analysis walk. Complete method
Packit Service 1fb00e
 *              return analysis.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
AnOperandTypecheckWalkEnd (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    void                    *Context)
Packit Service 1fb00e
{
Packit Service 1fb00e
    const ACPI_OPCODE_INFO  *OpInfo;
Packit Service 1fb00e
    UINT32                  RuntimeArgTypes;
Packit Service 1fb00e
    UINT32                  RuntimeArgTypes2;
Packit Service 1fb00e
    UINT32                  RequiredBtypes;
Packit Service 1fb00e
    UINT32                  ThisNodeBtype;
Packit Service 1fb00e
    UINT32                  CommonBtypes;
Packit Service 1fb00e
    UINT32                  OpcodeClass;
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *ArgOp;
Packit Service 1fb00e
    UINT32                  ArgType;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    switch (Op->Asl.AmlOpcode)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case AML_RAW_DATA_BYTE:
Packit Service 1fb00e
    case AML_RAW_DATA_WORD:
Packit Service 1fb00e
    case AML_RAW_DATA_DWORD:
Packit Service 1fb00e
    case AML_RAW_DATA_QWORD:
Packit Service 1fb00e
    case AML_RAW_DATA_BUFFER:
Packit Service 1fb00e
    case AML_RAW_DATA_CHAIN:
Packit Service 1fb00e
    case AML_PACKAGE_LENGTH:
Packit Service 1fb00e
    case AML_UNASSIGNED_OPCODE:
Packit Service 1fb00e
    case AML_DEFAULT_ARG_OP:
Packit Service 1fb00e
Packit Service 1fb00e
        /* Ignore the internal (compiler-only) AML opcodes */
Packit Service 1fb00e
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        break;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
Packit Service 1fb00e
    if (!OpInfo)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    ArgOp = Op->Asl.Child;
Packit Service 1fb00e
    OpcodeClass = OpInfo->Class;
Packit Service 1fb00e
    RuntimeArgTypes = OpInfo->RuntimeArgs;
Packit Service 1fb00e
Packit Service 1fb00e
#ifdef ASL_ERROR_NAMED_OBJECT_IN_WHILE
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Update 11/2008: In practice, we can't perform this check. A simple
Packit Service 1fb00e
     * analysis is not sufficient. Also, it can cause errors when compiling
Packit Service 1fb00e
     * disassembled code because of the way Switch operators are implemented
Packit Service 1fb00e
     * (a While(One) loop with a named temp variable created within.)
Packit Service 1fb00e
     */
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * If we are creating a named object, check if we are within a while loop
Packit Service 1fb00e
     * by checking if the parent is a WHILE op. This is a simple analysis, but
Packit Service 1fb00e
     * probably sufficient for many cases.
Packit Service 1fb00e
     *
Packit Service 1fb00e
     * Allow Scope(), Buffer(), and Package().
Packit Service 1fb00e
     */
Packit Service 1fb00e
    if (((OpcodeClass == AML_CLASS_NAMED_OBJECT) && (Op->Asl.AmlOpcode != AML_SCOPE_OP)) ||
Packit Service 1fb00e
        ((OpcodeClass == AML_CLASS_CREATE) && (OpInfo->Flags & AML_NSNODE)))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (Op->Asl.Parent->Asl.AmlOpcode == AML_WHILE_OP)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslError (ASL_ERROR, ASL_MSG_NAMED_OBJECT_IN_WHILE, Op, NULL);
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
#endif
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Special case for control opcodes IF/RETURN/WHILE since they
Packit Service 1fb00e
     * have no runtime arg list (at this time)
Packit Service 1fb00e
     */
Packit Service 1fb00e
    switch (Op->Asl.AmlOpcode)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case AML_IF_OP:
Packit Service 1fb00e
    case AML_WHILE_OP:
Packit Service 1fb00e
    case AML_RETURN_OP:
Packit Service 1fb00e
Packit Service 1fb00e
        if (ArgOp->Asl.ParseOpcode == PARSEOP_METHODCALL)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /* Check for an internal method */
Packit Service 1fb00e
Packit Service 1fb00e
            if (AnIsInternalMethod (ArgOp))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                return (AE_OK);
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            /* The lone arg is a method call, check it */
Packit Service 1fb00e
Packit Service 1fb00e
            RequiredBtypes = AnMapArgTypeToBtype (ARGI_INTEGER);
Packit Service 1fb00e
            if (Op->Asl.AmlOpcode == AML_RETURN_OP)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                RequiredBtypes = 0xFFFFFFFF;
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            ThisNodeBtype = AnGetBtype (ArgOp);
Packit Service 1fb00e
            if (ThisNodeBtype == ACPI_UINT32_MAX)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                return (AE_OK);
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            AnCheckMethodReturnValue (Op, OpInfo, ArgOp,
Packit Service 1fb00e
                RequiredBtypes, ThisNodeBtype);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_EXTERNAL_OP:
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Not really a "runtime" opcode since it used by disassembler only.
Packit Service 1fb00e
         * The parser will find any issues with the operands.
Packit Service 1fb00e
         */
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        break;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Ignore the non-executable opcodes */
Packit Service 1fb00e
Packit Service 1fb00e
    if (RuntimeArgTypes == ARGI_INVALID_OPCODE)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Special handling for certain opcodes.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    switch (Op->Asl.AmlOpcode)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* BankField has one TermArg */
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_BANK_FIELD_OP:
Packit Service 1fb00e
Packit Service 1fb00e
        OpcodeClass = AML_CLASS_EXECUTE;
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
        /* Operation Region has 2 TermArgs */
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_REGION_OP:
Packit Service 1fb00e
Packit Service 1fb00e
        OpcodeClass = AML_CLASS_EXECUTE;
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
        /* DataTableRegion has 3 TermArgs */
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_DATA_REGION_OP:
Packit Service 1fb00e
Packit Service 1fb00e
        OpcodeClass = AML_CLASS_EXECUTE;
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
        /* Buffers/Packages have a length that is a TermArg */
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_BUFFER_OP:
Packit Service 1fb00e
    case AML_PACKAGE_OP:
Packit Service 1fb00e
    case AML_VARIABLE_PACKAGE_OP:
Packit Service 1fb00e
Packit Service 1fb00e
            /* If length is a constant, we are done */
Packit Service 1fb00e
Packit Service 1fb00e
        if ((ArgOp->Asl.ParseOpcode == PARSEOP_INTEGER) ||
Packit Service 1fb00e
            (ArgOp->Asl.ParseOpcode == PARSEOP_RAW_DATA))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            return (AE_OK);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
        /* Store can write any object to the Debug object */
Packit Service 1fb00e
Packit Service 1fb00e
    case AML_STORE_OP:
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * If this is a Store() to the Debug object, we don't need
Packit Service 1fb00e
         * to perform any further validation -- because a Store of
Packit Service 1fb00e
         * any object to Debug is permitted and supported.
Packit Service 1fb00e
         */
Packit Service 1fb00e
        if (ArgOp->Asl.Next->Asl.AmlOpcode == AML_DEBUG_OP)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            return (AE_OK);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
        break;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    switch (OpcodeClass)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case AML_CLASS_EXECUTE:
Packit Service 1fb00e
    case AML_CLASS_CREATE:
Packit Service 1fb00e
    case AML_CLASS_CONTROL:
Packit Service 1fb00e
    case AML_CLASS_RETURN_VALUE:
Packit Service 1fb00e
Packit Service 1fb00e
        /* Reverse the runtime argument list */
Packit Service 1fb00e
Packit Service 1fb00e
        RuntimeArgTypes2 = 0;
Packit Service 1fb00e
        while ((ArgType = GET_CURRENT_ARG_TYPE (RuntimeArgTypes)))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            RuntimeArgTypes2 <<= ARG_TYPE_WIDTH;
Packit Service 1fb00e
            RuntimeArgTypes2 |= ArgType;
Packit Service 1fb00e
            INCREMENT_ARG_LIST (RuntimeArgTypes);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Typecheck each argument */
Packit Service 1fb00e
Packit Service 1fb00e
        while ((ArgType = GET_CURRENT_ARG_TYPE (RuntimeArgTypes2)))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /* Get the required type(s) for the argument */
Packit Service 1fb00e
Packit Service 1fb00e
            RequiredBtypes = AnMapArgTypeToBtype (ArgType);
Packit Service 1fb00e
Packit Service 1fb00e
            if (!ArgOp)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op,
Packit Service 1fb00e
                    "Null ArgOp in argument loop");
Packit Service 1fb00e
                AslAbort ();
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            /* Get the actual type of the argument */
Packit Service 1fb00e
Packit Service 1fb00e
            ThisNodeBtype = AnGetBtype (ArgOp);
Packit Service 1fb00e
            if (ThisNodeBtype == ACPI_UINT32_MAX)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                goto NextArgument;
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            /* Examine the arg based on the required type of the arg */
Packit Service 1fb00e
Packit Service 1fb00e
            switch (ArgType)
Packit Service 1fb00e
            {
Packit Service 1fb00e
            case ARGI_TARGETREF:
Packit Service 1fb00e
Packit Service 1fb00e
                if (ArgOp->Asl.ParseOpcode == PARSEOP_ZERO)
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    /* ZERO is the placeholder for "don't store result" */
Packit Service 1fb00e
Packit Service 1fb00e
                    ThisNodeBtype = RequiredBtypes;
Packit Service 1fb00e
                    break;
Packit Service 1fb00e
                }
Packit Service 1fb00e
Packit Service 1fb00e
            /* Fallthrough */
Packit Service 1fb00e
Packit Service 1fb00e
            case ARGI_STORE_TARGET:
Packit Service 1fb00e
Packit Service 1fb00e
                if (ArgOp->Asl.ParseOpcode == PARSEOP_INTEGER)
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    /*
Packit Service 1fb00e
                     * This is the case where an original reference to a resource
Packit Service 1fb00e
                     * descriptor field has been replaced by an (Integer) offset.
Packit Service 1fb00e
                     * These named fields are supported at compile-time only;
Packit Service 1fb00e
                     * the names are not passed to the interpreter (via the AML).
Packit Service 1fb00e
                     */
Packit Service 1fb00e
                    if ((ArgOp->Asl.Node->Type == ACPI_TYPE_LOCAL_RESOURCE_FIELD) ||
Packit Service 1fb00e
                        (ArgOp->Asl.Node->Type == ACPI_TYPE_LOCAL_RESOURCE))
Packit Service 1fb00e
                    {
Packit Service 1fb00e
                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_FIELD,
Packit Service 1fb00e
                            ArgOp, NULL);
Packit Service 1fb00e
                    }
Packit Service 1fb00e
                    else
Packit Service 1fb00e
                    {
Packit Service 1fb00e
                        AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE,
Packit Service 1fb00e
                            ArgOp, NULL);
Packit Service 1fb00e
                    }
Packit Service 1fb00e
                }
Packit Service 1fb00e
                break;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
#ifdef __FUTURE_IMPLEMENTATION
Packit Service 1fb00e
/*
Packit Service 1fb00e
 * Possible future typechecking support
Packit Service 1fb00e
 */
Packit Service 1fb00e
            case ARGI_REFERENCE:            /* References */
Packit Service 1fb00e
            case ARGI_INTEGER_REF:
Packit Service 1fb00e
            case ARGI_OBJECT_REF:
Packit Service 1fb00e
            case ARGI_DEVICE_REF:
Packit Service 1fb00e
Packit Service 1fb00e
                switch (ArgOp->Asl.ParseOpcode)
Packit Service 1fb00e
                {
Packit Service 1fb00e
                case PARSEOP_LOCAL0:
Packit Service 1fb00e
                case PARSEOP_LOCAL1:
Packit Service 1fb00e
                case PARSEOP_LOCAL2:
Packit Service 1fb00e
                case PARSEOP_LOCAL3:
Packit Service 1fb00e
                case PARSEOP_LOCAL4:
Packit Service 1fb00e
                case PARSEOP_LOCAL5:
Packit Service 1fb00e
                case PARSEOP_LOCAL6:
Packit Service 1fb00e
                case PARSEOP_LOCAL7:
Packit Service 1fb00e
Packit Service 1fb00e
                    /* TBD: implement analysis of current value (type) of the local */
Packit Service 1fb00e
                    /* For now, just treat any local as a typematch */
Packit Service 1fb00e
Packit Service 1fb00e
                    /*ThisNodeBtype = RequiredBtypes;*/
Packit Service 1fb00e
                    break;
Packit Service 1fb00e
Packit Service 1fb00e
                case PARSEOP_ARG0:
Packit Service 1fb00e
                case PARSEOP_ARG1:
Packit Service 1fb00e
                case PARSEOP_ARG2:
Packit Service 1fb00e
                case PARSEOP_ARG3:
Packit Service 1fb00e
                case PARSEOP_ARG4:
Packit Service 1fb00e
                case PARSEOP_ARG5:
Packit Service 1fb00e
                case PARSEOP_ARG6:
Packit Service 1fb00e
Packit Service 1fb00e
                    /* Hard to analyze argument types, so we won't */
Packit Service 1fb00e
                    /* for now. Just treat any arg as a typematch */
Packit Service 1fb00e
Packit Service 1fb00e
                    /* ThisNodeBtype = RequiredBtypes; */
Packit Service 1fb00e
                    break;
Packit Service 1fb00e
Packit Service 1fb00e
                case PARSEOP_DEBUG:
Packit Service 1fb00e
                case PARSEOP_REFOF:
Packit Service 1fb00e
                case PARSEOP_INDEX:
Packit Service 1fb00e
                default:
Packit Service 1fb00e
Packit Service 1fb00e
                    break;
Packit Service 1fb00e
                }
Packit Service 1fb00e
                break;
Packit Service 1fb00e
#endif
Packit Service 1fb00e
            case ARGI_INTEGER:
Packit Service 1fb00e
            default:
Packit Service 1fb00e
Packit Service 1fb00e
                break;
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
            /* Check for a type mismatch (required versus actual) */
Packit Service 1fb00e
Packit Service 1fb00e
            CommonBtypes = ThisNodeBtype & RequiredBtypes;
Packit Service 1fb00e
Packit Service 1fb00e
            if (ArgOp->Asl.ParseOpcode == PARSEOP_METHODCALL)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                if (AnIsInternalMethod (ArgOp))
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    return (AE_OK);
Packit Service 1fb00e
                }
Packit Service 1fb00e
Packit Service 1fb00e
                /* Check a method call for a valid return value */
Packit Service 1fb00e
Packit Service 1fb00e
                AnCheckMethodReturnValue (Op, OpInfo, ArgOp,
Packit Service 1fb00e
                    RequiredBtypes, ThisNodeBtype);
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * Now check if the actual type(s) match at least one
Packit Service 1fb00e
             * bit to the required type
Packit Service 1fb00e
             */
Packit Service 1fb00e
            else if (!CommonBtypes)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                /* No match -- this is a type mismatch error */
Packit Service 9fa89e
		int cnt;
Packit Service 9fa89e
		char *strp;
Packit Service 1fb00e
Packit Service 1fb00e
                AnFormatBtype (StringBuffer, ThisNodeBtype);
Packit Service 1fb00e
                AnFormatBtype (StringBuffer2, RequiredBtypes);
Packit Service 1fb00e
Packit Service 9fa89e
                cnt = asprintf (&strp, "[%s] found, %s operator requires [%s]",
Packit Service 1fb00e
                    StringBuffer, OpInfo->Name, StringBuffer2);
Packit Service 1fb00e
Packit Service 1fb00e
                AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE,
Packit Service 9fa89e
                    ArgOp, strp);
Packit Service 9fa89e
		if (cnt > 0)
Packit Service 9fa89e
		    free(strp);
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
        NextArgument:
Packit Service 1fb00e
            ArgOp = ArgOp->Asl.Next;
Packit Service 1fb00e
            INCREMENT_ARG_LIST (RuntimeArgTypes2);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        break;
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:    AnOtherSemanticAnalysisWalkBegin
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 for the analysis walk. Checks for
Packit Service 1fb00e
 *              miscellaneous issues in the code.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
AnOtherSemanticAnalysisWalkBegin (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    UINT32                  Level,
Packit Service 1fb00e
    void                    *Context)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *ArgOp;
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *PrevArgOp = NULL;
Packit Service 1fb00e
    const ACPI_OPCODE_INFO  *OpInfo;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *Node;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Determine if an execution class operator actually does something by
Packit Service 1fb00e
     * checking if it has a target and/or the function return value is used.
Packit Service 1fb00e
     * (Target is optional, so a standalone statement can actually do nothing.)
Packit Service 1fb00e
     */
Packit Service 1fb00e
    if ((OpInfo->Class == AML_CLASS_EXECUTE) &&
Packit Service 1fb00e
        (OpInfo->Flags & AML_HAS_RETVAL) &&
Packit Service 1fb00e
        (!AnIsResultUsed (Op)))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (OpInfo->Flags & AML_HAS_TARGET)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * Find the target node, it is always the last child. If the target
Packit Service 1fb00e
             * is not specified in the ASL, a default node of type Zero was
Packit Service 1fb00e
             * created by the parser.
Packit Service 1fb00e
             */
Packit Service 1fb00e
            ArgOp = Op->Asl.Child;
Packit Service 1fb00e
            while (ArgOp->Asl.Next)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                PrevArgOp = ArgOp;
Packit Service 1fb00e
                ArgOp = ArgOp->Asl.Next;
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            /* Divide() is the only weird case, it has two targets */
Packit Service 1fb00e
Packit Service 1fb00e
            if (Op->Asl.AmlOpcode == AML_DIVIDE_OP)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                if ((ArgOp->Asl.ParseOpcode == PARSEOP_ZERO) &&
Packit Service 1fb00e
                    (PrevArgOp) &&
Packit Service 1fb00e
                    (PrevArgOp->Asl.ParseOpcode == PARSEOP_ZERO))
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    AslError (ASL_ERROR, ASL_MSG_RESULT_NOT_USED,
Packit Service 1fb00e
                        Op, Op->Asl.ExternalName);
Packit Service 1fb00e
                }
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            else if (ArgOp->Asl.ParseOpcode == PARSEOP_ZERO)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                AslError (ASL_ERROR, ASL_MSG_RESULT_NOT_USED,
Packit Service 1fb00e
                    Op, Op->Asl.ExternalName);
Packit Service 1fb00e
            }
Packit Service 1fb00e
        }
Packit Service 1fb00e
        else
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * Has no target and the result is not used. Only a couple opcodes
Packit Service 1fb00e
             * can have this combination.
Packit Service 1fb00e
             */
Packit Service 1fb00e
            switch (Op->Asl.ParseOpcode)
Packit Service 1fb00e
            {
Packit Service 1fb00e
            case PARSEOP_ACQUIRE:
Packit Service 1fb00e
            case PARSEOP_WAIT:
Packit Service 1fb00e
            case PARSEOP_LOADTABLE:
Packit Service 1fb00e
Packit Service 1fb00e
                break;
Packit Service 1fb00e
Packit Service 1fb00e
            default:
Packit Service 1fb00e
Packit Service 1fb00e
                AslError (ASL_ERROR, ASL_MSG_RESULT_NOT_USED,
Packit Service 1fb00e
                    Op, Op->Asl.ExternalName);
Packit Service 1fb00e
                break;
Packit Service 1fb00e
            }
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Semantic checks for individual ASL operators
Packit Service 1fb00e
     */
Packit Service 1fb00e
    switch (Op->Asl.ParseOpcode)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case PARSEOP_STORE:
Packit Service 1fb00e
Packit Service 1fb00e
        if (Gbl_DoTypechecking)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AnAnalyzeStoreOperator (Op);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    case PARSEOP_ACQUIRE:
Packit Service 1fb00e
    case PARSEOP_WAIT:
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Emit a warning if the timeout parameter for these operators is not
Packit Service 1fb00e
         * ACPI_WAIT_FOREVER, and the result value from the operator is not
Packit Service 1fb00e
         * checked, meaning that a timeout could happen, but the code
Packit Service 1fb00e
         * would not know about it.
Packit Service 1fb00e
         */
Packit Service 1fb00e
Packit Service 1fb00e
        /* First child is the namepath, 2nd child is timeout */
Packit Service 1fb00e
Packit Service 1fb00e
        ArgOp = Op->Asl.Child;
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;
Packit Service 1fb00e
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Check for the WAIT_FOREVER case - defined by the ACPI spec to be
Packit Service 1fb00e
         * 0xFFFF or greater
Packit Service 1fb00e
         */
Packit Service 1fb00e
        if (((ArgOp->Asl.ParseOpcode == PARSEOP_WORDCONST) ||
Packit Service 1fb00e
             (ArgOp->Asl.ParseOpcode == PARSEOP_INTEGER))  &&
Packit Service 1fb00e
             (ArgOp->Asl.Value.Integer >= (UINT64) ACPI_WAIT_FOREVER))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            break;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * The operation could timeout. If the return value is not used
Packit Service 1fb00e
         * (indicates timeout occurred), issue a warning
Packit Service 1fb00e
         */
Packit Service 1fb00e
        if (!AnIsResultUsed (Op))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslError (ASL_WARNING, ASL_MSG_TIMEOUT, ArgOp,
Packit Service 1fb00e
                Op->Asl.ExternalName);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case PARSEOP_CREATEFIELD:
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Check for a zero Length (NumBits) operand. NumBits is the 3rd operand
Packit Service 1fb00e
         */
Packit Service 1fb00e
        ArgOp = Op->Asl.Child;
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;
Packit Service 1fb00e
Packit Service 1fb00e
        if ((ArgOp->Asl.ParseOpcode == PARSEOP_ZERO) ||
Packit Service 1fb00e
           ((ArgOp->Asl.ParseOpcode == PARSEOP_INTEGER) &&
Packit Service 1fb00e
            (ArgOp->Asl.Value.Integer == 0)))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslError (ASL_ERROR, ASL_MSG_NON_ZERO, ArgOp, NULL);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case PARSEOP_CONNECTION:
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Ensure that the referenced operation region has the correct SPACE_ID.
Packit Service 1fb00e
         * From the grammar/parser, we know the parent is a FIELD definition.
Packit Service 1fb00e
         */
Packit Service 1fb00e
        ArgOp = Op->Asl.Parent;     /* Field definition */
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Child;   /* First child is the OpRegion Name */
Packit Service 1fb00e
        Node = ArgOp->Asl.Node;     /* OpRegion namespace node */
Packit Service 1fb00e
        if (!Node)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            break;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        ArgOp = Node->Op;           /* OpRegion definition */
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Child;   /* First child is the OpRegion Name */
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;    /* Next peer is the SPACE_ID (what we want) */
Packit Service 1fb00e
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * The Connection() operator is only valid for the following operation
Packit Service 1fb00e
         * region SpaceIds: GeneralPurposeIo and GenericSerialBus.
Packit Service 1fb00e
         */
Packit Service 1fb00e
        if ((ArgOp->Asl.Value.Integer != ACPI_ADR_SPACE_GPIO) &&
Packit Service 1fb00e
            (ArgOp->Asl.Value.Integer != ACPI_ADR_SPACE_GSBUS))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslError (ASL_ERROR, ASL_MSG_CONNECTION_INVALID, Op, NULL);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case PARSEOP_FIELD:
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Ensure that fields for GeneralPurposeIo and GenericSerialBus
Packit Service 1fb00e
         * contain at least one Connection() operator
Packit Service 1fb00e
         */
Packit Service 1fb00e
        ArgOp = Op->Asl.Child;      /* 1st child is the OpRegion Name */
Packit Service 1fb00e
        Node = ArgOp->Asl.Node;     /* OpRegion namespace node */
Packit Service 1fb00e
        if (!Node)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            break;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        ArgOp = Node->Op;           /* OpRegion definition */
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Child;   /* First child is the OpRegion Name */
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;    /* Next peer is the SPACE_ID (what we want) */
Packit Service 1fb00e
Packit Service 1fb00e
        /* We are only interested in GeneralPurposeIo and GenericSerialBus */
Packit Service 1fb00e
Packit Service 1fb00e
        if ((ArgOp->Asl.Value.Integer != ACPI_ADR_SPACE_GPIO) &&
Packit Service 1fb00e
            (ArgOp->Asl.Value.Integer != ACPI_ADR_SPACE_GSBUS))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            break;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        ArgOp = Op->Asl.Child;      /* 1st child is the OpRegion Name */
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;    /* AccessType */
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;    /* LockRule */
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;    /* UpdateRule */
Packit Service 1fb00e
        ArgOp = ArgOp->Asl.Next;    /* Start of FieldUnitList */
Packit Service 1fb00e
Packit Service 1fb00e
        /* Walk the FieldUnitList */
Packit Service 1fb00e
Packit Service 1fb00e
        while (ArgOp)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            if (ArgOp->Asl.ParseOpcode == PARSEOP_CONNECTION)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                break;
Packit Service 1fb00e
            }
Packit Service 1fb00e
            else if (ArgOp->Asl.ParseOpcode == PARSEOP_NAMESEG)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                AslError (ASL_ERROR, ASL_MSG_CONNECTION_MISSING, ArgOp, NULL);
Packit Service 1fb00e
                break;
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            ArgOp = ArgOp->Asl.Next;
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        break;
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:    AnAnalyzeStoreOperator
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op                  - Store() operator
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Analyze a store operator. Mostly for stores to/from package
Packit Service 1fb00e
 *              objects where there are more restrictions than other data
Packit Service 1fb00e
 *              types.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
AnAnalyzeStoreOperator (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *SourceNode;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *TargetNode;
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *SourceOperandOp;
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *TargetOperandOp;
Packit Service 1fb00e
    UINT32                  SourceOperandBtype;
Packit Service 1fb00e
    UINT32                  TargetOperandBtype;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Extract the two operands for STORE */
Packit Service 1fb00e
Packit Service 1fb00e
    SourceOperandOp = Op->Asl.Child;
Packit Service 1fb00e
    TargetOperandOp = SourceOperandOp->Asl.Next;
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Ignore these Source operand opcodes, they cannot be typechecked,
Packit Service 1fb00e
     * the actual result is unknown here.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    switch (SourceOperandOp->Asl.ParseOpcode)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    /* For these, type of the returned value is unknown at compile time */
Packit Service 1fb00e
Packit Service 1fb00e
    case PARSEOP_DEREFOF:
Packit Service 1fb00e
    case PARSEOP_METHODCALL:
Packit Service 1fb00e
    case PARSEOP_STORE:
Packit Service 1fb00e
    case PARSEOP_COPYOBJECT:
Packit Service 1fb00e
Packit Service 1fb00e
        return;
Packit Service 1fb00e
Packit Service 1fb00e
    case PARSEOP_INDEX:
Packit Service 1fb00e
    case PARSEOP_REFOF:
Packit Service 1fb00e
Packit Service 1fb00e
        if (!Gbl_EnableReferenceTypechecking)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            return;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * These opcodes always return an object reference, and thus
Packit Service 1fb00e
         * the result can only be stored to a Local, Arg, or Debug.
Packit Service 1fb00e
         */
Packit Service 1fb00e
        if (TargetOperandOp->Asl.AmlOpcode == AML_DEBUG_OP)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            return;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        if ((TargetOperandOp->Asl.AmlOpcode < AML_LOCAL0) ||
Packit Service 1fb00e
            (TargetOperandOp->Asl.AmlOpcode > AML_ARG6))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, TargetOperandOp,
Packit Service 1fb00e
                "Source [Reference], Target must be [Local/Arg/Debug]");
Packit Service 1fb00e
        }
Packit Service 1fb00e
        return;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
        break;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Ignore these Target operand opcodes, they cannot be typechecked
Packit Service 1fb00e
     */
Packit Service 1fb00e
    switch (TargetOperandOp->Asl.ParseOpcode)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case PARSEOP_DEBUG:
Packit Service 1fb00e
    case PARSEOP_DEREFOF:
Packit Service 1fb00e
    case PARSEOP_REFOF:
Packit Service 1fb00e
    case PARSEOP_INDEX:
Packit Service 1fb00e
    case PARSEOP_STORE:
Packit Service 1fb00e
Packit Service 1fb00e
        return;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
        break;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Ignore typecheck for External() operands of type "UnknownObj",
Packit Service 1fb00e
     * we don't know the actual type (source or target).
Packit Service 1fb00e
     */
Packit Service 1fb00e
    SourceNode = SourceOperandOp->Asl.Node;
Packit Service 1fb00e
    if (SourceNode &&
Packit Service 1fb00e
        (SourceNode->Flags & ANOBJ_IS_EXTERNAL) &&
Packit Service 1fb00e
        (SourceNode->Type == ACPI_TYPE_ANY))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    TargetNode = TargetOperandOp->Asl.Node;
Packit Service 1fb00e
    if (TargetNode &&
Packit Service 1fb00e
        (TargetNode->Flags & ANOBJ_IS_EXTERNAL) &&
Packit Service 1fb00e
        (TargetNode->Type == ACPI_TYPE_ANY))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * A NULL node with a namepath AML opcode indicates non-existent
Packit Service 1fb00e
     * name. Just return, the error message is generated elsewhere.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    if ((!SourceNode && (SourceOperandOp->Asl.AmlOpcode == AML_INT_NAMEPATH_OP)) ||
Packit Service 1fb00e
        (!TargetNode && (TargetOperandOp->Asl.AmlOpcode == AML_INT_NAMEPATH_OP)))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Simple check for source same as target via NS node.
Packit Service 1fb00e
     * -- Could be expanded to locals and args.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    if (SourceNode && TargetNode)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (SourceNode == TargetNode)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslError (ASL_WARNING, ASL_MSG_DUPLICATE_ITEM,
Packit Service 1fb00e
                TargetOperandOp, "Source is the same as Target");
Packit Service 1fb00e
            return;
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Ignore typecheck if either source or target is a local or arg */
Packit Service 1fb00e
Packit Service 1fb00e
    if ((SourceOperandOp->Asl.AmlOpcode >= AML_LOCAL0) &&
Packit Service 1fb00e
        (SourceOperandOp->Asl.AmlOpcode <= AML_ARG6))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return; /* Cannot type a local/arg at compile time */
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if ((TargetOperandOp->Asl.AmlOpcode >= AML_LOCAL0) &&
Packit Service 1fb00e
        (TargetOperandOp->Asl.AmlOpcode <= AML_ARG6))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return; /* Cannot type a local/arg at compile time */
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Package objects are a special case because they cannot by implicitly
Packit Service 1fb00e
     * converted to/from anything. Check for these two illegal cases:
Packit Service 1fb00e
     *
Packit Service 1fb00e
     *      Store (non-package, package)
Packit Service 1fb00e
     *      Store (package, non-package)
Packit Service 1fb00e
     */
Packit Service 1fb00e
    SourceOperandBtype = AnGetBtype (SourceOperandOp);
Packit Service 1fb00e
    TargetOperandBtype = AnGetBtype (TargetOperandOp);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Check source first for (package, non-package) case */
Packit Service 1fb00e
Packit Service 1fb00e
    if (SourceOperandBtype & ACPI_BTYPE_PACKAGE)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* If Source is PACKAGE-->Target must be PACKAGE */
Packit Service 1fb00e
Packit Service 1fb00e
        if (!(TargetOperandBtype & ACPI_BTYPE_PACKAGE))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, TargetOperandOp,
Packit Service 1fb00e
                "Source is [Package], Target must be a package also");
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Else check target for (non-package, package) case */
Packit Service 1fb00e
Packit Service 1fb00e
    else if (TargetOperandBtype & ACPI_BTYPE_PACKAGE)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* If Target is PACKAGE, Source must be PACKAGE */
Packit Service 1fb00e
Packit Service 1fb00e
        if (!(SourceOperandBtype & ACPI_BTYPE_PACKAGE))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, SourceOperandOp,
Packit Service 1fb00e
                "Target is [Package], Source must be a package also");
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
}