From e1853c66214fc7f6039457ff10bdaedcc7381f53 Mon Sep 17 00:00:00 2001 From: Sylas Hollander Date: Sun, 1 Mar 2026 14:26:35 -0500 Subject: [PATCH] [FREELDR:UEFI] Correctly pass through ACPI information and map its memory (#8669) This prevents bugchecks in Windows due to the ACPI table being overwritten because of the incorrect UEFI to E820 memory mappings. CORE-11954 --- boot/freeldr/freeldr/arch/uefi/uefihw.c | 9 ++------- boot/freeldr/freeldr/arch/uefi/uefimem.c | 4 ++-- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/boot/freeldr/freeldr/arch/uefi/uefihw.c b/boot/freeldr/freeldr/arch/uefi/uefihw.c index 584c2a43d7b..3f5edb2322e 100644 --- a/boot/freeldr/freeldr/arch/uefi/uefihw.c +++ b/boot/freeldr/freeldr/arch/uefi/uefihw.c @@ -18,8 +18,6 @@ DBG_DEFAULT_CHANNEL(WARNING); extern EFI_SYSTEM_TABLE * GlobalSystemTable; extern EFI_HANDLE GlobalImageHandle; extern UCHAR PcBiosDiskCount; -extern EFI_MEMORY_DESCRIPTOR* EfiMemoryMap; -extern UINT32 FreeldrDescCount; /* From uefivid.c */ extern ULONG_PTR VramAddress; @@ -74,8 +72,7 @@ DetectAcpiBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) AcpiPresent = TRUE; /* Calculate the table size */ - TableSize = FreeldrDescCount * sizeof(BIOS_MEMORY_MAP) + - sizeof(ACPI_BIOS_DATA) - sizeof(BIOS_MEMORY_MAP); + TableSize = sizeof(ACPI_BIOS_DATA); /* Set 'Configuration Data' value */ Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, PartialDescriptors[1]) + TableSize; @@ -110,9 +107,7 @@ DetectAcpiBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) AcpiBiosData->RSDTAddress.LowPart = Rsdp->rsdt_physical_address; } - AcpiBiosData->Count = FreeldrDescCount; - RtlCopyMemory(AcpiBiosData->MemoryMap, EfiMemoryMap, - FreeldrDescCount * sizeof(BIOS_MEMORY_MAP)); + AcpiBiosData->Count = 0; TRACE("RSDT %p, data size %x\n", Rsdp->rsdt_physical_address, TableSize); diff --git a/boot/freeldr/freeldr/arch/uefi/uefimem.c b/boot/freeldr/freeldr/arch/uefi/uefimem.c index cbaf3c6b885..0097711cc3d 100644 --- a/boot/freeldr/freeldr/arch/uefi/uefimem.c +++ b/boot/freeldr/freeldr/arch/uefi/uefimem.c @@ -127,9 +127,9 @@ UefiConvertToFreeldrDesc(EFI_MEMORY_TYPE EfiMemoryType) case EfiUnusableMemory: return LoaderBad; case EfiACPIReclaimMemory: - return LoaderFirmwareTemporary; + return LoaderSpecialMemory; case EfiACPIMemoryNVS: - return LoaderReserve; + return LoaderSpecialMemory; case EfiMemoryMappedIO: return LoaderReserve; case EfiMemoryMappedIOPortSpace: