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

📄 psloop.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
    {        return_ACPI_STATUS (AE_NO_MEMORY);    }    if (WalkState->OpInfo->Flags & AML_NAMED)    {        Status = AcpiPsBuildNamedOp (WalkState, AmlOpStart, Op, &NamedOp);        AcpiPsFreeOp (Op);        if (ACPI_FAILURE (Status))        {            return_ACPI_STATUS (Status);        }        *NewOp = NamedOp;        return_ACPI_STATUS (AE_OK);    }    /* Not a named opcode, just allocate Op and append to parent */    if (WalkState->OpInfo->Flags & AML_CREATE)    {        /*         * Backup to beginning of CreateXXXfield declaration         * BodyLength is unknown until we parse the body         */        Op->Named.Data = AmlOpStart;        Op->Named.Length = 0;    }    if (WalkState->Opcode == AML_BANK_FIELD_OP)    {        /*         * Backup to beginning of BankField declaration         * BodyLength is unknown until we parse the body         */        Op->Named.Data = AmlOpStart;        Op->Named.Length = 0;    }    ParentScope = AcpiPsGetParentScope (&(WalkState->ParserState));    AcpiPsAppendArg (ParentScope, Op);    if (ParentScope)    {        OpInfo = AcpiPsGetOpcodeInfo (ParentScope->Common.AmlOpcode);        if (OpInfo->Flags & AML_HAS_TARGET)        {            ArgumentCount = AcpiPsGetArgumentCount (OpInfo->Type);            if (ParentScope->Common.ArgListLength > ArgumentCount)            {                Op->Common.Flags |= ACPI_PARSEOP_TARGET;            }        }        else if (ParentScope->Common.AmlOpcode == AML_INCREMENT_OP)        {            Op->Common.Flags |= ACPI_PARSEOP_TARGET;        }    }    if (WalkState->DescendingCallback != NULL)    {        /*         * Find the object. This will either insert the object into         * the namespace or simply look it up         */        WalkState->Op = *NewOp = Op;        Status = WalkState->DescendingCallback (WalkState, &Op);        Status = AcpiPsNextParseState (WalkState, Op, Status);        if (Status == AE_CTRL_PENDING)        {            Status = AE_CTRL_PARSE_PENDING;        }    }    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiPsGetArguments * * PARAMETERS:  WalkState           - Current state *              AmlOpStart          - Op start in AML *              Op                  - Current Op * * RETURN:      Status * * DESCRIPTION: Get arguments for passed Op. * ******************************************************************************/static ACPI_STATUSAcpiPsGetArguments (    ACPI_WALK_STATE         *WalkState,    UINT8                   *AmlOpStart,    ACPI_PARSE_OBJECT       *Op){    ACPI_STATUS             Status = AE_OK;    ACPI_PARSE_OBJECT       *Arg = NULL;    ACPI_FUNCTION_TRACE_PTR (PsGetArguments, WalkState);    switch (Op->Common.AmlOpcode)    {    case AML_BYTE_OP:       /* AML_BYTEDATA_ARG */    case AML_WORD_OP:       /* AML_WORDDATA_ARG */    case AML_DWORD_OP:      /* AML_DWORDATA_ARG */    case AML_QWORD_OP:      /* AML_QWORDATA_ARG */    case AML_STRING_OP:     /* AML_ASCIICHARLIST_ARG */        /* Fill in constant or string argument directly */        AcpiPsGetNextSimpleArg (&(WalkState->ParserState),            GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), Op);        break;    case AML_INT_NAMEPATH_OP:   /* AML_NAMESTRING_ARG */        Status = AcpiPsGetNextNamepath (WalkState, &(WalkState->ParserState), Op, 1);        if (ACPI_FAILURE (Status))        {            return_ACPI_STATUS (Status);        }        WalkState->ArgTypes = 0;        break;    default:        /*         * Op is not a constant or string, append each argument to the Op         */        while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) && !WalkState->ArgCount)        {            WalkState->AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->ParserState.Aml,                WalkState->ParserState.AmlStart);            Status = AcpiPsGetNextArg (WalkState, &(WalkState->ParserState),                        GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), &Arg);            if (ACPI_FAILURE (Status))            {                return_ACPI_STATUS (Status);            }            if (Arg)            {                Arg->Common.AmlOffset = WalkState->AmlOffset;                AcpiPsAppendArg (Op, Arg);            }            INCREMENT_ARG_LIST (WalkState->ArgTypes);        }        /* Special processing for certain opcodes */        /* TBD (remove): Temporary mechanism to disable this code if needed */#ifdef ACPI_ENABLE_MODULE_LEVEL_CODE        if ((WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS1) &&            ((WalkState->ParseFlags & ACPI_PARSE_DISASSEMBLE) == 0))        {            /*             * We want to skip If/Else/While constructs during Pass1 because we             * want to actually conditionally execute the code during Pass2.             *             * Except for disassembly, where we always want to walk the             * If/Else/While packages             */            switch (Op->Common.AmlOpcode)            {            case AML_IF_OP:            case AML_ELSE_OP:            case AML_WHILE_OP:                ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,                    "Pass1: Skipping an If/Else/While body\n"));                /* Skip body of if/else/while in pass 1 */                WalkState->ParserState.Aml = WalkState->ParserState.PkgEnd;                WalkState->ArgCount = 0;                break;            default:                break;            }        }#endif        switch (Op->Common.AmlOpcode)        {        case AML_METHOD_OP:            /*             * Skip parsing of control method because we don't have enough             * info in the first pass to parse it correctly.             *             * Save the length and address of the body             */            Op->Named.Data = WalkState->ParserState.Aml;            Op->Named.Length = (UINT32)                (WalkState->ParserState.PkgEnd - WalkState->ParserState.Aml);            /* Skip body of method */            WalkState->ParserState.Aml = WalkState->ParserState.PkgEnd;            WalkState->ArgCount = 0;            break;        case AML_BUFFER_OP:        case AML_PACKAGE_OP:        case AML_VAR_PACKAGE_OP:            if ((Op->Common.Parent) &&                (Op->Common.Parent->Common.AmlOpcode == AML_NAME_OP) &&                (WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2))            {                /*                 * Skip parsing of Buffers and Packages because we don't have                 * enough info in the first pass to parse them correctly.                 */                Op->Named.Data = AmlOpStart;                Op->Named.Length = (UINT32)                    (WalkState->ParserState.PkgEnd - AmlOpStart);                /* Skip body */                WalkState->ParserState.Aml = WalkState->ParserState.PkgEnd;                WalkState->ArgCount = 0;            }            break;        case AML_WHILE_OP:            if (WalkState->ControlState)            {                WalkState->ControlState->Control.PackageEnd =                    WalkState->ParserState.PkgEnd;            }            break;        default:            /* No action for all other opcodes */            break;        }        break;    }    return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiPsCompleteOp * * PARAMETERS:  WalkState           - Current state *              Op                  - Returned Op *              Status              - Parse status before complete Op * * RETURN:      Status * * DESCRIPTION: Complete Op * ******************************************************************************/static ACPI_STATUSAcpiPsCompleteOp (    ACPI_WALK_STATE         *WalkState,    ACPI_PARSE_OBJECT       **Op,    ACPI_STATUS             Status){    ACPI_STATUS             Status2;    ACPI_FUNCTION_TRACE_PTR (PsCompleteOp, WalkState);    /*     * Finished one argument of the containing scope     */    WalkState->ParserState.Scope->ParseScope.ArgCount--;    /* Close this Op (will result in parse subtree deletion) */    Status2 = AcpiPsCompleteThisOp (WalkState, *Op);    if (ACPI_FAILURE (Status2))    {        return_ACPI_STATUS (Status2);    }    *Op = NULL;    switch (Status)    {    case AE_OK:        break;    case AE_CTRL_TRANSFER:        /* We are about to transfer to a called method */        WalkState->PrevOp = NULL;        WalkState->PrevArgTypes = WalkState->ArgTypes;        return_ACPI_STATUS (Status);    case AE_CTRL_END:        AcpiPsPopScope (&(WalkState->ParserState), Op,            &WalkState->ArgTypes, &WalkState->ArgCount);        if (*Op)        {            WalkState->Op = *Op;            WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode);            WalkState->Opcode = (*Op)->Common.AmlOpcode;            Status = WalkState->AscendingCallback (WalkState);            Status = AcpiPsNextParseState (WalkState, *Op, Status);            Status2 = AcpiPsCompleteThisOp (WalkState, *Op);            if (ACPI_FAILURE (Status2))            {                return_ACPI_STATUS (Status2);            }        }        Status = AE_OK;        break;    case AE_CTRL_BREAK:    case AE_CTRL_CONTINUE:        /* Pop off scopes until we find the While */        while (!(*Op) || ((*Op)->Common.AmlOpcode != AML_WHILE_OP))        {            AcpiPsPopScope (&(WalkState->ParserState), Op,                &WalkState->ArgTypes, &WalkState->ArgCount);        }        /* Close this iteration of the While loop */        WalkState->Op = *Op;        WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode);        WalkState->Opcode = (*Op)->Common.AmlOpcode;        Status = WalkState->AscendingCallback (WalkState);        Status = AcpiPsNextParseState (WalkState, *Op, Status);        Status2 = AcpiPsCompleteThisOp (WalkState, *Op);        if (ACPI_FAILURE (Status2))        {            return_ACPI_STATUS (Status2);        }        Status = AE_OK;        break;    case AE_CTRL_TERMINATE:        /* Clean up */        do        {            if (*Op)            {                Status2 = AcpiPsCompleteThisOp (WalkState, *Op);                if (ACPI_FAILURE (Status2))                {                    return_ACPI_STATUS (Status2);                }                AcpiUtDeleteGenericState (                    AcpiUtPopGenericState (&WalkState->ControlState));            }            AcpiPsPopScope (&(WalkState->ParserState), Op,                &WalkState->ArgTypes, &WalkState->ArgCount);        } while (*Op);        return_ACPI_STATUS (AE_OK);    default:  /* All other non-AE_OK status */        do        {            if (*Op)            {                Status2 = AcpiPsCompleteThisOp (WalkState, *Op);                if (ACPI_FAILURE (Status2))                {

⌨️ 快捷键说明

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