⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsmthdat.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
    ACPI_STATUS             Status;    ACPI_NAMESPACE_NODE     *Node;    ACPI_FUNCTION_TRACE (DsMethodDataSetValue);    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,        "NewObj %p Opcode %X, Refs=%d [%s]\n", Object,        Opcode, Object->Common.ReferenceCount,        AcpiUtGetTypeName (Object->Common.Type)));    /* Get the namespace node for the arg/local */    Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /*     * Increment ref count so object can't be deleted while installed.     * NOTE: We do not copy the object in order to preserve the call by     * reference semantics of ACPI Control Method invocation.     * (See ACPI Specification 2.0C)     */    AcpiUtAddReference (Object);    /* Install the object */    Node->Object = Object;    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsMethodDataGetValue * * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP *              Index               - Which localVar or argument to get *              WalkState           - Current walk state object *              DestDesc            - Where Arg or Local value is returned * * RETURN:      Status * * DESCRIPTION: Retrieve value of selected Arg or Local for this method *              Used only in AcpiExResolveToValue(). * ******************************************************************************/ACPI_STATUSAcpiDsMethodDataGetValue (    UINT16                  Opcode,    UINT32                  Index,    ACPI_WALK_STATE         *WalkState,    ACPI_OPERAND_OBJECT     **DestDesc){    ACPI_STATUS             Status;    ACPI_NAMESPACE_NODE     *Node;    ACPI_OPERAND_OBJECT     *Object;    ACPI_FUNCTION_TRACE (DsMethodDataGetValue);    /* Validate the object descriptor */    if (!DestDesc)    {        ACPI_ERROR ((AE_INFO, "Null object descriptor pointer"));        return_ACPI_STATUS (AE_BAD_PARAMETER);    }    /* Get the namespace node for the arg/local */    Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /* Get the object from the node */    Object = Node->Object;    /* Examine the returned object, it must be valid. */    if (!Object)    {        /*         * Index points to uninitialized object.         * This means that either 1) The expected argument was         * not passed to the method, or 2) A local variable         * was referenced by the method (via the ASL)         * before it was initialized.  Either case is an error.         */        /* If slack enabled, init the LocalX/ArgX to an Integer of value zero */        if (AcpiGbl_EnableInterpreterSlack)        {            Object = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);            if (!Object)            {                return_ACPI_STATUS (AE_NO_MEMORY);            }            Object->Integer.Value = 0;            Node->Object = Object;        }        /* Otherwise, return the error */        else switch (Opcode)        {        case AML_ARG_OP:            ACPI_ERROR ((AE_INFO,                "Uninitialized Arg[%d] at node %p",                Index, Node));            return_ACPI_STATUS (AE_AML_UNINITIALIZED_ARG);        case AML_LOCAL_OP:            ACPI_ERROR ((AE_INFO,                "Uninitialized Local[%d] at node %p",                Index, Node));            return_ACPI_STATUS (AE_AML_UNINITIALIZED_LOCAL);        default:            ACPI_ERROR ((AE_INFO, "Not a Arg/Local opcode: %X", Opcode));            return_ACPI_STATUS (AE_AML_INTERNAL);        }    }    /*     * The Index points to an initialized and valid object.     * Return an additional reference to the object     */    *DestDesc = Object;    AcpiUtAddReference (Object);    return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiDsMethodDataDeleteValue * * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP *              Index               - Which localVar or argument to delete *              WalkState           - Current walk state object * * RETURN:      None * * DESCRIPTION: Delete the entry at Opcode:Index.  Inserts *              a null into the stack slot after the object is deleted. * ******************************************************************************/static voidAcpiDsMethodDataDeleteValue (    UINT16                  Opcode,    UINT32                  Index,    ACPI_WALK_STATE         *WalkState){    ACPI_STATUS             Status;    ACPI_NAMESPACE_NODE     *Node;    ACPI_OPERAND_OBJECT     *Object;    ACPI_FUNCTION_TRACE (DsMethodDataDeleteValue);    /* Get the namespace node for the arg/local */    Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);    if (ACPI_FAILURE (Status))    {        return_VOID;    }    /* Get the associated object */    Object = AcpiNsGetAttachedObject (Node);    /*     * Undefine the Arg or Local by setting its descriptor     * pointer to NULL. Locals/Args can contain both     * ACPI_OPERAND_OBJECTS and ACPI_NAMESPACE_NODEs     */    Node->Object = NULL;    if ((Object) &&        (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_OPERAND))    {        /*         * There is a valid object.         * Decrement the reference count by one to balance the         * increment when the object was stored.         */        AcpiUtRemoveReference (Object);    }    return_VOID;}/******************************************************************************* * * FUNCTION:    AcpiDsStoreObjectToLocal * * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP *              Index               - Which Local or Arg to set *              ObjDesc             - Value to be stored *              WalkState           - Current walk state * * RETURN:      Status * * DESCRIPTION: Store a value in an Arg or Local.  The ObjDesc is installed *              as the new value for the Arg or Local and the reference count *              for ObjDesc is incremented. * ******************************************************************************/ACPI_STATUSAcpiDsStoreObjectToLocal (    UINT16                  Opcode,    UINT32                  Index,    ACPI_OPERAND_OBJECT     *ObjDesc,    ACPI_WALK_STATE         *WalkState){    ACPI_STATUS             Status;    ACPI_NAMESPACE_NODE     *Node;    ACPI_OPERAND_OBJECT     *CurrentObjDesc;    ACPI_OPERAND_OBJECT     *NewObjDesc;    ACPI_FUNCTION_TRACE (DsStoreObjectToLocal);    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Opcode=%X Index=%d Obj=%p\n",        Opcode, Index, ObjDesc));    /* Parameter validation */    if (!ObjDesc)    {        return_ACPI_STATUS (AE_BAD_PARAMETER);    }    /* Get the namespace node for the arg/local */    Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    CurrentObjDesc = AcpiNsGetAttachedObject (Node);    if (CurrentObjDesc == ObjDesc)    {        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p already installed!\n",            ObjDesc));        return_ACPI_STATUS (Status);    }    /*     * If the reference count on the object is more than one, we must     * take a copy of the object before we store.  A reference count     * of exactly 1 means that the object was just created during the     * evaluation of an expression, and we can safely use it since it     * is not used anywhere else.     */    NewObjDesc = ObjDesc;    if (ObjDesc->Common.ReferenceCount > 1)    {        Status = AcpiUtCopyIobjectToIobject (ObjDesc, &NewObjDesc, WalkState);        if (ACPI_FAILURE (Status))        {            return_ACPI_STATUS (Status);        }    }    /*     * If there is an object already in this slot, we either     * have to delete it, or if this is an argument and there     * is an object reference stored there, we have to do     * an indirect store!     */    if (CurrentObjDesc)    {        /*         * Check for an indirect store if an argument         * contains an object reference (stored as an Node).         * We don't allow this automatic dereferencing for         * locals, since a store to a local should overwrite         * anything there, including an object reference.         *         * If both Arg0 and Local0 contain RefOf (Local4):         *         * Store (1, Arg0)             - Causes indirect store to local4         * Store (1, Local0)           - Stores 1 in local0, overwriting         *                                  the reference to local4         * Store (1, DeRefof (Local0)) - Causes indirect store to local4         *         * Weird, but true.         */        if (Opcode == AML_ARG_OP)        {            /*             * If we have a valid reference object that came from RefOf(),             * do the indirect store             */            if ((ACPI_GET_DESCRIPTOR_TYPE (CurrentObjDesc) == ACPI_DESC_TYPE_OPERAND) &&                (CurrentObjDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&                (CurrentObjDesc->Reference.Opcode == AML_REF_OF_OP))            {                ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,                        "Arg (%p) is an ObjRef(Node), storing in node %p\n",                        NewObjDesc, CurrentObjDesc));                /*                 * Store this object to the Node (perform the indirect store)                 * NOTE: No implicit conversion is performed, as per the ACPI                 * specification rules on storing to Locals/Args.                 */                Status = AcpiExStoreObjectToNode (NewObjDesc,                            CurrentObjDesc->Reference.Object, WalkState,                            ACPI_NO_IMPLICIT_CONVERSION);                /* Remove local reference if we copied the object above */                if (NewObjDesc != ObjDesc)                {                    AcpiUtRemoveReference (NewObjDesc);                }                return_ACPI_STATUS (Status);            }        }        /*         * Delete the existing object         * before storing the new one         */        AcpiDsMethodDataDeleteValue (Opcode, Index, WalkState);    }    /*     * Install the Obj descriptor (*NewObjDesc) into     * the descriptor for the Arg or Local.     * (increments the object reference count by one)     */    Status = AcpiDsMethodDataSetValue (Opcode, Index, NewObjDesc, WalkState);    /* Remove local reference if we copied the object above */    if (NewObjDesc != ObjDesc)    {        AcpiUtRemoveReference (NewObjDesc);    }    return_ACPI_STATUS (Status);}#ifdef ACPI_OBSOLETE_FUNCTIONS/******************************************************************************* * * FUNCTION:    AcpiDsMethodDataGetType * * PARAMETERS:  Opcode              - Either AML_LOCAL_OP or AML_ARG_OP *              Index               - Which Local or Arg whose type to get *              WalkState           - Current walk state object * * RETURN:      Data type of current value of the selected Arg or Local * * DESCRIPTION: Get the type of the object stored in the Local or Arg * ******************************************************************************/ACPI_OBJECT_TYPEAcpiDsMethodDataGetType (    UINT16                  Opcode,    UINT32                  Index,    ACPI_WALK_STATE         *WalkState){    ACPI_STATUS             Status;    ACPI_NAMESPACE_NODE     *Node;    ACPI_OPERAND_OBJECT     *Object;    ACPI_FUNCTION_TRACE (DsMethodDataGetType);    /* Get the namespace node for the arg/local */    Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);    if (ACPI_FAILURE (Status))    {        return_VALUE ((ACPI_TYPE_NOT_FOUND));    }    /* Get the object */    Object = AcpiNsGetAttachedObject (Node);    if (!Object)    {        /* Uninitialized local/arg, return TYPE_ANY */        return_VALUE (ACPI_TYPE_ANY);    }    /* Get the object type */    return_VALUE (ACPI_GET_OBJECT_TYPE (Object));}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -