📄 tbutils.c
字号:
******************************************************************************/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 + -