summaryrefslogtreecommitdiffstats
path: root/drivers/acpi/acpica/tbutils.c
diff options
context:
space:
mode:
authorLin Ming <ming.m.lin@intel.com>2010-04-01 10:47:56 +0800
committerLen Brown <len.brown@intel.com>2010-04-20 10:43:16 -0400
commit729df0f848daf2f17d02107199fa92efe909d995 (patch)
treed4ece34a277019368999fd36a0bf15a39eeaa742 /drivers/acpi/acpica/tbutils.c
parentc1637e9c649a0eb72c467041d78275aabdd48a41 (diff)
ACPICA: Add detection of corrupted/replaced DSDT
This change adds support to detect a DSDT that has been corrupted and/or replaced from outside the OS (by firmware). This is typically catastrophic for the system, but has been seen on some machines. https://bugzilla.kernel.org/show_bug.cgi?id=14679 Signed-off-by: Lin Ming <ming.m.lin@intel.com> Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/tbutils.c')
-rw-r--r--drivers/acpi/acpica/tbutils.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c
index f47a70e2006..07bc7437f82 100644
--- a/drivers/acpi/acpica/tbutils.c
+++ b/drivers/acpi/acpica/tbutils.c
@@ -349,6 +349,44 @@ u8 acpi_tb_checksum(u8 *buffer, u32 length)
/*******************************************************************************
*
+ * FUNCTION: acpi_tb_check_dsdt_header
+ *
+ * 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 acpi_tb_check_dsdt_header(void)
+{
+
+ /* Compare original length and checksum to current values */
+
+ if (acpi_gbl_original_dsdt_header.length !=
+ acpi_gbl_DSDT->pointer->length
+ || acpi_gbl_original_dsdt_header.checksum !=
+ acpi_gbl_DSDT->pointer->checksum) {
+ ACPI_ERROR((AE_INFO,
+ "The DSDT has been corrupted or replaced - old, new headers below"));
+ acpi_tb_print_table_header(0, &acpi_gbl_original_dsdt_header);
+ acpi_tb_print_table_header(acpi_gbl_DSDT->address,
+ acpi_gbl_DSDT->pointer);
+
+ /* Disable further error messages */
+
+ acpi_gbl_original_dsdt_header.length =
+ acpi_gbl_DSDT->pointer->length;
+ acpi_gbl_original_dsdt_header.checksum =
+ acpi_gbl_DSDT->pointer->checksum;
+ }
+}
+
+/*******************************************************************************
+ *
* FUNCTION: acpi_tb_install_table
*
* PARAMETERS: Address - Physical address of DSDT or FACS