From 8cdb2d8d172f9100b54d987b3eb4044da95889f8 Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Wed, 16 Aug 2023 02:53:24 +0200 Subject: [PATCH] acpi: don't map more rsdt/xsdt bytes than actually exist. With tianocore sometimes rsdt/xsdt map right before available RAM and if we attempt to map them we get a kernel panic --- drivers/acpi.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/acpi.cpp b/drivers/acpi.cpp index aaaedae..9bbcc3e 100644 --- a/drivers/acpi.cpp +++ b/drivers/acpi.cpp @@ -150,15 +150,21 @@ void ACPIParseTables() { bool isXSDT = false; if (acpi.rsdp) { + uint64_t sdt_address; + if (acpi.rsdp->revision == 2 && acpi.rsdp->xsdtAddress) { isXSDT = true; - sdt = (ACPIDescriptorTable *) acpi.rsdp->xsdtAddress; + sdt_address = acpi.rsdp->xsdtAddress; } else { isXSDT = false; - sdt = (ACPIDescriptorTable *) (uintptr_t) acpi.rsdp->rsdtAddress; + sdt_address = acpi.rsdp->rsdtAddress; } - sdt = (ACPIDescriptorTable *) MMMapPhysical(kernelMMSpace, (uintptr_t) sdt, 16384, ES_FLAGS_DEFAULT); + + ACPIDescriptorTable *tmp_sdt = (ACPIDescriptorTable *) MMMapPhysical(kernelMMSpace, sdt_address, sizeof(ACPIDescriptorTable), ES_FLAGS_DEFAULT); + uint32_t len_sdt = tmp_sdt->length < 16384 ? tmp_sdt->length : 16384; + MMFree(kernelMMSpace, tmp_sdt); + sdt = (ACPIDescriptorTable *) MMMapPhysical(kernelMMSpace, sdt_address, len_sdt, ES_FLAGS_DEFAULT); } else { KernelPanic("ACPIInitialise - Could not find supported root system descriptor pointer.\nACPI support is required.\n"); }