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

📄 dswexec.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
 * FUNCTION:    AcpiDsExecEndOp * * PARAMETERS:  WalkState       - Current state of the parse tree walk * * RETURN:      Status * * DESCRIPTION: Ascending callback used during the execution of control *              methods.  The only thing we really need to do here is to *              notice the beginning of IF, ELSE, and WHILE blocks. * ****************************************************************************/ACPI_STATUSAcpiDsExecEndOp (    ACPI_WALK_STATE         *WalkState){    ACPI_PARSE_OBJECT       *Op;    ACPI_STATUS             Status = AE_OK;    UINT32                  OpType;    UINT32                  OpClass;    ACPI_PARSE_OBJECT       *NextOp;    ACPI_PARSE_OBJECT       *FirstArg;    ACPI_FUNCTION_TRACE_PTR (DsExecEndOp, WalkState);    Op      = WalkState->Op;    OpType  = WalkState->OpInfo->Type;    OpClass = WalkState->OpInfo->Class;    if (OpClass == AML_CLASS_UNKNOWN)    {        ACPI_ERROR ((AE_INFO, "Unknown opcode %X", Op->Common.AmlOpcode));        return_ACPI_STATUS (AE_NOT_IMPLEMENTED);    }    FirstArg = Op->Common.Value.Arg;    /* Init the walk state */    WalkState->NumOperands = 0;    WalkState->OperandIndex = 0;    WalkState->ReturnDesc = NULL;    WalkState->ResultObj = NULL;    /* Call debugger for single step support (DEBUG build only) */    ACPI_DEBUGGER_EXEC (Status = AcpiDbSingleStep (WalkState, Op, OpClass));    ACPI_DEBUGGER_EXEC (if (ACPI_FAILURE (Status)) {return_ACPI_STATUS (Status);});    /* Decode the Opcode Class */    switch (OpClass)    {    case AML_CLASS_ARGUMENT:    /* Constants, literals, etc. */        if (WalkState->Opcode == AML_INT_NAMEPATH_OP)        {            Status = AcpiDsEvaluateNamePath (WalkState);            if (ACPI_FAILURE (Status))            {                goto Cleanup;            }        }        break;    case AML_CLASS_EXECUTE:     /* Most operators with arguments */        /* Build resolved operand stack */        Status = AcpiDsCreateOperands (WalkState, FirstArg);        if (ACPI_FAILURE (Status))        {            goto Cleanup;        }        /*         * All opcodes require operand resolution, with the only exceptions         * being the ObjectType and SizeOf operators.         */        if (!(WalkState->OpInfo->Flags & AML_NO_OPERAND_RESOLVE))        {            /* Resolve all operands */            Status = AcpiExResolveOperands (WalkState->Opcode,                        &(WalkState->Operands [WalkState->NumOperands -1]),                        WalkState);            if (ACPI_SUCCESS (Status))            {                ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,                    AcpiPsGetOpcodeName (WalkState->Opcode),                    WalkState->NumOperands, "after ExResolveOperands");            }        }        if (ACPI_SUCCESS (Status))        {            /*             * Dispatch the request to the appropriate interpreter handler             * routine.  There is one routine per opcode "type" based upon the             * number of opcode arguments and return type.             */            Status = AcpiGbl_OpTypeDispatch[OpType] (WalkState);        }        else        {            /*             * Treat constructs of the form "Store(LocalX,LocalX)" as noops when the             * Local is uninitialized.             */            if  ((Status == AE_AML_UNINITIALIZED_LOCAL) &&                (WalkState->Opcode == AML_STORE_OP) &&                (WalkState->Operands[0]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&                (WalkState->Operands[1]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&                (WalkState->Operands[0]->Reference.Opcode ==                 WalkState->Operands[1]->Reference.Opcode) &&                (WalkState->Operands[0]->Reference.Offset ==                 WalkState->Operands[1]->Reference.Offset))            {                Status = AE_OK;            }            else            {                ACPI_EXCEPTION ((AE_INFO, Status,                    "While resolving operands for [%s]",                    AcpiPsGetOpcodeName (WalkState->Opcode)));            }        }        /* Always delete the argument objects and clear the operand stack */        AcpiDsClearOperands (WalkState);        /*         * If a result object was returned from above, push it on the         * current result stack         */        if (ACPI_SUCCESS (Status) &&            WalkState->ResultObj)        {            Status = AcpiDsResultPush (WalkState->ResultObj, WalkState);        }        break;    default:        switch (OpType)        {        case AML_TYPE_CONTROL:    /* Type 1 opcode, IF/ELSE/WHILE/NOOP */            /* 1 Operand, 0 ExternalResult, 0 InternalResult */            Status = AcpiDsExecEndControlOp (WalkState, Op);            break;        case AML_TYPE_METHOD_CALL:            /*             * If the method is referenced from within a package             * declaration, it is not a invocation of the method, just             * a reference to it.             */            if ((Op->Asl.Parent) &&               ((Op->Asl.Parent->Asl.AmlOpcode == AML_PACKAGE_OP) ||                (Op->Asl.Parent->Asl.AmlOpcode == AML_VAR_PACKAGE_OP)))            {                ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,                    "Method Reference in a Package, Op=%p\n", Op));                Op->Common.Node = (ACPI_NAMESPACE_NODE *) Op->Asl.Value.Arg->Asl.Node;                AcpiUtAddReference (Op->Asl.Value.Arg->Asl.Node->Object);                return_ACPI_STATUS (AE_OK);            }            ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Method invocation, Op=%p\n", Op));            /*             * (AML_METHODCALL) Op->Asl.Value.Arg->Asl.Node contains             * the method Node pointer             */            /* NextOp points to the op that holds the method name */            NextOp = FirstArg;            /* NextOp points to first argument op */            NextOp = NextOp->Common.Next;            /*             * Get the method's arguments and put them on the operand stack             */            Status = AcpiDsCreateOperands (WalkState, NextOp);            if (ACPI_FAILURE (Status))            {                break;            }            /*             * Since the operands will be passed to another control method,             * we must resolve all local references here (Local variables,             * arguments to *this* method, etc.)             */            Status = AcpiDsResolveOperands (WalkState);            if (ACPI_FAILURE (Status))            {                /* On error, clear all resolved operands */                AcpiDsClearOperands (WalkState);                break;            }            /*             * Tell the walk loop to preempt this running method and             * execute the new method             */            Status = AE_CTRL_TRANSFER;            /*             * Return now; we don't want to disturb anything,             * especially the operand count!             */            return_ACPI_STATUS (Status);        case AML_TYPE_CREATE_FIELD:            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,                "Executing CreateField Buffer/Index Op=%p\n", Op));            Status = AcpiDsLoad2EndOp (WalkState);            if (ACPI_FAILURE (Status))            {                break;            }            Status = AcpiDsEvalBufferFieldOperands (WalkState, Op);            break;        case AML_TYPE_CREATE_OBJECT:            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,                "Executing CreateObject (Buffer/Package) Op=%p\n", Op));            switch (Op->Common.Parent->Common.AmlOpcode)            {            case AML_NAME_OP:                /*                 * Put the Node on the object stack (Contains the ACPI Name                 * of this object)                 */                WalkState->Operands[0] = (void *) Op->Common.Parent->Common.Node;                WalkState->NumOperands = 1;                Status = AcpiDsCreateNode (WalkState,                            Op->Common.Parent->Common.Node,                            Op->Common.Parent);                if (ACPI_FAILURE (Status))                {                    break;                }                /* Fall through */                /*lint -fallthrough */            case AML_INT_EVAL_SUBTREE_OP:                Status = AcpiDsEvalDataObjectOperands (WalkState, Op,                            AcpiNsGetAttachedObject (Op->Common.Parent->Common.Node));                break;            default:                Status = AcpiDsEvalDataObjectOperands (WalkState, Op, NULL);                break;            }            /*             * If a result object was returned from above, push it on the             * current result stack             */            if (WalkState->ResultObj)            {                Status = AcpiDsResultPush (WalkState->ResultObj, WalkState);            }            break;        case AML_TYPE_NAMED_FIELD:        case AML_TYPE_NAMED_COMPLEX:        case AML_TYPE_NAMED_SIMPLE:        case AML_TYPE_NAMED_NO_OBJ:            Status = AcpiDsLoad2EndOp (WalkState);            if (ACPI_FAILURE (Status))            {                break;            }            if (Op->Common.AmlOpcode == AML_REGION_OP)            {                ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,                    "Executing OpRegion Address/Length Op=%p\n", Op));                Status = AcpiDsEvalRegionOperands (WalkState, Op);                if (ACPI_FAILURE (Status))                {                    break;                }            }            else if (Op->Common.AmlOpcode == AML_DATA_REGION_OP)            {                ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,                    "Executing DataTableRegion Strings Op=%p\n", Op));                Status = AcpiDsEvalTableRegionOperands (WalkState, Op);                if (ACPI_FAILURE (Status))                {                    break;                }            }            else if (Op->Common.AmlOpcode == AML_BANK_FIELD_OP)            {                ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,                    "Executing BankField Op=%p\n", Op));                Status = AcpiDsEvalBankFieldOperands (WalkState, Op);                if (ACPI_FAILURE (Status))                {                    break;                }            }            break;        case AML_TYPE_UNDEFINED:            ACPI_ERROR ((AE_INFO,                "Undefined opcode type Op=%p", Op));            return_ACPI_STATUS (AE_NOT_IMPLEMENTED);        case AML_TYPE_BOGUS:            ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,                "Internal opcode=%X type Op=%p\n",                WalkState->Opcode, Op));            break;        default:            ACPI_ERROR ((AE_INFO,                "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p",                OpClass, OpType, Op->Common.AmlOpcode, Op));            Status = AE_NOT_IMPLEMENTED;            break;        }    }    /*     * ACPI 2.0 support for 64-bit integers: Truncate numeric     * result value if we are executing from a 32-bit ACPI table     */    AcpiExTruncateFor32bitTable (WalkState->ResultObj);    /*     * Check if we just completed the evaluation of a     * conditional predicate     */    if ((ACPI_SUCCESS (Status)) &&        (WalkState->ControlState) &&        (WalkState->ControlState->Common.State ==            ACPI_CONTROL_PREDICATE_EXECUTING) &&        (WalkState->ControlState->Control.PredicateOp == Op))    {        Status = AcpiDsGetPredicateValue (WalkState, WalkState->ResultObj);        WalkState->ResultObj = NULL;    }Cleanup:    if (WalkState->ResultObj)    {        /* Break to debugger to display result */        ACPI_DEBUGGER_EXEC (AcpiDbDisplayResultObject (WalkState->ResultObj,                                WalkState));        /*         * Delete the result op if and only if:         * Parent will not use the result -- such as any         * non-nested type2 op in a method (parent will be method)         */        AcpiDsDeleteResultIfNotUsed (Op, WalkState->ResultObj, WalkState);    }#ifdef _UNDER_DEVELOPMENT    if (WalkState->ParserState.Aml == WalkState->ParserState.AmlEnd)    {        AcpiDbMethodEnd (WalkState);    }#endif    /* Invoke exception handler on error */    if (ACPI_FAILURE (Status))    {        Status = AcpiDsMethodError (Status, WalkState);    }    /* Always clear the object stack */    WalkState->NumOperands = 0;    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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