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

📄 dswload.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
    if (ACPI_FAILURE (Status))    {        ACPI_ERROR_NAMESPACE (BufferPtr, Status);        return_ACPI_STATUS (Status);    }    if (!Op)    {        /* Create a new op */        Op = AcpiPsAllocOp (WalkState->Opcode);        if (!Op)        {            return_ACPI_STATUS (AE_NO_MEMORY);        }        /* Initialize the new op */        if (Node)        {            Op->Named.Name = Node->Name.Integer;        }        *OutOp = Op;    }    /*     * 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;    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsLoad2EndOp * * 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_STATUSAcpiDsLoad2EndOp (    ACPI_WALK_STATE         *WalkState){    ACPI_PARSE_OBJECT       *Op;    ACPI_STATUS             Status = AE_OK;    ACPI_OBJECT_TYPE        ObjectType;    ACPI_NAMESPACE_NODE     *Node;    ACPI_PARSE_OBJECT       *Arg;    ACPI_NAMESPACE_NODE     *NewNode;#ifndef ACPI_NO_METHOD_EXECUTION    UINT32                  i;    UINT8                   RegionSpace;#endif    ACPI_FUNCTION_TRACE (DsLoad2EndOp);    Op = WalkState->Op;    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n",            WalkState->OpInfo->Name, Op, WalkState));    /* Check if opcode had an associated namespace object */    if (!(WalkState->OpInfo->Flags & AML_NSOBJECT))    {#ifndef ACPI_NO_METHOD_EXECUTION#ifdef ACPI_ENABLE_MODULE_LEVEL_CODE        /* No namespace object. Executable opcode? */        if ((WalkState->OpInfo->Class == AML_CLASS_EXECUTE) ||            (WalkState->OpInfo->Class == AML_CLASS_CONTROL))        {            ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,                "End/EXEC:   %s (fl %8.8X)\n", WalkState->OpInfo->Name,                WalkState->OpInfo->Flags));            /* Executing a type1 or type2 opcode outside of a method */            Status = AcpiDsExecEndOp (WalkState);            return_ACPI_STATUS (Status);        }#endif#endif        return_ACPI_STATUS (AE_OK);    }    if (Op->Common.AmlOpcode == AML_SCOPE_OP)    {        ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,            "Ending scope Op=%p State=%p\n", Op, WalkState));    }    ObjectType = WalkState->OpInfo->ObjectType;    /*     * Get the Node/name from the earlier lookup     * (It was saved in the *op structure)     */    Node = Op->Common.Node;    /*     * Put the Node on the object stack (Contains the ACPI Name of     * this object)     */    WalkState->Operands[0] = (void *) Node;    WalkState->NumOperands = 1;    /* Pop the scope stack */    if (AcpiNsOpensScope (ObjectType) &&       (Op->Common.AmlOpcode != AML_INT_METHODCALL_OP))    {        ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s) Popping scope for Op %p\n",            AcpiUtGetTypeName (ObjectType), Op));        Status = AcpiDsScopeStackPop (WalkState);        if (ACPI_FAILURE (Status))        {            goto Cleanup;        }    }    /*     * Named operations are as follows:     *     * AML_ALIAS     * AML_BANKFIELD     * AML_CREATEBITFIELD     * AML_CREATEBYTEFIELD     * AML_CREATEDWORDFIELD     * AML_CREATEFIELD     * AML_CREATEQWORDFIELD     * AML_CREATEWORDFIELD     * AML_DATA_REGION     * AML_DEVICE     * AML_EVENT     * AML_FIELD     * AML_INDEXFIELD     * AML_METHOD     * AML_METHODCALL     * AML_MUTEX     * AML_NAME     * AML_NAMEDFIELD     * AML_OPREGION     * AML_POWERRES     * AML_PROCESSOR     * AML_SCOPE     * AML_THERMALZONE     */    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,        "Create-Load [%s] State=%p Op=%p NamedObj=%p\n",        AcpiPsGetOpcodeName (Op->Common.AmlOpcode), WalkState, Op, Node));    /* Decode the opcode */    Arg = Op->Common.Value.Arg;    switch (WalkState->OpInfo->Type)    {#ifndef ACPI_NO_METHOD_EXECUTION    case AML_TYPE_CREATE_FIELD:        /*         * Create the field object, but the field buffer and index must         * be evaluated later during the execution phase         */        Status = AcpiDsCreateBufferField (Op, WalkState);        break;     case AML_TYPE_NAMED_FIELD:        /*         * If we are executing a method, initialize the field         */        if (WalkState->MethodNode)        {            Status = AcpiDsInitFieldObjects (Op, WalkState);        }        switch (Op->Common.AmlOpcode)        {        case AML_INDEX_FIELD_OP:            Status = AcpiDsCreateIndexField (Op, (ACPI_HANDLE) Arg->Common.Node,                        WalkState);            break;        case AML_BANK_FIELD_OP:            Status = AcpiDsCreateBankField (Op, Arg->Common.Node, WalkState);            break;        case AML_FIELD_OP:            Status = AcpiDsCreateField (Op, Arg->Common.Node, WalkState);            break;        default:            /* All NAMED_FIELD opcodes must be handled above */            break;        }        break;     case AML_TYPE_NAMED_SIMPLE:        Status = AcpiDsCreateOperands (WalkState, Arg);        if (ACPI_FAILURE (Status))        {            goto Cleanup;        }        switch (Op->Common.AmlOpcode)        {        case AML_PROCESSOR_OP:            Status = AcpiExCreateProcessor (WalkState);            break;        case AML_POWER_RES_OP:            Status = AcpiExCreatePowerResource (WalkState);            break;        case AML_MUTEX_OP:            Status = AcpiExCreateMutex (WalkState);            break;        case AML_EVENT_OP:            Status = AcpiExCreateEvent (WalkState);            break;        case AML_ALIAS_OP:            Status = AcpiExCreateAlias (WalkState);            break;        default:            /* Unknown opcode */            Status = AE_OK;            goto Cleanup;        }        /* Delete operands */        for (i = 1; i < WalkState->NumOperands; i++)        {            AcpiUtRemoveReference (WalkState->Operands[i]);            WalkState->Operands[i] = NULL;        }        break;#endif /* ACPI_NO_METHOD_EXECUTION */    case AML_TYPE_NAMED_COMPLEX:        switch (Op->Common.AmlOpcode)        {#ifndef ACPI_NO_METHOD_EXECUTION        case AML_REGION_OP:        case AML_DATA_REGION_OP:            if (Op->Common.AmlOpcode == AML_REGION_OP)            {                RegionSpace = (ACPI_ADR_SPACE_TYPE)                      ((Op->Common.Value.Arg)->Common.Value.Integer);            }            else            {                RegionSpace = REGION_DATA_TABLE;            }            /*             * If we are executing a method, initialize the region             */            if (WalkState->MethodNode)            {                Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length,                            RegionSpace, WalkState);                if (ACPI_FAILURE (Status))                {                    return (Status);                }            }            /*             * The OpRegion is not fully parsed at this time. Only valid             * argument is the SpaceId. (We must save the address of the             * AML of the address and length operands)             */            /*             * If we have a valid region, initialize it             * Namespace is NOT locked at this point.             *             * TBD: need to unlock interpreter if it is locked, in order             * to allow _REG methods to be run.             */            Status = AcpiEvInitializeRegion (AcpiNsGetAttachedObject (Node),                        FALSE);            if (ACPI_FAILURE (Status))            {                /*                 *  If AE_NOT_EXIST is returned, it is not fatal                 *  because many regions get created before a handler                 *  is installed for said region.                 */                if (AE_NOT_EXIST == Status)                {                    Status = AE_OK;                }            }            break;        case AML_NAME_OP:            Status = AcpiDsCreateNode (WalkState, Node, Op);            break;        case 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);                }            }            break;#endif /* ACPI_NO_METHOD_EXECUTION */        default:            /* All NAMED_COMPLEX opcodes must be handled above */            break;        }        break;    case AML_CLASS_INTERNAL:        /* case AML_INT_NAMEPATH_OP: */        break;    case AML_CLASS_METHOD_CALL:        ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,            "RESOLVING-MethodCall: State=%p Op=%p NamedObj=%p\n",            WalkState, Op, Node));        /*         * Lookup the method name and save the Node         */        Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,                        ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS2,                        ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,                        WalkState, &(NewNode));        if (ACPI_SUCCESS (Status))        {            /*             * Make sure that what we found is indeed a method             * We didn't search for a method on purpose, to see if the name             * would resolve             */            if (NewNode->Type != ACPI_TYPE_METHOD)            {                Status = AE_AML_OPERAND_TYPE;            }            /* We could put the returned object (Node) on the object stack for             * later, but for now, we will put it in the "op" object that the             * parser uses, so we can get it again at the end of this scope             */            Op->Common.Node = NewNode;        }        else        {            ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);        }        break;    default:        break;    }Cleanup:    /* Remove the Node pushed at the very beginning */    WalkState->Operands[0] = NULL;    WalkState->NumOperands = 0;    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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