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

📄 dsopcode.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 4 页
字号:
    /* Execute the AML code for the TermArg arguments */    Status = AcpiDsExecuteArguments (Node, Node,                ObjDesc->Buffer.AmlLength, ObjDesc->Buffer.AmlStart);    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsGetPackageArguments * * PARAMETERS:  ObjDesc         - A valid Package object * * RETURN:      Status. * * DESCRIPTION: Get Package length and initializer byte list.  This implements *              the late evaluation of these attributes. * ******************************************************************************/ACPI_STATUSAcpiDsGetPackageArguments (    ACPI_OPERAND_OBJECT     *ObjDesc){    ACPI_NAMESPACE_NODE     *Node;    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE_PTR (DsGetPackageArguments, ObjDesc);    if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)    {        return_ACPI_STATUS (AE_OK);    }    /* Get the Package node */    Node = ObjDesc->Package.Node;    if (!Node)    {        ACPI_ERROR ((AE_INFO,            "No pointer back to NS node in package %p", ObjDesc));        return_ACPI_STATUS (AE_AML_INTERNAL);    }    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n"));    /* Execute the AML code for the TermArg arguments */    Status = AcpiDsExecuteArguments (Node, Node,                ObjDesc->Package.AmlLength, ObjDesc->Package.AmlStart);    return_ACPI_STATUS (Status);}/***************************************************************************** * * FUNCTION:    AcpiDsGetRegionArguments * * PARAMETERS:  ObjDesc         - A valid region object * * RETURN:      Status. * * DESCRIPTION: Get region address and length.  This implements the late *              evaluation of these region attributes. * ****************************************************************************/ACPI_STATUSAcpiDsGetRegionArguments (    ACPI_OPERAND_OBJECT     *ObjDesc){    ACPI_NAMESPACE_NODE     *Node;    ACPI_STATUS             Status;    ACPI_OPERAND_OBJECT     *ExtraDesc;    ACPI_FUNCTION_TRACE_PTR (DsGetRegionArguments, ObjDesc);    if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)    {        return_ACPI_STATUS (AE_OK);    }    ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc);    if (!ExtraDesc)    {        return_ACPI_STATUS (AE_NOT_EXIST);    }    /* Get the Region node */    Node = ObjDesc->Region.Node;    ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_REGION, Node, NULL));    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Arg Init at AML %p\n",        AcpiUtGetNodeName (Node), ExtraDesc->Extra.AmlStart));    /* Execute the argument AML */    Status = AcpiDsExecuteArguments (Node, AcpiNsGetParentNode (Node),                ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /* Validate the region address/length via the host OS */    Status = AcpiOsValidateAddress (ObjDesc->Region.SpaceId,                ObjDesc->Region.Address, (ACPI_SIZE) ObjDesc->Region.Length);    if (ACPI_FAILURE (Status))    {        /*         * Invalid address/length. We will emit an error message and mark         * the region as invalid, so that it will cause an additional error if         * it is ever used. Then return AE_OK.         */        ACPI_EXCEPTION ((AE_INFO, Status,            "During address validation of OpRegion [%4.4s]", Node->Name.Ascii));        ObjDesc->Common.Flags |= AOPOBJ_INVALID;        Status = AE_OK;    }    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsInitializeRegion * * PARAMETERS:  ObjHandle       - Region namespace node * * RETURN:      Status * * DESCRIPTION: Front end to EvInitializeRegion * ******************************************************************************/ACPI_STATUSAcpiDsInitializeRegion (    ACPI_HANDLE             ObjHandle){    ACPI_OPERAND_OBJECT     *ObjDesc;    ACPI_STATUS             Status;    ObjDesc = AcpiNsGetAttachedObject (ObjHandle);    /* Namespace is NOT locked */    Status = AcpiEvInitializeRegion (ObjDesc, FALSE);    return (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsInitBufferField * * PARAMETERS:  AmlOpcode       - CreateXxxField *              ObjDesc         - BufferField object *              BufferDesc      - Host Buffer *              OffsetDesc      - Offset into buffer *              LengthDesc      - Length of field (CREATE_FIELD_OP only) *              ResultDesc      - Where to store the result * * RETURN:      Status * * DESCRIPTION: Perform actual initialization of a buffer field * ******************************************************************************/static ACPI_STATUSAcpiDsInitBufferField (    UINT16                  AmlOpcode,    ACPI_OPERAND_OBJECT     *ObjDesc,    ACPI_OPERAND_OBJECT     *BufferDesc,    ACPI_OPERAND_OBJECT     *OffsetDesc,    ACPI_OPERAND_OBJECT     *LengthDesc,    ACPI_OPERAND_OBJECT     *ResultDesc){    UINT32                  Offset;    UINT32                  BitOffset;    UINT32                  BitCount;    UINT8                   FieldFlags;    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE_PTR (DsInitBufferField, ObjDesc);    /* Host object must be a Buffer */    if (ACPI_GET_OBJECT_TYPE (BufferDesc) != ACPI_TYPE_BUFFER)    {        ACPI_ERROR ((AE_INFO,            "Target of Create Field is not a Buffer object - %s",            AcpiUtGetObjectTypeName (BufferDesc)));        Status = AE_AML_OPERAND_TYPE;        goto Cleanup;    }    /*     * The last parameter to all of these opcodes (ResultDesc) started     * out as a NameString, and should therefore now be a NS node     * after resolution in AcpiExResolveOperands().     */    if (ACPI_GET_DESCRIPTOR_TYPE (ResultDesc) != ACPI_DESC_TYPE_NAMED)    {        ACPI_ERROR ((AE_INFO,            "(%s) destination not a NS Node [%s]",            AcpiPsGetOpcodeName (AmlOpcode),            AcpiUtGetDescriptorName (ResultDesc)));        Status = AE_AML_OPERAND_TYPE;        goto Cleanup;    }    Offset = (UINT32) OffsetDesc->Integer.Value;    /*     * Setup the Bit offsets and counts, according to the opcode     */    switch (AmlOpcode)    {    case AML_CREATE_FIELD_OP:        /* Offset is in bits, count is in bits */        FieldFlags = AML_FIELD_ACCESS_BYTE;        BitOffset  = Offset;        BitCount   = (UINT32) LengthDesc->Integer.Value;        /* Must have a valid (>0) bit count */        if (BitCount == 0)        {            ACPI_ERROR ((AE_INFO,                "Attempt to CreateField of length zero"));            Status = AE_AML_OPERAND_VALUE;            goto Cleanup;        }        break;    case AML_CREATE_BIT_FIELD_OP:        /* Offset is in bits, Field is one bit */        BitOffset  = Offset;        BitCount   = 1;        FieldFlags = AML_FIELD_ACCESS_BYTE;        break;    case AML_CREATE_BYTE_FIELD_OP:        /* Offset is in bytes, field is one byte */        BitOffset  = 8 * Offset;        BitCount   = 8;        FieldFlags = AML_FIELD_ACCESS_BYTE;        break;    case AML_CREATE_WORD_FIELD_OP:        /* Offset is in bytes, field is one word */        BitOffset  = 8 * Offset;        BitCount   = 16;        FieldFlags = AML_FIELD_ACCESS_WORD;        break;    case AML_CREATE_DWORD_FIELD_OP:        /* Offset is in bytes, field is one dword */        BitOffset  = 8 * Offset;        BitCount   = 32;        FieldFlags = AML_FIELD_ACCESS_DWORD;        break;    case AML_CREATE_QWORD_FIELD_OP:        /* Offset is in bytes, field is one qword */        BitOffset  = 8 * Offset;        BitCount   = 64;        FieldFlags = AML_FIELD_ACCESS_QWORD;        break;    default:        ACPI_ERROR ((AE_INFO,            "Unknown field creation opcode %02x",            AmlOpcode));        Status = AE_AML_BAD_OPCODE;        goto Cleanup;    }    /* Entire field must fit within the current length of the buffer */    if ((BitOffset + BitCount) >        (8 * (UINT32) BufferDesc->Buffer.Length))    {        ACPI_ERROR ((AE_INFO,            "Field [%4.4s] at %d exceeds Buffer [%4.4s] size %d (bits)",            AcpiUtGetNodeName (ResultDesc),            BitOffset + BitCount,            AcpiUtGetNodeName (BufferDesc->Buffer.Node),            8 * (UINT32) BufferDesc->Buffer.Length));        Status = AE_AML_BUFFER_LIMIT;        goto Cleanup;    }    /*     * Initialize areas of the field object that are common to all fields     * For FieldFlags, use LOCK_RULE = 0 (NO_LOCK),     * UPDATE_RULE = 0 (UPDATE_PRESERVE)     */    Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, 0,                                            BitOffset, BitCount);    if (ACPI_FAILURE (Status))    {        goto Cleanup;    }    ObjDesc->BufferField.BufferObj = BufferDesc;    /* Reference count for BufferDesc inherits ObjDesc count */    BufferDesc->Common.ReferenceCount = (UINT16)        (BufferDesc->Common.ReferenceCount + ObjDesc->Common.ReferenceCount);Cleanup:    /* Always delete the operands */    AcpiUtRemoveReference (OffsetDesc);    AcpiUtRemoveReference (BufferDesc);    if (AmlOpcode == AML_CREATE_FIELD_OP)    {        AcpiUtRemoveReference (LengthDesc);    }    /* On failure, delete the result descriptor */    if (ACPI_FAILURE (Status))    {        AcpiUtRemoveReference (ResultDesc);     /* Result descriptor */    }    else    {        /* Now the address and length are valid for this BufferField */        ObjDesc->BufferField.Flags |= AOPOBJ_DATA_VALID;    }    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsEvalBufferFieldOperands * * PARAMETERS:  WalkState       - Current walk *              Op              - A valid BufferField Op object * * RETURN:      Status * * DESCRIPTION: Get BufferField Buffer and Index *              Called from AcpiDsExecEndOp during BufferField parse tree walk * ******************************************************************************/ACPI_STATUSAcpiDsEvalBufferFieldOperands (    ACPI_WALK_STATE         *WalkState,    ACPI_PARSE_OBJECT       *Op){    ACPI_STATUS             Status;    ACPI_OPERAND_OBJECT     *ObjDesc;    ACPI_NAMESPACE_NODE     *Node;    ACPI_PARSE_OBJECT       *NextOp;    ACPI_FUNCTION_TRACE_PTR (DsEvalBufferFieldOperands, Op);    /*     * This is where we evaluate the address and length fields of the     * CreateXxxField declaration     */    Node =  Op->Common.Node;

⌨️ 快捷键说明

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