From f265810a5c1ed8bc0a7622ff95fea14ba7dc8c95 Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Mon, 3 Jun 2024 21:58:19 +0200 Subject: [PATCH] Fix AcGetAcpiTable() routine failing to validate FADT checksum on some ACPI 2.0 and older machines --- xtldr/modules/acpi/acpi.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/xtldr/modules/acpi/acpi.c b/xtldr/modules/acpi/acpi.c index 4b4a8c2..baf75a9 100644 --- a/xtldr/modules/acpi/acpi.c +++ b/xtldr/modules/acpi/acpi.c @@ -148,16 +148,34 @@ AcGetAcpiTable(IN CONST UINT Signature, } /* Verify table signature and checksum */ - if((TableHeader->Signature == Signature) && (AcpChecksumTable(TableHeader, TableHeader->Length) == 0)) + if((TableHeader->Signature == Signature)) { - /* Found valid ACPI table */ - *AcpiTable = TableHeader; - return STATUS_EFI_SUCCESS; + /* Found requested ACPI table */ + break; } } - /* ACPI table not found */ - return STATUS_EFI_NOT_FOUND; + /* Make sure table was found */ + if(TableHeader->Signature != Signature) + { + /* ACPI table not found, return error */ + return STATUS_EFI_NOT_FOUND; + } + + /* Don't validate FADT on old, broken firmwares with ACPI 2.0 or older */ + if(TableHeader->Signature != ACPI_FADT_SIGNATURE || TableHeader->Revision > 2) + { + /* Validate table checksum */ + if(AcpChecksumTable(TableHeader, TableHeader->Length) != 0) + { + /* Checksum mismatch, return error */ + return STATUS_EFI_CRC_ERROR; + } + } + + /* Found valid ACPI table, return success */ + *AcpiTable = TableHeader; + return STATUS_EFI_SUCCESS; } /**