From 6c1ada8d0aa408e08d94d5a8e51852ab4e504fb5 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Thu, 13 Jul 2023 15:08:54 +0300 Subject: [PATCH] Kernel: Enable global bit on kernel pages --- kernel/arch/x86_64/PageTable.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/kernel/arch/x86_64/PageTable.cpp b/kernel/arch/x86_64/PageTable.cpp index 26a2c9390..3b1e86e2d 100644 --- a/kernel/arch/x86_64/PageTable.cpp +++ b/kernel/arch/x86_64/PageTable.cpp @@ -17,6 +17,7 @@ namespace Kernel static PageTable* s_kernel = nullptr; static PageTable* s_current = nullptr; static bool s_has_nxe = false; + static bool s_has_pge = false; // Page Directories for kernel memory (KERNEL_OFFSET -> 0xFFFFFFFFFFFFFFFF) static paddr_t s_global[(0xFFFFFFFFFFFFFFFF - KERNEL_OFFSET + 1) / (4096ull * 512ull * 512ull)] { }; @@ -56,6 +57,18 @@ namespace Kernel s_has_nxe = true; } + uint32_t ecx, edx; + CPUID::get_features(ecx, edx); + if (edx & CPUID::EDX_PGE) + { + asm volatile( + "movq %cr4, %rax;" + "orq $0x80, %rax;" + "movq %rax, %cr4;" + ); + s_has_pge = true; + } + ASSERT(s_kernel == nullptr); s_kernel = new PageTable(); ASSERT(s_kernel); @@ -231,9 +244,12 @@ namespace Kernel { LockGuard _(m_lock); - uint64_t xd_bit = 0; + uint64_t extra_flags = 0; if (s_has_nxe && !(flags & Flags::Execute)) - xd_bit = 1ull << 63; + extra_flags |= 1ull << 63; + if (s_has_pge && this == s_kernel) + extra_flags |= 1ull << 8; + flags &= ~Flags::Execute; if (vaddr && (vaddr >= KERNEL_OFFSET) != (this == s_kernel)) Kernel::panic("mapping {8H} to {8H}, kernel: {}", paddr, vaddr, this == s_kernel); @@ -276,7 +292,7 @@ namespace Kernel } uint64_t* pt = (uint64_t*)P2V(pd[pde] & PAGE_ADDR_MASK); - pt[pte] = xd_bit | paddr | flags; + pt[pte] = paddr | flags | extra_flags; invalidate(canonicalize(vaddr)); }