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

📄 aslanalyze.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 5 页
字号:
        /* Reverse the runtime argument list */        RuntimeArgTypes2 = 0;        while ((ArgType = GET_CURRENT_ARG_TYPE (RuntimeArgTypes)))        {            RuntimeArgTypes2 <<= ARG_TYPE_WIDTH;            RuntimeArgTypes2 |= ArgType;            INCREMENT_ARG_LIST (RuntimeArgTypes);        }        while ((ArgType = GET_CURRENT_ARG_TYPE (RuntimeArgTypes2)))        {            RequiredBtypes = AnMapArgTypeToBtype (ArgType);            ThisNodeBtype = AnGetBtype (ArgOp);            if (ThisNodeBtype == ACPI_UINT32_MAX)            {                goto NextArgument;            }            /* Examine the arg based on the required type of the arg */            switch (ArgType)            {            case ARGI_TARGETREF:                if (ArgOp->Asl.ParseOpcode == PARSEOP_ZERO)                {                    /* ZERO is the placeholder for "don't store result" */                    ThisNodeBtype = RequiredBtypes;                    break;                }                if (ArgOp->Asl.ParseOpcode == PARSEOP_INTEGER)                {                    /*                     * This is the case where an original reference to a resource                     * descriptor field has been replaced by an (Integer) offset.                     * These named fields are supported at compile-time only;                     * the names are not passed to the interpreter (via the AML).                     */                    if ((ArgOp->Asl.Node->Type == ACPI_TYPE_LOCAL_RESOURCE_FIELD) ||                        (ArgOp->Asl.Node->Type == ACPI_TYPE_LOCAL_RESOURCE))                    {                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_FIELD, ArgOp, NULL);                    }                    else                    {                        AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ArgOp, NULL);                    }                    break;                }                if ((ArgOp->Asl.ParseOpcode == PARSEOP_METHODCALL) ||                    (ArgOp->Asl.ParseOpcode == PARSEOP_DEREFOF))                {                    break;                }                ThisNodeBtype = RequiredBtypes;                break;            case ARGI_REFERENCE:            /* References */            case ARGI_INTEGER_REF:            case ARGI_OBJECT_REF:            case ARGI_DEVICE_REF:                switch (ArgOp->Asl.ParseOpcode)                {                case PARSEOP_LOCAL0:                case PARSEOP_LOCAL1:                case PARSEOP_LOCAL2:                case PARSEOP_LOCAL3:                case PARSEOP_LOCAL4:                case PARSEOP_LOCAL5:                case PARSEOP_LOCAL6:                case PARSEOP_LOCAL7:                    /* TBD: implement analysis of current value (type) of the local */                    /* For now, just treat any local as a typematch */                    /*ThisNodeBtype = RequiredBtypes;*/                    break;                case PARSEOP_ARG0:                case PARSEOP_ARG1:                case PARSEOP_ARG2:                case PARSEOP_ARG3:                case PARSEOP_ARG4:                case PARSEOP_ARG5:                case PARSEOP_ARG6:                    /* Hard to analyze argument types, sow we won't */                    /* For now, just treat any arg as a typematch */                    /* ThisNodeBtype = RequiredBtypes; */                    break;                case PARSEOP_DEBUG:                    break;                case PARSEOP_REFOF:                case PARSEOP_INDEX:                default:                    break;                }                break;            case ARGI_INTEGER:            default:                break;            }            CommonBtypes = ThisNodeBtype & RequiredBtypes;            if (ArgOp->Asl.ParseOpcode == PARSEOP_METHODCALL)            {                if (AnIsInternalMethod (ArgOp))                {                    return (AE_OK);                }                /* Check a method call for a valid return value */                AnCheckMethodReturnValue (Op, OpInfo, ArgOp,                    RequiredBtypes, ThisNodeBtype);            }            /*             * Now check if the actual type(s) match at least one             * bit to the required type             */            else if (!CommonBtypes)            {                /* No match -- this is a type mismatch error */                AnFormatBtype (StringBuffer, ThisNodeBtype);                AnFormatBtype (StringBuffer2, RequiredBtypes);                sprintf (MsgBuffer, "[%s] found, %s operator requires [%s]",                            StringBuffer, OpInfo->Name, StringBuffer2);                AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ArgOp, MsgBuffer);            }        NextArgument:            ArgOp = ArgOp->Asl.Next;            INCREMENT_ARG_LIST (RuntimeArgTypes2);        }        break;    default:        break;    }    return (AE_OK);}/******************************************************************************* * * FUNCTION:    AnIsResultUsed * * PARAMETERS:  Op              - Parent op for the operator * * RETURN:      TRUE if result from this operation is actually consumed * * DESCRIPTION: Determine if the function result value from an operator is *              used. * ******************************************************************************/BOOLEANAnIsResultUsed (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *Parent;    switch (Op->Asl.ParseOpcode)    {    case PARSEOP_INCREMENT:    case PARSEOP_DECREMENT:        /* These are standalone operators, no return value */        return (TRUE);    default:        break;    }    /* Examine parent to determine if the return value is used */    Parent = Op->Asl.Parent;    switch (Parent->Asl.ParseOpcode)    {    /* If/While - check if the operator is the predicate */    case PARSEOP_IF:    case PARSEOP_WHILE:        /* First child is the predicate */        if (Parent->Asl.Child == Op)        {            return (TRUE);        }        return (FALSE);    /* Not used if one of these is the parent */    case PARSEOP_METHOD:    case PARSEOP_DEFINITIONBLOCK:    case PARSEOP_ELSE:        return (FALSE);    default:        /* Any other type of parent means that the result is used */        return (TRUE);    }}/******************************************************************************* * * FUNCTION:    AnOtherSemanticAnalysisWalkBegin * * PARAMETERS:  ASL_WALK_CALLBACK * * RETURN:      Status * * DESCRIPTION: Descending callback for the analysis walk. Checks for *              miscellaneous issues in the code. * ******************************************************************************/ACPI_STATUSAnOtherSemanticAnalysisWalkBegin (    ACPI_PARSE_OBJECT       *Op,    UINT32                  Level,    void                    *Context){    ACPI_PARSE_OBJECT       *ArgNode;    ACPI_PARSE_OBJECT       *PrevArgNode = NULL;    const ACPI_OPCODE_INFO  *OpInfo;    OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);    /*     * Determine if an execution class operator actually does something by     * checking if it has a target and/or the function return value is used.     * (Target is optional, so a standalone statement can actually do nothing.)     */    if ((OpInfo->Class == AML_CLASS_EXECUTE) &&        (OpInfo->Flags & AML_HAS_RETVAL) &&        (!AnIsResultUsed (Op)))    {        if (OpInfo->Flags & AML_HAS_TARGET)        {            /*             * Find the target node, it is always the last child. If the traget             * is not specified in the ASL, a default node of type Zero was             * created by the parser.             */            ArgNode = Op->Asl.Child;            while (ArgNode->Asl.Next)            {                PrevArgNode = ArgNode;                ArgNode = ArgNode->Asl.Next;            }            /* Divide() is the only weird case, it has two targets */            if (Op->Asl.AmlOpcode == AML_DIVIDE_OP)            {                if ((ArgNode->Asl.ParseOpcode == PARSEOP_ZERO) &&                    (PrevArgNode->Asl.ParseOpcode == PARSEOP_ZERO))                {                    AslError (ASL_WARNING, ASL_MSG_RESULT_NOT_USED, Op, Op->Asl.ExternalName);                }            }            else if (ArgNode->Asl.ParseOpcode == PARSEOP_ZERO)            {                AslError (ASL_WARNING, ASL_MSG_RESULT_NOT_USED, Op, Op->Asl.ExternalName);            }        }        else        {            /*             * Has no target and the result is not used. Only a couple opcodes             * can have this combination.             */            switch (Op->Asl.ParseOpcode)            {            case PARSEOP_ACQUIRE:            case PARSEOP_WAIT:                break;            default:                AslError (ASL_WARNING, ASL_MSG_RESULT_NOT_USED, Op, Op->Asl.ExternalName);                break;            }        }    }    /*     * Semantic checks for individual ASL operators     */    switch (Op->Asl.ParseOpcode)    {    case PARSEOP_ACQUIRE:    case PARSEOP_WAIT:        /*         * Emit a warning if the timeout parameter for these operators is not         * ACPI_WAIT_FOREVER, and the result value from the operator is not         * checked, meaning that a timeout could happen, but the code         * would not know about it.         */        /* First child is the namepath, 2nd child is timeout */        ArgNode = Op->Asl.Child;        ArgNode = ArgNode->Asl.Next;        /*         * Check for the WAIT_FOREVER case - defined by the ACPI spec to be         * 0xFFFF or greater         */        if (((ArgNode->Asl.ParseOpcode == PARSEOP_WORDCONST) ||             (ArgNode->Asl.ParseOpcode == PARSEOP_INTEGER))  &&             (ArgNode->Asl.Value.Integer >= (ACPI_INTEGER) ACPI_WAIT_FOREVER))        {            break;        }        /*         * The operation could timeout. If the return value is not used         * (indicates timeout occurred), issue a warning         */        if (!AnIsResultUsed (Op))        {            AslError (ASL_WARNING, ASL_MSG_TIMEOUT, ArgNode, Op->Asl.ExternalName);        }        break;    case PARSEOP_CREATEFIELD:        /*         * Check for a zero Length (NumBits) operand. NumBits is the 3rd operand         */        ArgNode = Op->Asl.Child;        ArgNode = ArgNode->Asl.Next;        ArgNode = ArgNode->Asl.Next;        if ((ArgNode->Asl.ParseOpcode == PARSEOP_ZERO) ||           ((ArgNode->Asl.ParseOpcode == PARSEOP_INTEGER) &&            (ArgNode->Asl.Value.Integer == 0)))        {            AslError (ASL_ERROR, ASL_MSG_NON_ZERO, ArgNode, NULL);        }        break;    default:        break;    }    return AE_OK;}/******************************************************************************* * * FUNCTION:    AnOtherSemanticAnalysisWalkEnd * * PARAMETERS:  ASL_WALK_CALLBACK * * RETURN:      Status * * DESCRIPTION: Ascending callback for analysis walk. Complete method *              return analysis. * ******************************************************************************/ACPI_STATUSAnOtherSemanticAnalysisWalkEnd (    ACPI_PARSE_OBJECT       *Op,    UINT32                  Level,    void                    *Context){    return AE_OK;}#ifdef ACPI_OBSOLETE_FUNCTIONS/******************************************************************************* * * FUNCTION:    AnMapBtypeToEtype * * PARAMETERS:  Btype               - Bitfield of ACPI types * * RETURN:      The Etype corresponding the the Btype * * DESCRIPTION: Convert a bitfield type to an encoded type * ******************************************************************************/UINT32AnMapBtypeToEtype (    UINT32              Btype){    UINT32              i;    UINT32              Etype;    if (Btype == 0)    {        return 0;    }    Etype = 1;    for (i = 1; i < Btype; i *= 2)    {        Etype++;    }    return (Etype);}#endif

⌨️ 快捷键说明

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