summaryrefslogtreecommitdiff
path: root/source/components/tables
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2015-08-25 19:41:12 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2015-08-25 19:41:12 +0000
commitc25a97c7b4f09b4c9efa992434d341f5b89629ff (patch)
tree2fa9d2167f719968f73daa4ec16528a068d308ad /source/components/tables
parent136eac2a0638d3c751b1987603f71a9ae26879fd (diff)
Notes
Diffstat (limited to 'source/components/tables')
-rw-r--r--source/components/tables/tbfadt.c6
-rw-r--r--source/components/tables/tbfind.c17
-rw-r--r--source/components/tables/tbinstal.c39
-rw-r--r--source/components/tables/tbutils.c70
-rw-r--r--source/components/tables/tbxfload.c89
5 files changed, 155 insertions, 66 deletions
diff --git a/source/components/tables/tbfadt.c b/source/components/tables/tbfadt.c
index 871eb880ae9f..bcbf576bc368 100644
--- a/source/components/tables/tbfadt.c
+++ b/source/components/tables/tbfadt.c
@@ -376,7 +376,7 @@ AcpiTbParseFadt (
/* Obtain the DSDT and FACS tables via their addresses within the FADT */
AcpiTbInstallFixedTable ((ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.XDsdt,
- ACPI_SIG_DSDT, ACPI_TABLE_INDEX_DSDT);
+ ACPI_SIG_DSDT, &AcpiGbl_DsdtIndex);
/* If Hardware Reduced flag is set, there is no FACS */
@@ -385,12 +385,12 @@ AcpiTbParseFadt (
if (AcpiGbl_FADT.Facs)
{
AcpiTbInstallFixedTable ((ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.Facs,
- ACPI_SIG_FACS, ACPI_TABLE_INDEX_FACS);
+ ACPI_SIG_FACS, &AcpiGbl_FacsIndex);
}
if (AcpiGbl_FADT.XFacs)
{
AcpiTbInstallFixedTable ((ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.XFacs,
- ACPI_SIG_FACS, ACPI_TABLE_INDEX_X_FACS);
+ ACPI_SIG_FACS, &AcpiGbl_XFacsIndex);
}
}
}
diff --git a/source/components/tables/tbfind.c b/source/components/tables/tbfind.c
index af790924105c..4d360ae8bee3 100644
--- a/source/components/tables/tbfind.c
+++ b/source/components/tables/tbfind.c
@@ -73,14 +73,29 @@ AcpiTbFindTable (
char *OemTableId,
UINT32 *TableIndex)
{
- UINT32 i;
ACPI_STATUS Status;
ACPI_TABLE_HEADER Header;
+ UINT32 i;
ACPI_FUNCTION_TRACE (TbFindTable);
+ /* Validate the input table signature */
+
+ if (!AcpiIsValidSignature (Signature))
+ {
+ return_ACPI_STATUS (AE_BAD_SIGNATURE);
+ }
+
+ /* Don't allow the OEM strings to be too long */
+
+ if ((strlen (OemId) > ACPI_OEM_ID_SIZE) ||
+ (strlen (OemTableId) > ACPI_OEM_TABLE_ID_SIZE))
+ {
+ return_ACPI_STATUS (AE_AML_STRING_LIMIT);
+ }
+
/* Normalize the input strings */
memset (&Header, 0, sizeof (ACPI_TABLE_HEADER));
diff --git a/source/components/tables/tbinstal.c b/source/components/tables/tbinstal.c
index c797efb808d3..a98a68989ec4 100644
--- a/source/components/tables/tbinstal.c
+++ b/source/components/tables/tbinstal.c
@@ -108,9 +108,9 @@ AcpiTbCompareTables (
*
* FUNCTION: AcpiTbInstallTableWithOverride
*
- * PARAMETERS: TableIndex - Index into root table array
- * NewTableDesc - New table descriptor to install
+ * PARAMETERS: NewTableDesc - New table descriptor to install
* Override - Whether override should be performed
+ * TableIndex - Where the table index is returned
*
* RETURN: None
*
@@ -123,12 +123,16 @@ AcpiTbCompareTables (
void
AcpiTbInstallTableWithOverride (
- UINT32 TableIndex,
ACPI_TABLE_DESC *NewTableDesc,
- BOOLEAN Override)
+ BOOLEAN Override,
+ UINT32 *TableIndex)
{
+ UINT32 i;
+ ACPI_STATUS Status;
+
- if (TableIndex >= AcpiGbl_RootTableList.CurrentTableCount)
+ Status = AcpiTbGetNextTableDescriptor (&i, NULL);
+ if (ACPI_FAILURE (Status))
{
return;
}
@@ -145,14 +149,18 @@ AcpiTbInstallTableWithOverride (
AcpiTbOverrideTable (NewTableDesc);
}
- AcpiTbInitTableDescriptor (&AcpiGbl_RootTableList.Tables[TableIndex],
+ AcpiTbInitTableDescriptor (&AcpiGbl_RootTableList.Tables[i],
NewTableDesc->Address, NewTableDesc->Flags, NewTableDesc->Pointer);
AcpiTbPrintTableHeader (NewTableDesc->Address, NewTableDesc->Pointer);
+ /* This synchronizes AcpiGbl_DsdtIndex */
+
+ *TableIndex = i;
+
/* Set the global integer width (based upon revision of the DSDT) */
- if (TableIndex == ACPI_TABLE_INDEX_DSDT)
+ if (i == AcpiGbl_DsdtIndex)
{
AcpiUtSetIntegerWidth (NewTableDesc->Pointer->Revision);
}
@@ -166,7 +174,7 @@ AcpiTbInstallTableWithOverride (
* PARAMETERS: Address - Physical address of DSDT or FACS
* Signature - Table signature, NULL if no need to
* match
- * TableIndex - Index into root table array
+ * TableIndex - Where the table index is returned
*
* RETURN: Status
*
@@ -179,7 +187,7 @@ ACPI_STATUS
AcpiTbInstallFixedTable (
ACPI_PHYSICAL_ADDRESS Address,
char *Signature,
- UINT32 TableIndex)
+ UINT32 *TableIndex)
{
ACPI_TABLE_DESC NewTableDesc;
ACPI_STATUS Status;
@@ -214,7 +222,9 @@ AcpiTbInstallFixedTable (
goto ReleaseAndExit;
}
- AcpiTbInstallTableWithOverride (TableIndex, &NewTableDesc, TRUE);
+ /* Add the table to the global root table list */
+
+ AcpiTbInstallTableWithOverride (&NewTableDesc, TRUE, TableIndex);
ReleaseAndExit:
@@ -375,14 +385,7 @@ AcpiTbInstallStandardTable (
/* Add the table to the global root table list */
- Status = AcpiTbGetNextTableDescriptor (&i, NULL);
- if (ACPI_FAILURE (Status))
- {
- goto ReleaseAndExit;
- }
-
- *TableIndex = i;
- AcpiTbInstallTableWithOverride (i, &NewTableDesc, Override);
+ AcpiTbInstallTableWithOverride (&NewTableDesc, Override, TableIndex);
ReleaseAndExit:
diff --git a/source/components/tables/tbutils.c b/source/components/tables/tbutils.c
index df1e053fbfe8..988a3b18f637 100644
--- a/source/components/tables/tbutils.c
+++ b/source/components/tables/tbutils.c
@@ -75,6 +75,8 @@ ACPI_STATUS
AcpiTbInitializeFacs (
void)
{
+ ACPI_TABLE_FACS *Facs;
+
/* If Hardware Reduced flag is set, there is no FACS */
@@ -83,19 +85,18 @@ AcpiTbInitializeFacs (
AcpiGbl_FACS = NULL;
return (AE_OK);
}
-
- (void) AcpiGetTableByIndex (ACPI_TABLE_INDEX_FACS,
- ACPI_CAST_INDIRECT_PTR (ACPI_TABLE_HEADER, &AcpiGbl_Facs32));
- (void) AcpiGetTableByIndex (ACPI_TABLE_INDEX_X_FACS,
- ACPI_CAST_INDIRECT_PTR (ACPI_TABLE_HEADER, &AcpiGbl_Facs64));
-
- if (AcpiGbl_Facs64 && (!AcpiGbl_Facs32 || !AcpiGbl_Use32BitFacsAddresses))
+ else if (AcpiGbl_FADT.XFacs &&
+ (!AcpiGbl_FADT.Facs || !AcpiGbl_Use32BitFacsAddresses))
{
- AcpiGbl_FACS = AcpiGbl_Facs64;
+ (void) AcpiGetTableByIndex (AcpiGbl_XFacsIndex,
+ ACPI_CAST_INDIRECT_PTR (ACPI_TABLE_HEADER, &Facs));
+ AcpiGbl_FACS = Facs;
}
- else if (AcpiGbl_Facs32)
+ else if (AcpiGbl_FADT.Facs)
{
- AcpiGbl_FACS = AcpiGbl_Facs32;
+ (void) AcpiGetTableByIndex (AcpiGbl_FacsIndex,
+ ACPI_CAST_INDIRECT_PTR (ACPI_TABLE_HEADER, &Facs));
+ AcpiGbl_FACS = Facs;
}
/* If there is no FACS, just continue. There was already an error msg */
@@ -206,7 +207,7 @@ AcpiTbCopyDsdt (
AcpiTbUninstallTable (TableDesc);
AcpiTbInitTableDescriptor (
- &AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT],
+ &AcpiGbl_RootTableList.Tables[AcpiGbl_DsdtIndex],
ACPI_PTR_TO_PHYSADDR (NewTable), ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
NewTable);
@@ -400,13 +401,6 @@ AcpiTbParseRootTable (
TableEntrySize);
TableEntry = ACPI_ADD_PTR (UINT8, Table, sizeof (ACPI_TABLE_HEADER));
- /*
- * First three entries in the table array are reserved for the DSDT
- * and 32bit/64bit FACS, which are not actually present in the
- * RSDT/XSDT - they come from the FADT
- */
- AcpiGbl_RootTableList.CurrentTableCount = 3;
-
/* Initialize the root table array from the RSDT/XSDT */
for (i = 0; i < TableCount; i++)
@@ -441,3 +435,43 @@ NextTable:
return_ACPI_STATUS (AE_OK);
}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiIsValidSignature
+ *
+ * PARAMETERS: Signature - Sig string to be validated
+ *
+ * RETURN: TRUE if signature is correct length and has valid characters
+ *
+ * DESCRIPTION: Validate an ACPI table signature.
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiIsValidSignature (
+ char *Signature)
+{
+ UINT32 i;
+
+
+ /* Validate the signature length */
+
+ if (strlen (Signature) != ACPI_NAME_SIZE)
+ {
+ return (FALSE);
+ }
+
+ /* Validate each character in the signature */
+
+ for (i = 0; i < ACPI_NAME_SIZE; i++)
+ {
+ if (!AcpiUtValidAcpiChar (Signature[i], i))
+ {
+ return (FALSE);
+ }
+ }
+
+ return (TRUE);
+}
diff --git a/source/components/tables/tbxfload.c b/source/components/tables/tbxfload.c
index 19c31e71cf94..bd5f7d7bc41f 100644
--- a/source/components/tables/tbxfload.c
+++ b/source/components/tables/tbxfload.c
@@ -51,12 +51,6 @@
#define _COMPONENT ACPI_TABLES
ACPI_MODULE_NAME ("tbxfload")
-/* Local prototypes */
-
-static ACPI_STATUS
-AcpiTbLoadNamespace (
- void);
-
/*******************************************************************************
*
@@ -83,6 +77,14 @@ AcpiLoadTables (
/* Load the namespace from the tables */
Status = AcpiTbLoadNamespace ();
+
+ /* Don't let single failures abort the load */
+
+ if (Status == AE_CTRL_TERMINATE)
+ {
+ Status = AE_OK;
+ }
+
if (ACPI_FAILURE (Status))
{
ACPI_EXCEPTION ((AE_INFO, Status,
@@ -108,13 +110,16 @@ ACPI_EXPORT_SYMBOL_INIT (AcpiLoadTables)
*
******************************************************************************/
-static ACPI_STATUS
+ACPI_STATUS
AcpiTbLoadNamespace (
void)
{
ACPI_STATUS Status;
UINT32 i;
ACPI_TABLE_HEADER *NewDsdt;
+ ACPI_TABLE_DESC *Table;
+ UINT32 TablesLoaded = 0;
+ UINT32 TablesFailed = 0;
ACPI_FUNCTION_TRACE (TbLoadNamespace);
@@ -126,12 +131,11 @@ AcpiTbLoadNamespace (
* Load the namespace. The DSDT is required, but any SSDT and
* PSDT tables are optional. Verify the DSDT.
*/
+ Table = &AcpiGbl_RootTableList.Tables[AcpiGbl_DsdtIndex];
+
if (!AcpiGbl_RootTableList.CurrentTableCount ||
- !ACPI_COMPARE_NAME (
- &(AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Signature),
- ACPI_SIG_DSDT) ||
- ACPI_FAILURE (AcpiTbValidateTable (
- &AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT])))
+ !ACPI_COMPARE_NAME (Table->Signature.Ascii, ACPI_SIG_DSDT) ||
+ ACPI_FAILURE (AcpiTbValidateTable (Table)))
{
Status = AE_NO_ACPI_TABLES;
goto UnlockAndExit;
@@ -143,7 +147,7 @@ AcpiTbLoadNamespace (
* array can change dynamically as tables are loaded at run-time. Note:
* .Pointer field is not validated until after call to AcpiTbValidateTable.
*/
- AcpiGbl_DSDT = AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Pointer;
+ AcpiGbl_DSDT = Table->Pointer;
/*
* Optionally copy the entire DSDT to local memory (instead of simply
@@ -153,7 +157,7 @@ AcpiTbLoadNamespace (
*/
if (AcpiGbl_CopyDsdtLocally)
{
- NewDsdt = AcpiTbCopyDsdt (ACPI_TABLE_INDEX_DSDT);
+ NewDsdt = AcpiTbCopyDsdt (AcpiGbl_DsdtIndex);
if (NewDsdt)
{
AcpiGbl_DSDT = NewDsdt;
@@ -171,10 +175,15 @@ AcpiTbLoadNamespace (
/* Load and parse tables */
- Status = AcpiNsLoadTable (ACPI_TABLE_INDEX_DSDT, AcpiGbl_RootNode);
+ Status = AcpiNsLoadTable (AcpiGbl_DsdtIndex, AcpiGbl_RootNode);
if (ACPI_FAILURE (Status))
{
- return_ACPI_STATUS (Status);
+ ACPI_EXCEPTION ((AE_INFO, Status, "[DSDT] table load failed"));
+ TablesFailed++;
+ }
+ else
+ {
+ TablesLoaded++;
}
/* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */
@@ -182,15 +191,13 @@ AcpiTbLoadNamespace (
(void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
{
+ Table = &AcpiGbl_RootTableList.Tables[i];
+
if (!AcpiGbl_RootTableList.Tables[i].Address ||
- (!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
- ACPI_SIG_SSDT) &&
- !ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
- ACPI_SIG_PSDT) &&
- !ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
- ACPI_SIG_OSDT)) ||
- ACPI_FAILURE (AcpiTbValidateTable (
- &AcpiGbl_RootTableList.Tables[i])))
+ (!ACPI_COMPARE_NAME (Table->Signature.Ascii, ACPI_SIG_SSDT) &&
+ !ACPI_COMPARE_NAME (Table->Signature.Ascii, ACPI_SIG_PSDT) &&
+ !ACPI_COMPARE_NAME (Table->Signature.Ascii, ACPI_SIG_OSDT)) ||
+ ACPI_FAILURE (AcpiTbValidateTable (Table)))
{
continue;
}
@@ -198,11 +205,41 @@ AcpiTbLoadNamespace (
/* Ignore errors while loading tables, get as many as possible */
(void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
- (void) AcpiNsLoadTable (i, AcpiGbl_RootNode);
+ Status = AcpiNsLoadTable (i, AcpiGbl_RootNode);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "(%4.4s:%8.8s) while loading table",
+ Table->Signature.Ascii, Table->Pointer->OemTableId));
+ TablesFailed++;
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
+ "Table [%4.4s:%8.8s] (id FF) - Table namespace load failed\n\n",
+ Table->Signature.Ascii, Table->Pointer->OemTableId));
+ }
+ else
+ {
+ TablesLoaded++;
+ }
+
(void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
}
- ACPI_INFO ((AE_INFO, "All ACPI Tables successfully acquired"));
+ if (!TablesFailed)
+ {
+ ACPI_INFO ((AE_INFO,
+ "%u ACPI AML tables successfully acquired and loaded",
+ TablesLoaded));
+ }
+ else
+ {
+ ACPI_ERROR ((AE_INFO,
+ "%u table load failures, %u successful",
+ TablesFailed, TablesLoaded));
+
+ /* Indicate at least one failure */
+
+ Status = AE_CTRL_TERMINATE;
+ }
UnlockAndExit:
(void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);