diff options
author | Jung-uk Kim <jkim@FreeBSD.org> | 2010-04-02 16:48:51 +0000 |
---|---|---|
committer | Jung-uk Kim <jkim@FreeBSD.org> | 2010-04-02 16:48:51 +0000 |
commit | b9ee7222924c1df653ed09d1b5befac3c98aa3f5 (patch) | |
tree | a128dad9042628a002a14e4ba0a4f5a98c9db600 /tables/tbutils.c | |
parent | 6e5c66621e4fd1bac329fef86cb2c60491b539a9 (diff) | |
download | src-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.c | 82 |
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 |