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

📄 exfield.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
     *     * Note: Field.length is in bits.     */    Length = (ACPI_SIZE) ACPI_ROUND_BITS_UP_TO_BYTES (ObjDesc->Field.BitLength);    if (Length > AcpiGbl_IntegerByteWidth)    {        /* Field is too large for an Integer, create a Buffer instead */        BufferDesc = AcpiUtCreateBufferObject (Length);        if (!BufferDesc)        {            return_ACPI_STATUS (AE_NO_MEMORY);        }        Buffer = BufferDesc->Buffer.Pointer;    }    else    {        /* Field will fit within an Integer (normal case) */        BufferDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);        if (!BufferDesc)        {            return_ACPI_STATUS (AE_NO_MEMORY);        }        Length = AcpiGbl_IntegerByteWidth;        BufferDesc->Integer.Value = 0;        Buffer = &BufferDesc->Integer.Value;    }    ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,        "FieldRead [TO]:   Obj %p, Type %X, Buf %p, ByteLen %X\n",        ObjDesc, ACPI_GET_OBJECT_TYPE (ObjDesc), Buffer, (UINT32) Length));    ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,        "FieldRead [FROM]: BitLen %X, BitOff %X, ByteOff %X\n",        ObjDesc->CommonField.BitLength,        ObjDesc->CommonField.StartFieldBitOffset,        ObjDesc->CommonField.BaseByteOffset));    /* Lock entire transaction if requested */    AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);    /* Read from the field */    Status = AcpiExExtractFromField (ObjDesc, Buffer, (UINT32) Length);    AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);Exit:    if (ACPI_FAILURE (Status))    {        AcpiUtRemoveReference (BufferDesc);    }    else    {        *RetBufferDesc = BufferDesc;    }    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiExWriteDataToField * * PARAMETERS:  SourceDesc          - Contains data to write *              ObjDesc             - The named field *              ResultDesc          - Where the return value is returned, if any * * RETURN:      Status * * DESCRIPTION: Write to a named field * ******************************************************************************/ACPI_STATUSAcpiExWriteDataToField (    ACPI_OPERAND_OBJECT     *SourceDesc,    ACPI_OPERAND_OBJECT     *ObjDesc,    ACPI_OPERAND_OBJECT     **ResultDesc){    ACPI_STATUS             Status;    UINT32                  Length;    void                    *Buffer;    ACPI_OPERAND_OBJECT     *BufferDesc;    ACPI_FUNCTION_TRACE_PTR (ExWriteDataToField, ObjDesc);    /* Parameter validation */    if (!SourceDesc || !ObjDesc)    {        return_ACPI_STATUS (AE_AML_NO_OPERAND);    }    if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_BUFFER_FIELD)    {        /*         * If the BufferField arguments have not been previously evaluated,         * evaluate them now and save the results.         */        if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID))        {            Status = AcpiDsGetBufferFieldArguments (ObjDesc);            if (ACPI_FAILURE (Status))            {                return_ACPI_STATUS (Status);            }        }    }    else if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_REGION_FIELD) &&             (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_SMBUS))    {        /*         * This is an SMBus write.  We will bypass the entire field mechanism         * and handoff the buffer directly to the handler.         *         * Source must be a buffer of sufficient size (ACPI_SMBUS_BUFFER_SIZE).         */        if (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_BUFFER)        {            ACPI_ERROR ((AE_INFO, "SMBus write requires Buffer, found type %s",                AcpiUtGetObjectTypeName (SourceDesc)));            return_ACPI_STATUS (AE_AML_OPERAND_TYPE);        }        if (SourceDesc->Buffer.Length < ACPI_SMBUS_BUFFER_SIZE)        {            ACPI_ERROR ((AE_INFO,                "SMBus write requires Buffer of length %X, found length %X",                ACPI_SMBUS_BUFFER_SIZE, SourceDesc->Buffer.Length));            return_ACPI_STATUS (AE_AML_BUFFER_LIMIT);        }        BufferDesc = AcpiUtCreateBufferObject (ACPI_SMBUS_BUFFER_SIZE);        if (!BufferDesc)        {            return_ACPI_STATUS (AE_NO_MEMORY);        }        Buffer = BufferDesc->Buffer.Pointer;        ACPI_MEMCPY (Buffer, SourceDesc->Buffer.Pointer,            ACPI_SMBUS_BUFFER_SIZE);        /* Lock entire transaction if requested */        AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);        /*         * Perform the write (returns status and perhaps data in the         * same buffer)         * Note: SMBus protocol type is passed in upper 16-bits of Function.         */        Status = AcpiExAccessRegion (ObjDesc, 0,                        (ACPI_INTEGER *) Buffer,                        ACPI_WRITE | (ObjDesc->Field.Attribute << 16));        AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);        *ResultDesc = BufferDesc;        return_ACPI_STATUS (Status);    }    /* Get a pointer to the data to be written */    switch (ACPI_GET_OBJECT_TYPE (SourceDesc))    {    case ACPI_TYPE_INTEGER:        Buffer = &SourceDesc->Integer.Value;        Length = sizeof (SourceDesc->Integer.Value);        break;    case ACPI_TYPE_BUFFER:        Buffer = SourceDesc->Buffer.Pointer;        Length = SourceDesc->Buffer.Length;        break;    case ACPI_TYPE_STRING:        Buffer = SourceDesc->String.Pointer;        Length = SourceDesc->String.Length;        break;    default:        return_ACPI_STATUS (AE_AML_OPERAND_TYPE);    }    ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,        "FieldWrite [FROM]: Obj %p (%s:%X), Buf %p, ByteLen %X\n",        SourceDesc, AcpiUtGetTypeName (ACPI_GET_OBJECT_TYPE (SourceDesc)),        ACPI_GET_OBJECT_TYPE (SourceDesc), Buffer, Length));    ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,        "FieldWrite [TO]:   Obj %p (%s:%X), BitLen %X, BitOff %X, ByteOff %X\n",        ObjDesc, AcpiUtGetTypeName (ACPI_GET_OBJECT_TYPE (ObjDesc)),        ACPI_GET_OBJECT_TYPE (ObjDesc),        ObjDesc->CommonField.BitLength,        ObjDesc->CommonField.StartFieldBitOffset,        ObjDesc->CommonField.BaseByteOffset));    /* Lock entire transaction if requested */    AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);    /* Write to the field */    Status = AcpiExInsertIntoField (ObjDesc, Buffer, Length);    AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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