summaryrefslogtreecommitdiff
path: root/Kernel/Memory
diff options
context:
space:
mode:
authorimplicitfield <114500360+implicitfield@users.noreply.github.com>2022-12-06 23:47:45 +0200
committerLinus Groh <mail@linusgroh.de>2022-12-14 17:05:06 +0000
commit9665f41979eafa554fd6f20aa5d300460ab833df (patch)
tree0d82af043a7059bfa0df4ce57bb2c3d9fc6c30d3 /Kernel/Memory
parent733a318709c7ba59cc025b12cad1ddb1378cba5a (diff)
downloadserenity-9665f41979eafa554fd6f20aa5d300460ab833df.zip
Kernel: Ignore an invalid QEMU multiboot entry
This was introduced in the QEMU commit 8504f12 and was causing the kernel to fail to boot on the q35 machine. Fixes #14952.
Diffstat (limited to 'Kernel/Memory')
-rw-r--r--Kernel/Memory/MemoryManager.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/Kernel/Memory/MemoryManager.cpp b/Kernel/Memory/MemoryManager.cpp
index 25ebf1f048..5537bba12b 100644
--- a/Kernel/Memory/MemoryManager.cpp
+++ b/Kernel/Memory/MemoryManager.cpp
@@ -291,7 +291,18 @@ UNMAP_AFTER_INIT void MemoryManager::parse_memory_map()
global_data.physical_memory_ranges.append(PhysicalMemoryRange { PhysicalMemoryRangeType::Usable, start_address, length });
break;
case (MULTIBOOT_MEMORY_RESERVED):
- global_data.physical_memory_ranges.append(PhysicalMemoryRange { PhysicalMemoryRangeType::Reserved, start_address, length });
+#if ARCH(I386) || ARCH(X86_64)
+ // Workaround for https://gitlab.com/qemu-project/qemu/-/commit/8504f129450b909c88e199ca44facd35d38ba4de
+ // That commit added a reserved 12GiB entry for the benefit of virtual firmware.
+ // We can safely ignore this block as it isn't actually reserved on any real hardware.
+ // From: https://lore.kernel.org/all/20220701161014.3850-1-joao.m.martins@oracle.com/
+ // "Always add the HyperTransport range into e820 even when the relocation isn't
+ // done *and* there's >= 40 phys bit that would put max phyusical boundary to 1T
+ // This should allow virtual firmware to avoid the reserved range at the
+ // 1T boundary on VFs with big bars."
+ if (address != 0x000000fd00000000 || length != (0x000000ffffffffff - 0x000000fd00000000) + 1)
+#endif
+ global_data.physical_memory_ranges.append(PhysicalMemoryRange { PhysicalMemoryRangeType::Reserved, start_address, length });
break;
case (MULTIBOOT_MEMORY_ACPI_RECLAIMABLE):
global_data.physical_memory_ranges.append(PhysicalMemoryRange { PhysicalMemoryRangeType::ACPI_Reclaimable, start_address, length });