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

📄 tbutils.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
 ******************************************************************************/voidAcpiTbInstallTable (    ACPI_PHYSICAL_ADDRESS   Address,    UINT8                   Flags,    char                    *Signature,    ACPI_NATIVE_UINT        TableIndex){    ACPI_TABLE_HEADER       *Table;    if (!Address)    {        ACPI_ERROR ((AE_INFO, "Null physical address for ACPI table [%s]",            Signature));        return;    }    /* Map just the table header */    Table = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER));    if (!Table)    {        return;    }    /* If a particular signature is expected, signature must match */    if (Signature &&        !ACPI_COMPARE_NAME (Table->Signature, Signature))    {        ACPI_ERROR ((AE_INFO, "Invalid signature 0x%X for ACPI table [%s]",            *ACPI_CAST_PTR (UINT32, Table->Signature), Signature));        goto UnmapAndExit;    }    /* Initialize the table entry */    AcpiGbl_RootTableList.Tables[TableIndex].Address = Address;    AcpiGbl_RootTableList.Tables[TableIndex].Length = Table->Length;    AcpiGbl_RootTableList.Tables[TableIndex].Flags = Flags;    ACPI_MOVE_32_TO_32 (        &(AcpiGbl_RootTableList.Tables[TableIndex].Signature),        Table->Signature);    AcpiTbPrintTableHeader (Address, Table);    if (TableIndex == ACPI_TABLE_INDEX_DSDT)    {        /* Global integer width is based upon revision of the DSDT */        AcpiUtSetIntegerWidth (Table->Revision);    }UnmapAndExit:    AcpiOsUnmapMemory (Table, sizeof (ACPI_TABLE_HEADER));}/******************************************************************************* * * FUNCTION:    AcpiTbGetRootTableEntry * * PARAMETERS:  TableEntry          - Pointer to the RSDT/XSDT table entry *              TableEntrySize      - sizeof 32 or 64 (RSDT or XSDT) * * RETURN:      Physical address extracted from the root table * * DESCRIPTION: Get one root table entry. Handles 32-bit and 64-bit cases on *              both 32-bit and 64-bit platforms * * NOTE:        ACPI_PHYSICAL_ADDRESS is 32-bit on 32-bit platforms, 64-bit on *              64-bit platforms. * ******************************************************************************/static ACPI_PHYSICAL_ADDRESSAcpiTbGetRootTableEntry (    UINT8                   *TableEntry,    ACPI_NATIVE_UINT        TableEntrySize){    UINT64                  Address64;    /*     * Get the table physical address (32-bit for RSDT, 64-bit for XSDT):     * Note: Addresses are 32-bit aligned (not 64) in both RSDT and XSDT     */    if (TableEntrySize == sizeof (UINT32))    {        /*         * 32-bit platform, RSDT: Return 32-bit table entry         * 64-bit platform, RSDT: Expand 32-bit to 64-bit and return         */        return ((ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST_PTR (UINT32, TableEntry)));    }    else    {        /*         * 32-bit platform, XSDT: Truncate 64-bit to 32-bit and return         * 64-bit platform, XSDT: Move (unaligned) 64-bit to local, return 64-bit         */        ACPI_MOVE_64_TO_64 (&Address64, TableEntry);#if ACPI_MACHINE_WIDTH == 32        if (Address64 > ACPI_UINT32_MAX)        {            /* Will truncate 64-bit address to 32 bits, issue warning */            ACPI_WARNING ((AE_INFO,                "64-bit Physical Address in XSDT is too large (%8.8X%8.8X), truncating",                ACPI_FORMAT_UINT64 (Address64)));        }#endif        return ((ACPI_PHYSICAL_ADDRESS) (Address64));    }}/******************************************************************************* * * FUNCTION:    AcpiTbParseRootTable * * PARAMETERS:  Rsdp                    - Pointer to the RSDP *              Flags                   - Flags * * RETURN:      Status * * DESCRIPTION: This function is called to parse the Root System Description *              Table (RSDT or XSDT) * * NOTE:        Tables are mapped (not copied) for efficiency. The FACS must *              be mapped and cannot be copied because it contains the actual *              memory location of the ACPI Global Lock. * ******************************************************************************/ACPI_STATUSAcpiTbParseRootTable (    ACPI_PHYSICAL_ADDRESS   RsdpAddress,    UINT8                   Flags){    ACPI_TABLE_RSDP         *Rsdp;    ACPI_NATIVE_UINT        TableEntrySize;    ACPI_NATIVE_UINT        i;    UINT32                  TableCount;    ACPI_TABLE_HEADER       *Table;    ACPI_PHYSICAL_ADDRESS   Address;    UINT32                  Length;    UINT8                   *TableEntry;    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (TbParseRootTable);    /*     * Map the entire RSDP and extract the address of the RSDT or XSDT     */    Rsdp = AcpiOsMapMemory (RsdpAddress, sizeof (ACPI_TABLE_RSDP));    if (!Rsdp)    {        return_ACPI_STATUS (AE_NO_MEMORY);    }    AcpiTbPrintTableHeader (RsdpAddress, ACPI_CAST_PTR (ACPI_TABLE_HEADER, Rsdp));    /* Differentiate between RSDT and XSDT root tables */    if (Rsdp->Revision > 1 && Rsdp->XsdtPhysicalAddress)    {        /*         * Root table is an XSDT (64-bit physical addresses). We must use the         * XSDT if the revision is > 1 and the XSDT pointer is present, as per         * the ACPI specification.         */        Address = (ACPI_PHYSICAL_ADDRESS) Rsdp->XsdtPhysicalAddress;        TableEntrySize = sizeof (UINT64);    }    else    {        /* Root table is an RSDT (32-bit physical addresses) */        Address = (ACPI_PHYSICAL_ADDRESS) Rsdp->RsdtPhysicalAddress;        TableEntrySize = sizeof (UINT32);    }    /*     * It is not possible to map more than one entry in some environments,     * so unmap the RSDP here before mapping other tables     */    AcpiOsUnmapMemory (Rsdp, sizeof (ACPI_TABLE_RSDP));    /* Map the RSDT/XSDT table header to get the full table length */    Table = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER));    if (!Table)    {        return_ACPI_STATUS (AE_NO_MEMORY);    }    AcpiTbPrintTableHeader (Address, Table);    /* Get the length of the full table, verify length and map entire table */    Length = Table->Length;    AcpiOsUnmapMemory (Table, sizeof (ACPI_TABLE_HEADER));    if (Length < sizeof (ACPI_TABLE_HEADER))    {        ACPI_ERROR ((AE_INFO, "Invalid length 0x%X in RSDT/XSDT", Length));        return_ACPI_STATUS (AE_INVALID_TABLE_LENGTH);    }    Table = AcpiOsMapMemory (Address, Length);    if (!Table)    {        return_ACPI_STATUS (AE_NO_MEMORY);    }    /* Validate the root table checksum */    Status = AcpiTbVerifyChecksum (Table, Length);    if (ACPI_FAILURE (Status))    {        AcpiOsUnmapMemory (Table, Length);        return_ACPI_STATUS (Status);    }    /* Calculate the number of tables described in the root table */    TableCount = (UINT32) ((Table->Length - sizeof (ACPI_TABLE_HEADER)) / TableEntrySize);    /*     * First two entries in the table array are reserved for the DSDT and FACS,     * which are not actually present in the RSDT/XSDT - they come from the FADT     */    TableEntry = ACPI_CAST_PTR (UINT8, Table) + sizeof (ACPI_TABLE_HEADER);    AcpiGbl_RootTableList.Count = 2;    /*     * Initialize the root table array from the RSDT/XSDT     */    for (i = 0; i < TableCount; i++)    {        if (AcpiGbl_RootTableList.Count >= AcpiGbl_RootTableList.Size)        {            /* There is no more room in the root table array, attempt resize */            Status = AcpiTbResizeRootTableList ();            if (ACPI_FAILURE (Status))            {                ACPI_WARNING ((AE_INFO, "Truncating %u table entries!",                    (unsigned) (AcpiGbl_RootTableList.Size - AcpiGbl_RootTableList.Count)));                break;            }        }        /* Get the table physical address (32-bit for RSDT, 64-bit for XSDT) */        AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Address =            AcpiTbGetRootTableEntry (TableEntry, TableEntrySize);        TableEntry += TableEntrySize;        AcpiGbl_RootTableList.Count++;    }    /*     * It is not possible to map more than one entry in some environments,     * so unmap the root table here before mapping other tables     */    AcpiOsUnmapMemory (Table, Length);    /*     * Complete the initialization of the root table array by examining     * the header of each table     */    for (i = 2; i < AcpiGbl_RootTableList.Count; i++)    {        AcpiTbInstallTable (AcpiGbl_RootTableList.Tables[i].Address,            Flags, NULL, i);        /* Special case for FADT - get the DSDT and FACS */        if (ACPI_COMPARE_NAME (                &AcpiGbl_RootTableList.Tables[i].Signature, ACPI_SIG_FADT))        {            AcpiTbParseFadt (i, Flags);        }    }    return_ACPI_STATUS (AE_OK);}

⌨️ 快捷键说明

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