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

📄 psloop.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
                    return_ACPI_STATUS (Status2);                }            }            AcpiPsPopScope (&(WalkState->ParserState), Op,                &WalkState->ArgTypes, &WalkState->ArgCount);        } while (*Op);#if 0        /*         * TBD: Cleanup parse ops on error         */        if (*Op == NULL)        {            AcpiPsPopScope (ParserState, Op,                &WalkState->ArgTypes, &WalkState->ArgCount);        }#endif        WalkState->PrevOp = NULL;        WalkState->PrevArgTypes = WalkState->ArgTypes;        return_ACPI_STATUS (Status);    }    /* This scope complete? */    if (AcpiPsHasCompletedScope (&(WalkState->ParserState)))    {        AcpiPsPopScope (&(WalkState->ParserState), Op,            &WalkState->ArgTypes, &WalkState->ArgCount);        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", *Op));    }    else    {        *Op = NULL;    }    return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiPsCompleteFinalOp * * PARAMETERS:  WalkState           - Current state *              Op                  - Current Op *              Status              - Current parse status before complete last *                                    Op * * RETURN:      Status * * DESCRIPTION: Complete last Op. * ******************************************************************************/static ACPI_STATUSAcpiPsCompleteFinalOp (    ACPI_WALK_STATE         *WalkState,    ACPI_PARSE_OBJECT       *Op,    ACPI_STATUS             Status){    ACPI_STATUS             Status2;    ACPI_FUNCTION_TRACE_PTR (PsCompleteFinalOp, WalkState);    /*     * Complete the last Op (if not completed), and clear the scope stack.     * It is easily possible to end an AML "package" with an unbounded number     * of open scopes (such as when several ASL blocks are closed with     * sequential closing braces). We want to terminate each one cleanly.     */    ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "AML package complete at Op %p\n", Op));    do    {        if (Op)        {            if (WalkState->AscendingCallback != NULL)            {                WalkState->Op = Op;                WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);                WalkState->Opcode = Op->Common.AmlOpcode;                Status = WalkState->AscendingCallback (WalkState);                Status = AcpiPsNextParseState (WalkState, Op, Status);                if (Status == AE_CTRL_PENDING)                {                    Status = AcpiPsCompleteOp (WalkState, &Op, AE_OK);                    if (ACPI_FAILURE (Status))                    {                        return_ACPI_STATUS (Status);                    }                }                if (Status == AE_CTRL_TERMINATE)                {                    Status = AE_OK;                    /* Clean up */                    do                    {                        if (Op)                        {                            Status2 = AcpiPsCompleteThisOp (WalkState, Op);                            if (ACPI_FAILURE (Status2))                            {                                return_ACPI_STATUS (Status2);                            }                        }                        AcpiPsPopScope (&(WalkState->ParserState), &Op,                            &WalkState->ArgTypes, &WalkState->ArgCount);                    } while (Op);                    return_ACPI_STATUS (Status);                }                else if (ACPI_FAILURE (Status))                {                    /* First error is most important */                    (void) AcpiPsCompleteThisOp (WalkState, Op);                    return_ACPI_STATUS (Status);                }            }            Status2 = AcpiPsCompleteThisOp (WalkState, Op);            if (ACPI_FAILURE (Status2))            {                return_ACPI_STATUS (Status2);            }        }        AcpiPsPopScope (&(WalkState->ParserState), &Op, &WalkState->ArgTypes,            &WalkState->ArgCount);    } while (Op);    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiPsParseLoop * * PARAMETERS:  WalkState           - Current state * * RETURN:      Status * * DESCRIPTION: Parse AML (pointed to by the current parser state) and return *              a tree of ops. * ******************************************************************************/ACPI_STATUSAcpiPsParseLoop (    ACPI_WALK_STATE         *WalkState){    ACPI_STATUS             Status = AE_OK;    ACPI_PARSE_OBJECT       *Op = NULL;     /* current op */    ACPI_PARSE_STATE        *ParserState;    UINT8                   *AmlOpStart = NULL;    ACPI_FUNCTION_TRACE_PTR (PsParseLoop, WalkState);    if (WalkState->DescendingCallback == NULL)    {        return_ACPI_STATUS (AE_BAD_PARAMETER);    }    ParserState = &WalkState->ParserState;    WalkState->ArgTypes = 0;#if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))    if (WalkState->WalkType & ACPI_WALK_METHOD_RESTART)    {        /* We are restarting a preempted control method */        if (AcpiPsHasCompletedScope (ParserState))        {            /*             * We must check if a predicate to an IF or WHILE statement             * was just completed             */            if ((ParserState->Scope->ParseScope.Op) &&               ((ParserState->Scope->ParseScope.Op->Common.AmlOpcode == AML_IF_OP) ||                (ParserState->Scope->ParseScope.Op->Common.AmlOpcode == AML_WHILE_OP)) &&                (WalkState->ControlState) &&                (WalkState->ControlState->Common.State ==                    ACPI_CONTROL_PREDICATE_EXECUTING))            {                /*                 * A predicate was just completed, get the value of the                 * predicate and branch based on that value                 */                WalkState->Op = NULL;                Status = AcpiDsGetPredicateValue (WalkState, ACPI_TO_POINTER (TRUE));                if (ACPI_FAILURE (Status) &&                    ((Status & AE_CODE_MASK) != AE_CODE_CONTROL))                {                    if (Status == AE_AML_NO_RETURN_VALUE)                    {                        ACPI_EXCEPTION ((AE_INFO, Status,                            "Invoked method did not return a value"));                    }                    ACPI_EXCEPTION ((AE_INFO, Status, "GetPredicate Failed"));                    return_ACPI_STATUS (Status);                }                Status = AcpiPsNextParseState (WalkState, Op, Status);            }            AcpiPsPopScope (ParserState, &Op,                &WalkState->ArgTypes, &WalkState->ArgCount);            ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", Op));        }        else if (WalkState->PrevOp)        {            /* We were in the middle of an op */            Op = WalkState->PrevOp;            WalkState->ArgTypes = WalkState->PrevArgTypes;        }    }#endif    /* Iterative parsing loop, while there is more AML to process: */    while ((ParserState->Aml < ParserState->AmlEnd) || (Op))    {        AmlOpStart = ParserState->Aml;        if (!Op)        {            Status = AcpiPsCreateOp (WalkState, AmlOpStart, &Op);            if (ACPI_FAILURE (Status))            {                if (Status == AE_CTRL_PARSE_CONTINUE)                {                    continue;                }                if (Status == AE_CTRL_PARSE_PENDING)                {                    Status = AE_OK;                }                Status = AcpiPsCompleteOp (WalkState, &Op, Status);                if (ACPI_FAILURE (Status))                {                    return_ACPI_STATUS (Status);                }                continue;            }            Op->Common.AmlOffset = WalkState->AmlOffset;            if (WalkState->OpInfo)            {                ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,                    "Opcode %4.4X [%s] Op %p Aml %p AmlOffset %5.5X\n",                     (UINT32) Op->Common.AmlOpcode, WalkState->OpInfo->Name,                     Op, ParserState->Aml, Op->Common.AmlOffset));            }        }        /*         * Start ArgCount at zero because we don't know if there are         * any args yet         */        WalkState->ArgCount  = 0;        /* Are there any arguments that must be processed? */        if (WalkState->ArgTypes)        {            /* Get arguments */            Status = AcpiPsGetArguments (WalkState, AmlOpStart, Op);            if (ACPI_FAILURE (Status))            {                Status = AcpiPsCompleteOp (WalkState, &Op, Status);                if (ACPI_FAILURE (Status))                {                    return_ACPI_STATUS (Status);                }                continue;            }        }        /* Check for arguments that need to be processed */        if (WalkState->ArgCount)        {            /*             * There are arguments (complex ones), push Op and             * prepare for argument             */            Status = AcpiPsPushScope (ParserState, Op,                        WalkState->ArgTypes, WalkState->ArgCount);            if (ACPI_FAILURE (Status))            {                Status = AcpiPsCompleteOp (WalkState, &Op, Status);                if (ACPI_FAILURE (Status))                {                    return_ACPI_STATUS (Status);                }                continue;            }            Op = NULL;            continue;        }        /*         * All arguments have been processed -- Op is complete,         * prepare for next         */        WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);        if (WalkState->OpInfo->Flags & AML_NAMED)        {            if (AcpiGbl_Depth)            {                AcpiGbl_Depth--;            }            if (Op->Common.AmlOpcode == AML_REGION_OP ||                Op->Common.AmlOpcode == AML_DATA_REGION_OP)            {                /*                 * Skip parsing of control method or opregion body,                 * because we don't have enough info in the first pass                 * to parse them correctly.                 *                 * Completed parsing an OpRegion declaration, we now                 * know the length.                 */                Op->Named.Length = (UINT32) (ParserState->Aml - Op->Named.Data);            }        }        if (WalkState->OpInfo->Flags & AML_CREATE)        {            /*             * Backup to beginning of CreateXXXfield declaration (1 for             * Opcode)             *             * BodyLength is unknown until we parse the body             */            Op->Named.Length = (UINT32) (ParserState->Aml - Op->Named.Data);        }        if (Op->Common.AmlOpcode == AML_BANK_FIELD_OP)        {            /*             * Backup to beginning of BankField declaration             *             * BodyLength is unknown until we parse the body             */            Op->Named.Length = (UINT32) (ParserState->Aml - Op->Named.Data);        }        /* This op complete, notify the dispatcher */        if (WalkState->AscendingCallback != NULL)        {            WalkState->Op = Op;            WalkState->Opcode = Op->Common.AmlOpcode;            Status = WalkState->AscendingCallback (WalkState);            Status = AcpiPsNextParseState (WalkState, Op, Status);            if (Status == AE_CTRL_PENDING)            {                Status = AE_OK;            }        }        Status = AcpiPsCompleteOp (WalkState, &Op, Status);        if (ACPI_FAILURE (Status))        {            return_ACPI_STATUS (Status);        }    } /* while ParserState->Aml */    Status = AcpiPsCompleteFinalOp (WalkState, Op, Status);    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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