From fa90647ab083458ecf69a44b7bd57fc5685437b0 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Tue, 24 Sep 2013 13:52:41 +0800 Subject: [PATCH] acpi: Be lenient about unknown revision of FADT, MADT, XSDT and RSDT Revision 5 FADT is found on on ASRock H77 Pro4-M, which is beyond the revision even in ACPI-4.0a. Since length is checked for these tables, this commit should be safe. --- sys/platform/pc32/acpica/acpi_fadt.c | 3 +-- sys/platform/pc32/acpica/acpi_madt.c | 4 +--- sys/platform/pc32/acpica/acpi_sdt.c | 14 ++++++++++++-- sys/platform/pc64/acpica/acpi_fadt.c | 3 +-- sys/platform/pc64/acpica/acpi_madt.c | 4 +--- sys/platform/pc64/acpica/acpi_sdt.c | 14 ++++++++++++-- 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/sys/platform/pc32/acpica/acpi_fadt.c b/sys/platform/pc32/acpica/acpi_fadt.c index ec841766a9..d7886cd227 100644 --- a/sys/platform/pc32/acpica/acpi_fadt.c +++ b/sys/platform/pc32/acpica/acpi_fadt.c @@ -112,9 +112,8 @@ fadt_probe(void) * FADT in ACPI specification 1.0 - 4.0 */ if (fadt->fadt_hdr.sdth_rev < 1 || fadt->fadt_hdr.sdth_rev > 4) { - kprintf("fadt_probe: unsupported FADT revision %d\n", + kprintf("fadt_probe: unknown FADT revision %d\n", fadt->fadt_hdr.sdth_rev); - goto back; } if (fadt->fadt_hdr.sdth_len < sizeof(*fadt)) { diff --git a/sys/platform/pc32/acpica/acpi_madt.c b/sys/platform/pc32/acpica/acpi_madt.c index 2a7575c2b3..4fd321f964 100644 --- a/sys/platform/pc32/acpica/acpi_madt.c +++ b/sys/platform/pc32/acpica/acpi_madt.c @@ -180,10 +180,8 @@ madt_check(vm_paddr_t madt_paddr) * MADT in ACPI specification 1.0 - 4.0 */ if (madt->madt_hdr.sdth_rev < 1 || madt->madt_hdr.sdth_rev > 3) { - kprintf("madt_check: unsupported MADT revision %d\n", + kprintf("madt_check: unknown MADT revision %d\n", madt->madt_hdr.sdth_rev); - error = EOPNOTSUPP; - goto back; } if (madt->madt_hdr.sdth_len < diff --git a/sys/platform/pc32/acpica/acpi_sdt.c b/sys/platform/pc32/acpica/acpi_sdt.c index 50f00b5950..e8d22529f2 100644 --- a/sys/platform/pc32/acpica/acpi_sdt.c +++ b/sys/platform/pc32/acpica/acpi_sdt.c @@ -204,8 +204,13 @@ sdt_search_xsdt(vm_paddr_t xsdt_paddr, const uint8_t *sig) } if (xsdt->xsdt_hdr.sdth_rev != 1) { - kprintf("sdt_search_xsdt: unsupported XSDT revision %d\n", + kprintf("sdt_search_xsdt: unknown XSDT revision %d\n", xsdt->xsdt_hdr.sdth_rev); + } + + if (xsdt->xsdt_hdr.sdth_len < sizeof(xsdt->xsdt_hdr)) { + kprintf("sdt_search_xsdt: invalid XSDT length %u\n", + xsdt->xsdt_hdr.sdth_len); goto back; } @@ -260,8 +265,13 @@ sdt_search_rsdt(vm_paddr_t rsdt_paddr, const uint8_t *sig) } if (rsdt->rsdt_hdr.sdth_rev != 1) { - kprintf("sdt_search_rsdt: unsupported RSDT revision %d\n", + kprintf("sdt_search_rsdt: unknown RSDT revision %d\n", rsdt->rsdt_hdr.sdth_rev); + } + + if (rsdt->rsdt_hdr.sdth_len < sizeof(rsdt->rsdt_hdr)) { + kprintf("sdt_search_rsdt: invalid RSDT length %u\n", + rsdt->rsdt_hdr.sdth_len); goto back; } diff --git a/sys/platform/pc64/acpica/acpi_fadt.c b/sys/platform/pc64/acpica/acpi_fadt.c index ec841766a9..d7886cd227 100644 --- a/sys/platform/pc64/acpica/acpi_fadt.c +++ b/sys/platform/pc64/acpica/acpi_fadt.c @@ -112,9 +112,8 @@ fadt_probe(void) * FADT in ACPI specification 1.0 - 4.0 */ if (fadt->fadt_hdr.sdth_rev < 1 || fadt->fadt_hdr.sdth_rev > 4) { - kprintf("fadt_probe: unsupported FADT revision %d\n", + kprintf("fadt_probe: unknown FADT revision %d\n", fadt->fadt_hdr.sdth_rev); - goto back; } if (fadt->fadt_hdr.sdth_len < sizeof(*fadt)) { diff --git a/sys/platform/pc64/acpica/acpi_madt.c b/sys/platform/pc64/acpica/acpi_madt.c index 2fb3c4ce6f..22cc585155 100644 --- a/sys/platform/pc64/acpica/acpi_madt.c +++ b/sys/platform/pc64/acpica/acpi_madt.c @@ -180,10 +180,8 @@ madt_check(vm_paddr_t madt_paddr) * MADT in ACPI specification 1.0 - 4.0 */ if (madt->madt_hdr.sdth_rev < 1 || madt->madt_hdr.sdth_rev > 3) { - kprintf("madt_check: unsupported MADT revision %d\n", + kprintf("madt_check: unknown MADT revision %d\n", madt->madt_hdr.sdth_rev); - error = EOPNOTSUPP; - goto back; } if (madt->madt_hdr.sdth_len < diff --git a/sys/platform/pc64/acpica/acpi_sdt.c b/sys/platform/pc64/acpica/acpi_sdt.c index 50f00b5950..e8d22529f2 100644 --- a/sys/platform/pc64/acpica/acpi_sdt.c +++ b/sys/platform/pc64/acpica/acpi_sdt.c @@ -204,8 +204,13 @@ sdt_search_xsdt(vm_paddr_t xsdt_paddr, const uint8_t *sig) } if (xsdt->xsdt_hdr.sdth_rev != 1) { - kprintf("sdt_search_xsdt: unsupported XSDT revision %d\n", + kprintf("sdt_search_xsdt: unknown XSDT revision %d\n", xsdt->xsdt_hdr.sdth_rev); + } + + if (xsdt->xsdt_hdr.sdth_len < sizeof(xsdt->xsdt_hdr)) { + kprintf("sdt_search_xsdt: invalid XSDT length %u\n", + xsdt->xsdt_hdr.sdth_len); goto back; } @@ -260,8 +265,13 @@ sdt_search_rsdt(vm_paddr_t rsdt_paddr, const uint8_t *sig) } if (rsdt->rsdt_hdr.sdth_rev != 1) { - kprintf("sdt_search_rsdt: unsupported RSDT revision %d\n", + kprintf("sdt_search_rsdt: unknown RSDT revision %d\n", rsdt->rsdt_hdr.sdth_rev); + } + + if (rsdt->rsdt_hdr.sdth_len < sizeof(rsdt->rsdt_hdr)) { + kprintf("sdt_search_rsdt: invalid RSDT length %u\n", + rsdt->rsdt_hdr.sdth_len); goto back; } -- 2.41.0