aboutsummaryrefslogtreecommitdiff
path: root/tables/tbutils.c
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2010-04-02 16:48:51 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2010-04-02 16:48:51 +0000
commitb9ee7222924c1df653ed09d1b5befac3c98aa3f5 (patch)
treea128dad9042628a002a14e4ba0a4f5a98c9db600 /tables/tbutils.c
parent6e5c66621e4fd1bac329fef86cb2c60491b539a9 (diff)
downloadsrc-b9ee7222924c1df653ed09d1b5befac3c98aa3f5.tar.gz
src-b9ee7222924c1df653ed09d1b5befac3c98aa3f5.zip
Import ACPICA 20100331.vendor/acpica/20100331
Notes
Notes: svn path=/vendor-sys/acpica/dist/; revision=206104 svn path=/vendor-sys/acpica/20100331/; revision=206105; tag=vendor/acpica/20100331
Diffstat (limited to 'tables/tbutils.c')
-rw-r--r--tables/tbutils.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/tables/tbutils.c b/tables/tbutils.c
index a496556f43e3..eb8bc43597d0 100644
--- a/tables/tbutils.c
+++ b/tables/tbutils.c
@@ -395,6 +395,88 @@ AcpiTbChecksum (
/*******************************************************************************
*
+ * FUNCTION: AcpiTbCheckDsdtHeader
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Quick compare to check validity of the DSDT. This will detect
+ * if the DSDT has been replaced from outside the OS and/or if
+ * the DSDT header has been corrupted.
+ *
+ ******************************************************************************/
+
+void
+AcpiTbCheckDsdtHeader (
+ void)
+{
+
+ /* Compare original length and checksum to current values */
+
+ if (AcpiGbl_OriginalDsdtHeader.Length != AcpiGbl_DSDT->Length ||
+ AcpiGbl_OriginalDsdtHeader.Checksum != AcpiGbl_DSDT->Checksum)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "The DSDT has been corrupted or replaced - old, new headers below"));
+ AcpiTbPrintTableHeader (0, &AcpiGbl_OriginalDsdtHeader);
+ AcpiTbPrintTableHeader (0, AcpiGbl_DSDT);
+
+ /* Disable further error messages */
+
+ AcpiGbl_OriginalDsdtHeader.Length = AcpiGbl_DSDT->Length;
+ AcpiGbl_OriginalDsdtHeader.Checksum = AcpiGbl_DSDT->Checksum;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbCopyDsdt
+ *
+ * PARAMETERS: TableDesc - Installed table to copy
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Implements a subsystem option to copy the DSDT to local memory.
+ * Some very bad BIOSs are known to either corrupt the DSDT or
+ * install a new, bad DSDT. This copy works around the problem.
+ *
+ ******************************************************************************/
+
+ACPI_TABLE_HEADER *
+AcpiTbCopyDsdt (
+ UINT32 TableIndex)
+{
+ ACPI_TABLE_HEADER *NewTable;
+ ACPI_TABLE_DESC *TableDesc;
+
+
+ TableDesc = &AcpiGbl_RootTableList.Tables[TableIndex];
+
+ NewTable = ACPI_ALLOCATE (TableDesc->Length);
+ if (!NewTable)
+ {
+ ACPI_ERROR ((AE_INFO, "Could not copy DSDT of length 0x%X",
+ TableDesc->Length));
+ return (NULL);
+ }
+
+ ACPI_MEMCPY (NewTable, TableDesc->Pointer, TableDesc->Length);
+ AcpiTbDeleteTable (TableDesc);
+ TableDesc->Pointer = NewTable;
+ TableDesc->Flags = ACPI_TABLE_ORIGIN_ALLOCATED;
+
+ ACPI_INFO ((AE_INFO,
+ "Forced DSDT copy: length 0x%05X copied locally, original unmapped",
+ NewTable->Length));
+
+ return (NewTable);
+}
+
+
+/*******************************************************************************
+ *
* FUNCTION: AcpiTbInstallTable
*
* PARAMETERS: Address - Physical address of DSDT or FACS