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

📄 adisasm.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
    ACPI_PARSE_OBJECT       *SearchOp;    ACPI_PARSE_OBJECT       *StartOp;    UINT32                  BaseAmlOffset;    ACPI_PARSE_OBJECT       *ExtraOp;    ACPI_FUNCTION_TRACE (AdDeferredParse);    fprintf (stderr, ".");    if (!Aml || !AmlLength)    {        return_ACPI_STATUS (AE_OK);    }    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Parsing %s [%4.4s]\n",        Op->Common.AmlOpName, (char *) &Op->Named.Name));    WalkState = AcpiDsCreateWalkState (0, Op, NULL, NULL);    if (!WalkState)    {        return_ACPI_STATUS (AE_NO_MEMORY);    }    Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, Aml,                    AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /* Parse the method */    WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;    WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;    Status = AcpiPsParseAml (WalkState);    /*     * We need to update all of the Aml offsets, since the parser thought     * that the method began at offset zero.  In reality, it began somewhere     * within the ACPI table, at the BaseAmlOffset.  Walk the entire tree that     * was just created and update the AmlOffset in each Op     */    BaseAmlOffset = (Op->Common.Value.Arg)->Common.AmlOffset + 1;    StartOp = (Op->Common.Value.Arg)->Common.Next;    SearchOp = StartOp;    /* Walk the parse tree */    while (SearchOp)    {        SearchOp->Common.AmlOffset += BaseAmlOffset;        SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp);    }    /*     * Link the newly parsed subtree into the main parse tree     */    switch (Op->Common.AmlOpcode)    {    case AML_BUFFER_OP:    case AML_PACKAGE_OP:    case AML_VAR_PACKAGE_OP:        switch (Op->Common.AmlOpcode)        {        case AML_PACKAGE_OP:            ExtraOp = Op->Common.Value.Arg;            ExtraOp = ExtraOp->Common.Next;            Op->Common.Value.Arg = ExtraOp->Common.Value.Arg;            break;        case AML_VAR_PACKAGE_OP:        case AML_BUFFER_OP:        default:            ExtraOp = Op->Common.Value.Arg;            Op->Common.Value.Arg = ExtraOp->Common.Value.Arg;            break;        }        /* Must point all parents to the main tree */        StartOp = Op;        SearchOp = StartOp;        while (SearchOp)        {            if (SearchOp->Common.Parent == ExtraOp)            {                SearchOp->Common.Parent = Op;            }            SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp);        }        break;    default:        break;    }    return_ACPI_STATUS (AE_OK);}/****************************************************************************** * * FUNCTION:    AdParseDeferredOps * * PARAMETERS:  Root            - Root of the parse tree * * RETURN:      Status * * DESCRIPTION: Parse the deferred opcodes (Methods, regions, etc.) * *****************************************************************************/ACPI_STATUSAdParseDeferredOps (    ACPI_PARSE_OBJECT       *Root){    ACPI_PARSE_OBJECT       *Op = Root;    ACPI_STATUS             Status = AE_OK;    const ACPI_OPCODE_INFO  *OpInfo;    ACPI_FUNCTION_NAME (AdParseDeferredOps);    fprintf (stderr, "Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)\n");    while (Op)    {        OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);        if (!(OpInfo->Flags & AML_DEFER))        {            Op = AcpiPsGetDepthNext (Root, Op);            continue;        }        switch (Op->Common.AmlOpcode)        {        case AML_METHOD_OP:        case AML_BUFFER_OP:        case AML_PACKAGE_OP:        case AML_VAR_PACKAGE_OP:            Status = AdDeferredParse (Op, Op->Named.Data, Op->Named.Length);            if (ACPI_FAILURE (Status))            {                return_ACPI_STATUS (Status);            }            break;        case AML_REGION_OP:        case AML_CREATE_QWORD_FIELD_OP:        case AML_CREATE_DWORD_FIELD_OP:        case AML_CREATE_WORD_FIELD_OP:        case AML_CREATE_BYTE_FIELD_OP:        case AML_CREATE_BIT_FIELD_OP:        case AML_CREATE_FIELD_OP:        case AML_BANK_FIELD_OP:            /* Nothing to do in these cases */            break;        default:            ACPI_ERROR ((AE_INFO, "Unhandled deferred opcode [%s]",                Op->Common.AmlOpName));            break;        }        Op = AcpiPsGetDepthNext (Root, Op);    }    fprintf (stderr, "\n");    return Status;}/****************************************************************************** * * FUNCTION:    AdGetLocalTables * * PARAMETERS:  Filename        - Not used *              GetAllTables    - TRUE if all tables are desired * * RETURN:      Status * * DESCRIPTION: Get the ACPI tables from either memory or a file * *****************************************************************************/ACPI_STATUSAdGetLocalTables (    char                    *Filename,    BOOLEAN                 GetAllTables){    ACPI_STATUS             Status;    ACPI_TABLE_HEADER       TableHeader;    ACPI_TABLE_HEADER       *NewTable;    UINT32                  NumTables;    UINT32                  PointerSize;    ACPI_NATIVE_UINT        TableIndex;    if (GetAllTables)    {        ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_RSDT);        AcpiOsTableOverride (&TableHeader, &NewTable);        if (!NewTable)        {            fprintf (stderr, "Could not obtain RSDT\n");            return AE_NO_ACPI_TABLES;        }        if (ACPI_COMPARE_NAME (NewTable->Signature, ACPI_SIG_RSDT))        {            PointerSize = sizeof (UINT32);        }        else        {            PointerSize = sizeof (UINT64);        }        /*         * Determine the number of tables pointed to by the RSDT/XSDT.         * This is defined by the ACPI Specification to be the number of         * pointers contained within the RSDT/XSDT.  The size of the pointers         * is architecture-dependent.         */        NumTables = (NewTable->Length - sizeof (ACPI_TABLE_HEADER)) / PointerSize;        AcpiOsPrintf ("There are %d tables defined in the %4.4s\n\n",            NumTables, NewTable->Signature);        /* Get the FADT */        ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_FADT);        AcpiOsTableOverride (&TableHeader, &NewTable);        if (NewTable)        {            AdWriteTable (NewTable, NewTable->Length,                ACPI_SIG_FADT, NewTable->OemTableId);        }        AcpiOsPrintf ("\n");        /* Don't bother with FACS, it is usually all zeros */    }    /* Always get the DSDT */    ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_DSDT);    AcpiOsTableOverride (&TableHeader, &NewTable);    if (NewTable)    {        AdWriteTable (NewTable, NewTable->Length,            ACPI_SIG_DSDT, NewTable->OemTableId);        /* Store DSDT in the Table Manager */        Status = AcpiTbStoreTable (0, NewTable, NewTable->Length,                    0, &TableIndex);    }    else    {        fprintf (stderr, "Could not obtain DSDT\n");        return AE_NO_ACPI_TABLES;    }#if 0    /* TBD: Future implementation */    AcpiOsPrintf ("\n");    /* Get all SSDTs */    ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_SSDT);    do    {        NewTable = NULL;        Status = AcpiOsTableOverride (&TableHeader, &NewTable);    } while (NewTable);#endif    return AE_OK;}/****************************************************************************** * * FUNCTION:    AdParseTable * * PARAMETERS:  Table           - Pointer to the raw table * * RETURN:      Status * * DESCRIPTION: Parse the DSDT. * *****************************************************************************/ACPI_STATUSAdParseTable (    ACPI_TABLE_HEADER       *Table,    BOOLEAN                 LoadTable){    ACPI_STATUS             Status = AE_OK;    ACPI_WALK_STATE         *WalkState;    UINT8                   *AmlStart;    UINT32                  AmlLength;    ACPI_NATIVE_UINT        TableIndex;    if (!Table)    {        return AE_NOT_EXIST;    }    /* Pass 1:  Parse everything except control method bodies */    fprintf (stderr, "Pass 1 parse of [%4.4s]\n", (char *) Table->Signature);    AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);    AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));    /* Create the root object */    AcpiGbl_ParseOpRoot = AcpiPsCreateScopeOp ();    if (!AcpiGbl_ParseOpRoot)    {        return AE_NO_MEMORY;    }    /* Create and initialize a new walk state */    WalkState = AcpiDsCreateWalkState (0,                        AcpiGbl_ParseOpRoot, NULL, NULL);    if (!WalkState)    {        return (AE_NO_MEMORY);    }    Status = AcpiDsInitAmlWalk (WalkState, AcpiGbl_ParseOpRoot,                NULL, AmlStart, AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);    if (ACPI_FAILURE (Status))    {        return (Status);    }    WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;    WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;    Status = AcpiPsParseAml (WalkState);    if (ACPI_FAILURE (Status))    {        return Status;    }    /* Pass 2 */    if (LoadTable)    {        Status = AcpiTbStoreTable ((ACPI_NATIVE_UINT) Table, Table,                    Table->Length, ACPI_TABLE_ORIGIN_ALLOCATED, &TableIndex);        if (ACPI_FAILURE (Status))        {            return Status;        }    }    fprintf (stderr, "Pass 2 parse of [%4.4s]\n", (char *) Table->Signature);    Status = AcpiNsOneCompleteParse (ACPI_IMODE_LOAD_PASS2, 0, NULL);    if (ACPI_FAILURE (Status))    {        return (Status);    }    /* Pass 3: Parse control methods and link their parse trees into the main parse tree */    Status = AdParseDeferredOps (AcpiGbl_ParseOpRoot);    /* Process Resource Templates */    AcpiDmFindResources (AcpiGbl_ParseOpRoot);    fprintf (stderr, "Parsing completed\n");    return AE_OK;}

⌨️ 快捷键说明

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