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

📄 exoparg1.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
        /*         * TempDesc is now guaranteed to be an Integer object --         * Perform the actual increment or decrement         */        if (WalkState->Opcode == AML_INCREMENT_OP)        {            ReturnDesc->Integer.Value = TempDesc->Integer.Value +1;        }        else        {            ReturnDesc->Integer.Value = TempDesc->Integer.Value -1;        }        /* Finished with this Integer object */        AcpiUtRemoveReference (TempDesc);        /*         * Store the result back (indirectly) through the original         * Reference object         */        Status = AcpiExStore (ReturnDesc, Operand[0], WalkState);        break;    case AML_TYPE_OP:               /* ObjectType (SourceObject) */        /*         * Note: The operand is not resolved at this point because we want to         * get the associated object, not its value.  For example, we don't         * want to resolve a FieldUnit to its value, we want the actual         * FieldUnit object.         */        /* Get the type of the base object */        Status = AcpiExResolveMultiple (WalkState, Operand[0], &Type, NULL);        if (ACPI_FAILURE (Status))        {            goto Cleanup;        }        /* Allocate a descriptor to hold the type. */        ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);        if (!ReturnDesc)        {            Status = AE_NO_MEMORY;            goto Cleanup;        }        ReturnDesc->Integer.Value = Type;        break;    case AML_SIZE_OF_OP:            /* SizeOf (SourceObject)  */        /*         * Note: The operand is not resolved at this point because we want to         * get the associated object, not its value.         */        /* Get the base object */        Status = AcpiExResolveMultiple (WalkState,                    Operand[0], &Type, &TempDesc);        if (ACPI_FAILURE (Status))        {            goto Cleanup;        }        /*         * The type of the base object must be integer, buffer, string, or         * package.  All others are not supported.         *         * NOTE: Integer is not specifically supported by the ACPI spec,         * but is supported implicitly via implicit operand conversion.         * rather than bother with conversion, we just use the byte width         * global (4 or 8 bytes).         */        switch (Type)        {        case ACPI_TYPE_INTEGER:            Value = AcpiGbl_IntegerByteWidth;            break;        case ACPI_TYPE_STRING:            Value = TempDesc->String.Length;            break;        case ACPI_TYPE_BUFFER:            /* Buffer arguments may not be evaluated at this point */            Status = AcpiDsGetBufferArguments (TempDesc);            Value = TempDesc->Buffer.Length;            break;        case ACPI_TYPE_PACKAGE:            /* Package arguments may not be evaluated at this point */            Status = AcpiDsGetPackageArguments (TempDesc);            Value = TempDesc->Package.Count;            break;        default:            ACPI_ERROR ((AE_INFO,                "Operand must be Buffer/Integer/String/Package - found type %s",                AcpiUtGetTypeName (Type)));            Status = AE_AML_OPERAND_TYPE;            goto Cleanup;        }        if (ACPI_FAILURE (Status))        {            goto Cleanup;        }        /*         * Now that we have the size of the object, create a result         * object to hold the value         */        ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);        if (!ReturnDesc)        {            Status = AE_NO_MEMORY;            goto Cleanup;        }        ReturnDesc->Integer.Value = Value;        break;    case AML_REF_OF_OP:             /* RefOf (SourceObject) */        Status = AcpiExGetObjectReference (Operand[0], &ReturnDesc, WalkState);        if (ACPI_FAILURE (Status))        {            goto Cleanup;        }        break;    case AML_DEREF_OF_OP:           /* DerefOf (ObjReference | String) */        /* Check for a method local or argument, or standalone String */        if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) == ACPI_DESC_TYPE_NAMED)        {            TempDesc = AcpiNsGetAttachedObject (                           (ACPI_NAMESPACE_NODE *) Operand[0]);            if (TempDesc &&                 ((ACPI_GET_OBJECT_TYPE (TempDesc) == ACPI_TYPE_STRING) ||                  (ACPI_GET_OBJECT_TYPE (TempDesc) == ACPI_TYPE_LOCAL_REFERENCE)))            {                Operand[0] = TempDesc;                AcpiUtAddReference (TempDesc);            }            else            {                Status = AE_AML_OPERAND_TYPE;                goto Cleanup;            }        }        else        {            switch (ACPI_GET_OBJECT_TYPE (Operand[0]))            {            case ACPI_TYPE_LOCAL_REFERENCE:                /*                 * This is a DerefOf (LocalX | ArgX)                 *                 * Must resolve/dereference the local/arg reference first                 */                switch (Operand[0]->Reference.Opcode)                {                case AML_LOCAL_OP:                case AML_ARG_OP:                    /* Set Operand[0] to the value of the local/arg */                    Status = AcpiDsMethodDataGetValue (                                Operand[0]->Reference.Opcode,                                Operand[0]->Reference.Offset,                                WalkState, &TempDesc);                    if (ACPI_FAILURE (Status))                    {                        goto Cleanup;                    }                    /*                     * Delete our reference to the input object and                     * point to the object just retrieved                     */                    AcpiUtRemoveReference (Operand[0]);                    Operand[0] = TempDesc;                    break;                case AML_REF_OF_OP:                    /* Get the object to which the reference refers */                    TempDesc = Operand[0]->Reference.Object;                    AcpiUtRemoveReference (Operand[0]);                    Operand[0] = TempDesc;                    break;                default:                    /* Must be an Index op - handled below */                    break;                }                break;            case ACPI_TYPE_STRING:                break;            default:                Status = AE_AML_OPERAND_TYPE;                goto Cleanup;            }        }        if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) != ACPI_DESC_TYPE_NAMED)        {            if (ACPI_GET_OBJECT_TYPE (Operand[0]) == ACPI_TYPE_STRING)            {                /*                 * This is a DerefOf (String). The string is a reference                 * to a named ACPI object.                 *                 * 1) Find the owning Node                 * 2) Dereference the node to an actual object. Could be a                 *    Field, so we need to resolve the node to a value.                 */                Status = AcpiNsGetNode (WalkState->ScopeInfo->Scope.Node,                            Operand[0]->String.Pointer,                            ACPI_NS_SEARCH_PARENT,                            ACPI_CAST_INDIRECT_PTR (                                ACPI_NAMESPACE_NODE, &ReturnDesc));                if (ACPI_FAILURE (Status))                {                    goto Cleanup;                }                Status = AcpiExResolveNodeToValue (                            ACPI_CAST_INDIRECT_PTR (                                ACPI_NAMESPACE_NODE, &ReturnDesc),                            WalkState);                goto Cleanup;            }        }        /* Operand[0] may have changed from the code above */        if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) == ACPI_DESC_TYPE_NAMED)        {            /*             * This is a DerefOf (ObjectReference)             * Get the actual object from the Node (This is the dereference).             * This case may only happen when a LocalX or ArgX is             * dereferenced above.             */            ReturnDesc = AcpiNsGetAttachedObject (                            (ACPI_NAMESPACE_NODE *) Operand[0]);            AcpiUtAddReference (ReturnDesc);        }        else        {            /*             * This must be a reference object produced by either the             * Index() or RefOf() operator             */            switch (Operand[0]->Reference.Opcode)            {            case AML_INDEX_OP:                /*                 * The target type for the Index operator must be                 * either a Buffer or a Package                 */                switch (Operand[0]->Reference.TargetType)                {                case ACPI_TYPE_BUFFER_FIELD:                    TempDesc = Operand[0]->Reference.Object;                    /*                     * Create a new object that contains one element of the                     * buffer -- the element pointed to by the index.                     *                     * NOTE: index into a buffer is NOT a pointer to a                     * sub-buffer of the main buffer, it is only a pointer to a                     * single element (byte) of the buffer!                     */                    ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);                    if (!ReturnDesc)                    {                        Status = AE_NO_MEMORY;                        goto Cleanup;                    }                    /*                     * Since we are returning the value of the buffer at the                     * indexed location, we don't need to add an additional                     * reference to the buffer itself.                     */                    ReturnDesc->Integer.Value =                        TempDesc->Buffer.Pointer[Operand[0]->Reference.Offset];                    break;                case ACPI_TYPE_PACKAGE:                    /*                     * Return the referenced element of the package.  We must                     * add another reference to the referenced object, however.                     */                    ReturnDesc = *(Operand[0]->Reference.Where);                    if (ReturnDesc)                    {                        AcpiUtAddReference (ReturnDesc);                    }                    break;                default:                    ACPI_ERROR ((AE_INFO,                        "Unknown Index TargetType %X in obj %p",                        Operand[0]->Reference.TargetType, Operand[0]));                    Status = AE_AML_OPERAND_TYPE;                    goto Cleanup;                }                break;            case AML_REF_OF_OP:                ReturnDesc = Operand[0]->Reference.Object;                if (ACPI_GET_DESCRIPTOR_TYPE (ReturnDesc) ==                        ACPI_DESC_TYPE_NAMED)                {                    ReturnDesc = AcpiNsGetAttachedObject (                                    (ACPI_NAMESPACE_NODE *) ReturnDesc);                }                /* Add another reference to the object! */                AcpiUtAddReference (ReturnDesc);                break;            default:                ACPI_ERROR ((AE_INFO,                    "Unknown opcode in reference(%p) - %X",                    Operand[0], Operand[0]->Reference.Opcode));                Status = AE_TYPE;                goto Cleanup;            }        }        break;    default:        ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",            WalkState->Opcode));        Status = AE_AML_BAD_OPCODE;        goto Cleanup;    }Cleanup:    /* Delete return object on error */    if (ACPI_FAILURE (Status))    {        AcpiUtRemoveReference (ReturnDesc);    }    /* Save return object on success */    else    {        WalkState->ResultObj = ReturnDesc;    }    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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