From 0116fd3b382dd2e0b3d2cda33a8d27914f4f81f5 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 5 Dec 2022 06:02:25 +0200 Subject: [PATCH] Oops, SetFlag() should not clear the entire data --- Core/Memory/PageDirectoryEntry.cpp | 2 +- Core/Memory/VirtualMemoryManager.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Core/Memory/PageDirectoryEntry.cpp b/Core/Memory/PageDirectoryEntry.cpp index 8c95881..1fdbddf 100644 --- a/Core/Memory/PageDirectoryEntry.cpp +++ b/Core/Memory/PageDirectoryEntry.cpp @@ -7,7 +7,7 @@ namespace Memory void PageDirectoryEntry::ClearFlags() { this->Value.raw = 0; } void PageDirectoryEntry::SetFlag(uint64_t Flag, bool Enabled) { - this->Value.raw = 0; + this->Value.raw &= ~Flag; if (Enabled) this->Value.raw |= Flag; } diff --git a/Core/Memory/VirtualMemoryManager.cpp b/Core/Memory/VirtualMemoryManager.cpp index 9db6078..4c62976 100644 --- a/Core/Memory/VirtualMemoryManager.cpp +++ b/Core/Memory/VirtualMemoryManager.cpp @@ -57,6 +57,7 @@ namespace Memory { PDP = (PageTable *)KernelAllocator.RequestPage(); memset(PDP, 0, PAGE_SIZE); + PDE.ClearFlags(); PDE.SetFlag(PTFlag::P, true); PDE.AddFlag(Flags); PDE.SetAddress((uint64_t)PDP >> 12); @@ -71,6 +72,7 @@ namespace Memory { PD = (PageTable *)KernelAllocator.RequestPage(); memset(PD, 0, PAGE_SIZE); + PDE.ClearFlags(); PDE.SetFlag(PTFlag::P, true); PDE.AddFlag(Flags); PDE.SetAddress((uint64_t)PD >> 12); @@ -85,6 +87,7 @@ namespace Memory { PT = (PageTable *)KernelAllocator.RequestPage(); memset(PT, 0, PAGE_SIZE); + PDE.ClearFlags(); PDE.SetFlag(PTFlag::P, true); PDE.AddFlag(Flags); PDE.SetAddress((uint64_t)PT >> 12); @@ -94,6 +97,7 @@ namespace Memory PT = (PageTable *)((uint64_t)PDE.GetAddress() << 12); PDE = PT->Entries[Index.PIndex]; + PDE.ClearFlags(); PDE.SetFlag(PTFlag::P, true); PDE.AddFlag(Flags); PDE.SetAddress((uint64_t)PhysicalAddress >> 12);