Blame source/components/dispatcher/dsmthdat.c

Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Module Name: dsmthdat - control method arguments and local variables
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 "acpi.h"
Packit Service 1fb00e
#include "accommon.h"
Packit Service 1fb00e
#include "acdispat.h"
Packit Service 1fb00e
#include "acnamesp.h"
Packit Service 1fb00e
#include "acinterp.h"
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
#define _COMPONENT          ACPI_DISPATCHER
Packit Service 1fb00e
        ACPI_MODULE_NAME    ("dsmthdat")
Packit Service 1fb00e
Packit Service 1fb00e
/* Local prototypes */
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
AcpiDsMethodDataDeleteValue (
Packit Service 1fb00e
    UINT8                   Type,
Packit Service 1fb00e
    UINT32                  Index,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState);
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
AcpiDsMethodDataSetValue (
Packit Service 1fb00e
    UINT8                   Type,
Packit Service 1fb00e
    UINT32                  Index,
Packit Service 1fb00e
    ACPI_OPERAND_OBJECT     *Object,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState);
Packit Service 1fb00e
Packit Service 1fb00e
#ifdef ACPI_OBSOLETE_FUNCTIONS
Packit Service 1fb00e
ACPI_OBJECT_TYPE
Packit Service 1fb00e
AcpiDsMethodDataGetType (
Packit Service 1fb00e
    UINT16                  Opcode,
Packit Service 1fb00e
    UINT32                  Index,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState);
Packit Service 1fb00e
#endif
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AcpiDsMethodDataInit
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  WalkState           - Current walk state object
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Initialize the data structures that hold the method's arguments
Packit Service 1fb00e
 *              and locals. The data struct is an array of namespace nodes for
Packit Service 1fb00e
 *              each - this allows RefOf and DeRefOf to work properly for these
Packit Service 1fb00e
 *              special data types.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * NOTES:       WalkState fields are initialized to zero by the
Packit Service 1fb00e
 *              ACPI_ALLOCATE_ZEROED().
Packit Service 1fb00e
 *
Packit Service 1fb00e
 *              A pseudo-Namespace Node is assigned to each argument and local
Packit Service 1fb00e
 *              so that RefOf() can return a pointer to the Node.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
AcpiDsMethodDataInit (
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState)
Packit Service 1fb00e
{
Packit Service 1fb00e
    UINT32                  i;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FUNCTION_TRACE (DsMethodDataInit);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Init the method arguments */
Packit Service 1fb00e
Packit Service 1fb00e
    for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        ACPI_MOVE_32_TO_32 (&WalkState->Arguments[i].Name,
Packit Service 1fb00e
            NAMEOF_ARG_NTE);
Packit Service 1fb00e
Packit Service 1fb00e
        WalkState->Arguments[i].Name.Integer |= (i << 24);
Packit Service 1fb00e
        WalkState->Arguments[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
Packit Service 1fb00e
        WalkState->Arguments[i].Type = ACPI_TYPE_ANY;
Packit Service 1fb00e
        WalkState->Arguments[i].Flags = ANOBJ_METHOD_ARG;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Init the method locals */
Packit Service 1fb00e
Packit Service 1fb00e
    for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        ACPI_MOVE_32_TO_32 (&WalkState->LocalVariables[i].Name,
Packit Service 1fb00e
            NAMEOF_LOCAL_NTE);
Packit Service 1fb00e
Packit Service 1fb00e
        WalkState->LocalVariables[i].Name.Integer |= (i << 24);
Packit Service 1fb00e
        WalkState->LocalVariables[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
Packit Service 1fb00e
        WalkState->LocalVariables[i].Type = ACPI_TYPE_ANY;
Packit Service 1fb00e
        WalkState->LocalVariables[i].Flags = ANOBJ_METHOD_LOCAL;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return_VOID;
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AcpiDsMethodDataDeleteAll
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  WalkState           - Current walk state object
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Delete method locals and arguments. Arguments are only
Packit Service 1fb00e
 *              deleted if this method was called from another method.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
AcpiDsMethodDataDeleteAll (
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState)
Packit Service 1fb00e
{
Packit Service 1fb00e
    UINT32                  Index;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FUNCTION_TRACE (DsMethodDataDeleteAll);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Detach the locals */
Packit Service 1fb00e
Packit Service 1fb00e
    for (Index = 0; Index < ACPI_METHOD_NUM_LOCALS; Index++)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (WalkState->LocalVariables[Index].Object)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Local%u=%p\n",
Packit Service 1fb00e
                Index, WalkState->LocalVariables[Index].Object));
Packit Service 1fb00e
Packit Service 1fb00e
            /* Detach object (if present) and remove a reference */
Packit Service 1fb00e
Packit Service 1fb00e
            AcpiNsDetachObject (&WalkState->LocalVariables[Index]);
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Detach the arguments */
Packit Service 1fb00e
Packit Service 1fb00e
    for (Index = 0; Index < ACPI_METHOD_NUM_ARGS; Index++)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (WalkState->Arguments[Index].Object)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Arg%u=%p\n",
Packit Service 1fb00e
                Index, WalkState->Arguments[Index].Object));
Packit Service 1fb00e
Packit Service 1fb00e
            /* Detach object (if present) and remove a reference */
Packit Service 1fb00e
Packit Service 1fb00e
            AcpiNsDetachObject (&WalkState->Arguments[Index]);
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return_VOID;
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AcpiDsMethodDataInitArgs
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  *Params         - Pointer to a parameter list for the method
Packit Service 1fb00e
 *              MaxParamCount   - The arg count for this method
Packit Service 1fb00e
 *              WalkState       - Current walk state object
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Initialize arguments for a method. The parameter list is a list
Packit Service 1fb00e
 *              of ACPI operand objects, either null terminated or whose length
Packit Service 1fb00e
 *              is defined by MaxParamCount.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
AcpiDsMethodDataInitArgs (
Packit Service 1fb00e
    ACPI_OPERAND_OBJECT     **Params,
Packit Service 1fb00e
    UINT32                  MaxParamCount,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_STATUS             Status;
Packit Service 1fb00e
    UINT32                  Index = 0;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FUNCTION_TRACE_PTR (DsMethodDataInitArgs, Params);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    if (!Params)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
Packit Service 1fb00e
            "No parameter list passed to method\n"));
Packit Service 1fb00e
        return_ACPI_STATUS (AE_OK);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Copy passed parameters into the new method stack frame */
Packit Service 1fb00e
Packit Service 1fb00e
    while ((Index < ACPI_METHOD_NUM_ARGS) &&
Packit Service 1fb00e
           (Index < MaxParamCount)        &&
Packit Service 1fb00e
            Params[Index])
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * A valid parameter.
Packit Service 1fb00e
         * Store the argument in the method/walk descriptor.
Packit Service 1fb00e
         * Do not copy the arg in order to implement call by reference
Packit Service 1fb00e
         */
Packit Service 1fb00e
        Status = AcpiDsMethodDataSetValue (
Packit Service 1fb00e
            ACPI_REFCLASS_ARG, Index, Params[Index], 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
        Index++;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%u args passed to method\n", Index));
Packit Service 1fb00e
    return_ACPI_STATUS (AE_OK);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AcpiDsMethodDataGetNode
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
Packit Service 1fb00e
 *                                    ACPI_REFCLASS_ARG
Packit Service 1fb00e
 *              Index               - Which Local or Arg whose type to get
Packit Service 1fb00e
 *              WalkState           - Current walk state object
Packit Service 1fb00e
 *              Node                - Where the node is returned.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status and node
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Get the Node associated with a local or arg.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
AcpiDsMethodDataGetNode (
Packit Service 1fb00e
    UINT8                   Type,
Packit Service 1fb00e
    UINT32                  Index,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState,
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     **Node)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_FUNCTION_TRACE (DsMethodDataGetNode);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Method Locals and Arguments are supported
Packit Service 1fb00e
     */
Packit Service 1fb00e
    switch (Type)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case ACPI_REFCLASS_LOCAL:
Packit Service 1fb00e
Packit Service 1fb00e
        if (Index > ACPI_METHOD_MAX_LOCAL)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            ACPI_ERROR ((AE_INFO,
Packit Service f54687
                "Local index %u is invalid (max %d)",
Packit Service 1fb00e
                Index, ACPI_METHOD_MAX_LOCAL));
Packit Service 1fb00e
            return_ACPI_STATUS (AE_AML_INVALID_INDEX);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Return a pointer to the pseudo-node */
Packit Service 1fb00e
Packit Service 1fb00e
        *Node = &WalkState->LocalVariables[Index];
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case ACPI_REFCLASS_ARG:
Packit Service 1fb00e
Packit Service 1fb00e
        if (Index > ACPI_METHOD_MAX_ARG)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            ACPI_ERROR ((AE_INFO,
Packit Service f54687
                "Arg index %u is invalid (max %d)",
Packit Service 1fb00e
                Index, ACPI_METHOD_MAX_ARG));
Packit Service 1fb00e
            return_ACPI_STATUS (AE_AML_INVALID_INDEX);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Return a pointer to the pseudo-node */
Packit Service 1fb00e
Packit Service 1fb00e
        *Node = &WalkState->Arguments[Index];
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        ACPI_ERROR ((AE_INFO, "Type %u is invalid", Type));
Packit Service 1fb00e
        return_ACPI_STATUS (AE_TYPE);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return_ACPI_STATUS (AE_OK);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AcpiDsMethodDataSetValue
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
Packit Service 1fb00e
 *                                    ACPI_REFCLASS_ARG
Packit Service 1fb00e
 *              Index               - Which Local or Arg to get
Packit Service 1fb00e
 *              Object              - Object to be inserted into the stack entry
Packit Service 1fb00e
 *              WalkState           - Current walk state object
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Insert an object onto the method stack at entry Opcode:Index.
Packit Service 1fb00e
 *              Note: There is no "implicit conversion" for locals.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static ACPI_STATUS
Packit Service 1fb00e
AcpiDsMethodDataSetValue (
Packit Service 1fb00e
    UINT8                   Type,
Packit Service 1fb00e
    UINT32                  Index,
Packit Service 1fb00e
    ACPI_OPERAND_OBJECT     *Object,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_STATUS             Status;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *Node;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FUNCTION_TRACE (DsMethodDataSetValue);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
Packit Service 1fb00e
        "NewObj %p Type %2.2X, Refs=%u [%s]\n", Object,
Packit Service 1fb00e
        Type, Object->Common.ReferenceCount,
Packit Service 1fb00e
        AcpiUtGetTypeName (Object->Common.Type)));
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the namespace node for the arg/local */
Packit Service 1fb00e
Packit Service 1fb00e
    Status = AcpiDsMethodDataGetNode (Type, Index, 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
     * Increment ref count so object can't be deleted while installed.
Packit Service 1fb00e
     * NOTE: We do not copy the object in order to preserve the call by
Packit Service 1fb00e
     * reference semantics of ACPI Control Method invocation.
Packit Service 1fb00e
     * (See ACPI Specification 2.0C)
Packit Service 1fb00e
     */
Packit Service 1fb00e
    AcpiUtAddReference (Object);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Install the object */
Packit Service 1fb00e
Packit Service 1fb00e
    Node->Object = Object;
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:    AcpiDsMethodDataGetValue
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
Packit Service 1fb00e
 *                                    ACPI_REFCLASS_ARG
Packit Service 1fb00e
 *              Index               - Which localVar or argument to get
Packit Service 1fb00e
 *              WalkState           - Current walk state object
Packit Service 1fb00e
 *              DestDesc            - Where Arg or Local value is returned
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Retrieve value of selected Arg or Local for this method
Packit Service 1fb00e
 *              Used only in AcpiExResolveToValue().
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
AcpiDsMethodDataGetValue (
Packit Service 1fb00e
    UINT8                   Type,
Packit Service 1fb00e
    UINT32                  Index,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState,
Packit Service 1fb00e
    ACPI_OPERAND_OBJECT     **DestDesc)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_STATUS             Status;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *Node;
Packit Service 1fb00e
    ACPI_OPERAND_OBJECT     *Object;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FUNCTION_TRACE (DsMethodDataGetValue);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Validate the object descriptor */
Packit Service 1fb00e
Packit Service 1fb00e
    if (!DestDesc)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        ACPI_ERROR ((AE_INFO, "Null object descriptor pointer"));
Packit Service 1fb00e
        return_ACPI_STATUS (AE_BAD_PARAMETER);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the namespace node for the arg/local */
Packit Service 1fb00e
Packit Service 1fb00e
    Status = AcpiDsMethodDataGetNode (Type, Index, 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
    /* Get the object from the node */
Packit Service 1fb00e
Packit Service 1fb00e
    Object = Node->Object;
Packit Service 1fb00e
Packit Service 1fb00e
    /* Examine the returned object, it must be valid. */
Packit Service 1fb00e
Packit Service 1fb00e
    if (!Object)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Index points to uninitialized object.
Packit Service 1fb00e
         * This means that either 1) The expected argument was
Packit Service 1fb00e
         * not passed to the method, or 2) A local variable
Packit Service 1fb00e
         * was referenced by the method (via the ASL)
Packit Service 1fb00e
         * before it was initialized. Either case is an error.
Packit Service 1fb00e
         */
Packit Service 1fb00e
Packit Service 1fb00e
        /* If slack enabled, init the LocalX/ArgX to an Integer of value zero */
Packit Service 1fb00e
Packit Service 1fb00e
        if (AcpiGbl_EnableInterpreterSlack)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Object = AcpiUtCreateIntegerObject ((UINT64) 0);
Packit Service 1fb00e
            if (!Object)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                return_ACPI_STATUS (AE_NO_MEMORY);
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            Node->Object = Object;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Otherwise, return the error */
Packit Service 1fb00e
Packit Service 1fb00e
        else switch (Type)
Packit Service 1fb00e
        {
Packit Service 1fb00e
        case ACPI_REFCLASS_ARG:
Packit Service 1fb00e
Packit Service 1fb00e
            ACPI_ERROR ((AE_INFO,
Packit Service 1fb00e
                "Uninitialized Arg[%u] at node %p",
Packit Service 1fb00e
                Index, Node));
Packit Service 1fb00e
Packit Service 1fb00e
            return_ACPI_STATUS (AE_AML_UNINITIALIZED_ARG);
Packit Service 1fb00e
Packit Service 1fb00e
        case ACPI_REFCLASS_LOCAL:
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * No error message for this case, will be trapped again later to
Packit Service 1fb00e
             * detect and ignore cases of Store(LocalX,LocalX)
Packit Service 1fb00e
             */
Packit Service 1fb00e
            return_ACPI_STATUS (AE_AML_UNINITIALIZED_LOCAL);
Packit Service 1fb00e
Packit Service 1fb00e
        default:
Packit Service 1fb00e
Packit Service 1fb00e
            ACPI_ERROR ((AE_INFO, "Not a Arg/Local opcode: 0x%X", Type));
Packit Service 1fb00e
            return_ACPI_STATUS (AE_AML_INTERNAL);
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * The Index points to an initialized and valid object.
Packit Service 1fb00e
     * Return an additional reference to the object
Packit Service 1fb00e
     */
Packit Service 1fb00e
    *DestDesc = Object;
Packit Service 1fb00e
    AcpiUtAddReference (Object);
Packit Service 1fb00e
Packit Service 1fb00e
    return_ACPI_STATUS (AE_OK);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AcpiDsMethodDataDeleteValue
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
Packit Service 1fb00e
 *                                    ACPI_REFCLASS_ARG
Packit Service 1fb00e
 *              Index               - Which localVar or argument to delete
Packit Service 1fb00e
 *              WalkState           - Current walk state object
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Delete the entry at Opcode:Index. Inserts
Packit Service 1fb00e
 *              a null into the stack slot after the object is deleted.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
AcpiDsMethodDataDeleteValue (
Packit Service 1fb00e
    UINT8                   Type,
Packit Service 1fb00e
    UINT32                  Index,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_STATUS             Status;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *Node;
Packit Service 1fb00e
    ACPI_OPERAND_OBJECT     *Object;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FUNCTION_TRACE (DsMethodDataDeleteValue);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the namespace node for the arg/local */
Packit Service 1fb00e
Packit Service 1fb00e
    Status = AcpiDsMethodDataGetNode (Type, Index, WalkState, &Node);
Packit Service 1fb00e
    if (ACPI_FAILURE (Status))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return_VOID;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the associated object */
Packit Service 1fb00e
Packit Service 1fb00e
    Object = AcpiNsGetAttachedObject (Node);
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Undefine the Arg or Local by setting its descriptor
Packit Service 1fb00e
     * pointer to NULL. Locals/Args can contain both
Packit Service 1fb00e
     * ACPI_OPERAND_OBJECTS and ACPI_NAMESPACE_NODEs
Packit Service 1fb00e
     */
Packit Service 1fb00e
    Node->Object = NULL;
Packit Service 1fb00e
Packit Service 1fb00e
    if ((Object) &&
Packit Service 1fb00e
        (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_OPERAND))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * There is a valid object.
Packit Service 1fb00e
         * Decrement the reference count by one to balance the
Packit Service 1fb00e
         * increment when the object was stored.
Packit Service 1fb00e
         */
Packit Service 1fb00e
        AcpiUtRemoveReference (Object);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return_VOID;
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AcpiDsStoreObjectToLocal
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Type                - Either ACPI_REFCLASS_LOCAL or
Packit Service 1fb00e
 *                                    ACPI_REFCLASS_ARG
Packit Service 1fb00e
 *              Index               - Which Local or Arg to set
Packit Service 1fb00e
 *              ObjDesc             - Value to be stored
Packit Service 1fb00e
 *              WalkState           - Current walk state
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Store a value in an Arg or Local. The ObjDesc is installed
Packit Service 1fb00e
 *              as the new value for the Arg or Local and the reference count
Packit Service 1fb00e
 *              for ObjDesc is incremented.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
AcpiDsStoreObjectToLocal (
Packit Service 1fb00e
    UINT8                   Type,
Packit Service 1fb00e
    UINT32                  Index,
Packit Service 1fb00e
    ACPI_OPERAND_OBJECT     *ObjDesc,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_STATUS             Status;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *Node;
Packit Service 1fb00e
    ACPI_OPERAND_OBJECT     *CurrentObjDesc;
Packit Service 1fb00e
    ACPI_OPERAND_OBJECT     *NewObjDesc;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FUNCTION_TRACE (DsStoreObjectToLocal);
Packit Service 1fb00e
    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Type=%2.2X Index=%u Obj=%p\n",
Packit Service 1fb00e
        Type, Index, ObjDesc));
Packit Service 1fb00e
Packit Service 1fb00e
    /* Parameter validation */
Packit Service 1fb00e
Packit Service 1fb00e
    if (!ObjDesc)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return_ACPI_STATUS (AE_BAD_PARAMETER);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the namespace node for the arg/local */
Packit Service 1fb00e
Packit Service 1fb00e
    Status = AcpiDsMethodDataGetNode (Type, Index, 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
    CurrentObjDesc = AcpiNsGetAttachedObject (Node);
Packit Service 1fb00e
    if (CurrentObjDesc == ObjDesc)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p already installed!\n",
Packit Service 1fb00e
            ObjDesc));
Packit Service 1fb00e
        return_ACPI_STATUS (Status);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * If the reference count on the object is more than one, we must
Packit Service 1fb00e
     * take a copy of the object before we store. A reference count
Packit Service 1fb00e
     * of exactly 1 means that the object was just created during the
Packit Service 1fb00e
     * evaluation of an expression, and we can safely use it since it
Packit Service 1fb00e
     * is not used anywhere else.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    NewObjDesc = ObjDesc;
Packit Service 1fb00e
    if (ObjDesc->Common.ReferenceCount > 1)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Status = AcpiUtCopyIobjectToIobject (
Packit Service 1fb00e
            ObjDesc, &NewObjDesc, 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
    /*
Packit Service 1fb00e
     * If there is an object already in this slot, we either
Packit Service 1fb00e
     * have to delete it, or if this is an argument and there
Packit Service 1fb00e
     * is an object reference stored there, we have to do
Packit Service 1fb00e
     * an indirect store!
Packit Service 1fb00e
     */
Packit Service 1fb00e
    if (CurrentObjDesc)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * Check for an indirect store if an argument
Packit Service 1fb00e
         * contains an object reference (stored as an Node).
Packit Service 1fb00e
         * We don't allow this automatic dereferencing for
Packit Service 1fb00e
         * locals, since a store to a local should overwrite
Packit Service 1fb00e
         * anything there, including an object reference.
Packit Service 1fb00e
         *
Packit Service 1fb00e
         * If both Arg0 and Local0 contain RefOf (Local4):
Packit Service 1fb00e
         *
Packit Service 1fb00e
         * Store (1, Arg0)             - Causes indirect store to local4
Packit Service 1fb00e
         * Store (1, Local0)           - Stores 1 in local0, overwriting
Packit Service 1fb00e
         *                                  the reference to local4
Packit Service 1fb00e
         * Store (1, DeRefof (Local0)) - Causes indirect store to local4
Packit Service 1fb00e
         *
Packit Service 1fb00e
         * Weird, but true.
Packit Service 1fb00e
         */
Packit Service 1fb00e
        if (Type == ACPI_REFCLASS_ARG)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * If we have a valid reference object that came from RefOf(),
Packit Service 1fb00e
             * do the indirect store
Packit Service 1fb00e
             */
Packit Service 1fb00e
            if ((ACPI_GET_DESCRIPTOR_TYPE (CurrentObjDesc) ==
Packit Service 1fb00e
                    ACPI_DESC_TYPE_OPERAND) &&
Packit Service 1fb00e
                (CurrentObjDesc->Common.Type ==
Packit Service 1fb00e
                    ACPI_TYPE_LOCAL_REFERENCE) &&
Packit Service 1fb00e
                (CurrentObjDesc->Reference.Class ==
Packit Service 1fb00e
                    ACPI_REFCLASS_REFOF))
Packit Service 1fb00e
            {
Packit Service 1fb00e
                ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
Packit Service 1fb00e
                    "Arg (%p) is an ObjRef(Node), storing in node %p\n",
Packit Service 1fb00e
                    NewObjDesc, CurrentObjDesc));
Packit Service 1fb00e
Packit Service 1fb00e
                /*
Packit Service 1fb00e
                 * Store this object to the Node (perform the indirect store)
Packit Service 1fb00e
                 * NOTE: No implicit conversion is performed, as per the ACPI
Packit Service 1fb00e
                 * specification rules on storing to Locals/Args.
Packit Service 1fb00e
                 */
Packit Service 1fb00e
                Status = AcpiExStoreObjectToNode (NewObjDesc,
Packit Service 1fb00e
                    CurrentObjDesc->Reference.Object, WalkState,
Packit Service 1fb00e
                    ACPI_NO_IMPLICIT_CONVERSION);
Packit Service 1fb00e
Packit Service 1fb00e
                /* Remove local reference if we copied the object above */
Packit Service 1fb00e
Packit Service 1fb00e
                if (NewObjDesc != ObjDesc)
Packit Service 1fb00e
                {
Packit Service 1fb00e
                    AcpiUtRemoveReference (NewObjDesc);
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
        /* Delete the existing object before storing the new one */
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiDsMethodDataDeleteValue (Type, Index, WalkState);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Install the Obj descriptor (*NewObjDesc) into
Packit Service 1fb00e
     * the descriptor for the Arg or Local.
Packit Service 1fb00e
     * (increments the object reference count by one)
Packit Service 1fb00e
     */
Packit Service 1fb00e
    Status = AcpiDsMethodDataSetValue (Type, Index, NewObjDesc, WalkState);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Remove local reference if we copied the object above */
Packit Service 1fb00e
Packit Service 1fb00e
    if (NewObjDesc != ObjDesc)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AcpiUtRemoveReference (NewObjDesc);
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
#ifdef ACPI_OBSOLETE_FUNCTIONS
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AcpiDsMethodDataGetType
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Opcode              - Either AML_FIRST LOCAL_OP or
Packit Service 1fb00e
 *                                    AML_FIRST_ARG_OP
Packit Service 1fb00e
 *              Index               - Which Local or Arg whose type to get
Packit Service 1fb00e
 *              WalkState           - Current walk state object
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Data type of current value of the selected Arg or Local
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Get the type of the object stored in the Local or Arg
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_OBJECT_TYPE
Packit Service 1fb00e
AcpiDsMethodDataGetType (
Packit Service 1fb00e
    UINT16                  Opcode,
Packit Service 1fb00e
    UINT32                  Index,
Packit Service 1fb00e
    ACPI_WALK_STATE         *WalkState)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_STATUS             Status;
Packit Service 1fb00e
    ACPI_NAMESPACE_NODE     *Node;
Packit Service 1fb00e
    ACPI_OPERAND_OBJECT     *Object;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    ACPI_FUNCTION_TRACE (DsMethodDataGetType);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the namespace node for the arg/local */
Packit Service 1fb00e
Packit Service 1fb00e
    Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);
Packit Service 1fb00e
    if (ACPI_FAILURE (Status))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return_VALUE ((ACPI_TYPE_NOT_FOUND));
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the object */
Packit Service 1fb00e
Packit Service 1fb00e
    Object = AcpiNsGetAttachedObject (Node);
Packit Service 1fb00e
    if (!Object)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* Uninitialized local/arg, return TYPE_ANY */
Packit Service 1fb00e
Packit Service 1fb00e
        return_VALUE (ACPI_TYPE_ANY);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the object type */
Packit Service 1fb00e
Packit Service 1fb00e
    return_VALUE (Object->Type);
Packit Service 1fb00e
}
Packit Service 1fb00e
#endif