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

📄 exresop.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
             * A Namespace Node is OK as-is             */            if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)            {                goto NextOperand;            }            Status = AcpiExCheckObjectType (ACPI_TYPE_LOCAL_REFERENCE,                            ObjectType, ObjDesc);            if (ACPI_FAILURE (Status))            {                return_ACPI_STATUS (Status);            }            goto NextOperand;        case ARGI_DATAREFOBJ:  /* Store operator only */            /*             * We don't want to resolve IndexOp reference objects during             * a store because this would be an implicit DeRefOf operation.             * Instead, we just want to store the reference object.             * -- All others must be resolved below.             */            if ((Opcode == AML_STORE_OP) &&                (ACPI_GET_OBJECT_TYPE (*StackPtr) == ACPI_TYPE_LOCAL_REFERENCE) &&                ((*StackPtr)->Reference.Opcode == AML_INDEX_OP))            {                goto NextOperand;            }            break;        default:            /* All cases covered above */            break;        }        /*         * Resolve this object to a value         */        Status = AcpiExResolveToValue (StackPtr, WalkState);        if (ACPI_FAILURE (Status))        {            return_ACPI_STATUS (Status);        }        /* Get the resolved object */        ObjDesc = *StackPtr;        /*         * Check the resulting object (value) type         */        switch (ThisArgType)        {        /*         * For the simple cases, only one type of resolved object         * is allowed         */        case ARGI_MUTEX:            /* Need an operand of type ACPI_TYPE_MUTEX */            TypeNeeded = ACPI_TYPE_MUTEX;            break;        case ARGI_EVENT:            /* Need an operand of type ACPI_TYPE_EVENT */            TypeNeeded = ACPI_TYPE_EVENT;            break;        case ARGI_PACKAGE:   /* Package */            /* Need an operand of type ACPI_TYPE_PACKAGE */            TypeNeeded = ACPI_TYPE_PACKAGE;            break;        case ARGI_ANYTYPE:            /* Any operand type will do */            TypeNeeded = ACPI_TYPE_ANY;            break;        case ARGI_DDBHANDLE:            /* Need an operand of type ACPI_TYPE_DDB_HANDLE */            TypeNeeded = ACPI_TYPE_LOCAL_REFERENCE;            break;        /*         * The more complex cases allow multiple resolved object types         */        case ARGI_INTEGER:            /*             * Need an operand of type ACPI_TYPE_INTEGER,             * But we can implicitly convert from a STRING or BUFFER             * Aka - "Implicit Source Operand Conversion"             */            Status = AcpiExConvertToInteger (ObjDesc, StackPtr, 16);            if (ACPI_FAILURE (Status))            {                if (Status == AE_TYPE)                {                    ACPI_ERROR ((AE_INFO,                        "Needed [Integer/String/Buffer], found [%s] %p",                        AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));                    return_ACPI_STATUS (AE_AML_OPERAND_TYPE);                }                return_ACPI_STATUS (Status);            }            if (ObjDesc != *StackPtr)            {                AcpiUtRemoveReference (ObjDesc);            }            goto NextOperand;        case ARGI_BUFFER:            /*             * Need an operand of type ACPI_TYPE_BUFFER,             * But we can implicitly convert from a STRING or INTEGER             * Aka - "Implicit Source Operand Conversion"             */            Status = AcpiExConvertToBuffer (ObjDesc, StackPtr);            if (ACPI_FAILURE (Status))            {                if (Status == AE_TYPE)                {                    ACPI_ERROR ((AE_INFO,                        "Needed [Integer/String/Buffer], found [%s] %p",                        AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));                    return_ACPI_STATUS (AE_AML_OPERAND_TYPE);                }                return_ACPI_STATUS (Status);            }            if (ObjDesc != *StackPtr)            {                AcpiUtRemoveReference (ObjDesc);            }            goto NextOperand;        case ARGI_STRING:            /*             * Need an operand of type ACPI_TYPE_STRING,             * But we can implicitly convert from a BUFFER or INTEGER             * Aka - "Implicit Source Operand Conversion"             */            Status = AcpiExConvertToString (ObjDesc, StackPtr,                        ACPI_IMPLICIT_CONVERT_HEX);            if (ACPI_FAILURE (Status))            {                if (Status == AE_TYPE)                {                    ACPI_ERROR ((AE_INFO,                        "Needed [Integer/String/Buffer], found [%s] %p",                        AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));                    return_ACPI_STATUS (AE_AML_OPERAND_TYPE);                }                return_ACPI_STATUS (Status);            }            if (ObjDesc != *StackPtr)            {                AcpiUtRemoveReference (ObjDesc);            }            goto NextOperand;        case ARGI_COMPUTEDATA:            /* Need an operand of type INTEGER, STRING or BUFFER */            switch (ACPI_GET_OBJECT_TYPE (ObjDesc))            {            case ACPI_TYPE_INTEGER:            case ACPI_TYPE_STRING:            case ACPI_TYPE_BUFFER:                /* Valid operand */               break;            default:                ACPI_ERROR ((AE_INFO,                    "Needed [Integer/String/Buffer], found [%s] %p",                    AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));                return_ACPI_STATUS (AE_AML_OPERAND_TYPE);            }            goto NextOperand;        case ARGI_BUFFER_OR_STRING:            /* Need an operand of type STRING or BUFFER */            switch (ACPI_GET_OBJECT_TYPE (ObjDesc))            {            case ACPI_TYPE_STRING:            case ACPI_TYPE_BUFFER:                /* Valid operand */               break;            case ACPI_TYPE_INTEGER:                /* Highest priority conversion is to type Buffer */                Status = AcpiExConvertToBuffer (ObjDesc, StackPtr);                if (ACPI_FAILURE (Status))                {                    return_ACPI_STATUS (Status);                }                if (ObjDesc != *StackPtr)                {                    AcpiUtRemoveReference (ObjDesc);                }                break;            default:                ACPI_ERROR ((AE_INFO,                    "Needed [Integer/String/Buffer], found [%s] %p",                    AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));                return_ACPI_STATUS (AE_AML_OPERAND_TYPE);            }            goto NextOperand;        case ARGI_DATAOBJECT:            /*             * ARGI_DATAOBJECT is only used by the SizeOf operator.             * Need a buffer, string, package, or RefOf reference.             *             * The only reference allowed here is a direct reference to             * a namespace node.             */            switch (ACPI_GET_OBJECT_TYPE (ObjDesc))            {            case ACPI_TYPE_PACKAGE:            case ACPI_TYPE_STRING:            case ACPI_TYPE_BUFFER:            case ACPI_TYPE_LOCAL_REFERENCE:                /* Valid operand */                break;            default:                ACPI_ERROR ((AE_INFO,                    "Needed [Buffer/String/Package/Reference], found [%s] %p",                    AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));                return_ACPI_STATUS (AE_AML_OPERAND_TYPE);            }            goto NextOperand;        case ARGI_COMPLEXOBJ:            /* Need a buffer or package or (ACPI 2.0) String */            switch (ACPI_GET_OBJECT_TYPE (ObjDesc))            {            case ACPI_TYPE_PACKAGE:            case ACPI_TYPE_STRING:            case ACPI_TYPE_BUFFER:                /* Valid operand */                break;            default:                ACPI_ERROR ((AE_INFO,                    "Needed [Buffer/String/Package], found [%s] %p",                    AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));                return_ACPI_STATUS (AE_AML_OPERAND_TYPE);            }            goto NextOperand;        case ARGI_REGION_OR_BUFFER: /* Used by Load() only */            /* Need an operand of type REGION or a BUFFER (which could be a resolved region field) */            switch (ACPI_GET_OBJECT_TYPE (ObjDesc))            {            case ACPI_TYPE_BUFFER:            case ACPI_TYPE_REGION:                /* Valid operand */                break;            default:                ACPI_ERROR ((AE_INFO,                    "Needed [Region/Buffer], found [%s] %p",                    AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));                return_ACPI_STATUS (AE_AML_OPERAND_TYPE);            }            goto NextOperand;        case ARGI_DATAREFOBJ:            /* Used by the Store() operator only */            switch (ACPI_GET_OBJECT_TYPE (ObjDesc))            {            case ACPI_TYPE_INTEGER:            case ACPI_TYPE_PACKAGE:            case ACPI_TYPE_STRING:            case ACPI_TYPE_BUFFER:            case ACPI_TYPE_BUFFER_FIELD:            case ACPI_TYPE_LOCAL_REFERENCE:            case ACPI_TYPE_LOCAL_REGION_FIELD:            case ACPI_TYPE_LOCAL_BANK_FIELD:            case ACPI_TYPE_LOCAL_INDEX_FIELD:            case ACPI_TYPE_DDB_HANDLE:                /* Valid operand */                break;            default:                if (AcpiGbl_EnableInterpreterSlack)                {                    /*                     * Enable original behavior of Store(), allowing any and all                     * objects as the source operand.  The ACPI spec does not                     * allow this, however.                     */                    break;                }                if (TargetOp == AML_DEBUG_OP)                {                    /* Allow store of any object to the Debug object */                    break;                }                ACPI_ERROR ((AE_INFO,                    "Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p",                    AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));                return_ACPI_STATUS (AE_AML_OPERAND_TYPE);            }            goto NextOperand;        default:            /* Unknown type */            ACPI_ERROR ((AE_INFO,                "Internal - Unknown ARGI (required operand) type %X",                ThisArgType));            return_ACPI_STATUS (AE_BAD_PARAMETER);        }        /*         * Make sure that the original object was resolved to the         * required object type (Simple cases only).         */        Status = AcpiExCheckObjectType (TypeNeeded,                        ACPI_GET_OBJECT_TYPE (*StackPtr), *StackPtr);        if (ACPI_FAILURE (Status))        {            return_ACPI_STATUS (Status);        }NextOperand:        /*         * If more operands needed, decrement StackPtr to point         * to next operand on stack         */        if (GET_CURRENT_ARG_TYPE (ArgTypes))        {            StackPtr--;        }    }    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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