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

📄 dsfield.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
                    return_ACPI_STATUS (Status);                }                /* Already exists, ignore error */            }            else            {                Arg->Common.Node = Info->FieldNode;                Info->FieldBitLength = Arg->Common.Value.Size;                /*                 * If there is no object attached to the node, this node was just created                 * and we need to create the field object.  Otherwise, this was a lookup                 * of an existing node and we don't want to create the field object again.                 */                if (!AcpiNsGetAttachedObject (Info->FieldNode))                {                    Status = AcpiExPrepFieldValue (Info);                    if (ACPI_FAILURE (Status))                    {                        return_ACPI_STATUS (Status);                    }                }            }            /* Keep track of bit position for the next field */            Position = (ACPI_INTEGER) Info->FieldBitPosition                        + (ACPI_INTEGER) Arg->Common.Value.Size;            if (Position > ACPI_UINT32_MAX)            {                ACPI_ERROR ((AE_INFO,                    "Field [%4.4s] bit offset too large (> 0xFFFFFFFF)",                    ACPI_CAST_PTR (char, &Info->FieldNode->Name)));                return_ACPI_STATUS (AE_SUPPORT);            }            Info->FieldBitPosition += Info->FieldBitLength;            break;        default:            ACPI_ERROR ((AE_INFO,                "Invalid opcode in field list: %X",                Arg->Common.AmlOpcode));            return_ACPI_STATUS (AE_AML_BAD_OPCODE);        }        Arg = Arg->Common.Next;    }    return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiDsCreateField * * PARAMETERS:  Op              - Op containing the Field definition and args *              RegionNode      - Object for the containing Operation Region *  `           WalkState       - Current method state * * RETURN:      Status * * DESCRIPTION: Create a new field in the specified operation region * ******************************************************************************/ACPI_STATUSAcpiDsCreateField (    ACPI_PARSE_OBJECT       *Op,    ACPI_NAMESPACE_NODE     *RegionNode,    ACPI_WALK_STATE         *WalkState){    ACPI_STATUS             Status;    ACPI_PARSE_OBJECT       *Arg;    ACPI_CREATE_FIELD_INFO  Info;    ACPI_FUNCTION_TRACE_PTR (DsCreateField, Op);    /* First arg is the name of the parent OpRegion (must already exist) */    Arg = Op->Common.Value.Arg;    if (!RegionNode)    {        Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,                        ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,                        ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);        if (ACPI_FAILURE (Status))        {            ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);            return_ACPI_STATUS (Status);        }    }    /* Second arg is the field flags */    Arg = Arg->Common.Next;    Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;    Info.Attribute = 0;    /* Each remaining arg is a Named Field */    Info.FieldType = ACPI_TYPE_LOCAL_REGION_FIELD;    Info.RegionNode = RegionNode;    Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsInitFieldObjects * * PARAMETERS:  Op              - Op containing the Field definition and args *  `           WalkState       - Current method state * * RETURN:      Status * * DESCRIPTION: For each "Field Unit" name in the argument list that is *              part of the field declaration, enter the name into the *              namespace. * ******************************************************************************/ACPI_STATUSAcpiDsInitFieldObjects (    ACPI_PARSE_OBJECT       *Op,    ACPI_WALK_STATE         *WalkState){    ACPI_STATUS             Status;    ACPI_PARSE_OBJECT       *Arg = NULL;    ACPI_NAMESPACE_NODE     *Node;    UINT8                   Type = 0;    UINT32                  Flags;    ACPI_FUNCTION_TRACE_PTR (DsInitFieldObjects, Op);    /*     * During the load phase, we want to enter the name of the field into     * the namespace. During the execute phase (when we evaluate the BankValue     * operand), we want to lookup the name.     */    if (WalkState->DeferredNode)    {        Flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE;    }    else    {        Flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |                    ACPI_NS_ERROR_IF_FOUND;    }    switch (WalkState->Opcode)    {    case AML_FIELD_OP:        Arg = AcpiPsGetArg (Op, 2);        Type = ACPI_TYPE_LOCAL_REGION_FIELD;        break;    case AML_BANK_FIELD_OP:        Arg = AcpiPsGetArg (Op, 4);        Type = ACPI_TYPE_LOCAL_BANK_FIELD;        break;    case AML_INDEX_FIELD_OP:        Arg = AcpiPsGetArg (Op, 3);        Type = ACPI_TYPE_LOCAL_INDEX_FIELD;        break;    default:        return_ACPI_STATUS (AE_BAD_PARAMETER);    }    /*     * Walk the list of entries in the FieldList     */    while (Arg)    {        /* Ignore OFFSET and ACCESSAS terms here */        if (Arg->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)        {            Status = AcpiNsLookup (WalkState->ScopeInfo,                            (char *) &Arg->Named.Name,                            Type, ACPI_IMODE_LOAD_PASS1,                            Flags, WalkState, &Node);            if (ACPI_FAILURE (Status))            {                ACPI_ERROR_NAMESPACE ((char *) &Arg->Named.Name, Status);                if (Status != AE_ALREADY_EXISTS)                {                    return_ACPI_STATUS (Status);                }                /* Name already exists, just ignore this error */                Status = AE_OK;            }            Arg->Common.Node = Node;        }        /* Move to next field in the list */        Arg = Arg->Common.Next;    }    return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiDsCreateBankField * * PARAMETERS:  Op              - Op containing the Field definition and args *              RegionNode      - Object for the containing Operation Region *              WalkState       - Current method state * * RETURN:      Status * * DESCRIPTION: Create a new bank field in the specified operation region * ******************************************************************************/ACPI_STATUSAcpiDsCreateBankField (    ACPI_PARSE_OBJECT       *Op,    ACPI_NAMESPACE_NODE     *RegionNode,    ACPI_WALK_STATE         *WalkState){    ACPI_STATUS             Status;    ACPI_PARSE_OBJECT       *Arg;    ACPI_CREATE_FIELD_INFO  Info;    ACPI_FUNCTION_TRACE_PTR (DsCreateBankField, Op);    /* First arg is the name of the parent OpRegion (must already exist) */    Arg = Op->Common.Value.Arg;    if (!RegionNode)    {        Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,                        ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,                        ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);        if (ACPI_FAILURE (Status))        {            ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);            return_ACPI_STATUS (Status);        }    }    /* Second arg is the Bank Register (Field) (must already exist) */    Arg = Arg->Common.Next;    Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,                    ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,                    ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode);    if (ACPI_FAILURE (Status))    {        ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);        return_ACPI_STATUS (Status);    }    /*     * Third arg is the BankValue     * This arg is a TermArg, not a constant     * It will be evaluated later, by AcpiDsEvalBankFieldOperands     */    Arg = Arg->Common.Next;    /* Fourth arg is the field flags */    Arg = Arg->Common.Next;    Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;    /* Each remaining arg is a Named Field */    Info.FieldType = ACPI_TYPE_LOCAL_BANK_FIELD;    Info.RegionNode = RegionNode;    /*     * Use Info.DataRegisterNode to store BankField Op     * It's safe because DataRegisterNode will never be used when create bank field     * We store AmlStart and AmlLength in the BankField Op for late evaluation     * Used in AcpiExPrepFieldValue(Info)     *     * TBD: Or, should we add a field in ACPI_CREATE_FIELD_INFO, like "void *ParentOp"?     */    Info.DataRegisterNode = (ACPI_NAMESPACE_NODE*) Op;    Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiDsCreateIndexField * * PARAMETERS:  Op              - Op containing the Field definition and args *              RegionNode      - Object for the containing Operation Region *  `           WalkState       - Current method state * * RETURN:      Status * * DESCRIPTION: Create a new index field in the specified operation region * ******************************************************************************/ACPI_STATUSAcpiDsCreateIndexField (    ACPI_PARSE_OBJECT       *Op,    ACPI_NAMESPACE_NODE     *RegionNode,    ACPI_WALK_STATE         *WalkState){    ACPI_STATUS             Status;    ACPI_PARSE_OBJECT       *Arg;    ACPI_CREATE_FIELD_INFO  Info;    ACPI_FUNCTION_TRACE_PTR (DsCreateIndexField, Op);    /* First arg is the name of the Index register (must already exist) */    Arg = Op->Common.Value.Arg;    Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,                    ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,                    ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode);    if (ACPI_FAILURE (Status))    {        ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);        return_ACPI_STATUS (Status);    }    /* Second arg is the data register (must already exist) */    Arg = Arg->Common.Next;    Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,                    ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,                    ACPI_NS_SEARCH_PARENT, WalkState, &Info.DataRegisterNode);    if (ACPI_FAILURE (Status))    {        ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);        return_ACPI_STATUS (Status);    }    /* Next arg is the field flags */    Arg = Arg->Common.Next;    Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;    /* Each remaining arg is a Named Field */    Info.FieldType = ACPI_TYPE_LOCAL_INDEX_FIELD;    Info.RegionNode = RegionNode;    Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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