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

📄 dsopcode.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 4 页
字号:
    /* NextOp points to the op that holds the Buffer */    NextOp = Op->Common.Value.Arg;    /* Evaluate/create the address and length operands */    Status = AcpiDsCreateOperands (WalkState, NextOp);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    ObjDesc = AcpiNsGetAttachedObject (Node);    if (!ObjDesc)    {        return_ACPI_STATUS (AE_NOT_EXIST);    }    /* Resolve the operands */    Status = AcpiExResolveOperands (Op->Common.AmlOpcode,                    ACPI_WALK_OPERANDS, WalkState);    ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,                    AcpiPsGetOpcodeName (Op->Common.AmlOpcode),                    WalkState->NumOperands, "after AcpiExResolveOperands");    if (ACPI_FAILURE (Status))    {        ACPI_ERROR ((AE_INFO, "(%s) bad operand(s) (%X)",            AcpiPsGetOpcodeName (Op->Common.AmlOpcode), Status));        return_ACPI_STATUS (Status);    }    /* Initialize the Buffer Field */    if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)    {        /* NOTE: Slightly different operands for this opcode */        Status = AcpiDsInitBufferField (Op->Common.AmlOpcode, ObjDesc,                    WalkState->Operands[0], WalkState->Operands[1],                    WalkState->Operands[2], WalkState->Operands[3]);    }    else    {        /* All other, CreateXxxField opcodes */        Status = AcpiDsInitBufferField (Op->Common.AmlOpcode, ObjDesc,                    WalkState->Operands[0], WalkState->Operands[1],                                      NULL, WalkState->Operands[2]);    }    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsEvalRegionOperands * * PARAMETERS:  WalkState       - Current walk *              Op              - A valid region Op object * * RETURN:      Status * * DESCRIPTION: Get region address and length *              Called from AcpiDsExecEndOp during OpRegion parse tree walk * ******************************************************************************/ACPI_STATUSAcpiDsEvalRegionOperands (    ACPI_WALK_STATE         *WalkState,    ACPI_PARSE_OBJECT       *Op){    ACPI_STATUS             Status;    ACPI_OPERAND_OBJECT     *ObjDesc;    ACPI_OPERAND_OBJECT     *OperandDesc;    ACPI_NAMESPACE_NODE     *Node;    ACPI_PARSE_OBJECT       *NextOp;    ACPI_FUNCTION_TRACE_PTR (DsEvalRegionOperands, Op);    /*     * This is where we evaluate the address and length fields of the     * OpRegion declaration     */    Node =  Op->Common.Node;    /* NextOp points to the op that holds the SpaceID */    NextOp = Op->Common.Value.Arg;    /* NextOp points to address op */    NextOp = NextOp->Common.Next;    /* Evaluate/create the address and length operands */    Status = AcpiDsCreateOperands (WalkState, NextOp);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /* Resolve the length and address operands to numbers */    Status = AcpiExResolveOperands (Op->Common.AmlOpcode,                ACPI_WALK_OPERANDS, WalkState);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,                    AcpiPsGetOpcodeName (Op->Common.AmlOpcode),                    1, "after AcpiExResolveOperands");    ObjDesc = AcpiNsGetAttachedObject (Node);    if (!ObjDesc)    {        return_ACPI_STATUS (AE_NOT_EXIST);    }    /*     * Get the length operand and save it     * (at Top of stack)     */    OperandDesc = WalkState->Operands[WalkState->NumOperands - 1];    ObjDesc->Region.Length = (UINT32) OperandDesc->Integer.Value;    AcpiUtRemoveReference (OperandDesc);    /*     * Get the address and save it     * (at top of stack - 1)     */    OperandDesc = WalkState->Operands[WalkState->NumOperands - 2];    ObjDesc->Region.Address = (ACPI_PHYSICAL_ADDRESS)                                OperandDesc->Integer.Value;    AcpiUtRemoveReference (OperandDesc);    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",        ObjDesc,        ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),        ObjDesc->Region.Length));    /* Now the address and length are valid for this opregion */    ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID;    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsEvalTableRegionOperands * * PARAMETERS:  WalkState       - Current walk *              Op              - A valid region Op object * * RETURN:      Status * * DESCRIPTION: Get region address and length *              Called from AcpiDsExecEndOp during DataTableRegion parse tree walk * ******************************************************************************/ACPI_STATUSAcpiDsEvalTableRegionOperands (    ACPI_WALK_STATE         *WalkState,    ACPI_PARSE_OBJECT       *Op){    ACPI_STATUS             Status;    ACPI_OPERAND_OBJECT     *ObjDesc;    ACPI_OPERAND_OBJECT     **Operand;    ACPI_NAMESPACE_NODE     *Node;    ACPI_PARSE_OBJECT       *NextOp;    ACPI_NATIVE_UINT        TableIndex;    ACPI_TABLE_HEADER       *Table;    ACPI_FUNCTION_TRACE_PTR (DsEvalTableRegionOperands, Op);    /*     * This is where we evaluate the SignatureString and OemIDString     * and OemTableIDString of the DataTableRegion declaration     */    Node =  Op->Common.Node;    /* NextOp points to SignatureString op */    NextOp = Op->Common.Value.Arg;    /*     * Evaluate/create the SignatureString and OemIDString     * and OemTableIDString operands     */    Status = AcpiDsCreateOperands (WalkState, NextOp);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /*     * Resolve the SignatureString and OemIDString     * and OemTableIDString operands     */    Status = AcpiExResolveOperands (Op->Common.AmlOpcode,                ACPI_WALK_OPERANDS, WalkState);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,                    AcpiPsGetOpcodeName (Op->Common.AmlOpcode),                    1, "after AcpiExResolveOperands");    Operand = &WalkState->Operands[0];    /* Find the ACPI table */    Status = AcpiTbFindTable (Operand[0]->String.Pointer,                Operand[1]->String.Pointer, Operand[2]->String.Pointer,                &TableIndex);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    AcpiUtRemoveReference (Operand[0]);    AcpiUtRemoveReference (Operand[1]);    AcpiUtRemoveReference (Operand[2]);    Status = AcpiGetTableByIndex (TableIndex, &Table);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    ObjDesc = AcpiNsGetAttachedObject (Node);    if (!ObjDesc)    {        return_ACPI_STATUS (AE_NOT_EXIST);    }    ObjDesc->Region.Address = (ACPI_PHYSICAL_ADDRESS) ACPI_TO_INTEGER (Table);    ObjDesc->Region.Length = Table->Length;    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",        ObjDesc,        ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),        ObjDesc->Region.Length));    /* Now the address and length are valid for this opregion */    ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID;    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsEvalDataObjectOperands * * PARAMETERS:  WalkState       - Current walk *              Op              - A valid DataObject Op object *              ObjDesc         - DataObject * * RETURN:      Status * * DESCRIPTION: Get the operands and complete the following data object types: *              Buffer, Package. * ******************************************************************************/ACPI_STATUSAcpiDsEvalDataObjectOperands (    ACPI_WALK_STATE         *WalkState,    ACPI_PARSE_OBJECT       *Op,    ACPI_OPERAND_OBJECT     *ObjDesc){    ACPI_STATUS             Status;    ACPI_OPERAND_OBJECT     *ArgDesc;    UINT32                  Length;    ACPI_FUNCTION_TRACE (DsEvalDataObjectOperands);    /* The first operand (for all of these data objects) is the length */    /*     * Set proper index into operand stack for AcpiDsObjStackPush     * invoked inside AcpiDsCreateOperand.     */    WalkState->OperandIndex = WalkState->NumOperands;    Status = AcpiDsCreateOperand (WalkState, Op->Common.Value.Arg, 1);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    Status = AcpiExResolveOperands (WalkState->Opcode,                    &(WalkState->Operands [WalkState->NumOperands -1]),                    WalkState);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /* Extract length operand */    ArgDesc = WalkState->Operands [WalkState->NumOperands - 1];    Length = (UINT32) ArgDesc->Integer.Value;    /* Cleanup for length operand */    Status = AcpiDsObjStackPop (1, WalkState);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    AcpiUtRemoveReference (ArgDesc);    /*     * Create the actual data object     */    switch (Op->Common.AmlOpcode)    {    case AML_BUFFER_OP:        Status = AcpiDsBuildInternalBufferObj (WalkState, Op, Length, &ObjDesc);        break;    case AML_PACKAGE_OP:    case AML_VAR_PACKAGE_OP:        Status = AcpiDsBuildInternalPackageObj (WalkState, Op, Length, &ObjDesc);        break;    default:        return_ACPI_STATUS (AE_AML_BAD_OPCODE);    }    if (ACPI_SUCCESS (Status))    {        /*         * Return the object in the WalkState, unless the parent is a package -         * in this case, the return object will be stored in the parse tree         * for the package.         */        if ((!Op->Common.Parent) ||            ((Op->Common.Parent->Common.AmlOpcode != AML_PACKAGE_OP) &&             (Op->Common.Parent->Common.AmlOpcode != AML_VAR_PACKAGE_OP) &&             (Op->Common.Parent->Common.AmlOpcode != AML_NAME_OP)))        {            WalkState->ResultObj = ObjDesc;        }    }    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsEvalBankFieldOperands * * PARAMETERS:  WalkState       - Current walk *              Op              - A valid BankField Op object * * RETURN:      Status * * DESCRIPTION: Get BankField BankValue *              Called from AcpiDsExecEndOp during BankField parse tree walk * ******************************************************************************/ACPI_STATUSAcpiDsEvalBankFieldOperands (    ACPI_WALK_STATE         *WalkState,    ACPI_PARSE_OBJECT       *Op){    ACPI_STATUS             Status;    ACPI_OPERAND_OBJECT     *ObjDesc;    ACPI_OPERAND_OBJECT     *OperandDesc;    ACPI_NAMESPACE_NODE     *Node;    ACPI_PARSE_OBJECT       *NextOp;    ACPI_PARSE_OBJECT       *Arg;

⌨️ 快捷键说明

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