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

📄 dswload.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
        }    }    /* Initialize the op */#if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY))    Op->Named.Path = ACPI_CAST_PTR (UINT8, Path);#endif    if (Node)    {        /*         * Put the Node in the "op" object that the parser uses, so we         * can get it again quickly when this scope is closed         */        Op->Common.Node = Node;        Op->Named.Name = Node->Name.Integer;    }    AcpiPsAppendArg (AcpiPsGetParentScope (&WalkState->ParserState), Op);    *OutOp = Op;    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsLoad1EndOp * * PARAMETERS:  WalkState       - Current state of the parse tree walk * * RETURN:      Status * * DESCRIPTION: Ascending callback used during the loading of the namespace, *              both control methods and everything else. * ******************************************************************************/ACPI_STATUSAcpiDsLoad1EndOp (    ACPI_WALK_STATE         *WalkState){    ACPI_PARSE_OBJECT       *Op;    ACPI_OBJECT_TYPE        ObjectType;    ACPI_STATUS             Status = AE_OK;    ACPI_FUNCTION_TRACE (DsLoad1EndOp);    Op = WalkState->Op;    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState));    /* We are only interested in opcodes that have an associated name */    if (!(WalkState->OpInfo->Flags & (AML_NAMED | AML_FIELD)))    {        return_ACPI_STATUS (AE_OK);    }    /* Get the object type to determine if we should pop the scope */    ObjectType = WalkState->OpInfo->ObjectType;#ifndef ACPI_NO_METHOD_EXECUTION    if (WalkState->OpInfo->Flags & AML_FIELD)    {        /*         * If we are executing a method, do not create any namespace objects         * during the load phase, only during execution.         */        if (!WalkState->MethodNode)        {            if (WalkState->Opcode == AML_FIELD_OP          ||                WalkState->Opcode == AML_BANK_FIELD_OP     ||                WalkState->Opcode == AML_INDEX_FIELD_OP)            {                Status = AcpiDsInitFieldObjects (Op, WalkState);            }        }        return_ACPI_STATUS (Status);    }    /*     * If we are executing a method, do not create any namespace objects     * during the load phase, only during execution.     */    if (!WalkState->MethodNode)    {        if (Op->Common.AmlOpcode == AML_REGION_OP)        {            Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length,                        (ACPI_ADR_SPACE_TYPE) ((Op->Common.Value.Arg)->Common.Value.Integer),                        WalkState);            if (ACPI_FAILURE (Status))            {                return_ACPI_STATUS (Status);            }        }        else if (Op->Common.AmlOpcode == AML_DATA_REGION_OP)        {            Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length,                        REGION_DATA_TABLE, WalkState);            if (ACPI_FAILURE (Status))            {                return_ACPI_STATUS (Status);            }        }    }#endif    if (Op->Common.AmlOpcode == AML_NAME_OP)    {        /* For Name opcode, get the object type from the argument */        if (Op->Common.Value.Arg)        {            ObjectType = (AcpiPsGetOpcodeInfo (                (Op->Common.Value.Arg)->Common.AmlOpcode))->ObjectType;            /* Set node type if we have a namespace node */            if (Op->Common.Node)            {                Op->Common.Node->Type = (UINT8) ObjectType;            }        }    }    /*     * If we are executing a method, do not create any namespace objects     * during the load phase, only during execution.     */    if (!WalkState->MethodNode)    {        if (Op->Common.AmlOpcode == AML_METHOD_OP)        {            /*             * MethodOp PkgLength NameString MethodFlags TermList             *             * Note: We must create the method node/object pair as soon as we             * see the method declaration. This allows later pass1 parsing             * of invocations of the method (need to know the number of             * arguments.)             */            ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,                "LOADING-Method: State=%p Op=%p NamedObj=%p\n",                WalkState, Op, Op->Named.Node));            if (!AcpiNsGetAttachedObject (Op->Named.Node))            {                WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node);                WalkState->NumOperands = 1;                Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg);                if (ACPI_SUCCESS (Status))                {                    Status = AcpiExCreateMethod (Op->Named.Data,                                        Op->Named.Length, WalkState);                }                WalkState->Operands[0] = NULL;                WalkState->NumOperands = 0;                if (ACPI_FAILURE (Status))                {                    return_ACPI_STATUS (Status);                }            }        }    }    /* Pop the scope stack (only if loading a table) */    if (!WalkState->MethodNode &&        AcpiNsOpensScope (ObjectType))    {        ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s): Popping scope for Op %p\n",            AcpiUtGetTypeName (ObjectType), Op));        Status = AcpiDsScopeStackPop (WalkState);    }    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsLoad2BeginOp * * PARAMETERS:  WalkState       - Current state of the parse tree walk *              OutOp           - Wher to return op if a new one is created * * RETURN:      Status * * DESCRIPTION: Descending callback used during the loading of ACPI tables. * ******************************************************************************/ACPI_STATUSAcpiDsLoad2BeginOp (    ACPI_WALK_STATE         *WalkState,    ACPI_PARSE_OBJECT       **OutOp){    ACPI_PARSE_OBJECT       *Op;    ACPI_NAMESPACE_NODE     *Node;    ACPI_STATUS             Status;    ACPI_OBJECT_TYPE        ObjectType;    char                    *BufferPtr;    UINT32                  Flags;    ACPI_FUNCTION_TRACE (DsLoad2BeginOp);    Op = WalkState->Op;    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState));    if (Op)    {        if ((WalkState->ControlState) &&            (WalkState->ControlState->Common.State ==                ACPI_CONTROL_CONDITIONAL_EXECUTING))        {            /* We are executing a while loop outside of a method */            Status = AcpiDsExecBeginOp (WalkState, OutOp);            return_ACPI_STATUS (Status);        }        /* We only care about Namespace opcodes here */        if ((!(WalkState->OpInfo->Flags & AML_NSOPCODE)   &&              (WalkState->Opcode != AML_INT_NAMEPATH_OP)) ||            (!(WalkState->OpInfo->Flags & AML_NAMED)))        {#ifdef ACPI_ENABLE_MODULE_LEVEL_CODE            if ((WalkState->OpInfo->Class == AML_CLASS_EXECUTE) ||                (WalkState->OpInfo->Class == AML_CLASS_CONTROL))            {                ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,                    "Begin/EXEC: %s (fl %8.8X)\n", WalkState->OpInfo->Name,                    WalkState->OpInfo->Flags));                /* Executing a type1 or type2 opcode outside of a method */                Status = AcpiDsExecBeginOp (WalkState, OutOp);                return_ACPI_STATUS (Status);            }#endif            return_ACPI_STATUS (AE_OK);        }        /* Get the name we are going to enter or lookup in the namespace */        if (WalkState->Opcode == AML_INT_NAMEPATH_OP)        {            /* For Namepath op, get the path string */            BufferPtr = Op->Common.Value.String;            if (!BufferPtr)            {                /* No name, just exit */                return_ACPI_STATUS (AE_OK);            }        }        else        {            /* Get name from the op */            BufferPtr = ACPI_CAST_PTR (char, &Op->Named.Name);        }    }    else    {        /* Get the namestring from the raw AML */        BufferPtr = AcpiPsGetNextNamestring (&WalkState->ParserState);    }    /* Map the opcode into an internal object type */    ObjectType = WalkState->OpInfo->ObjectType;    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,        "State=%p Op=%p Type=%X\n", WalkState, Op, ObjectType));    switch (WalkState->Opcode)    {    case AML_FIELD_OP:    case AML_BANK_FIELD_OP:    case AML_INDEX_FIELD_OP:        Node = NULL;        Status = AE_OK;        break;    case AML_INT_NAMEPATH_OP:        /*         * The NamePath is an object reference to an existing object.         * Don't enter the name into the namespace, but look it up         * for use later.         */        Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,                        ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,                        WalkState, &(Node));        break;    case AML_SCOPE_OP:        /*         * The Path is an object reference to an existing object.         * Don't enter the name into the namespace, but look it up         * for use later.         */        Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,                        ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,                        WalkState, &(Node));        if (ACPI_FAILURE (Status))        {#ifdef ACPI_ASL_COMPILER            if (Status == AE_NOT_FOUND)            {                Status = AE_OK;            }            else            {                ACPI_ERROR_NAMESPACE (BufferPtr, Status);            }#else            ACPI_ERROR_NAMESPACE (BufferPtr, Status);#endif            return_ACPI_STATUS (Status);        }        /*         * We must check to make sure that the target is         * one of the opcodes that actually opens a scope         */        switch (Node->Type)        {        case ACPI_TYPE_ANY:        case ACPI_TYPE_LOCAL_SCOPE:         /* Scope */        case ACPI_TYPE_DEVICE:        case ACPI_TYPE_POWER:        case ACPI_TYPE_PROCESSOR:        case ACPI_TYPE_THERMAL:            /* These are acceptable types */            break;        case ACPI_TYPE_INTEGER:        case ACPI_TYPE_STRING:        case ACPI_TYPE_BUFFER:            /*             * These types we will allow, but we will change the type. This             * enables some existing code of the form:             *             *  Name (DEB, 0)             *  Scope (DEB) { ... }             */            ACPI_WARNING ((AE_INFO,                "Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)",                BufferPtr, AcpiUtGetTypeName (Node->Type)));            Node->Type = ACPI_TYPE_ANY;            WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;            break;        default:            /* All other types are an error */            ACPI_ERROR ((AE_INFO,                "Invalid type (%s) for target of Scope operator [%4.4s]",                AcpiUtGetTypeName (Node->Type), BufferPtr));            return (AE_AML_OPERAND_TYPE);        }        break;    default:        /* All other opcodes */        if (Op && Op->Common.Node)        {            /* This op/node was previously entered into the namespace */            Node = Op->Common.Node;            if (AcpiNsOpensScope (ObjectType))            {                Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);                if (ACPI_FAILURE (Status))                {                    return_ACPI_STATUS (Status);                }            }            return_ACPI_STATUS (AE_OK);        }        /*         * Enter the named type into the internal namespace. We enter the name         * as we go downward in the parse tree. Any necessary subobjects that         * involve arguments to the opcode must be created as we go back up the         * parse tree later.         *         * Note: Name may already exist if we are executing a deferred opcode.         */        if (WalkState->DeferredNode)        {            /* This name is already in the namespace, get the node */            Node = WalkState->DeferredNode;            Status = AE_OK;            break;        }        Flags = ACPI_NS_NO_UPSEARCH;        if (WalkState->PassNumber == ACPI_IMODE_EXECUTE)        {            /* Execution mode, node cannot already exist, node is temporary */            Flags |= (ACPI_NS_ERROR_IF_FOUND | ACPI_NS_TEMPORARY);        }        /* Add new entry or lookup existing entry */        Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,                    ACPI_IMODE_LOAD_PASS2, Flags, WalkState, &Node);        break;    }

⌨️ 快捷键说明

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