From f07e0180d63a522c1de4ac1c616b78a5ccaa3d37 Mon Sep 17 00:00:00 2001 From: Liav A Date: Sat, 8 Oct 2022 02:08:03 +0300 Subject: [PATCH] Kernel: Don't truncate physical memory space PDE pointers For some odd reason we used to return PhysicalPtr for a page_table_base result, but when setting it we accepted only a 32 bit value, so we truncated valid 64 bit addresses into 32 bit addresses by doing that. With this commit being applied, now PageDirectories can be located beyond the 4 GiB barrier. This was found by sin-ack, therefore he should be credited with this fix appropriately with Co-authored-by sign. Co-authored-by: sin-ack --- Kernel/Arch/aarch64/PageDirectory.h | 2 +- Kernel/Arch/x86/PageDirectory.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Kernel/Arch/aarch64/PageDirectory.h b/Kernel/Arch/aarch64/PageDirectory.h index 326c017f70..c05d406316 100644 --- a/Kernel/Arch/aarch64/PageDirectory.h +++ b/Kernel/Arch/aarch64/PageDirectory.h @@ -38,7 +38,7 @@ constexpr u32 DEVICE_MEMORY = (1 << 2); class PageDirectoryEntry { public: PhysicalPtr page_table_base() const { return PhysicalAddress::physical_page_base(m_raw); } - void set_page_table_base(u32 value) + void set_page_table_base(PhysicalPtr value) { m_raw &= 0xffff000000000fffULL; m_raw |= PhysicalAddress::physical_page_base(value); diff --git a/Kernel/Arch/x86/PageDirectory.h b/Kernel/Arch/x86/PageDirectory.h index 05fa7bade0..86bc97bf8c 100644 --- a/Kernel/Arch/x86/PageDirectory.h +++ b/Kernel/Arch/x86/PageDirectory.h @@ -16,7 +16,7 @@ namespace Kernel { class PageDirectoryEntry { public: PhysicalPtr page_table_base() const { return PhysicalAddress::physical_page_base(m_raw); } - void set_page_table_base(u32 value) + void set_page_table_base(PhysicalPtr value) { m_raw &= 0x8000000000000fffULL; m_raw |= PhysicalAddress::physical_page_base(value);