summaryrefslogtreecommitdiff
path: root/source/components/tables/tbutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/components/tables/tbutils.c')
-rw-r--r--source/components/tables/tbutils.c175
1 files changed, 17 insertions, 158 deletions
diff --git a/source/components/tables/tbutils.c b/source/components/tables/tbutils.c
index a9c2d138cd6a..fc580f6b0e1f 100644
--- a/source/components/tables/tbutils.c
+++ b/source/components/tables/tbutils.c
@@ -197,9 +197,12 @@ AcpiTbCopyDsdt (
}
ACPI_MEMCPY (NewTable, TableDesc->Pointer, TableDesc->Length);
- AcpiTbDeleteTable (TableDesc);
- TableDesc->Pointer = NewTable;
- TableDesc->Flags = ACPI_TABLE_ORIGIN_ALLOCATED;
+ AcpiTbUninstallTable (TableDesc);
+
+ AcpiTbInitTableDescriptor (
+ &AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT],
+ ACPI_PTR_TO_PHYSADDR (NewTable), ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
+ NewTable);
ACPI_INFO ((AE_INFO,
"Forced DSDT copy: length 0x%05X copied locally, original unmapped",
@@ -211,125 +214,6 @@ AcpiTbCopyDsdt (
/*******************************************************************************
*
- * FUNCTION: AcpiTbInstallTable
- *
- * PARAMETERS: Address - Physical address of DSDT or FACS
- * Signature - Table signature, NULL if no need to
- * match
- * TableIndex - Index into root table array
- *
- * RETURN: None
- *
- * DESCRIPTION: Install an ACPI table into the global data structure. The
- * table override mechanism is called to allow the host
- * OS to replace any table before it is installed in the root
- * table array.
- *
- ******************************************************************************/
-
-void
-AcpiTbInstallTable (
- ACPI_PHYSICAL_ADDRESS Address,
- char *Signature,
- UINT32 TableIndex)
-{
- ACPI_TABLE_HEADER *Table;
- ACPI_TABLE_HEADER *FinalTable;
- ACPI_TABLE_DESC *TableDesc;
-
-
- 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)
- {
- ACPI_ERROR ((AE_INFO, "Could not map memory for table [%s] at %p",
- Signature, ACPI_CAST_PTR (void, Address)));
- return;
- }
-
- /* If a particular signature is expected (DSDT/FACS), it must match */
-
- if (Signature &&
- !ACPI_COMPARE_NAME (Table->Signature, Signature))
- {
- ACPI_BIOS_ERROR ((AE_INFO,
- "Invalid signature 0x%X for ACPI table, expected [%s]",
- *ACPI_CAST_PTR (UINT32, Table->Signature), Signature));
- goto UnmapAndExit;
- }
-
- /*
- * Initialize the table entry. Set the pointer to NULL, since the
- * table is not fully mapped at this time.
- */
- TableDesc = &AcpiGbl_RootTableList.Tables[TableIndex];
-
- TableDesc->Address = Address;
- TableDesc->Pointer = NULL;
- TableDesc->Length = Table->Length;
- TableDesc->Flags = ACPI_TABLE_ORIGIN_MAPPED;
- ACPI_MOVE_32_TO_32 (TableDesc->Signature.Ascii, Table->Signature);
-
- /*
- * ACPI Table Override:
- *
- * Before we install the table, let the host OS override it with a new
- * one if desired. Any table within the RSDT/XSDT can be replaced,
- * including the DSDT which is pointed to by the FADT.
- *
- * NOTE: If the table is overridden, then FinalTable will contain a
- * mapped pointer to the full new table. If the table is not overridden,
- * or if there has been a physical override, then the table will be
- * fully mapped later (in verify table). In any case, we must
- * unmap the header that was mapped above.
- */
- FinalTable = AcpiTbTableOverride (Table, TableDesc);
- if (!FinalTable)
- {
- FinalTable = Table; /* There was no override */
- }
-
- AcpiTbPrintTableHeader (TableDesc->Address, FinalTable);
-
- /* Set the global integer width (based upon revision of the DSDT) */
-
- if (TableIndex == ACPI_TABLE_INDEX_DSDT)
- {
- AcpiUtSetIntegerWidth (FinalTable->Revision);
- }
-
- /*
- * If we have a physical override during this early loading of the ACPI
- * tables, unmap the table for now. It will be mapped again later when
- * it is actually used. This supports very early loading of ACPI tables,
- * before virtual memory is fully initialized and running within the
- * host OS. Note: A logical override has the ACPI_TABLE_ORIGIN_OVERRIDE
- * flag set and will not be deleted below.
- */
- if (FinalTable != Table)
- {
- AcpiTbDeleteTable (TableDesc);
- }
-
-
-UnmapAndExit:
-
- /* Always unmap the table header that we mapped above */
-
- AcpiOsUnmapMemory (Table, sizeof (ACPI_TABLE_HEADER));
-}
-
-
-/*******************************************************************************
- *
* FUNCTION: AcpiTbGetRootTableEntry
*
* PARAMETERS: TableEntry - Pointer to the RSDT/XSDT table entry
@@ -506,6 +390,7 @@ AcpiTbParseRootTable (
UINT32 Length;
UINT8 *TableEntry;
ACPI_STATUS Status;
+ UINT32 TableIndex;
ACPI_FUNCTION_TRACE (TbParseRootTable);
@@ -625,28 +510,20 @@ AcpiTbParseRootTable (
for (i = 0; i < TableCount; i++)
{
- if (AcpiGbl_RootTableList.CurrentTableCount >=
- AcpiGbl_RootTableList.MaxTableCount)
- {
- /* 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) (TableCount -
- (AcpiGbl_RootTableList.CurrentTableCount - 2))));
- break;
- }
- }
-
/* Get the table physical address (32-bit for RSDT, 64-bit for XSDT) */
- AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.CurrentTableCount].Address =
- AcpiTbGetRootTableEntry (TableEntry, TableEntrySize);
+ Status = AcpiTbInstallStandardTable (
+ AcpiTbGetRootTableEntry (TableEntry, TableEntrySize),
+ ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL, FALSE, TRUE, &TableIndex);
+
+ if (ACPI_SUCCESS (Status) &&
+ ACPI_COMPARE_NAME (&AcpiGbl_RootTableList.Tables[TableIndex].Signature,
+ ACPI_SIG_FADT))
+ {
+ AcpiTbParseFadt (TableIndex);
+ }
TableEntry += TableEntrySize;
- AcpiGbl_RootTableList.CurrentTableCount++;
}
/*
@@ -655,23 +532,5 @@ AcpiTbParseRootTable (
*/
AcpiOsUnmapMemory (Table, Length);
- /*
- * Complete the initialization of the root table array by examining
- * the header of each table
- */
- for (i = 2; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
- {
- AcpiTbInstallTable (AcpiGbl_RootTableList.Tables[i].Address,
- NULL, i);
-
- /* Special case for FADT - validate it then get the DSDT and FACS */
-
- if (ACPI_COMPARE_NAME (
- &AcpiGbl_RootTableList.Tables[i].Signature, ACPI_SIG_FADT))
- {
- AcpiTbParseFadt (i);
- }
- }
-
return_ACPI_STATUS (AE_OK);
}