summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-04-11 17:52:52 +0200
committerGitHub <noreply@github.com>2025-04-11 17:52:52 +0200
commitc1d9fbd3925d6e10919a7793fc214c9f1a01b2ab (patch)
treea74bdf6f87d07a24496effbc157f74d379d25007 /dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
parent8988b6f166d1087615b21229df651e0bcc0fa048 (diff)
parentc3856eddb5a8146751dac82ad1ba4433f5ca6d6d (diff)
Merge pull request #14 from amlel-el-mahrouss/dev
tweak kernel, boot: use -Wall, -Werror, -Wpedantic now
Diffstat (limited to 'dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc')
-rw-r--r--dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc90
1 files changed, 56 insertions, 34 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc b/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
index 040b6fd9..8bd98923 100644
--- a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
@@ -12,6 +12,41 @@
namespace Kernel::HAL
{
+ namespace Detail
+ {
+ struct PTE
+ {
+ UInt64 Present : 1;
+ UInt64 Wr : 1;
+ UInt64 User : 1;
+ UInt64 Pwt : 1; // Page-level Write-Through
+ UInt64 Pcd : 1; // Page-level Cache Disable
+ UInt64 Accessed : 1;
+ UInt64 Dirty : 1;
+ UInt64 Pat : 1; // Page Attribute Table (or PS for PDE)
+ UInt64 Global : 1;
+ UInt64 Ignored1 : 3; // Available to software
+ UInt64 PhysicalAddress : 40; // Physical page frame address (bits 12–51)
+ UInt64 Ignored2 : 7; // More software bits / reserved
+ UInt64 Protection_key : 4; // Optional (if PKU enabled)
+ UInt64 Reserved : 1; // Usually reserved
+ UInt64 Nx : 1; // No Execute
+ };
+ } // namespace Detail
+
+ /***********************************************************************************/
+ /// \brief Retrieve the page status of a PTE.
+ /// \param pte Page Table Entry pointer.
+ /***********************************************************************************/
+ STATIC Void mmi_page_status(Detail::PTE* pte)
+ {
+ (void)(kout << (pte->Present ? "Present" : "Not Present") << kendl);
+ (void)(kout << (pte->Wr ? "W/R" : "Not W/R") << kendl);
+ (void)(kout << (pte->Nx ? "NX" : "Not NX") << kendl);
+ (void)(kout << (pte->User ? "User" : "Not User") << kendl);
+ (void)(kout << (pte->Pcd ? "Not Cached" : "Cached") << kendl);
+ }
+
/***********************************************************************************/
/// @brief Gets a physical address from a virtual address.
/// @param virt a valid virtual address.
@@ -25,6 +60,8 @@ namespace Kernel::HAL
UInt64 cr3 = (UInt64)hal_read_cr3() & ~kPageOffsetMask;
+ hal_invl_tlb(virt);
+
// Level 4
auto pml4 = reinterpret_cast<UInt64*>(cr3);
UInt64 pml4e = pml4[(vaddr >> 39) & kMask9Bits];
@@ -54,28 +91,16 @@ namespace Kernel::HAL
// Level 1
auto pt = reinterpret_cast<UInt64*>(pde & ~kPageOffsetMask);
- UInt64 pte = pt[(vaddr >> 12) & kMask9Bits];
+ Detail::PTE* pte = (Detail::PTE*)pt[(vaddr >> 12) & kMask9Bits];
- if (!(pte & 1))
+ if (!pte->Present)
return 0;
- return (pte & ~kPageOffsetMask) | (vaddr & kPageOffsetMask);
- }
+ mmi_page_status((Detail::PTE*)pte);
- /***********************************************************************************/
- /// \brief Retrieve the page status of a PTE.
- /// \param pte Page Table Entry pointer.
- /***********************************************************************************/
- STATIC Void mmi_page_status(PTE* pte)
- {
- kout << (pte->Present ? "Present" : "Not Present") << kendl;
- kout << (pte->Wr ? "W/R" : "Not W/R") << kendl;
- kout << (pte->ExecDisable ? "NX" : "Not NX") << kendl;
- kout << (pte->User ? "User" : "Not User") << kendl;
+ return pte->PhysicalAddress;
}
- STATIC Int32 mmi_map_page_table_entry(UIntPtr virtual_address, UInt32 physical_address, UInt32 flags, NE_PTE* pt_entry, NE_PDE* pd_entry);
-
/***********************************************************************************/
/// @brief Maps or allocates a page from virtual_address.
/// @param virtual_address a valid virtual address.
@@ -95,39 +120,36 @@ namespace Kernel::HAL
UInt64 pml4e = pml4[(vaddr >> 39) & kMask9];
if (!(pml4e & 1))
- return 1;
+ return kErrorInvalidData;
auto pdpt = reinterpret_cast<UInt64*>(pml4e & ~kPageMask);
UInt64 pdpte = pdpt[(vaddr >> 30) & kMask9];
if (!(pdpte & 1))
- return 1;
+ return kErrorInvalidData;
auto pd = reinterpret_cast<UInt64*>(pdpte & ~kPageMask);
UInt64 pde = pd[(vaddr >> 21) & kMask9];
if (!(pde & 1))
- return 1;
-
- auto pt = reinterpret_cast<UInt64*>(pde & ~kPageMask);
- UInt64& pte = pt[(vaddr >> 12) & kMask9];
+ return kErrorInvalidData;
- // Set the new PTE
- pte = (reinterpret_cast<UInt64>(physical_address) & ~0xFFFULL) | 0x01ULL; // Present
+ UInt64* pt = reinterpret_cast<UInt64*>(pde & ~kPageMask);
+ Detail::PTE* pte = (Detail::PTE*)pt[(vaddr >> 12) & kMask9];
- if (flags & ~kMMFlagsPresent)
- pte &= ~(0x01ULL); // Not Present
+ pte->Present = !!(flags & kMMFlagsPresent);
+ pte->Wr = !!(flags & kMMFlagsWr);
+ pte->User = !!(flags & kMMFlagsUser);
+ pte->Nx = !!(flags & kMMFlagsNX);
+ pte->Pcd = !(flags & kMMFlagsUncached);
- if (flags & kMMFlagsWr)
- pte |= 1 << 1; // Writable
+ if (physical_address)
+ pte->PhysicalAddress = (UIntPtr)physical_address;
- if (flags & kMMFlagsUser)
- pte |= 1 << 2; // User
+ hal_invl_tlb(virtual_address);
- if (flags & kMMFlagsNX)
- pte |= 1ULL << 63; // NX
+ mmi_page_status(pte);
- hal_invl_tlb(virtual_address);
- return 0;
+ return kErrorSuccess;
}
} // namespace Kernel::HAL