forked from Bananymous/banan-os
Kernel: Enable global bit on kernel pages
This commit is contained in:
parent
7d00c2670f
commit
6c1ada8d0a
|
@ -17,6 +17,7 @@ namespace Kernel
|
||||||
static PageTable* s_kernel = nullptr;
|
static PageTable* s_kernel = nullptr;
|
||||||
static PageTable* s_current = nullptr;
|
static PageTable* s_current = nullptr;
|
||||||
static bool s_has_nxe = false;
|
static bool s_has_nxe = false;
|
||||||
|
static bool s_has_pge = false;
|
||||||
|
|
||||||
// Page Directories for kernel memory (KERNEL_OFFSET -> 0xFFFFFFFFFFFFFFFF)
|
// Page Directories for kernel memory (KERNEL_OFFSET -> 0xFFFFFFFFFFFFFFFF)
|
||||||
static paddr_t s_global[(0xFFFFFFFFFFFFFFFF - KERNEL_OFFSET + 1) / (4096ull * 512ull * 512ull)] { };
|
static paddr_t s_global[(0xFFFFFFFFFFFFFFFF - KERNEL_OFFSET + 1) / (4096ull * 512ull * 512ull)] { };
|
||||||
|
@ -56,6 +57,18 @@ namespace Kernel
|
||||||
s_has_nxe = true;
|
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);
|
ASSERT(s_kernel == nullptr);
|
||||||
s_kernel = new PageTable();
|
s_kernel = new PageTable();
|
||||||
ASSERT(s_kernel);
|
ASSERT(s_kernel);
|
||||||
|
@ -231,9 +244,12 @@ namespace Kernel
|
||||||
{
|
{
|
||||||
LockGuard _(m_lock);
|
LockGuard _(m_lock);
|
||||||
|
|
||||||
uint64_t xd_bit = 0;
|
uint64_t extra_flags = 0;
|
||||||
if (s_has_nxe && !(flags & Flags::Execute))
|
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))
|
if (vaddr && (vaddr >= KERNEL_OFFSET) != (this == s_kernel))
|
||||||
Kernel::panic("mapping {8H} to {8H}, kernel: {}", paddr, vaddr, 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);
|
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));
|
invalidate(canonicalize(vaddr));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue